This commit is contained in:
cerenX9
2026-07-21 18:54:09 +03:00
parent 03b97ca431
commit b0ccf8bb85
11 changed files with 5948 additions and 1032 deletions

View File

@@ -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

View File

@@ -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

View 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!")

View File

@@ -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 &amp; 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,
} }

View File

@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mymach_fleet_contract_user contract_user model_mymach_fleet_contract group_mymach_fleet_user 1 0 0 0
3 access_mymach_fleet_contract_manager contract_manager model_mymach_fleet_contract group_mymach_fleet_manager 1 1 1 1
4 access_mymach_fleet_maintenance_cost_manager maintenance_cost_manager model_mymach_fleet_maintenance_cost group_mymach_fleet_manager 1 1 1 1
5 access_mymach_fleet_security_log_user log_user model_mymach_fleet_security_log group_mymach_fleet_user 1 1 0 0
6 access_mymach_fleet_security_log_manager log_manager model_mymach_fleet_security_log group_mymach_fleet_manager 1 1 1 1
7 access_mymach_fleet_route_wizard_user route_wizard_user model_mymach_fleet_route_exception_wizard group_mymach_fleet_user 1 1 1 1
8 access_mymach_fleet_reservation_user reservation_user model_mymach_fleet_reservation group_mymach_fleet_user 1 1 1 0

View File

@@ -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>

View File

@@ -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 &amp; 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 &amp; 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 &amp; 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 &amp; Rota Uyum Motoru</h3> <h3 class="mymach_zara_group_title" style="color: #f43f5e; border-color: rgba(244, 63, 94, 0.25);">Güvenlik &amp; 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 &amp; Sapma Denetimi Bölümü --> <!-- Otonom Rota Planlama &amp; 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>