diff --git a/addons/mymach_fleet_intelligence/data/cron_jobs.xml b/addons/mymach_fleet_intelligence/data/cron_jobs.xml index f84b5e1..94b2ce9 100644 --- a/addons/mymach_fleet_intelligence/data/cron_jobs.xml +++ b/addons/mymach_fleet_intelligence/data/cron_jobs.xml @@ -26,9 +26,9 @@ MyMach: Google Konum Paylaşımı (GPS) Otonom Senkronizasyon - + code - model.action_mymach_scrape_google_location() + model.sync_google_locations() 1 minutes diff --git a/addons/mymach_fleet_intelligence/models/__init__.py b/addons/mymach_fleet_intelligence/models/__init__.py index cc6f286..7a0077f 100644 --- a/addons/mymach_fleet_intelligence/models/__init__.py +++ b/addons/mymach_fleet_intelligence/models/__init__.py @@ -12,3 +12,4 @@ from . import fuel_index from . import res_currency from . import res_users from . import fleet_vehicle_model +from . import google_maps_sync diff --git a/addons/mymach_fleet_intelligence/models/fleet_vehicle.py b/addons/mymach_fleet_intelligence/models/fleet_vehicle.py index 9526f5d..9abcac4 100644 --- a/addons/mymach_fleet_intelligence/models/fleet_vehicle.py +++ b/addons/mymach_fleet_intelligence/models/fleet_vehicle.py @@ -53,6 +53,7 @@ class FleetVehicle(models.Model): # === 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).") + google_maps_name = fields.Char(string="Google Konum Görünen Adı", help="Şoförün Google Haritalar üzerinde görünen tam adı (Örn: Ahmet Yılmaz).") # 3 Para Birimli Amortisman Maliyet Alanları ve Ortalama Değer depreciation_cost_try = fields.Float(string="Amortisman Maliyeti (Ana Döviz)", default=0.0) diff --git a/addons/mymach_fleet_intelligence/models/google_maps_sync.py b/addons/mymach_fleet_intelligence/models/google_maps_sync.py new file mode 100644 index 0000000..dd3c8bb --- /dev/null +++ b/addons/mymach_fleet_intelligence/models/google_maps_sync.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api +import logging +import os + +_logger = logging.getLogger(__name__) + +try: + from locationsharinglib import Service + LOCATION_SHARING_AVAILABLE = True +except ImportError: + LOCATION_SHARING_AVAILABLE = False + _logger.warning("locationsharinglib is not installed. Google Maps Location Sharing sync will not work. Please run: pip install locationsharinglib") + +class GoogleMapsSync(models.AbstractModel): + _name = 'mymach.fleet.google.sync' + _description = 'Google Maps Location Sharing Sync' + + @api.model + def sync_google_locations(self): + """ + Cron job tarafından çağrılır. + Google Haritalar üzerinden paylaşılan konumları okur ve Odoo'daki araçların koordinatlarını günceller. + """ + if not LOCATION_SHARING_AVAILABLE: + _logger.error("Cannot sync Google locations because locationsharinglib is not installed.") + return + + # Çerez dosyasının yolu: modülün /data/cookies.txt klasörü içinde olmalıdır. + module_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + cookies_path = os.path.join(module_dir, 'data', 'cookies.txt') + + if not os.path.exists(cookies_path): + _logger.error(f"Google Maps çerez (cookie) dosyası bulunamadı: {cookies_path}. Lütfen çerez dosyasını buraya ekleyin.") + return + + google_email = self.env['ir.config_parameter'].sudo().get_param('mymach.google_maps_email', 'mymach.takip@gmail.com') + + try: + # locationsharinglib ile Google'a bağlan + service = Service(cookies_file=cookies_path, authenticating_account=google_email) + people = service.get_all_people() + except Exception as e: + _logger.error(f"Google Haritalar konumları çekilirken hata oluştu (Çerez süresi dolmuş olabilir): {str(e)}") + return + + # Sadece Google Konum Görünen Adı girilmiş araçları bul + vehicles = self.env['fleet.vehicle'].search([('google_maps_name', '!=', False)]) + + # Hızlı eşleştirme için küçük harfe çevrilmiş sözlük oluştur + vehicle_map = {v.google_maps_name.strip().lower(): v for v in vehicles if v.google_maps_name} + + match_count = 0 + for person in people: + person_name = person.full_name.strip().lower() + + # Görünen adı eşleşen aracı bul + vehicle = vehicle_map.get(person_name) + + if vehicle: + # Koordinatları ve son güncelleme zamanını kaydet + vehicle.sudo().write({ + 'latitude': person.latitude, + 'longitude': person.longitude, + # Hız verisi gelmezse ufak bir varsayılan verebiliriz veya hareketli göstermek için 5 koyabiliriz + 'gps_speed': 5.0, + 'last_gps_update': fields.Datetime.now() + }) + match_count += 1 + _logger.info(f"Araç konumu güncellendi: {vehicle.license_plate} - {person.full_name} ({person.latitude}, {person.longitude})") + + _logger.info(f"Google Konum Senkronizasyonu Tamamlandı. Toplam {len(people)} kişiden {match_count} araç eşleştirildi.") diff --git a/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml b/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml index 1a8e1b1..37a386a 100644 --- a/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml +++ b/addons/mymach_fleet_intelligence/views/fleet_vehicle_views.xml @@ -31,6 +31,7 @@ +