diff --git a/addons/mymach_fleet_intelligence/__manifest__.py b/addons/mymach_fleet_intelligence/__manifest__.py index a07e547..87d7ef8 100644 --- a/addons/mymach_fleet_intelligence/__manifest__.py +++ b/addons/mymach_fleet_intelligence/__manifest__.py @@ -27,7 +27,6 @@ 'views/fleet_handover_views.xml', 'views/fuel_index_views.xml', 'views/home_views.xml', - 'views/driver_tracker_template.xml', ], 'installable': True, 'application': True, diff --git a/addons/mymach_fleet_intelligence/controllers/main.py b/addons/mymach_fleet_intelligence/controllers/main.py index 8f8dd90..6c90ad8 100644 --- a/addons/mymach_fleet_intelligence/controllers/main.py +++ b/addons/mymach_fleet_intelligence/controllers/main.py @@ -390,15 +390,51 @@ class MymachFleetController(http.Controller): 'vehicles_json': map_data }) - @http.route('/mymach/driver/tracker', type='http', auth='user') - def driver_tracker(self, **kwargs): + @http.route('/mymach/api/tracker', type='http', auth='public', methods=['GET', 'POST'], csrf=False) + def api_tracker_webhook(self, **kwargs): """ - Sürücülerin mobil cihazlarından konum paylaşabilmeleri için web arayüzü. + Otonom GPS Takip Webhook'u (OwnTracks / Traccar / OsmAnd Formatları) + Bu endpoint arka plan takip uygulamasından gelen verileri (GET veya POST) karşılar. """ - vehicles = request.env['fleet.vehicle'].sudo().search([]) - return request.render('mymach_fleet_intelligence.driver_tracker_template', { - 'vehicles': vehicles, - }) + try: + data = {} + if request.httprequest.method == 'POST': + try: + data = json.loads(request.httprequest.data.decode('utf-8')) + except: + data = request.httprequest.form.to_dict() + else: + data = request.httprequest.args.to_dict() + + # Traccar / OsmAnd formatları query params (id, lat, lon) olarak gönderir. + # OwnTracks JSON içinde (tid, lat, lon) olarak gönderir. + + device_id = data.get('id') or data.get('device') or data.get('tid') or kwargs.get('id') + lat = data.get('lat') or kwargs.get('lat') + lon = data.get('lon') or data.get('lng') or kwargs.get('lon') + speed = data.get('speed') or data.get('vel') or kwargs.get('speed') or 0.0 + + if not device_id or not lat or not lon: + return request.make_response(json.dumps({'error': 'Missing device_id or coordinates'}), headers=[('Content-Type', 'application/json')], status=400) + + # Cihaz ID'si ile eşleşen aracı bul (Sıfır Güven - Sadece kayıtlı cihazlar) + vehicle = request.env['fleet.vehicle'].sudo().search([('tracker_device_id', '=', device_id)], limit=1) + + if not vehicle: + return request.make_response(json.dumps({'error': 'Device not registered to any vehicle'}), headers=[('Content-Type', 'application/json')], status=404) + + from odoo import fields + # Araç Konumunu Güncelle + vehicle.sudo().write({ + 'latitude': float(lat), + 'longitude': float(lon), + 'gps_speed': float(speed), + 'last_gps_update': fields.Datetime.now() + }) + + return request.make_response(json.dumps({'status': 'success', 'vehicle': vehicle.license_plate}), headers=[('Content-Type', 'application/json')]) + except Exception as e: + return request.make_response(json.dumps({'error': str(e)}), headers=[('Content-Type', 'application/json')], status=500) @http.route('/mymach/fix_db', type='http', auth='none') def fix_db(self, db='mymach-odoodev2-2026', **kwargs): diff --git a/addons/mymach_fleet_intelligence/models/fleet_vehicle.py b/addons/mymach_fleet_intelligence/models/fleet_vehicle.py index ba0dcd4..9526f5d 100644 --- a/addons/mymach_fleet_intelligence/models/fleet_vehicle.py +++ b/addons/mymach_fleet_intelligence/models/fleet_vehicle.py @@ -51,6 +51,9 @@ class FleetVehicle(models.Model): index_currency_id = fields.Many2one('res.currency', string="Amortisman Endeks Dövizi", default=lambda self: self.env.ref('base.TRY').id if self.env.ref('base.TRY', raise_if_not_found=False) else False) + # === Otonom GPS / Takip Cihazı (Faz 9) === + tracker_device_id = fields.Char(string="Takip Uygulaması ID", help="Traccar veya OwnTracks uygulamasındaki benzersiz kimlik (Device ID).") + # 3 Para Birimli Amortisman Maliyet Alanları ve Ortalama Değer depreciation_cost_try = fields.Float(string="Amortisman Maliyeti (Ana Döviz)", default=0.0) depreciation_cost_usd = fields.Float(string="Amortisman Maliyeti (Döviz 1)", default=0.0) diff --git a/addons/mymach_fleet_intelligence/views/dashboard_template.xml b/addons/mymach_fleet_intelligence/views/dashboard_template.xml index 3853840..6018ea3 100644 --- a/addons/mymach_fleet_intelligence/views/dashboard_template.xml +++ b/addons/mymach_fleet_intelligence/views/dashboard_template.xml @@ -216,14 +216,7 @@ - - - -
- SEFERE BAŞLA / KONUM PAYLAŞ - Sürücü Mobil Takip Ekranını Aç (Yeni Sekme) -
-
+
diff --git a/addons/mymach_fleet_intelligence/views/driver_tracker_template.xml b/addons/mymach_fleet_intelligence/views/driver_tracker_template.xml deleted file mode 100644 index f097350..0000000 --- a/addons/mymach_fleet_intelligence/views/driver_tracker_template.xml +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - Sürücü Mobil Takip Ekranı - /mymach/driver/tracker - new - - - - - diff --git a/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml b/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml index aba819d..1a8e1b1 100644 --- a/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml +++ b/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml @@ -30,6 +30,7 @@ + diff --git a/addons/mymach_fleet_intelligence/views/home_views.xml b/addons/mymach_fleet_intelligence/views/home_views.xml index 5dc56f6..bd596d3 100644 --- a/addons/mymach_fleet_intelligence/views/home_views.xml +++ b/addons/mymach_fleet_intelligence/views/home_views.xml @@ -130,11 +130,7 @@ action = {
Bekleyen Rota Uyarılarım
-
- -
📍 Sefere Başla -
-
+