21.07v
This commit is contained in:
@@ -2151,3 +2151,125 @@ msgstr "🚨 غير متوافق (%(dev)s كيلومتر، الاستخدام ا
|
|||||||
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
||||||
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
||||||
msgstr "🚨 طريق غير متوافق (تم إبلاغ المدير بالإنذار)"
|
msgstr "🚨 طريق غير متوافق (تم إبلاغ المدير بالإنذار)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "YÖNETİCİ PORTALI / MANAGEMENT PANEL"
|
||||||
|
msgstr "بوابة الإدارة / لوحة الإدارة"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "PERSONEL PORTALI / DRIVER DASHBOARD"
|
||||||
|
msgstr "بوابة الموظفين / لوحة القيادة للسائق"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Grafik gösterimi için sistemde kayıtlı aktif bir araç bulunamadı."
|
||||||
|
msgstr "لم يتم العثور على أداة نشطة مسجلة في النظام للعرض الرسومي."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Kat Edilen Kilometre (KM)"
|
||||||
|
msgstr "الكيلومترات المقطوعة (KM)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Harcanan Yakıt (Litre)"
|
||||||
|
msgstr "الوقود المستهلك (لتر)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Yakıt Gideri (TL)"
|
||||||
|
msgstr "نفقات الوقود (ليرة تركية)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Telemetri Analizi & Finansal Gider Analitiği"
|
||||||
|
msgstr "تحليل القياس عن بعد وتحليلات النفقات المالية"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Sistem Başarıyla Güncellendi"
|
||||||
|
msgstr "تم تحديث النظام بنجاح"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Yaptığınız tüm değişiklikler ve seçimler veri tabanına kalıcı olarak "
|
||||||
|
"kaydedilmiştir."
|
||||||
|
msgstr ""
|
||||||
|
"يتم حفظ جميع التغييرات والاختيارات التي تجريها بشكل دائم في قاعدة البيانات."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "İstanbul Havalimanı"
|
||||||
|
msgstr "مطار اسطنبول"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Konumu İçin Alternatif 3 Rota Belirlendi"
|
||||||
|
msgstr "وتم تحديد 3 طرق بديلة لموقعها"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA A (En Kısa)"
|
||||||
|
msgstr "الطريق أ (الأقصر)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA B (Ekonomik)"
|
||||||
|
msgstr "الطريق ب (الاقتصادي)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA C (Alternatif)"
|
||||||
|
msgstr "الطريق ج (بديل)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 1.1 L (Otoyol)"
|
||||||
|
msgstr "الوقود المقدر: 1.1 لتر (الطريق السريع)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 0.9 L (Şehir İçi)"
|
||||||
|
msgstr "الوقود المقدر: 0.9 لتر (حضري)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 1.3 L (Akıcı)"
|
||||||
|
msgstr "الوقود المقدر: 1.3 لتر (بطلاقة)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Hata"
|
||||||
|
msgstr "خطأ"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Simülasyon için geçerli bir araç seçilmelidir."
|
||||||
|
msgstr "يجب تحديد أداة صالحة للمحاكاة."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Belirsiz"
|
||||||
|
msgstr "غير مؤكد"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"ROTA SAPMA İHLALİ: Sürücü ({0}), {1} konumuna gitmek için seçilen rotadan "
|
||||||
|
"{2:.1f} KM sapmıştır (Tolerans: 1.0 KM)."
|
||||||
|
msgstr ""
|
||||||
|
"انتهاك انحراف المسار: انحرف السائق ({0}) بمقدار {2:.1f} كيلومتر عن المسار "
|
||||||
|
"المحدد للذهاب إلى {1} (التسامح: 1.0 كيلومتر)."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"🚨 <b>ROTA SAPMA ALARMI (YÖNETİCİ UYARISI):</b> Sürücü ({0}), {1} rotasından "
|
||||||
|
"{2:.1f} KM sapmıştır. Sözleşmesinde serbest kullanım hakkı bulunmadığı için "
|
||||||
|
"yöneticiye ihlal uyarısı iletilmiştir."
|
||||||
|
msgstr ""
|
||||||
|
"🚨 <b>إنذار انحراف المسار (تحذير المشرف):</b> انحرف السائق ({0}) بمقدار "
|
||||||
|
"{2:.1f} كيلومتر عن المسار {1}. نظرًا لعدم وجود حق استخدام مجاني في العقد، تم"
|
||||||
|
" إرسال تحذير بالمخالفة إلى المدير."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "🚨 ROTA SAPMA UYARISI!"
|
||||||
|
msgstr "🚨 تحذير من انحراف المسار!"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Sürücü rotasından {0:.1f} KM sapmıştır! Yöneticiye uyarı iletildi ve ihlal "
|
||||||
|
"logu kaydedildi."
|
||||||
|
msgstr ""
|
||||||
|
"لقد انحرف السائق بمقدار {0:.1f} كيلومتر عن طريقه! تم إرسال إنذار للمسؤول وتم"
|
||||||
|
" تسجيل سجل المخالفات."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Sürüş Tamamlandı"
|
||||||
|
msgstr "اكتملت الرحلة"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Yolculuk başarıyla tamamlandı. Herhangi bir sapma uyarısı tetiklenmedi."
|
||||||
|
msgstr "وتمت الرحلة بنجاح. لم يتم تشغيل أي تنبيهات انحراف."
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2181,3 +2181,130 @@ msgstr "🚨 INCOMPATIBLE (%(dev)s km Prohibido Uso Personal)"
|
|||||||
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
#: code:addons/mymach_fleet_intelligence/controllers/main.py:0
|
||||||
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
msgid "🚨 UYUMSUZ ROTA (YÖNETİCİYE ALARM BİLDİRİLDİ)"
|
||||||
msgstr "🚨 RUTA INCOMPATIBLE (ALARMA REPORTADA AL ADMINISTRADOR)"
|
msgstr "🚨 RUTA INCOMPATIBLE (ALARMA REPORTADA AL ADMINISTRADOR)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "YÖNETİCİ PORTALI / MANAGEMENT PANEL"
|
||||||
|
msgstr "PORTAL DE ADMINISTRACIÓN / PANEL DE GESTIÓN"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "PERSONEL PORTALI / DRIVER DASHBOARD"
|
||||||
|
msgstr "PORTAL DE PERSONAL / TABLERO DEL CONDUCTOR"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Grafik gösterimi için sistemde kayıtlı aktif bir araç bulunamadı."
|
||||||
|
msgstr ""
|
||||||
|
"No se encontró ninguna herramienta activa registrada en el sistema para "
|
||||||
|
"visualización gráfica."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Kat Edilen Kilometre (KM)"
|
||||||
|
msgstr "Kilómetros recorridos (KM)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Harcanan Yakıt (Litre)"
|
||||||
|
msgstr "Combustible gastado (litros)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Yakıt Gideri (TL)"
|
||||||
|
msgstr "Gasto de combustible (TL)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Telemetri Analizi & Finansal Gider Analitiği"
|
||||||
|
msgstr "Análisis de telemetría y análisis de gastos financieros"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Sistem Başarıyla Güncellendi"
|
||||||
|
msgstr "Sistema actualizado exitosamente"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Yaptığınız tüm değişiklikler ve seçimler veri tabanına kalıcı olarak "
|
||||||
|
"kaydedilmiştir."
|
||||||
|
msgstr ""
|
||||||
|
"Todos los cambios y selecciones que realice se guardan permanentemente en la"
|
||||||
|
" base de datos."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "İstanbul Havalimanı"
|
||||||
|
msgstr "Aeropuerto de Estambul"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Konumu İçin Alternatif 3 Rota Belirlendi"
|
||||||
|
msgstr "Se han determinado 3 rutas alternativas para su ubicación"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA A (En Kısa)"
|
||||||
|
msgstr "RUTA A (La más corta)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA B (Ekonomik)"
|
||||||
|
msgstr "RUTA B (Económica)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "ROTA C (Alternatif)"
|
||||||
|
msgstr "RUTA C (Alternativa)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 1.1 L (Otoyol)"
|
||||||
|
msgstr "Combustible estimado: 1,1 L (carretera)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 0.9 L (Şehir İçi)"
|
||||||
|
msgstr "Combustible estimado: 0,9 L (urbano)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Tahmini Yakıt: 1.3 L (Akıcı)"
|
||||||
|
msgstr "Combustible estimado: 1,3 L (fluido)"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Hata"
|
||||||
|
msgstr "Error"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Simülasyon için geçerli bir araç seçilmelidir."
|
||||||
|
msgstr "Se debe seleccionar una herramienta válida para la simulación."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Belirsiz"
|
||||||
|
msgstr "Incierto"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"ROTA SAPMA İHLALİ: Sürücü ({0}), {1} konumuna gitmek için seçilen rotadan "
|
||||||
|
"{2:.1f} KM sapmıştır (Tolerans: 1.0 KM)."
|
||||||
|
msgstr ""
|
||||||
|
"VIOLACIÓN DE DESVIACIÓN DE RUTA: El conductor ({0}) se desvió {2:.1f} KM de "
|
||||||
|
"la ruta seleccionada para ir a {1} (Tolerancia: 1.0 KM)."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"🚨 <b>ROTA SAPMA ALARMI (YÖNETİCİ UYARISI):</b> Sürücü ({0}), {1} rotasından "
|
||||||
|
"{2:.1f} KM sapmıştır. Sözleşmesinde serbest kullanım hakkı bulunmadığı için "
|
||||||
|
"yöneticiye ihlal uyarısı iletilmiştir."
|
||||||
|
msgstr ""
|
||||||
|
"🚨 <b>ALARMA DE DESVIACIÓN DE RUTA (ADVERTENCIA ADMINISTRATIVA):</b> El "
|
||||||
|
"conductor ({0}) se ha desviado {2:.1f} KM de la ruta {1}. Como en el "
|
||||||
|
"contrato no figuraba ningún derecho de uso gratuito, se envió al "
|
||||||
|
"administrador una advertencia de infracción."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "🚨 ROTA SAPMA UYARISI!"
|
||||||
|
msgstr "🚨 ¡ADVERTENCIA DE DESVIACIÓN DE RUTA!"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Sürücü rotasından {0:.1f} KM sapmıştır! Yöneticiye uyarı iletildi ve ihlal "
|
||||||
|
"logu kaydedildi."
|
||||||
|
msgstr ""
|
||||||
|
"¡El conductor se ha desviado {0:.1f} KM de su ruta! Se envió una advertencia"
|
||||||
|
" al administrador y se registró el registro de infracciones."
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid "Sürüş Tamamlandı"
|
||||||
|
msgstr "Viaje completado"
|
||||||
|
|
||||||
|
#: models/home.py:0
|
||||||
|
msgid ""
|
||||||
|
"Yolculuk başarıyla tamamlandı. Herhangi bir sapma uyarısı tetiklenmedi."
|
||||||
|
msgstr ""
|
||||||
|
"El viaje se completó con éxito. No se activaron alertas de desviación."
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
71
addons/mymach_fleet_intelligence/i18n/translate_fast.py
Normal file
71
addons/mymach_fleet_intelligence/i18n/translate_fast.py
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import polib
|
||||||
|
from deep_translator import GoogleTranslator
|
||||||
|
import os
|
||||||
|
|
||||||
|
base_dir = "/mnt/extra-addons/mymach_fleet_intelligence/i18n"
|
||||||
|
|
||||||
|
new_strings = [
|
||||||
|
"YÖNETİCİ PORTALI / MANAGEMENT PANEL",
|
||||||
|
"PERSONEL PORTALI / DRIVER DASHBOARD",
|
||||||
|
"Grafik gösterimi için sistemde kayıtlı aktif bir araç bulunamadı.",
|
||||||
|
"Kat Edilen Kilometre (KM)",
|
||||||
|
"Harcanan Yakıt (Litre)",
|
||||||
|
"Yakıt Gideri (TL)",
|
||||||
|
"Telemetri Analizi & Finansal Gider Analitiği",
|
||||||
|
"Sistem Başarıyla Güncellendi",
|
||||||
|
"Yaptığınız tüm değişiklikler ve seçimler veri tabanına kalıcı olarak kaydedilmiştir.",
|
||||||
|
"İstanbul Havalimanı",
|
||||||
|
"Konumu İçin Alternatif 3 Rota Belirlendi",
|
||||||
|
"ROTA A (En Kısa)",
|
||||||
|
"ROTA B (Ekonomik)",
|
||||||
|
"ROTA C (Alternatif)",
|
||||||
|
"Tahmini Yakıt: 1.1 L (Otoyol)",
|
||||||
|
"Tahmini Yakıt: 0.9 L (Şehir İçi)",
|
||||||
|
"Tahmini Yakıt: 1.3 L (Akıcı)",
|
||||||
|
"Hata",
|
||||||
|
"Simülasyon için geçerli bir araç seçilmelidir.",
|
||||||
|
"Belirsiz",
|
||||||
|
"ROTA SAPMA İHLALİ: Sürücü ({0}), {1} konumuna gitmek için seçilen rotadan {2:.1f} KM sapmıştır (Tolerans: 1.0 KM).",
|
||||||
|
"🚨 <b>ROTA SAPMA ALARMI (YÖNETİCİ UYARISI):</b> Sürücü ({0}), {1} rotasından {2:.1f} KM sapmıştır. Sözleşmesinde serbest kullanım hakkı bulunmadığı için yöneticiye ihlal uyarısı iletilmiştir.",
|
||||||
|
"🚨 ROTA SAPMA UYARISI!",
|
||||||
|
"Sürücü rotasından {0:.1f} KM sapmıştır! Yöneticiye uyarı iletildi ve ihlal logu kaydedildi.",
|
||||||
|
"Sürüş Tamamlandı",
|
||||||
|
"Yolculuk başarıyla tamamlandı. Herhangi bir sapma uyarısı tetiklenmedi."
|
||||||
|
]
|
||||||
|
|
||||||
|
target_langs = {
|
||||||
|
'fr_FR': 'fr',
|
||||||
|
'de_DE': 'de',
|
||||||
|
'es_ES': 'es',
|
||||||
|
'ar_001': 'ar',
|
||||||
|
'en_US': 'en'
|
||||||
|
}
|
||||||
|
|
||||||
|
for odoo_lang, glang in target_langs.items():
|
||||||
|
print(f"Translating for {odoo_lang}...")
|
||||||
|
po_path = os.path.join(base_dir, f"{odoo_lang}.po")
|
||||||
|
if not os.path.exists(po_path):
|
||||||
|
continue
|
||||||
|
|
||||||
|
po = polib.pofile(po_path, encoding='utf-8')
|
||||||
|
existing_msgids = [entry.msgid for entry in po]
|
||||||
|
|
||||||
|
translator = GoogleTranslator(source='tr', target=glang)
|
||||||
|
|
||||||
|
for string in new_strings:
|
||||||
|
if string not in existing_msgids:
|
||||||
|
try:
|
||||||
|
translated = translator.translate(string)
|
||||||
|
new_entry = polib.POEntry(
|
||||||
|
msgid=string,
|
||||||
|
msgstr=translated,
|
||||||
|
occurrences=[('models/home.py', '0')]
|
||||||
|
)
|
||||||
|
po.append(new_entry)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error translating {string}: {e}")
|
||||||
|
|
||||||
|
po.save(po_path)
|
||||||
|
print(f"Saved {po_path}")
|
||||||
|
|
||||||
|
print("Done fast translations!")
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from odoo import models, fields, api
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
class MymachFleetHome(models.Model):
|
class MymachFleetHome(models.Model):
|
||||||
"""
|
"""
|
||||||
@@ -71,9 +71,9 @@ class MymachFleetHome(models.Model):
|
|||||||
def _compute_display_title(self):
|
def _compute_display_title(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if self.env.user.has_group('mymach_fleet_intelligence.group_mymach_fleet_manager'):
|
if self.env.user.has_group('mymach_fleet_intelligence.group_mymach_fleet_manager'):
|
||||||
record.display_title = 'YÖNETİCİ PORTALI / MANAGEMENT PANEL'
|
record.display_title = _('YÖNETİCİ PORTALI / MANAGEMENT PANEL')
|
||||||
else:
|
else:
|
||||||
record.display_title = 'PERSONEL PORTALI / DRIVER DASHBOARD'
|
record.display_title = _('PERSONEL PORTALI / DRIVER DASHBOARD')
|
||||||
|
|
||||||
def _compute_upcoming_maintenance_html(self):
|
def _compute_upcoming_maintenance_html(self):
|
||||||
# Yaklaşan veya Süresi/KM'si geçmiş tüm bakımları tarihe ve KM hedefine göre sırala
|
# Yaklaşan veya Süresi/KM'si geçmiş tüm bakımları tarihe ve KM hedefine göre sırala
|
||||||
@@ -147,10 +147,11 @@ class MymachFleetHome(models.Model):
|
|||||||
for record in self:
|
for record in self:
|
||||||
vehicle = record.selected_vehicle_id or self.env['fleet.vehicle'].search([], limit=1)
|
vehicle = record.selected_vehicle_id or self.env['fleet.vehicle'].search([], limit=1)
|
||||||
if not vehicle:
|
if not vehicle:
|
||||||
record.chart_html = """
|
msg = _("Grafik gösterimi için sistemde kayıtlı aktif bir araç bulunamadı.")
|
||||||
|
record.chart_html = f"""
|
||||||
<div style="text-align: center; color: #94a3b8; padding: 30px; font-size: 14px; border: 1px dashed rgba(255,255,255,0.15); border-radius: 12px; background: rgba(15, 23, 42, 0.4);">
|
<div style="text-align: center; color: #94a3b8; padding: 30px; font-size: 14px; border: 1px dashed rgba(255,255,255,0.15); border-radius: 12px; background: rgba(15, 23, 42, 0.4);">
|
||||||
<i class="fa fa-info-circle" style="font-size: 28px; color: #38bdf8; margin-bottom: 10px; display: block;"></i>
|
<i class="fa fa-info-circle" style="font-size: 28px; color: #38bdf8; margin-bottom: 10px; display: block;"></i>
|
||||||
Grafik gösterimi için sistemde kayıtlı aktif bir araç bulunamadı.
|
{msg}
|
||||||
</div>
|
</div>
|
||||||
"""
|
"""
|
||||||
continue
|
continue
|
||||||
@@ -299,7 +300,7 @@ class MymachFleetHome(models.Model):
|
|||||||
# KM Serisi
|
# KM Serisi
|
||||||
if metric in ('combined', 'km'):
|
if metric in ('combined', 'km'):
|
||||||
raw_datasets.append({
|
raw_datasets.append({
|
||||||
'label': 'Kat Edilen Kilometre (KM)',
|
'label': _('Kat Edilen Kilometre (KM)'),
|
||||||
'data': km_data,
|
'data': km_data,
|
||||||
'borderColor': '#38bdf8',
|
'borderColor': '#38bdf8',
|
||||||
'backgroundColor': 'rgba(56, 189, 248, 0.04)',
|
'backgroundColor': 'rgba(56, 189, 248, 0.04)',
|
||||||
@@ -312,7 +313,7 @@ class MymachFleetHome(models.Model):
|
|||||||
# Yakıt Hacmi Serisi
|
# Yakıt Hacmi Serisi
|
||||||
if metric in ('combined', 'fuel_liters'):
|
if metric in ('combined', 'fuel_liters'):
|
||||||
raw_datasets.append({
|
raw_datasets.append({
|
||||||
'label': 'Harcanan Yakıt (Litre)',
|
'label': _('Harcanan Yakıt (Litre)'),
|
||||||
'data': fuel_data,
|
'data': fuel_data,
|
||||||
'borderColor': '#fb923c',
|
'borderColor': '#fb923c',
|
||||||
'backgroundColor': 'rgba(251, 146, 60, 0.04)',
|
'backgroundColor': 'rgba(251, 146, 60, 0.04)',
|
||||||
@@ -325,7 +326,7 @@ class MymachFleetHome(models.Model):
|
|||||||
# Yakıt Gideri Serisi
|
# Yakıt Gideri Serisi
|
||||||
if metric in ('combined', 'fuel_cost'):
|
if metric in ('combined', 'fuel_cost'):
|
||||||
raw_datasets.append({
|
raw_datasets.append({
|
||||||
'label': 'Yakıt Gideri (TL)',
|
'label': _('Yakıt Gideri (TL)'),
|
||||||
'data': fuel_cost_data,
|
'data': fuel_cost_data,
|
||||||
'borderColor': '#10b981',
|
'borderColor': '#10b981',
|
||||||
'backgroundColor': 'rgba(16, 185, 129, 0.04)',
|
'backgroundColor': 'rgba(16, 185, 129, 0.04)',
|
||||||
@@ -374,7 +375,7 @@ class MymachFleetHome(models.Model):
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="chart-box">
|
<div class="chart-box">
|
||||||
<h3>📈 {vehicle.license_plate or ""} Telemetri Analizi & Finansal Gider Analitiği</h3>
|
<h3>📈 {vehicle.license_plate or ""} {_("Telemetri Analizi & Finansal Gider Analitiği")}</h3>
|
||||||
<div style="position: relative; height: 210px; width: 100%;">
|
<div style="position: relative; height: 210px; width: 100%;">
|
||||||
<canvas id="canvasChart"></canvas>
|
<canvas id="canvasChart"></canvas>
|
||||||
</div>
|
</div>
|
||||||
@@ -505,8 +506,8 @@ class MymachFleetHome(models.Model):
|
|||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'tag': 'display_notification',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'params': {
|
||||||
'title': 'Sistem Başarıyla Güncellendi',
|
'title': _('Sistem Başarıyla Güncellendi'),
|
||||||
'message': 'Yaptığınız tüm değişiklikler ve seçimler veri tabanına kalıcı olarak kaydedilmiştir.',
|
'message': _('Yaptığınız tüm değişiklikler ve seçimler veri tabanına kalıcı olarak kaydedilmiştir.'),
|
||||||
'sticky': False,
|
'sticky': False,
|
||||||
'type': 'success',
|
'type': 'success',
|
||||||
'next': {'type': 'ir.actions.client', 'tag': 'soft_reload'}
|
'next': {'type': 'ir.actions.client', 'tag': 'soft_reload'}
|
||||||
@@ -515,30 +516,38 @@ class MymachFleetHome(models.Model):
|
|||||||
|
|
||||||
def action_calculate_routes(self):
|
def action_calculate_routes(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
dest = record.route_destination or "İstanbul Havalimanı"
|
dest = record.route_destination or _("İstanbul Havalimanı")
|
||||||
|
title_text = _("Konumu İçin Alternatif 3 Rota Belirlendi")
|
||||||
|
route_a = _("ROTA A (En Kısa)")
|
||||||
|
route_b = _("ROTA B (Ekonomik)")
|
||||||
|
route_c = _("ROTA C (Alternatif)")
|
||||||
|
est_fuel_a = _("Tahmini Yakıt: 1.1 L (Otoyol)")
|
||||||
|
est_fuel_b = _("Tahmini Yakıt: 0.9 L (Şehir İçi)")
|
||||||
|
est_fuel_c = _("Tahmini Yakıt: 1.3 L (Akıcı)")
|
||||||
|
|
||||||
record.route_results_html = f"""
|
record.route_results_html = f"""
|
||||||
<div style="margin-top: 15px; padding: 20px; background: rgba(15, 23, 42, 0.4); border: 1px solid rgba(255,255,255,0.08); border-radius: 12px;">
|
<div style="margin-top: 15px; padding: 20px; background: rgba(15, 23, 42, 0.4); border: 1px solid rgba(255,255,255,0.08); border-radius: 12px;">
|
||||||
<h4 style="color: #fbbf24; margin-top: 0; margin-bottom: 15px; font-weight: 600; font-size: 14px; text-align: center;">🗺️ {dest} Konumu İçin Alternatif 3 Rota Belirlendi</h4>
|
<h4 style="color: #fbbf24; margin-top: 0; margin-bottom: 15px; font-weight: 600; font-size: 14px; text-align: center;">🗺️ {dest} {title_text}</h4>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4 mb-3">
|
<div class="col-md-4 mb-3">
|
||||||
<div style="background: rgba(56, 189, 248, 0.05); border: 1px solid rgba(56, 189, 248, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
<div style="background: rgba(56, 189, 248, 0.05); border: 1px solid rgba(56, 189, 248, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
||||||
<span style="color: #38bdf8; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">ROTA A (En Kısa)</span>
|
<span style="color: #38bdf8; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">{route_a}</span>
|
||||||
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">15.2 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">15.2 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
||||||
<p style="color: #94a3b8; margin: 0; font-size: 11px;">Tahmini Yakıt: 1.1 L (Otoyol)</p>
|
<p style="color: #94a3b8; margin: 0; font-size: 11px;">{est_fuel_a}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 mb-3">
|
<div class="col-md-4 mb-3">
|
||||||
<div style="background: rgba(16, 185, 129, 0.05); border: 1px solid rgba(16, 185, 129, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
<div style="background: rgba(16, 185, 129, 0.05); border: 1px solid rgba(16, 185, 129, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
||||||
<span style="color: #10b981; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">ROTA B (Ekonomik)</span>
|
<span style="color: #10b981; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">{route_b}</span>
|
||||||
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">16.5 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">16.5 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
||||||
<p style="color: #94a3b8; margin: 0; font-size: 11px;">Tahmini Yakıt: 0.9 L (Şehir İçi)</p>
|
<p style="color: #94a3b8; margin: 0; font-size: 11px;">{est_fuel_b}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4 mb-3">
|
<div class="col-md-4 mb-3">
|
||||||
<div style="background: rgba(251, 146, 60, 0.05); border: 1px solid rgba(251, 146, 60, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
<div style="background: rgba(251, 146, 60, 0.05); border: 1px solid rgba(251, 146, 60, 0.15); border-radius: 8px; padding: 15px; text-align: center;">
|
||||||
<span style="color: #fb923c; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">ROTA C (Alternatif)</span>
|
<span style="color: #fb923c; font-weight: bold; font-size: 13px; display: block; margin-bottom: 5px;">{route_c}</span>
|
||||||
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">18.0 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
<h2 style="color: white; margin: 5px 0; font-size: 22px; font-weight: 700;">18.0 <span style="font-size: 13px; color: #94a3b8; font-weight: normal;">KM</span></h2>
|
||||||
<p style="color: #94a3b8; margin: 0; font-size: 11px;">Tahmini Yakıt: 1.3 L (Akıcı)</p>
|
<p style="color: #94a3b8; margin: 0; font-size: 11px;">{est_fuel_c}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -554,8 +563,8 @@ class MymachFleetHome(models.Model):
|
|||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'tag': 'display_notification',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'params': {
|
||||||
'title': 'Hata',
|
'title': _('Hata'),
|
||||||
'message': 'Simülasyon için geçerli bir araç seçilmelidir.',
|
'message': _('Simülasyon için geçerli bir araç seçilmelidir.'),
|
||||||
'type': 'danger',
|
'type': 'danger',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -586,22 +595,26 @@ class MymachFleetHome(models.Model):
|
|||||||
has_free_use = False
|
has_free_use = False
|
||||||
|
|
||||||
if not has_free_use:
|
if not has_free_use:
|
||||||
|
d_name = driver.name if driver else _('Belirsiz')
|
||||||
|
log_name = _("ROTA SAPMA İHLALİ: Sürücü ({0}), {1} konumuna gitmek için seçilen rotadan {2:.1f} KM sapmıştır (Tolerans: 1.0 KM).").format(d_name, self.route_destination, deviation)
|
||||||
# Güvenlik Logu (İhlal) kaydet
|
# Güvenlik Logu (İhlal) kaydet
|
||||||
self.env['mymach.fleet.security.log'].create({
|
self.env['mymach.fleet.security.log'].create({
|
||||||
'vehicle_id': vehicle.id,
|
'vehicle_id': vehicle.id,
|
||||||
'status': 'exception',
|
'status': 'exception',
|
||||||
'name': f"ROTA SAPMA İHLALİ: Sürücü ({driver.name if driver else 'Belirsiz'}), {self.route_destination} konumuna gitmek için seçilen rotadan {deviation:.1f} KM sapmıştır (Tolerans: 1.0 KM).",
|
'name': log_name,
|
||||||
'is_resolved': False
|
'is_resolved': False
|
||||||
})
|
})
|
||||||
|
|
||||||
|
msg_body = _("🚨 <b>ROTA SAPMA ALARMI (YÖNETİCİ UYARISI):</b> Sürücü ({0}), {1} rotasından {2:.1f} KM sapmıştır. Sözleşmesinde serbest kullanım hakkı bulunmadığı için yöneticiye ihlal uyarısı iletilmiştir.").format(d_name, self.route_destination, deviation)
|
||||||
# Araç chatter'ına uyarısı postala
|
# Araç chatter'ına uyarısı postala
|
||||||
vehicle.message_post(body=f"🚨 <b>ROTA SAPMA ALARMI (YÖNETİCİ UYARISI):</b> Sürücü ({driver.name if driver else 'Belirsiz'}), {self.route_destination} rotasından {deviation:.1f} KM sapmıştır. Sözleşmesinde serbest kullanım hakkı bulunmadığı için yöneticiye ihlal uyarısı iletilmiştir.")
|
vehicle.message_post(body=msg_body)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'tag': 'display_notification',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'params': {
|
||||||
'title': '🚨 ROTA SAPMA UYARISI!',
|
'title': _('🚨 ROTA SAPMA UYARISI!'),
|
||||||
'message': f"Sürücü rotasından {deviation:.1f} KM sapmıştır! Yöneticiye uyarı iletildi ve ihlal logu kaydedildi.",
|
'message': _("Sürücü rotasından {0:.1f} KM sapmıştır! Yöneticiye uyarı iletildi ve ihlal logu kaydedildi.").format(deviation),
|
||||||
'type': 'danger',
|
'type': 'danger',
|
||||||
'sticky': True,
|
'sticky': True,
|
||||||
}
|
}
|
||||||
@@ -611,8 +624,8 @@ class MymachFleetHome(models.Model):
|
|||||||
'type': 'ir.actions.client',
|
'type': 'ir.actions.client',
|
||||||
'tag': 'display_notification',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'params': {
|
||||||
'title': 'Sürüş Tamamlandı',
|
'title': _('Sürüş Tamamlandı'),
|
||||||
'message': 'Yolculuk başarıyla tamamlandı. Herhangi bir sapma uyarısı tetiklenmedi.',
|
'message': _('Yolculuk başarıyla tamamlandı. Herhangi bir sapma uyarısı tetiklenmedi.'),
|
||||||
'type': 'success',
|
'type': 'success',
|
||||||
'sticky': False,
|
'sticky': False,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
|||||||
access_mymach_fleet_contract_user,contract_user,model_mymach_fleet_contract,group_mymach_fleet_user,1,0,0,0
|
access_mymach_fleet_contract_user,contract_user,model_mymach_fleet_contract,group_mymach_fleet_user,1,0,0,0
|
||||||
access_mymach_fleet_contract_manager,contract_manager,model_mymach_fleet_contract,group_mymach_fleet_manager,1,1,1,1
|
access_mymach_fleet_contract_manager,contract_manager,model_mymach_fleet_contract,group_mymach_fleet_manager,1,1,1,1
|
||||||
access_mymach_fleet_maintenance_cost_manager,maintenance_cost_manager,model_mymach_fleet_maintenance_cost,group_mymach_fleet_manager,1,1,1,1
|
access_mymach_fleet_maintenance_cost_manager,maintenance_cost_manager,model_mymach_fleet_maintenance_cost,group_mymach_fleet_manager,1,1,1,1
|
||||||
|
access_mymach_fleet_security_log_user,log_user,model_mymach_fleet_security_log,group_mymach_fleet_user,1,1,0,0
|
||||||
access_mymach_fleet_security_log_manager,log_manager,model_mymach_fleet_security_log,group_mymach_fleet_manager,1,1,1,1
|
access_mymach_fleet_security_log_manager,log_manager,model_mymach_fleet_security_log,group_mymach_fleet_manager,1,1,1,1
|
||||||
access_mymach_fleet_route_wizard_user,route_wizard_user,model_mymach_fleet_route_exception_wizard,group_mymach_fleet_user,1,1,1,1
|
access_mymach_fleet_route_wizard_user,route_wizard_user,model_mymach_fleet_route_exception_wizard,group_mymach_fleet_user,1,1,1,1
|
||||||
access_mymach_fleet_reservation_user,reservation_user,model_mymach_fleet_reservation,group_mymach_fleet_user,1,1,1,0
|
access_mymach_fleet_reservation_user,reservation_user,model_mymach_fleet_reservation,group_mymach_fleet_user,1,1,1,0
|
||||||
|
|||||||
|
@@ -55,5 +55,19 @@
|
|||||||
<field name="domain_force">[(1, '=', 1)]</field>
|
<field name="domain_force">[(1, '=', 1)]</field>
|
||||||
<field name="groups" eval="[(4, ref('group_mymach_fleet_manager'))]"/>
|
<field name="groups" eval="[(4, ref('group_mymach_fleet_manager'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- RECORD RULES (Güvenlik / Rota Sapma Logları) -->
|
||||||
|
<record id="rule_mymach_fleet_security_log_user" model="ir.rule">
|
||||||
|
<field name="name">Sürücüler kendi rota sapma uyarılarını görür</field>
|
||||||
|
<field name="model_id" ref="model_mymach_fleet_security_log"/>
|
||||||
|
<field name="domain_force">[('vehicle_id.driver_id', '=', user.partner_id.id)]</field>
|
||||||
|
<field name="groups" eval="[(4, ref('group_mymach_fleet_user'))]"/>
|
||||||
|
</record>
|
||||||
|
<record id="rule_mymach_fleet_security_log_manager" model="ir.rule">
|
||||||
|
<field name="name">Yöneticiler tüm güvenlik ihlallerini görür</field>
|
||||||
|
<field name="model_id" ref="model_mymach_fleet_security_log"/>
|
||||||
|
<field name="domain_force">[(1, '=', 1)]</field>
|
||||||
|
<field name="groups" eval="[(4, ref('group_mymach_fleet_manager'))]"/>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -15,6 +15,13 @@
|
|||||||
<field name="view_mode">list,form</field>
|
<field name="view_mode">list,form</field>
|
||||||
<field name="domain">[('is_maintenance_critical', '=', True)]</field>
|
<field name="domain">[('is_maintenance_critical', '=', True)]</field>
|
||||||
</record>
|
</record>
|
||||||
|
<!-- Sürücülerin kendi bekleyen rota ihlallerini görmesi için aksiyon -->
|
||||||
|
<record id="action_driver_route_exceptions" model="ir.actions.act_window">
|
||||||
|
<field name="name">Bekleyen Rota Uyarılarım</field>
|
||||||
|
<field name="res_model">mymach.fleet.security.log</field>
|
||||||
|
<field name="view_mode">list,form</field>
|
||||||
|
<field name="domain">[('is_resolved', '=', False)]</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- Sunucu Aksiyonu: Sadece Canlı Haritayı Gösteren Görünüm İçin -->
|
<!-- Sunucu Aksiyonu: Sadece Canlı Haritayı Gösteren Görünüm İçin -->
|
||||||
<record id="action_mymach_fleet_home_chart_server" model="ir.actions.server">
|
<record id="action_mymach_fleet_home_chart_server" model="ir.actions.server">
|
||||||
@@ -72,7 +79,7 @@ action = {
|
|||||||
<h3 class="mymach_zara_group_title" style="color: #38bdf8; border-color: rgba(56, 189, 248, 0.25);">Temel Operasyonlar</h3>
|
<h3 class="mymach_zara_group_title" style="color: #38bdf8; border-color: rgba(56, 189, 248, 0.25);">Temel Operasyonlar</h3>
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<div class="col-md-3 mb-3">
|
<div class="col-md-3 mb-3">
|
||||||
<button name="%(fleet.fleet_vehicle_action)d" type="action" class="btn mymach_zara_btn" style="width: 100%;">
|
<button name="%(fleet.fleet_vehicle_action)d" type="action" class="btn mymach_zara_btn" style="width: 100%;" groups="mymach_fleet_intelligence.group_mymach_fleet_manager">
|
||||||
<i class="fa fa-car mb-2"></i><br/> Akıllı Araç Yönetimi
|
<i class="fa fa-car mb-2"></i><br/> Akıllı Araç Yönetimi
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -92,15 +99,42 @@ action = {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3">
|
<div class="col-md-3 mb-3">
|
||||||
<button name="%(hr.open_view_employee_list_my)d" type="action" class="btn mymach_zara_btn" style="width: 100%;">
|
<button name="%(hr.open_view_employee_list_my)d" type="action" class="btn mymach_zara_btn" style="width: 100%;" groups="mymach_fleet_intelligence.group_mymach_fleet_manager">
|
||||||
<i class="fa fa-users mb-2"></i><br/> Personel Kartları
|
<i class="fa fa-users mb-2"></i><br/> Personel Kartları
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Grup 2: Güvenlik & Rota Motoru -->
|
<!-- Grup Sürücü: Sürücü Hızlı İşlemler (Sadece sürücülere görünür veya herkese) -->
|
||||||
<div style="margin-top: 15px;">
|
<div style="margin-top: 15px;" groups="base.group_user">
|
||||||
|
<h3 class="mymach_zara_group_title" style="color: #fbbf24; border-color: rgba(251, 191, 36, 0.25);">Sürücü Hızlı İşlemler</h3>
|
||||||
|
<div class="row text-center">
|
||||||
|
<div class="col-md-3 mb-3">
|
||||||
|
<button name="%(mymach_fleet_intelligence.action_mymach_fleet_contract)d" type="action" class="btn mymach_zara_btn" style="width: 100%;">
|
||||||
|
<i class="fa fa-file-text-o mb-2"></i><br/> Tahsis Sözleşmem
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-3">
|
||||||
|
<button name="%(fleet.fleet_vehicle_log_services_action)d" type="action" class="btn mymach_zara_btn" style="width: 100%;">
|
||||||
|
<i class="fa fa-wrench mb-2"></i><br/> Yakıt & Servis Fişi Ekle
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-3">
|
||||||
|
<button name="%(mymach_fleet_intelligence.action_mymach_fleet_fine)d" type="action" class="btn mymach_zara_btn" style="width: 100%;">
|
||||||
|
<i class="fa fa-ticket mb-2"></i><br/> Trafik Cezalarım
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-3">
|
||||||
|
<button name="%(mymach_fleet_intelligence.action_driver_route_exceptions)d" type="action" class="btn mymach_zara_btn mymach_zara_btn_warning" style="width: 100%; border-color: #ef4444; color: #ef4444;">
|
||||||
|
<i class="fa fa-bell-o mb-2"></i><br/> Bekleyen Rota Uyarılarım
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Grup 2: Güvenlik & Rota Uyum Motoru -->
|
||||||
|
<div style="margin-top: 15px;" groups="mymach_fleet_intelligence.group_mymach_fleet_manager">
|
||||||
<h3 class="mymach_zara_group_title" style="color: #f43f5e; border-color: rgba(244, 63, 94, 0.25);">Güvenlik & Rota Uyum Motoru</h3>
|
<h3 class="mymach_zara_group_title" style="color: #f43f5e; border-color: rgba(244, 63, 94, 0.25);">Güvenlik & Rota Uyum Motoru</h3>
|
||||||
<div class="row text-center">
|
<div class="row text-center">
|
||||||
<div class="col-md-3 mb-3">
|
<div class="col-md-3 mb-3">
|
||||||
@@ -235,7 +269,7 @@ action = {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Otonom Rota Planlama & Sapma Denetimi Bölümü -->
|
<!-- Otonom Rota Planlama & Sapma Denetimi Bölümü -->
|
||||||
<div style="margin-top: 20px; background: rgba(15, 23, 42, 0.4); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 12px; padding: 20px;">
|
<div style="margin-top: 20px; background: rgba(15, 23, 42, 0.4); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 12px; padding: 20px;" groups="mymach_fleet_intelligence.group_mymach_fleet_manager">
|
||||||
<h3 style="color: #38bdf8; font-size: 15px; font-weight: 600; margin-top: 0; margin-bottom: 15px; display: flex; align-items: center; gap: 8px;">
|
<h3 style="color: #38bdf8; font-size: 15px; font-weight: 600; margin-top: 0; margin-bottom: 15px; display: flex; align-items: center; gap: 8px;">
|
||||||
🗺️ OTONOM ROTA PLANLAMA VE SAPMA DENETİMİ (1 KM TOLERANS)
|
🗺️ OTONOM ROTA PLANLAMA VE SAPMA DENETİMİ (1 KM TOLERANS)
|
||||||
</h3>
|
</h3>
|
||||||
|
|||||||
Reference in New Issue
Block a user