diff --git a/odex25_fleet/odex25_fleet_account_custom/__init__.py b/odex25_fleet/odex25_fleet_account_custom/__init__.py
new file mode 100644
index 000000000..5305644df
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/__manifest__.py b/odex25_fleet/odex25_fleet_account_custom/__manifest__.py
new file mode 100644
index 000000000..22c078916
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/__manifest__.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': "odex25_fleet_account_custom",
+
+ 'summary': """ Customize Integration between fleet and account""",
+
+ 'description': """
+ Customize Integration between fleet and account by separate them with boolean field in setting
+ """,
+
+ 'author': "My Company",
+ 'website': "http://www.yourcompany.com",
+
+ # Categories can be used to filter modules in modules listing
+ # Check https://github.com/odoo/odoo/blob/11.0/odoo/addons/base/module/module_data.xml
+ # for the full list
+ 'category': 'Uncategorized',
+ 'version': '0.1',
+
+ # any module necessary for this one to work correctly
+ 'depends': ['fleet','odex_fleet'],
+
+ # always loaded
+ 'data': [
+ 'security/security_view.xml',
+ 'views/fleet_views.xml'
+ ],
+ # only loaded in demonstration mode
+ # 'demo': [
+ # # 'demo/demo.xml',
+ # ],
+}
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/i18n/ar_001.po b/odex25_fleet/odex25_fleet_account_custom/i18n/ar_001.po
new file mode 100644
index 000000000..996cbcd55
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/i18n/ar_001.po
@@ -0,0 +1,112 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odex25_fleet_account_custom
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-05-13 11:47+0000\n"
+"PO-Revision-Date: 2024-05-13 11:47+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model,name:odex25_fleet_account_custom.model_res_config_settings
+msgid "Config Settings"
+msgstr "ضبط الاعدادات"
+
+#. module: odex25_fleet_account_custom
+#: model:res.groups,name:odex25_fleet_account_custom.disable_integration_with_account
+msgid "Disable Integration With Account"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance__display_name
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel__display_name
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services__display_name
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_form_renew__display_name
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_res_config_settings__display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model,name:odex25_fleet_account_custom.model_fleet_maintenance
+msgid "Fleet Maintenance"
+msgstr "صيانة المركبات"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model,name:odex25_fleet_account_custom.model_form_renew
+msgid "Forn Renew"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model,name:odex25_fleet_account_custom.model_fleet_vehicle_log_fuel
+msgid "Fuel log for vehicles"
+msgstr "سجل الوقود للمركبات"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance__id
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel__id
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services__id
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_form_renew__id
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_res_config_settings__id
+msgid "ID"
+msgstr "المُعرف"
+
+#. module: odex25_fleet_account_custom
+#: model:res.groups,name:odex25_fleet_account_custom.integration_with_account
+msgid "Integration With Account"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance__integration_with_accounting
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel__integration_with_accounting
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services__integration_with_accounting
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_form_renew__integration_with_accounting
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_res_config_settings__integration_with_accounting_configuration
+#: model_terms:ir.ui.view,arch_db:odex25_fleet_account_custom.res_config_settings_inherit
+msgid "Integration With Accounting"
+msgstr "تكامل مع المالية"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance____last_update
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel____last_update
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services____last_update
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_form_renew____last_update
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_res_config_settings____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model,name:odex25_fleet_account_custom.model_fleet_vehicle_log_services
+msgid "Services for vehicles"
+msgstr "الخدمات للمركبات"
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel__state_a
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_fuel__state_b
+msgid "State"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services__status_a
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_vehicle_log_services__status_b
+msgid "Status"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: code:addons/odex25_fleet_account_custom/models/models.py:0
+#, python-format
+msgid "You Need Approve Quotation First"
+msgstr ""
+
+#. module: odex25_fleet_account_custom
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance__state_a
+#: model:ir.model.fields,field_description:odex25_fleet_account_custom.field_fleet_maintenance__state_b
+msgid "state"
+msgstr ""
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/models/__init__.py b/odex25_fleet/odex25_fleet_account_custom/models/__init__.py
new file mode 100644
index 000000000..5305644df
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/models/models.py b/odex25_fleet/odex25_fleet_account_custom/models/models.py
new file mode 100644
index 000000000..e71f5f5cf
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/models/models.py
@@ -0,0 +1,95 @@
+from odoo import api,fields, models ,_
+from odoo.exceptions import UserError, ValidationError
+
+
+
+class FleetFuel(models.Model):
+ _inherit = 'fleet.vehicle.log.fuel'
+
+ integration_with_accounting = fields.Boolean(string='Integration With Accounting',compute="get_integ")
+ state_a = fields.Selection(related='state')
+ state_b = fields.Selection(related='state')
+ @api.depends("vehicle_id")
+ def get_integ(self):
+ config = self.env["res.config.settings"].sudo().search([], limit=1, order="id desc")
+ self.integration_with_accounting = config.integration_with_accounting_configuration
+
+class FleetMaintenance(models.Model):
+ _inherit = 'fleet.maintenance'
+
+ integration_with_accounting = fields.Boolean(string='Integration With Accounting',compute="get_integ")
+ state_a = fields.Selection(related='state')
+ state_b = fields.Selection(related='state')
+ @api.depends("vehicle_id")
+ def get_integ(self):
+ config = self.env["res.config.settings"].sudo().search([],limit=1 ,order ="id desc")
+ self.integration_with_accounting = config.integration_with_accounting_configuration
+
+ def action_approve(self):
+ for rec in self:
+ record = rec.quotation_ids.sudo().filtered(lambda r: r.approve == True)
+ if not record and rec.integration_with_accounting == True:
+ raise ValidationError(_("You Need Approve Quotation First"))
+ else:
+ print("no Validation")
+ rec.state = 'approve'
+ rec.vehicle_id.next_request_date = rec.next_request_date
+
+class FormRenew(models.Model):
+ _inherit = 'form.renew'
+
+ integration_with_accounting = fields.Boolean(string='Integration With Accounting',compute="get_integ")
+
+ @api.depends("vehicle_id")
+ def get_integ(self):
+ config = self.env["res.config.settings"].sudo().search([],limit=1 ,order ="id desc")
+ self.integration_with_accounting = config.integration_with_accounting_configuration
+
+class FleetServices(models.Model):
+ _inherit = 'fleet.vehicle.log.services'
+
+ integration_with_accounting = fields.Boolean(string='Integration With Accounting',compute="get_integ")
+ status_a = fields.Selection(related='status')
+ status_b = fields.Selection(related='status')
+ @api.depends("vehicle_id")
+ def get_integ(self):
+ config = self.env["res.config.settings"].sudo().search([],limit=1 ,order ="id desc")
+ self.integration_with_accounting = config.integration_with_accounting_configuration
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ integration_with_accounting_configuration = fields.Boolean(string='Integration With Accounting',config_parameter='odex25_fleet_account_custom.integration_with_accounting_configuration')
+
+ @api.depends('integration_with_accounting_configuration')
+ def _compute_integration_with_accounting(self):
+ group1 = self.env.ref('odex25_fleet_account_custom.integration_with_account')
+ group2 = self.env.ref('odex25_fleet_account_custom.disable_integration_with_account')
+ for record in self:
+ if record.integration_with_accounting_configuration == True:
+ group1.write({'users': [(4, self.env.user.id)]})
+ group2.write({'users': [(3, self.env.user.id)]})
+ else:
+ group1.write({'users': [(3, self.env.user.id)]})
+ group2.write({'users': [(4, self.env.user.id)]})
+
+
+ @api.model
+ def create(self, values):
+ # Call the create method of the superclass
+ record = super(ResConfigSettings, self).create(values)
+
+ # Call the dependency computation method to perform the desired actions
+ record._compute_integration_with_accounting()
+
+ return record
+
+ def write(self, values):
+ # Call the write method of the superclass
+ result = super(ResConfigSettings, self).write(values)
+
+ # Call the dependency computation method to perform the desired actions
+ self._compute_integration_with_accounting()
+
+ return result
diff --git a/odex25_fleet/odex25_fleet_account_custom/security/security_view.xml b/odex25_fleet/odex25_fleet_account_custom/security/security_view.xml
new file mode 100644
index 000000000..c7b375145
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/security/security_view.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ Integration With Account
+
+
+
+ Disable Integration With Account
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/views/fleet_views.xml b/odex25_fleet/odex25_fleet_account_custom/views/fleet_views.xml
new file mode 100644
index 000000000..32d3b0c25
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/views/fleet_views.xml
@@ -0,0 +1,159 @@
+
+
+
+
+ fleet.vehicle.log.fuel.inherit
+ fleet.vehicle.log.fuel
+
+
+
+
+
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ odex25_fleet_account_custom.integration_with_account
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ fleet.maintenance.inherit
+ fleet.maintenance
+
+
+
+
+
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ odex25_fleet_account_custom.integration_with_account
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.log.services.inherit
+ fleet.vehicle.log.services
+
+
+
+
+
+
+
+ odex25_fleet_account_custom.integration_with_account
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ form.renew.inherit
+ form.renew
+
+
+
+
+
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+ 0
+ 1
+
+
+
+
+
+ res.config.settings.inherit
+ res.config.settings
+
+
+
+ Integration With Accounting
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex25_fleet_account_custom/views/views.xml b/odex25_fleet/odex25_fleet_account_custom/views/views.xml
new file mode 100644
index 000000000..b0878e46e
--- /dev/null
+++ b/odex25_fleet/odex25_fleet_account_custom/views/views.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex25_nadi_custom/__init__.py b/odex25_fleet/odex25_nadi_custom/__init__.py
new file mode 100644
index 000000000..f5ba686bc
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import models
\ No newline at end of file
diff --git a/odex25_fleet/odex25_nadi_custom/__manifest__.py b/odex25_fleet/odex25_nadi_custom/__manifest__.py
new file mode 100644
index 000000000..f8ae32d44
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/__manifest__.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': "Odex25 Nnadi Fleet Custom",
+
+ 'summary': """
+ add new field relational employee in fleet vehicle model""",
+
+ 'description': """
+ add new field relational employee in fleet vehicle model """,
+ 'author': "My Company",
+ 'website': "http://www.yourcompany.com",
+
+ # Categories can be used to filter modules in modules listing
+ # Check https://github.com/odoo/odoo/blob/15.0/odoo/addons/base/data/ir_module_category_data.xml
+ # for the full list
+ 'category': 'Uncategorized',
+ 'version': '0.1',
+
+ # any module necessary for this one to work correctly
+ 'depends': ['base','fleet'],
+
+ # always loaded.....
+ 'data': [
+ 'views/views.xml',
+ ],
+}
diff --git a/odex25_fleet/odex25_nadi_custom/i18n/ar_001.po b/odex25_fleet/odex25_nadi_custom/i18n/ar_001.po
new file mode 100644
index 000000000..ac817dff3
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/i18n/ar_001.po
@@ -0,0 +1,43 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odex25_nadi_custom
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-12-12 09:18+0000\n"
+"PO-Revision-Date: 2023-12-12 09:18+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: odex25_nadi_custom
+#: model:ir.model.fields,field_description:odex25_nadi_custom.field_fleet_vehicle__display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: odex25_nadi_custom
+#: code:addons/odex25_nadi_custom/models/models.py:0
+#: model:ir.model.fields,field_description:odex25_nadi_custom.field_fleet_vehicle__employee_id
+#, python-format
+msgid "Employee"
+msgstr "الفني المكلف بالصيانة"
+
+#. module: odex25_nadi_custom
+#: model:ir.model.fields,field_description:odex25_nadi_custom.field_fleet_vehicle__id
+msgid "ID"
+msgstr "المُعرف"
+
+#. module: odex25_nadi_custom
+#: model:ir.model.fields,field_description:odex25_nadi_custom.field_fleet_vehicle____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: odex25_nadi_custom
+#: model:ir.model,name:odex25_nadi_custom.model_fleet_vehicle
+msgid "Vehicle"
+msgstr "المركبة"
diff --git a/odex25_fleet/odex25_nadi_custom/models/__init__.py b/odex25_fleet/odex25_nadi_custom/models/__init__.py
new file mode 100644
index 000000000..5305644df
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
\ No newline at end of file
diff --git a/odex25_fleet/odex25_nadi_custom/models/models.py b/odex25_fleet/odex25_nadi_custom/models/models.py
new file mode 100644
index 000000000..423902abc
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/models/models.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+from odoo import models, fields, api,_
+
+class Fleet(models.Model):
+ _inherit = 'fleet.vehicle'
+ employee_maintenance_id = fields.Many2one(comodel_name='hr.employee',string=_('Employee'))
diff --git a/odex25_fleet/odex25_nadi_custom/static/description/icon.png b/odex25_fleet/odex25_nadi_custom/static/description/icon.png
new file mode 100644
index 000000000..4141f52da
Binary files /dev/null and b/odex25_fleet/odex25_nadi_custom/static/description/icon.png differ
diff --git a/odex25_fleet/odex25_nadi_custom/views/views.xml b/odex25_fleet/odex25_nadi_custom/views/views.xml
new file mode 100644
index 000000000..640919a70
--- /dev/null
+++ b/odex25_fleet/odex25_nadi_custom/views/views.xml
@@ -0,0 +1,13 @@
+
+
+
+ fleet.form.inherit0
+ fleet.vehicle
+
+
+
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/__init__.py b/odex25_fleet/odex_fleet/__init__.py
new file mode 100644
index 000000000..fe8bf93ac
--- /dev/null
+++ b/odex25_fleet/odex_fleet/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from .import models
+from .import wizards
+from .import reports
diff --git a/odex25_fleet/odex_fleet/__manifest__.py b/odex25_fleet/odex_fleet/__manifest__.py
new file mode 100644
index 000000000..c9256dc6b
--- /dev/null
+++ b/odex25_fleet/odex_fleet/__manifest__.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': "Odex Fleet",
+
+ 'summary': """
+ Manage Fleet and Reports""",
+
+ 'description': """
+Manage Fleet and Reports
+ """,
+
+ 'author': "Expert Co Ltd",
+ 'website': "http://www.ex.com",
+ 'category': 'fleet',
+ 'version': '0.1',
+ 'depends': ['fleet','branch','hr_base'],
+ # 'exp_custody_petty_cash',
+ # 'bi_odoo_multi_branch_hr'
+ # 'hr_base'
+ 'data': [
+ 'security/security_view.xml',
+ 'security/ir.model.access.csv',
+ 'views/vehicle_view.xml',
+ 'views/vehicle_deleation_view.xml',
+ 'views/driver_view.xml',
+ 'views/maintenance_request_view.xml',
+ 'views/renew_view.xml',
+ 'views/config_view.xml',
+ 'views/account_config_view.xml',
+ 'data/cron_data.xml',
+ 'views/mail_template.xml',
+ 'wizards/fleet_view.xml',
+ 'reports/fleet_template.xml',
+ 'reports/maintains_template.xml',
+ 'reports/driver_template.xml',
+ 'reports/renew_template.xml',
+ 'reports/service_template.xml',
+ 'reports/maintains_purchase_request.xml',
+ 'reports/service_purchase_request.xml',
+ 'wizards/reject_reason.xml',
+ 'views/insurance_companies.xml',
+ 'views/infractions.xml',
+ 'wizards/reject_reason_infraction.xml',
+ 'views/driver_departments.xml',
+
+ ]
+}
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/data/cron_data.xml b/odex25_fleet/odex_fleet/data/cron_data.xml
new file mode 100644
index 000000000..8cffbd39e
--- /dev/null
+++ b/odex25_fleet/odex_fleet/data/cron_data.xml
@@ -0,0 +1,60 @@
+
+
+
+
+ Check Driver Expiry
+
+ code
+ model.driver_expired_cron()
+ 1
+ days
+ -1
+
+
+ Check Fleet Expiry
+
+ code
+ model.fleet_expired_cron()
+ 1
+ days
+ -1
+
+
+
+ Check Fleet Maintenance
+
+ code
+ model.fleet_maintenance_cron()
+ 1
+ days
+ -1
+
+
+ Check Delegation Expiry
+
+ code
+ model.delegation_expired_cron()
+ 1
+ days
+ -1
+
+
+ Check Delegation Start
+
+ code
+ model.delegation_start_cron()
+ 1
+ days
+ -1
+
+
+ Check Delegation Close
+
+ code
+ model.delegation_close_cron()
+ 1
+ days
+ -1
+
+
+
diff --git a/odex25_fleet/odex_fleet/i18n/ar_001.po b/odex25_fleet/odex_fleet/i18n/ar_001.po
new file mode 100644
index 000000000..0407a7c28
--- /dev/null
+++ b/odex25_fleet/odex_fleet/i18n/ar_001.po
@@ -0,0 +1,3223 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odex_fleet
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-05-19 11:09+0000\n"
+"PO-Revision-Date: 2024-05-19 11:09+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.delegation_expiration_email_template
+msgid ""
+"\n"
+" \n"
+"
عزيزي العميل \n"
+" نود تذكيركم بقرب انتهاء تفويض سيارة رقم ${(object.vehicle_id.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.vehicle_id.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.end_date)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.operation_number_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب انتهاء كرت التشغيل رقم ${(object.operation_card_number)} للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.operation_card_number)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.check_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب موعد الفحص للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.check_end)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.installment_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب موعد سداد قسط التامين بوليصة رقم ${(object.fleet_id.insurance_number)} بتاريخ ${(object.date)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.form_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب انتهاء الاستمارة للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.form_end)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.driver_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب انتهاء رخصة السائق ${(object.name)} رقم ${(object.license_number)} القائد ${(object.employee_id.name)} والتي تنتهي بتاريخ ${(object.license_end)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.car_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب انتهاء رخصة السير للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.license_end)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,body_html:odex_fleet.insurance_expiration_email_template
+msgid ""
+"\n"
+" \n"
+" عزيزي العميل \n"
+" نود تذكيركم بقرب موعد انتهاء بوليصة التامين رقم ${(object.insurance_number)} للسيارة رقم ${(object.license_plate)} والتي تنتهي بتاريخ ${(object.insurance_end_date)}\n"
+"\n"
+"
\n"
+"\t \n"
+" "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__form
+msgid " Form"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__date
+msgid " Request Date"
+msgstr "تاريخ طلب الصيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__state_ids
+msgid " States"
+msgstr "المحافظة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Vehicle "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Days "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Driver "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Km "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Liter Per Day "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Liter Price Per Day "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Service "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_branch_report_pdf
+msgid "Total Expense "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Total "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Type "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "g/km "
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "kW "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__infraction_type__accident
+msgid "Accident"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__account_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__account_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__account_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__account_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__account_id
+msgid "Account"
+msgstr "الحساب"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.fleet_account_config
+msgid "Account Configuration"
+msgstr "اعدادات الحسابات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Account Details"
+msgstr "بيانات الفاتورة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_needaction
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_needaction
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_ids
+msgid "Activities"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_exception_decoration
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_exception_decoration
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_exception_decoration
+msgid "Activity Exception Decoration"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_state
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_state
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_state
+msgid "Activity State"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_type_icon
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_type_icon
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_type_icon
+msgid "Activity Type Icon"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Additional Details"
+msgstr "بيانات اضافية"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Additional Properties"
+msgstr "اعدادات اضافية"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__all_branch_cost
+msgid "All Branch Cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_all_branch_cost
+msgid "All Branch Expense "
+msgstr "تقرير مركبات الفرع"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.state_cost_report_pdf_act
+msgid "All State Expense Report"
+msgstr "تقرير تكاليف المناطق"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.service_report_pdf_act
+msgid "All State Service Report"
+msgstr "تقرير خدمات المركبة بالمناطق"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_delegation_vehicle_view_search
+msgid "All vehicles"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cost_amount
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__amount
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Amount"
+msgstr "مبلغ الدفعة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__approve
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__approve
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Approve"
+msgstr "اعتماد"
+
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__approve
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__approve
+#: model:ir.model.fields.selection,name:odex_fleet.selection__form_renew__state__approve
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__approve
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__approve
+msgid "Approved"
+msgstr "موافقة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Archived"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_attachment_count
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_attachment_count
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__auto_generated
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__auto_generated
+msgid "Automatically Generated"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__benefits_discounts
+msgid "Benefits/Discounts"
+msgstr "خصم من؟"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_res_branch
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_contract__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__branch_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__branch_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__delegation_type__branch
+#: model:ir.ui.menu,name:odex_fleet.res_branches_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_delegation_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_maintenance_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_view_search
+msgid "Branch"
+msgstr "الفروع"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.all_branch_cost_report_pdf_act
+msgid "Branch Chart Cost Report"
+msgstr "تقرير مركبات الفرع"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__branch_cost
+msgid "Branch Cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_branch_delegation_action
+#: model:ir.ui.menu,name:odex_fleet.branch_delegation_menu
+msgid "Branch Delegation"
+msgstr "تفويض المركبات"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_branch_cost
+msgid "Branch Expense "
+msgstr "تقرير مصروفات فرع"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__brand_ids
+msgid "Brand"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_model_brand
+msgid "Brand of the vehicle"
+msgstr "العلامة التجارية للمركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cal_type
+msgid "Calculation Type"
+msgstr "نوع الحساب"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__cancel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__cancel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__cancel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__form_renew__state__cancel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__cancel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__cancel
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_report_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.wizard_reject_reason_fleet_wiz_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.wizard_reject_reason_infraction_form
+msgid "Cancel"
+msgstr "إلغاء"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.car_category_action
+#: model:ir.model,name:odex_fleet.model_car_category
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__car_category
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__car_category
+#: model:ir.ui.menu,name:odex_fleet.car_category_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_car_category_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_car_category_view_tree
+msgid "Car Category"
+msgstr "فئة السيارة"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.check_expiration_email_template
+msgid "Car Check"
+msgstr "فحص"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__car_consumption
+msgid "Car Consumption"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.car_consumption_cost_report_pdf_act
+msgid "Car Consumption Report"
+msgstr "تقرير مصروفات المركبة"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.form_expiration_email_template
+msgid "Car Form"
+msgstr "استمارة المركبة"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.installment_expiration_email_template
+msgid "Car Installment"
+msgstr "اقساط المركية"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.insurance_expiration_email_template
+msgid "Car Insurance"
+msgstr "تامين المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__car_license
+msgid "Car Licence"
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.car_expiration_email_template
+msgid "Car License"
+msgstr "رخصة المركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_res_config_settings_view_form
+msgid "Car Notification"
+msgstr ""
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.operation_number_expiration_email_template
+msgid "Car Operation Number"
+msgstr "رقم تشغيل المركبة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.action_partner_owner_form
+#: model:ir.model.fields,field_description:odex_fleet.field_res_partner__car_owner
+#: model:ir.model.fields,field_description:odex_fleet.field_res_users__car_owner
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicle_owner_menu
+msgid "Car Owner"
+msgstr "مالك المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__car_weight
+msgid "Car Weight"
+msgstr "وزن المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__employee_cars_count
+msgid "Cars"
+msgstr "السيارات "
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__cost_type
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cost_type
+msgid "Category of the cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__vin_sn
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__vin_sn
+msgid "Chassis Number"
+msgstr "رقم الهيكل"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__check
+msgid "Check"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_delegation_close_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_delegation_close
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_delegation_close
+msgid "Check Delegation Close"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_delegation_expiry_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_delegation_expiry
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_delegation_expiry
+msgid "Check Delegation Expiry"
+msgstr "انتهاء التفويض"
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_delegation_start_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_delegation_start
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_delegation_start
+msgid "Check Delegation Start"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_driver_expiry_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_driver_expiry
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_driver_expiry
+msgid "Check Driver Expiry"
+msgstr "انتهاء فحص السائق"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__check_end
+msgid "Check End Date"
+msgstr "تاريخ انتهاء الفحص"
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_fleet_expiry_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_fleet_expiry
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_fleet_expiry
+msgid "Check Fleet Expiry"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.server,name:odex_fleet.ir_cron_data_check_fleet_maintenance_ir_actions_server
+#: model:ir.cron,cron_name:odex_fleet.ir_cron_data_check_fleet_maintenance
+#: model:ir.cron,name:odex_fleet.ir_cron_data_check_fleet_maintenance
+msgid "Check Fleet Maintenance"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_branch_delegation_action
+msgid "Click to create a new Branch Delegation."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.car_category_action
+msgid "Click to create a new Car Category."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.driver_department_action
+msgid "Click to create a new Department."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_delegation_action
+msgid "Click to create a new Driver Delegation."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_renew_action
+#: model_terms:ir.actions.act_window,help:odex_fleet.insurance_companies_action
+msgid "Click to create a new Form Renew."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fuel_price_action
+msgid "Click to create a new Fuel Price."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.vehicle_infraction_action
+msgid "Click to create a new Infraction."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.man_company_action
+msgid "Click to create a new Manufacture Company."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_costs_action
+msgid "Click to create a new cost."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_log_fuel_action
+msgid "Click to create a new fuel log."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.transmission_setting_action
+msgid "Click to create a new transmission ."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_amount_action
+msgid "Click to create a new type."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__state__close
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__close
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_account_config_form
+msgid "Close"
+msgstr "إلغاء"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_res_company
+msgid "Companies"
+msgstr "مؤسسات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__company_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__company_id
+msgid "Company"
+msgstr "المؤسسة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__name
+msgid "Company Name"
+msgstr "اسم المؤسسة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__computer_number
+msgid "Computer Number"
+msgstr "رقم الحاسوب"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_res_config_settings
+msgid "Config Settings"
+msgstr "ضبط الاعدادات"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__state__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__form_renew__state__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__confirm
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__confirm
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_account_config_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.wizard_reject_reason_fleet_wiz_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.wizard_reject_reason_infraction_form
+msgid "Confirm"
+msgstr "تأكيد"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_car_consumption
+msgid "Consumption Report"
+msgstr "تقرير مصروفات المركبة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_res_partner
+msgid "Contact"
+msgstr "جهة الاتصال"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__contract_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__contract_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_cost__cost_type__contract
+msgid "Contract"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__contract_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__contract_id
+msgid "Contract attached to this cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Contracts"
+msgstr "العقود"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__type__corrective
+msgid "Corrective"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__cost
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__cost
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__qty
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cost_id
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Cost"
+msgstr "سعر الوحدة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__description
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__description
+msgid "Cost Description"
+msgstr "وصف التكلفة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_form
+msgid "Cost Details"
+msgstr "تفاصيل التكلفة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__cost_percentage
+msgid "Cost Percentage%"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Cost Subtype"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Cost Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_cost
+msgid "Cost related to a vehicle"
+msgstr "التكلفة المتعلقة لمركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__cost_subtype_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__cost_subtype_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_services__cost_subtype_id
+msgid "Cost type purchased with this cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_graph
+msgid "Costs Per Month"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Create Invoice"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__create_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__create_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__custody_id
+msgid "Custody"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__date
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__date
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_service_line_config__type__date
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+msgid "Date"
+msgstr "التاريخ"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__date_from
+msgid "Date From"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__date_to
+msgid "Date To"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/wizards/fleet_wiz.py:0
+#, python-format
+msgid "Date To Should Be Greater Than Date From"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__date
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__date
+msgid "Date when the cost has been executed"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__advantage_id
+msgid "Deduction Employee"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fuel_price__uom_id
+msgid "Default unit of measure used for all stock operations."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__delegation_id
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__delegation
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__delegation
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__delegation
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicles_delegation
+msgid "Delegation"
+msgstr "التفويض"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.delegation_expiration_email_template
+msgid "Delegation End"
+msgstr "انتهاء تفويض"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__delegation_end
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "Delegation End Date"
+msgstr "تاريخ انتهاء التفويض"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__delegation_start
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "Delegation Start Date"
+msgstr "تاريخ بداية التفويض"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__delegation_type
+msgid "Delegation Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__department_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__department_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__vehicle_del_type__department
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__entity_type__department
+msgid "Department"
+msgstr "الادارة / القسم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__department_ids
+#: model:ir.ui.menu,name:odex_fleet.driver_department_menu
+msgid "Departments"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.all_branch_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_branch_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+msgid "Description"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_service_line_config__odometer
+msgid "Determine the current mileage value to submit a maintenance request"
+msgstr "تحديد قيمة الأميال الحالية لتقديم طلب الصيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__discount_amount
+msgid "Discount Amount"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_contract__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model_brand__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_all_branch_cost_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_car_consumption_cost_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_delegation_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_fleet_branch_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_invoice_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_maintains_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_renew_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_service_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_state_cost_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_to_renew_report_pdf__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_res_branch__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_res_partner__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__display_name
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__display_name
+msgid "Display Name"
+msgstr "الاسم المعروض"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__state__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__form_renew__state__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__draft
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__draft
+msgid "Draft"
+msgstr "مسودة"
+
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_draft
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Set To Draft"
+msgstr "إرسال الى مسودة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__employee_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__driver_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__employee_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__employee_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__employee_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__employee_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__employee_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__driver
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Driver"
+msgstr "السائق"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_delegation_action
+#: model:ir.ui.menu,name:odex_fleet.vehicle_delegation_menu
+msgid "Driver Delegation"
+msgstr "تفويض سائق مركبة"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.driver_delegation_report_pdf_act
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+msgid "Driver Delegation Report"
+msgstr "تقرير تفويض سائق"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.driver_department_action
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__driver_department
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_department_view_form
+msgid "Driver Department"
+msgstr "قسم السائقين"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_driver_form_view
+msgid "Driver Information"
+msgstr "معلومات السائق"
+
+#. module: odex_fleet
+#: model:mail.template,subject:odex_fleet.driver_expiration_email_template
+msgid "Driver License"
+msgstr "رخصة السائق"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.driver_report_pdf_act
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+msgid "Driver Report"
+msgstr "تقرير السائقين"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle__driver_id
+msgid "Driver of the vehicle"
+msgstr "سائق المركبة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.odex_employees_list_action
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicle_driver_menu
+msgid "Drivers"
+msgstr "السائقين"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Drivers History"
+msgstr "سجل السائقين"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__edit_access
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__edit_access
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__edit_access
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__edit_access
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__edit_access
+msgid "Edit Access"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Effective Costs"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_hr_employee
+msgid "Employee"
+msgstr "الموظف"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Employee Information"
+msgstr "بيانات السائق"
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "Emptying the odometer value of a vehicle is not allowed."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+msgid "End"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__end_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__end_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__end_date
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "End Date"
+msgstr "تاريخ النهاية"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Engine Options"
+msgstr "خيارات المحرك"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__entity_type
+msgid "Entity Type"
+msgstr "نوع الجهة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__first_odometer
+msgid "First Odometer"
+msgstr "عداد المسافة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__fleet_id
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__fleet_id
+msgid "Fleet"
+msgstr ""
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_account
+msgid "Fleet Account Manager"
+msgstr "المدير المالى"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_account_config_action
+msgid "Fleet Account Settings"
+msgstr "اعدادات الحسابات"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.all_branch_cost_report_fleet_report_action
+msgid "Fleet All Branch Expense Report"
+msgstr "تقرير مركبات الفرع"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.branch_cost_cost_report_fleet_report_action
+msgid "Fleet Branch Expense Report"
+msgstr "تقرير تكاليف فرع"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.car_consumption_report_fleet_report_action
+msgid "Fleet Consumption Report"
+msgstr "تقرير مصروفات مركبة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_account_config
+msgid "Fleet Cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.delegation_report_fleet_report_action
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_car_delegation
+msgid "Fleet Delegation Report"
+msgstr "تقرير تفويض سائق"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.driver_report_fleet_report_action
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_car_driver
+msgid "Fleet Driver Report"
+msgstr "تقرير السائقين"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_car_invoice
+msgid "Fleet Expense Invoice Report"
+msgstr "تقرير إستهلاك وقود"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.invoice_report_fleet_report_action
+msgid "Fleet Expense Report"
+msgstr "تقرير إستهلاك وقود"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.invoice_report_pdf_act
+msgid "Fleet Invoice Report"
+msgstr "تقرير إستهلاك وقود"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_maintains
+msgid "Fleet Maintains"
+msgstr "تقرير مركبة تجاوزت الصيانة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.maintains_report_fleet_report_action
+msgid "Fleet Maintains Report"
+msgstr "تقرير مركبة تجاوزت الصيانة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_maintenance_action
+#: model:ir.model,name:odex_fleet.model_fleet_maintenance
+#: model:ir.ui.menu,name:odex_fleet.vehicle_maintenance_menu
+msgid "Fleet Maintenance"
+msgstr "صيانة المركبات"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_to_maintains
+msgid "Fleet Need Maintains"
+msgstr " مركبات تحتاج الصيانة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.to_maintains_report_fleet_report_action
+msgid "Fleet Need Maintains Report"
+msgstr "تقرير مركبة تحت الصيانة"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_to_renew
+msgid "Fleet Need Renew"
+msgstr "بيان تجديد استمارة مركبة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.to_renew_report_fleet_report_action
+msgid "Fleet Need Renew Report"
+msgstr "بيان تجديد استمارة مركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_res_config_settings_view_form
+msgid "Fleet Notification Before"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_quotation
+msgid "Fleet Quotation"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.renew_report_fleet_report_action
+msgid "Fleet Renew Report"
+msgstr "تقرير مركبة تم تجديد استمارة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_report_action
+msgid "Fleet Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_service_line_config
+msgid "Fleet Serive Line"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_quotation_service
+msgid "Fleet Service"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.service_report_fleet_report_action
+msgid "Fleet Service Report"
+msgstr "خدمات المركبة"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.cost_state_report_fleet_report_action
+msgid "Fleet State Expense Report"
+msgstr "تقرير تكاليف المركبات"
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_supervisor
+msgid "Fleet Supervisor"
+msgstr "مشرف الاسطول"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_type
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__fleet_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model__fleet_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__type_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__fleet_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__fleet_type_id
+msgid "Fleet Type"
+msgstr "نوع المركبة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_wiz
+msgid "Fleet Wizard Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_follower_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_follower_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_channel_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_channel_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_channel_ids
+msgid "Followers (Channels)"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_partner_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_partner_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__activity_type_icon
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__activity_type_icon
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__activity_type_icon
+msgid "Font awesome icon e.g. fa-tasks"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__cost_type
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__cost_type
+msgid "For internal purpose only"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__type__form
+msgid "Form"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__form_end
+msgid "Form End Date"
+msgstr "تاريخ انتهاء النموذج"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.insurance_companies_action
+msgid "Form Insurance Companies"
+msgstr "مؤسسات التأمين"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_renew_action
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicle_renew_menu
+msgid "Form Renew"
+msgstr "تجديد استمارة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__form_renew_cost
+msgid "Form Renew Cost"
+msgstr "تكلفة تجديد النموذج"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_form_renew
+msgid "Forn Renew"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "From"
+msgstr "استمارة"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__type__fuel
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_cost__cost_type__fuel
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Fuel"
+msgstr "وقود"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_log_fuel_view_tree
+msgid "Fuel Logs"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fuel_price_action
+#: model:ir.model,name:odex_fleet.model_fuel_price
+#: model:ir.ui.menu,name:odex_fleet.fuel_price_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_fuel_price_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_fuel_price_view_tree
+msgid "Fuel Price"
+msgstr "سعر الوقود"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__fuel_type
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__fuel_type
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__fuel_type
+msgid "Fuel Type"
+msgstr "نوع الوقود"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle__fuel_type
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__fuel_type
+#: model:ir.model.fields,help:odex_fleet.field_fuel_price__fuel_type
+msgid "Fuel Used by the vehicle"
+msgstr "الوقود المستخدم في المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__fuel_consumption
+msgid "Fuel consumption"
+msgstr "استهلاك الوقود"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_log_fuel
+msgid "Fuel log for vehicles"
+msgstr "سجل الوقود للمركبات"
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_gm
+msgid "GM"
+msgstr "المدير العام"
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_vice_gm
+msgid "GM Vice"
+msgstr "نائب المدير العام"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__hr_employee__license_type__general
+msgid "General"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.fleet_branch_report_pdf_act
+msgid "General Cost Report"
+msgstr "تقرير مصروفات المركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "General Properties"
+msgstr "الاعدادات العامة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_delegation_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_maintenance_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_log_fuel_action
+msgid ""
+"Here you can add refuelling entries for all vehicles. You can\n"
+" also filter logs of a particular vehicle using the search\n"
+" field."
+msgstr ""
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_hr
+msgid "Hr Manager"
+msgstr "مدير الموارد البشرية"
+
+#. module: odex_fleet
+#: model:res.groups,name:odex_fleet.fleet_group_hr_officer
+msgid "Hr Officer"
+msgstr "مسؤل الموارد البشرية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__id
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_contract__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model_brand__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__id
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__id
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__id
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__id
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__id
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__id
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__id
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_all_branch_cost_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_car_consumption_cost_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_delegation_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_fleet_branch_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_invoice_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_maintains_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_renew_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_service_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_state_cost_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_to_renew_report_pdf__id
+#: model:ir.model.fields,field_description:odex_fleet.field_res_branch__id
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__id
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__id
+#: model:ir.model.fields,field_description:odex_fleet.field_res_partner__id
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__id
+msgid "ID"
+msgstr "المُعرف"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_exception_icon
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_exception_icon
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_exception_icon
+msgid "Icon"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__activity_exception_icon
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__activity_exception_icon
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__activity_exception_icon
+msgid "Icon to indicate an exception activity."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+msgid "Id Number"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_needaction
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_unread
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_needaction
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_unread
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_needaction
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_unread
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_has_error
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_has_sms_error
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_has_error
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_has_sms_error
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_has_error
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__in_progress
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__in_progress
+msgid "In Progress"
+msgstr "جاري العمل"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__cost_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cost_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__cost_ids
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Included Services"
+msgstr "الخدمات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Indicative Cost"
+msgstr "قيمة الوحدة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Indicative Costs"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__infraction_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__infraction_type__infraction
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_department_view_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_view_search
+msgid "Infraction"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__infraction_cost
+msgid "Infraction Cost"
+msgstr "قيمة المخالفة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__infraction_date
+msgid "Infraction Date"
+msgstr "تاريخ المخالفة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Infraction Information"
+msgstr "بيانات المخالفة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__infraction_number
+msgid "Infraction Number"
+msgstr "رقم المخالفة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__infraction_type
+msgid "Infraction Type"
+msgstr "نوع المخالفة"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.vehicles_infractions
+msgid "Infractions"
+msgstr "مخالفات المركبات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__installment_ids
+msgid "Installment"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__installment
+msgid "Installment "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__installment
+msgid "Installment Notify Before"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__installment_number
+msgid "Installment Number"
+msgstr "عدد الدفعات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__insurance
+msgid "Insurance"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_companies_id
+#: model:ir.ui.menu,name:odex_fleet.insurance_companies_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.insurance_companies_view_form
+msgid "Insurance Companies"
+msgstr "مؤسسات التأمين"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_cost
+msgid "Insurance Cost"
+msgstr "الملف التأمينى"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_attachment
+msgid "Insurance Docs"
+msgstr "الملف التأمينى"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_end_date
+msgid "Insurance End Date"
+msgstr "تاريخ نهاية التأمين"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Insurance Information"
+msgstr "معلومات التأمين"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_insurance_installment
+msgid "Insurance Installment"
+msgstr "أقساط التأمين"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__insurance
+msgid "Insurance Notify Before"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_number
+msgid "Insurance Number"
+msgstr "الرقم التأمينى"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__insurance_start_date
+msgid "Insurance Start Date"
+msgstr "تاريخ بداية التأمين"
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "Insurance Start Date must be less than or equal Insurance End Date "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__invoice_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__invoice_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__invoice_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__invoice_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__invoice
+msgid "Invoice"
+msgstr "فاتورة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Invoice Number"
+msgstr "رقم الفاتورة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__inv_ref
+msgid "Invoice Reference"
+msgstr "مرجع الفاتورة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "Invoice Report"
+msgstr "تقرير الفاتورة"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__invoiced
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__invoiced
+msgid "Invoiced"
+msgstr "مفوتر"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__driver
+msgid "Is Driver"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_is_follower
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_is_follower
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Job"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__km_number
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+msgid "KM Number"
+msgstr "الفرق بين عداد المسافة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__last_branch_id
+msgid "Last Branch"
+msgstr "اخر فرع"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__last_department_id
+msgid "Last Department"
+msgstr "اخر قسم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_contract____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model_brand____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_all_branch_cost_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_car_consumption_cost_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_delegation_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_driver_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_fleet_branch_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_invoice_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_maintains_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_renew_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_service_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_state_cost_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_report_odex_fleet_to_renew_report_pdf____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_res_branch____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_res_partner____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation____last_update
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction____last_update
+msgid "Last Modified on"
+msgstr "آخر تعديل في"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__odometer
+msgid "Last Odometer"
+msgstr "اخر قيمة لعداد المسافة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__last_project_id
+msgid "Last Project"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__write_uid
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_car_category__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_companies__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__write_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__license
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__license
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+msgid "License"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__license_attache
+msgid "License Attachment"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__license_end
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__license_end
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__license_end
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__license_end
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "License End"
+msgstr "تاريخ انتهاء الرخصة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_driver_form_view
+msgid "License Information"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__license_number
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__license_number
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__license_number
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "License Number"
+msgstr "رقم رخصة السياقة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__license_plate
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__license_plate
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__license_plate
+msgid "License Plate"
+msgstr "رقم اللوحة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__license_start
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "License Start"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__license_type
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "License Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__license_plate
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__license_plate
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_infraction__license_plate
+msgid "License plate number of the vehicle (i = plate number for a car)"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__line_id
+msgid "Line"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__liter
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__cal_type__liter
+msgid "Liter"
+msgstr "لتر"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle__location
+msgid "Location of the vehicle (garage, ...)"
+msgstr "موقع السيارة (المرآب، ...)"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_main_attachment_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_main_attachment_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__maintenance_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__type__maintenance
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__maintains
+#: model:ir.ui.menu,name:odex_fleet.fleet_maintenance_root
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Maintenance"
+msgstr "صيانة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Maintenance Date"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.maintains_purchase_req_act
+msgid "Maintenance Purchase Request"
+msgstr "طلب أمر شراء"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.maintains_report_pdf_act
+msgid "Maintenance Report"
+msgstr "تقرير مركبة تحتاج صيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__request_id
+msgid "Maintenance Request"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Maintenance Settings"
+msgstr "اعدادات الصيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__type
+msgid "Maintenance Type"
+msgstr "نوع الصيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__man_company
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model__man_company_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_model_brand__man_company_id
+msgid "Man Company"
+msgstr "المؤسسة الاساسية"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.man_company_action
+#: model:ir.model,name:odex_fleet.model_manufacture_company
+#: model:ir.model.fields,field_description:odex_fleet.field_manufacture_company__man_company
+#: model:ir.ui.menu,name:odex_fleet.man_company_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_man_company_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_man_company_view_tree
+msgid "Manufacture Company"
+msgstr "مؤسسة الصنع"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Manufacture Year"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_has_error
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_has_error
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__model_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__model_id
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Model"
+msgstr "موديل المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__model_id
+msgid "Model Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_model
+msgid "Model of a vehicle"
+msgstr "موديل مركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle__model_id
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__model_id
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_infraction__model_id
+msgid "Model of the vehicle"
+msgstr "موديل المركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Month"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__my_activity_date_deadline
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__my_activity_date_deadline
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__my_activity_date_deadline
+msgid "My Activity Deadline"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_driver_department__name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__name
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__name
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__name
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__name
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__name
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+msgid "Name"
+msgstr "الاسم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__new_date
+msgid "New End Date"
+msgstr "تاريخ انتهاء الاستمارة الجديدة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_date_deadline
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_date_deadline
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_date_deadline
+msgid "Next Activity Deadline"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_summary
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_summary
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_summary
+msgid "Next Activity Summary"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_type_id
+msgid "Next Activity Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__next_request_date
+msgid "Next Maintenance Date"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__next_odometer
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__next_odometer
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__odometer
+msgid "Next Odometer"
+msgstr "عداد المسافة القادم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__next_request_date
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__date
+msgid "Next Request Date"
+msgstr "تاريخ الصيانة القادم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_service_line_config__date
+msgid "Next Request Date Of Maintenance Request"
+msgstr "تاريخ الصيانة القادم"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__notes
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Notes"
+msgstr "ملاحظات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__car_license
+msgid "Notify Before Car Licence"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__check
+msgid "Notify Before Check"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__form
+msgid "Notify Before Form"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__number
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__number
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__number
+msgid "Number"
+msgstr "الكمية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_needaction_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_needaction_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_has_error_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_has_error_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_needaction_counter
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_needaction_counter
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_has_error_counter
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_has_error_counter
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__message_unread_counter
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__message_unread_counter
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__message_unread_counter
+msgid "Number of unread messages"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__odometer
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__odometer_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__odometer_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_service_line_config__type__odometer
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Odometer"
+msgstr "عداد المسافات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Odometer Details"
+msgstr "بيانات عداد المسافة"
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "Odometer Should Be Greater Than 0"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__odometer
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__odometer
+msgid "Odometer Value"
+msgstr "قيمة عداد المسافة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__odometer
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__odometer_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__odometer
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__odometer_id
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__odometer
+msgid "Odometer measure of the vehicle at the moment of this log"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.actions.act_window,help:odex_fleet.fleet_vehicle_costs_action
+msgid ""
+"Odoo helps you managing the costs for your different\n"
+" vehicles. Costs are created automatically from services,\n"
+" contracts (fixed or recurring) and fuel logs."
+msgstr ""
+
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__type__form
+msgid "Form"
+msgstr "استمارة"
+
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__offer
+msgid "Offer Attachment"
+msgstr "مرفق العرض"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Oil"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__old_branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__old_branch_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__old_branch_id
+msgid "Old Branch"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__old_vehicle_id
+msgid "Old Vehicle"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Operation"
+msgstr "العملية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__operation
+msgid "Operation Card"
+msgstr "كارت العملية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__operation_card_end
+msgid "Operation Card End"
+msgstr "تاريخ انتهاء العملية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__operation_card_number
+msgid "Operation Card Number"
+msgstr "رقم كارت العملية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__operation
+msgid "Operation Notify Before"
+msgstr "الاخطار قبل العملية"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_cost__cost_type__other
+msgid "Other"
+msgstr "اخرى"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__owner_id
+msgid "Owner"
+msgstr "المالك"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_insurance_installment__paid
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__paid
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+msgid "Paid"
+msgstr "إنشاء فاتورة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__parent_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__parent_id
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Parent"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__parent_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__parent_id
+msgid "Parent cost to this current cost"
+msgstr "التكلفة الأصلية لهذه التكلفة الحالية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__partner_id
+msgid "Partner"
+msgstr "العميل"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__penalty_cost
+msgid "Penalty Cost"
+msgstr "قيمة مخالفات التأخير"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Percentage"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Plate"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__type__preventive
+msgid "Preventive"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__price
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_log_fuel_view_tree
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Price"
+msgstr "السعر"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__price_per_liter
+msgid "Price Per Liter"
+msgstr "قيمة اللتر"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_report_form
+msgid "Print PDF"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__hr_employee__license_type__private
+msgid "Private"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__project_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__project_id
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__vehicle_del_type__project
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__entity_type__project
+msgid "Project"
+msgstr "مشروع"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__hr_employee__license_type__public
+msgid "Public"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__purchaser_id
+msgid "Purchaser"
+msgstr "السائق"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__quotation_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__service_ids
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+msgid "Quotations"
+msgstr "الفواتير"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__reason
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_infraction_wiz__reason
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__reason
+msgid "Reason"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__receive_date
+msgid "Receive Date"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.delegation_receive_report_pdf_act
+msgid "Receive Report"
+msgstr "تقرير الاستلام"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+msgid "Refueling Details"
+msgstr "بيانات تعبئة الوقود"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_maintenance__state__refused
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Refuse"
+msgstr "رفض"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__state__refused
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_services__status__refused
+#: model:ir.model.fields.selection,name:odex_fleet.selection__form_renew__state__refused
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__state__refused
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_infraction__state__refused
+msgid "Refused"
+msgstr "مرفوض"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+msgid "Reject"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/infractions.py:0
+#: code:addons/odex_fleet/models/maintenance_request.py:0
+#: code:addons/odex_fleet/models/vehicle_deleation.py:0
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__reason
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__reason
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__reason
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+#, python-format
+msgid "Reject Reason"
+msgstr "سبب الرفض"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_reject_reason_fleet_wiz
+msgid "Reject Wiz"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__renew
+msgid "Renew"
+msgstr "تجديد"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_type__amount
+msgid "Renew Amount"
+msgstr "قيمة تجديد الاستمارة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__cost
+msgid "Renew Cost"
+msgstr "قيمة التجديد"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.renew_report_pdf_act
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_renew
+msgid "Renew Report"
+msgstr "تقرير مركبة تم تجديد إستمارة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_fleet_branch_report_pdf
+msgid "Report Branch"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_all_branch_cost_report_pdf
+msgid "Report Branch Cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_car_consumption_cost_report_pdf
+msgid "Report Consumption"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_driver_delegation_report_pdf
+msgid "Report Delegation"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_driver_report_pdf
+msgid "Report Driver"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_service_report_pdf
+msgid "Report Fleet Service"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_invoice_report_pdf
+msgid "Report Invoice"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_maintains_report_pdf
+msgid "Report Mainatains"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_renew_report_pdf
+msgid "Report Renew"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_state_cost_report_pdf
+msgid "Report State Cotst"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_report_odex_fleet_to_renew_report_pdf
+msgid "Report To Renew"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__report_type
+msgid "Report Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__request_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__request_id
+#: model:ir.model.fields,field_description:odex_fleet.field_reject_reason_fleet_wiz__request_id
+msgid "Request"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__date
+msgid "Request Date"
+msgstr "تاريخ الطلب"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__user_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__user_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__user_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__user_id
+msgid "Responsible"
+msgstr "المسؤول"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__activity_user_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__activity_user_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__activity_user_id
+msgid "Responsible User"
+msgstr "المستخدم المسؤول"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_has_sms_error
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_has_sms_error
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Serial"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__serial_number
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__serial_number
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__serial_number
+msgid "Serial Number"
+msgstr "الرقم المسلسل"
+
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/fleet_service_type.py:0
+#, python-format
+msgid "service"
+msgstr "الخدمة"
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/fleet_service_type.py:0
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__service_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__service_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__service_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__service_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__service_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_res_config_settings__service
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_account_config__type__service
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__service
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+msgid "Service"
+msgstr "الخدمة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_res_company__service
+msgid "Service Notify Before"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__partner_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__partner_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__partner_id
+msgid "Service Provider"
+msgstr "مقدم الخدمة"
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_car_service
+msgid "Service Report"
+msgstr " تكاليف خدمات "
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__service_type_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__cost_subtype_ids
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Service Type"
+msgstr "نوع الخدمة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__service_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__service_id
+msgid "Service cost to this current cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__service_ids
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_cost__cost_type__services
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "Services"
+msgstr "الخدمات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Services Details"
+msgstr "بيانات الخدمة"
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.services_purchase_req_act
+msgid "Services Purchase Request"
+msgstr "طلب أمر شراء"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_log_services
+msgid "Services for vehicles"
+msgstr "الخدمات للمركبات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__state
+msgid "Stage"
+msgstr "المرحلة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Start"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__start_date
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__start_date
+msgid "Start Date"
+msgstr "تاريخ البداية"
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/infractions.py:0
+#: code:addons/odex_fleet/models/vehicle_deleation.py:0
+#, python-format
+msgid "Start Date must be less than or equal End Date "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__state
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__state
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__state
+#: model:ir.model.fields,field_description:odex_fleet.field_res_branch__state_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__state
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__state_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__state
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_delegation_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_maintenance_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_view_search
+msgid "State"
+msgstr "الحالة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__states
+msgid "State"
+msgstr "المحافظة"
+
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__state_cost
+msgid "State Cost"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.menu_fleet_reporting_state_cost
+msgid "State Expense "
+msgstr "تكلفة المناطق "
+
+#. module: odex_fleet
+#: model:ir.ui.menu,name:odex_fleet.res_states_menu
+msgid "States"
+msgstr "المناطق / المحافظات"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__status
+msgid "Status"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__activity_state
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__activity_state
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__activity_state
+msgid ""
+"Status based on activities\n"
+"Overdue: Due date is already passed\n"
+"Today: Activity date is today\n"
+"Planned: Future activities."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.report,name:odex_fleet.to_renew_report_pdf_act
+msgid "TO Renew Report"
+msgstr "بيان تجديد استمارة مركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__tax_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__tax_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__price_tax
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__tax_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__tax_id
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__tax_id
+msgid "Tax"
+msgstr "الضريبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__last_branch_id
+msgid "The last Branch the vehicle was authorized for"
+msgstr "اخر فرع تم تفويض المركبة له"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__last_department_id
+msgid "The last Department the vehicle was authorized for"
+msgstr "اخر قسم تم تفويض المركبة له"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__first_odometer
+msgid "The odometer value at the moment the car is authorized"
+msgstr "قيمة عداد المسافة لحظة تفويض السيارة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__km_number
+msgid ""
+"The value of the difference between the odometer at the moment of delivery "
+"and receipt"
+msgstr "قيمة الفرق بين عداد المسافة لحظة التسليم والاستلام"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.invoice_report_pdf
+msgid "To"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__to_maintains
+msgid "To Maintenance"
+msgstr "الى الصيانة"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_wiz__report_type__to_renew
+msgid "To Renew"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__total1
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation_service__total
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__total
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__total
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__total_price_tax
+#: model:ir.model.fields.selection,name:odex_fleet.selection__fleet_vehicle_log_fuel__cal_type__total
+#: model_terms:ir.ui.view,arch_db:odex_fleet.all_branch_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_branch_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Total"
+msgstr "الاجمالى"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__total_cost
+msgid "Total Cost"
+msgstr "اجمالى التكلفة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_branch_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+msgid "Total Expense"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.all_branch_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Total Percentage"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__amount
+msgid "Total Price"
+msgstr "التكلفة الإجمالية"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__amount
+msgid "Total Untax"
+msgstr "المجموع بدون الضريبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+msgid "Total Vehicle Expense By state Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.all_branch_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_branch_report_pdf
+msgid "Total Vehicle Expense For Branch Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.state_cost_report_pdf
+msgid "Total Vehicle For State"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Totals"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+msgid "Totel"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__transmission_id
+#: model:ir.model.fields,field_description:odex_fleet.field_transmission_setting__transmission
+msgid "Transmission"
+msgstr "نوع ناقل الحركة "
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.transmission_setting_action
+#: model:ir.ui.menu,name:odex_fleet.transmission_setting_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_transmission_setting_view_tree
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_transmission_view_form
+msgid "Transmission Type"
+msgstr "نوع الناقل"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_transmission_setting
+msgid "Trnsmission Setting"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_account_config__type
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_service_line_config__type
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__cost_subtype_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__cost_subtype_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_services__cost_subtype_id
+#: model_terms:ir.ui.view,arch_db:odex_fleet.car_consumption_cost_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_delegation_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.driver_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_type_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_type_view_tree
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Type"
+msgstr "النوع"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__activity_exception_decoration
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__activity_exception_decoration
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__activity_exception_decoration
+msgid "Type of the exception activity on record."
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__vin_sn
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_infraction__vin_sn
+msgid "Unique number written on the vehicle motor (VIN/SN number)"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__odometer_unit
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__odometer_unit
+msgid "Unit"
+msgstr "وحدة القياس"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fuel_price__uom_id
+msgid "Unit of Measure"
+msgstr "وحدة القياس"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__odometer_unit
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__odometer_unit
+msgid "Unit of the odometer "
+msgstr "وحدة القياس العداد"
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_unread
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_unread
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_unread
+msgid "Unread Messages"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__message_unread_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__message_unread_counter
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_cost__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__vehicle_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_hr_employee__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__vehicle_id
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_infraction__vehicle_id
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_delegation_vehicle_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.hr_kanban_view
+msgid "Vehicle"
+msgstr "المركبة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_fleet_vehicle_log_contract
+msgid "Vehicle Contract"
+msgstr "عقد المركبة "
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_costs_action
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicle_costs_menu
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_cost_view_tree
+msgid "Vehicle Costs"
+msgstr "تكلفة المركبات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Vehicle Costs by Month"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__vehicle_del_type
+msgid "Vehicle Del Type"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_vehicle_delegation
+msgid "Vehicle Deleagation"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+msgid "Vehicle Details"
+msgstr "بيانات المركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+msgid "Vehicle Form Renew Cost Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "Vehicle Form To Renew Cost Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_form_renew_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_request_maintenance_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+#: model_terms:ir.ui.view,arch_db:odex_fleet.vehicle_infraction_view_form
+msgid "Vehicle Information"
+msgstr "بيانات المركبة"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_vehicle_infraction
+msgid "Vehicle Infraction"
+msgstr "مخالفات المركبات"
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.vehicle_infraction_action
+#: model:ir.ui.menu,name:odex_fleet.vehicles_infractions_menu
+msgid "Vehicle Infractions"
+msgstr "مخالفات المركبات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Vehicle Maintenance Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.maintains_report_pdf
+msgid "Vehicle Need Maintenance Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.service_report_pdf
+msgid "Vehicle Service By state Report"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_amount_action
+#: model:ir.ui.menu,name:odex_fleet.fleet_type_menu
+msgid "Vehicle Type"
+msgstr "نوع المركبة"
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_cost__vehicle_id
+#: model:ir.model.fields,help:odex_fleet.field_fleet_vehicle_log_fuel__vehicle_id
+msgid "Vehicle concerned by this log"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_form
+msgid "Vehicle costs"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.actions.act_window,name:odex_fleet.fleet_vehicle_log_fuel_action
+#: model:ir.ui.menu,name:odex_fleet.fleet_vehicle_log_fuel_menu
+msgid "Vehicles Fuel Logs"
+msgstr "سجلات وقود المركبات"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_cost_indicative_view_graph
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_cost_indicative_view_pivot
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_cost_view_graph
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_cost_view_pivot
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Vehicles costs"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle_log_fuel__vendor_id
+msgid "Vendor"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__website_message_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_form_renew__website_message_ids
+#: model:ir.model.fields,field_description:odex_fleet.field_vehicle_delegation__website_message_ids
+msgid "Website Messages"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_fleet_maintenance__website_message_ids
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__website_message_ids
+#: model:ir.model.fields,help:odex_fleet.field_vehicle_delegation__website_message_ids
+msgid "Website communication history"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_vehicle__location
+msgid "Work Location"
+msgstr "مكان ايقاف المركبة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_fuel_view_form
+msgid "Write here any other information"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_fleet_vehicle_log_services_view_form
+msgid "Write here any other information related to the service completed."
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_costs_view_search
+msgid "Year"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/maintenance_request.py:0
+#, python-format
+msgid "You Can Not Approve More Than One Quotation"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/maintenance_request.py:0
+#, python-format
+msgid "You NEED To ADD And Approve Quotation Lines"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/maintenance_request.py:0
+#, python-format
+msgid "You Need Approve Quotation First"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle_deleation.py:0
+#, python-format
+msgid "You Need To Close Other Delegation Request for this Vehicle"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/form_renew.py:0
+#: code:addons/odex_fleet/models/maintenance_request.py:0
+#: code:addons/odex_fleet/models/vehicle.py:0
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "You Need To Configurate Account Details"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/account_config.py:0
+#, python-format
+msgid "You can not Have More than one Confirm record "
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,help:odex_fleet.field_form_renew__date
+msgid "date of current maintenance request"
+msgstr "تاريخ طلب الصيانة الحالي"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.fleet_vehicle_delegation_view_form
+msgid "delegated entity"
+msgstr "الجهة المفوض إليها"
+
+#. module: odex_fleet
+#: model:ir.model.fields.selection,name:odex_fleet.selection__vehicle_delegation__delegation_type__driver
+msgid "driver"
+msgstr "السائق"
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_driver_department
+msgid "driver.department"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "e.g. Model S"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "e.g. PAE 326"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_insurance_companies
+msgid "insurance.companies"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "liter Should Be Greater Than 0"
+msgstr ""
+
+#. module: odex_fleet
+#: code:addons/odex_fleet/models/vehicle.py:0
+#, python-format
+msgid "odometer should be more than current odometer"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_wiz__project_ids
+msgid "projects"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model,name:odex_fleet.model_reject_reason_infraction_wiz
+msgid "reject.reason.infraction.wiz"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "show the contract for this vehicle"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "show the odometer logs for this vehicle"
+msgstr ""
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.odex_view_fleet_vehicle_form
+msgid "show the services logs for this vehicle"
+msgstr ""
+
+#. module: odex_fleet
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_maintenance__state
+#: model:ir.model.fields,field_description:odex_fleet.field_fleet_quotation__state
+msgid "state"
+msgstr "الحالة"
+
+#. module: odex_fleet
+#: model_terms:ir.ui.view,arch_db:odex_fleet.renew_report_pdf
+#: model_terms:ir.ui.view,arch_db:odex_fleet.to_renew_report_pdf
+msgid "التاريخ :"
+msgstr ""
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/__init__.py b/odex25_fleet/odex_fleet/models/__init__.py
new file mode 100644
index 000000000..f6402966b
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/__init__.py
@@ -0,0 +1,11 @@
+from . import driver
+from . import vehicle
+from . import vehicle_deleation
+from . import maintenance_request
+from . import res_config
+from . import form_renew
+from . import account_config
+from . import insurance_companies
+from . import infractions
+from . import driver_departments
+from . import fleet_service_type
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/account_config.py b/odex25_fleet/odex_fleet/models/account_config.py
new file mode 100644
index 000000000..13ba82ef7
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/account_config.py
@@ -0,0 +1,32 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+
+class AccountConfigFleet(models.Model):
+ _name = 'fleet.account.config'
+ _description = 'Fleet Cost'
+
+ name = fields.Char(string="Name")
+ state = fields.Selection(selection=[('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('close', 'Close')
+ ],default='draft')
+ type = fields.Selection(selection=[('fuel', 'Fuel'),
+ ('service', 'Service'),
+ ('form', 'Form'),
+ ('maintenance', 'Maintenance'),
+ ],)
+ account_id = fields.Many2one('account.account', string="Account")
+ tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict')
+
+
+ def action_confirm(self):
+ rec = self.env['fleet.account.config'].sudo().search([('id','!=',self.id),('type','=',self.type),('state','=','confirm')])
+ if rec:
+ raise ValidationError(_("You can not Have More than one Confirm record "))
+ self.state = 'confirm'
+
+ def action_close(self):
+ self.state = 'close'
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/driver.py b/odex25_fleet/odex_fleet/models/driver.py
new file mode 100644
index 000000000..203e42be4
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/driver.py
@@ -0,0 +1,52 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+
+class HRCustom(models.Model):
+ _inherit = 'hr.employee'
+
+ driver = fields.Boolean(string="Is Driver")
+ license_type = fields.Selection(selection=[('private', 'Private'), ('general', 'General'), ('public', 'Public')],
+ string="License Type")
+ license_number = fields.Char(string="License Number")
+ license_start = fields.Date(string="License Start")
+ license_end = fields.Date(string="License End")
+ vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle")
+ old_vehicle_id = fields.Many2one('fleet.vehicle', string="Old Vehicle")
+ delegation_start = fields.Date(string="Delegation Start Date")
+ delegation_end = fields.Date(string="Delegation End Date")
+ receive_date = fields.Date(string="Receive Date",readonly=True)
+ license_attache = fields.Binary(string="License Attachment")
+ employee_cars_count = fields.Integer(compute="_compute_employee_cars_count", string="Cars",groups="base.group_user")
+
+ def _compute_employee_cars_count(self):
+ driver_ids = (self.mapped('user_id.partner_id') | self.sudo().mapped('address_home_id')).ids
+ fleet_data = self.env['fleet.vehicle.assignation.log'].read_group(
+ domain=[('driver_id', 'in', driver_ids)], fields=['vehicle_id:array_agg'], groupby=['driver_id'])
+ mapped_data = {
+ group['driver_id'][0]: len(set(group['vehicle_id']))
+ for group in fleet_data
+ }
+ for employee in self:
+ drivers = employee.user_id.partner_id | employee.sudo().address_home_id
+ employee.employee_cars_count = sum(mapped_data.get(pid, 0) for pid in drivers.ids)
+
+ @api.onchange('delegation_start', 'receive_date')
+ def _onchange_delegation_start(self):
+ for r in self:
+ r.receive_date = r.delegation_start
+
+ @api.model
+ def driver_expired_cron(self):
+ date = datetime.now().date()
+ license = self.company_id.license
+ if license > 0:
+ date = date + relativedelta(days=license)
+ fleet = self.env['hr.employee'].sudo().search([('driver','=',True),('license_end', '<=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.driver_expiration_email_template', False)
+ template.send_mail(f.id)
+
+
diff --git a/odex25_fleet/odex_fleet/models/driver_departments.py b/odex25_fleet/odex_fleet/models/driver_departments.py
new file mode 100644
index 000000000..255bfb684
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/driver_departments.py
@@ -0,0 +1,10 @@
+from odoo import models, fields, api, _
+
+
+class DriverDepartment(models.Model):
+ _name = 'driver.department'
+ # _rec_name = 'driver_department_id'
+
+ name = fields.Char('Name' , related = "department_id.name")
+ department_id = fields.Many2one('hr.department', string='Department')
+ branch_id = fields.Many2one('res.branch', string='Branch')
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/fleet_service_type.py b/odex25_fleet/odex_fleet/models/fleet_service_type.py
new file mode 100644
index 000000000..173911711
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/fleet_service_type.py
@@ -0,0 +1,14 @@
+from odoo import models, fields, api, _
+from odoo.api import returns
+
+
+class FleetServiceType(models.Model):
+ _inherit = 'fleet.service.type'
+ _description = 'Fleet Service Type'
+
+ category = fields.Selection(selection='get_new_category_selection', string='Category', required=True,
+ help='Choose whether the service refer to contracts, vehicle services or both')
+
+ def get_new_category_selection(self):
+ selection = [(_('service'), _('Service'))]
+ return selection
diff --git a/odex25_fleet/odex_fleet/models/form_renew.py b/odex25_fleet/odex_fleet/models/form_renew.py
new file mode 100644
index 000000000..55aee5c21
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/form_renew.py
@@ -0,0 +1,115 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+
+class FormRenew(models.Model):
+ _name = 'form.renew'
+ _description = 'Forn Renew'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ @api.model
+ def default_get(self, default_fields):
+ res = super(FormRenew, self).default_get(default_fields)
+ rec = self.env['fleet.account.config'].sudo().search([('type', '=', 'form'), ('state', '=', 'confirm')],
+ limit=1)
+ if rec and self.env.user.has_group("odex25_fleet_account_custom.integration_with_account"):
+ res['account_id'] = rec.account_id.id
+ res['tax_id'] = rec.tax_id.id
+ elif self.env.user.has_group("odex25_fleet_account_custom.disable_integration_with_account"):
+ pass
+ else:
+ raise ValidationError(_("You Need To Configurate Account Details"))
+ return res
+
+ name = fields.Char(string="Name")
+ branch_id = fields.Many2one('res.branch', string="Branch")
+
+ state = fields.Selection(selection=[('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel'),
+ ], default='draft')
+ company_id = fields.Many2one('res.company', string='Company', readonly=True,
+ default=lambda self: self.env.user.company_id)
+
+ vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", )
+ cost = fields.Float(string="Renew Cost", )
+ date = fields.Date(string="Request Date", default=fields.Date.context_today,
+ help="date of current maintenance request")
+ user_id = fields.Many2one('res.users', string='Responsible', required=False, default=lambda self: self.env.user)
+ end_date = fields.Date(string="End Date")
+ new_date = fields.Date(string="New End Date")
+ branch_id = fields.Many2one('hr.department', string="Branch")
+ account_id = fields.Many2one('account.account', string="Account")
+ invoice_id = fields.Many2one('account.move', string="Invoice", copy=False)
+ partner_id = fields.Many2one('res.partner', string="Service Provider")
+ tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict')
+ penalty_cost = fields.Float()
+ edit_access = fields.Boolean(compute="get_access", )
+
+ def get_access(self):
+ for rec in self:
+ rec.edit_access = False
+ if rec.state == 'confirm' and self.env.user.has_group('odex_fleet.fleet_group_account'):
+ rec.edit_access = True
+
+ @api.onchange('vehicle_id')
+ def get_fleet_data(self):
+ if self.vehicle_id:
+ self.branch_id = self.vehicle_id.branch_id.id
+ self.cost = self.vehicle_id.fleet_type_id.amount
+ self.end_date = self.vehicle_id.form_end
+
+ def create_invoice(self):
+ invoice = self.env['account.move'].sudo().create({
+ 'partner_id': self.partner_id.id,
+ 'currency_id': self.env.user.company_id.currency_id.id,
+ # 'account_id': self.partner_id.property_account_payable_id.id,
+ 'branch_id': self.vehicle_id.branch_id.id,
+ 'move_type': 'in_invoice',
+ 'invoice_date': datetime.now().today(),
+ 'invoice_line_ids': [(0, 0, {
+ 'quantity': 1,
+ 'price_unit': self.cost + self.penalty_cost,
+ # 'move_id': invoice.id,
+ 'name': 'Fleet Form Renew Cost',
+ 'account_id': self.account_id.id,
+ 'tax_ids': [(6, 0, [self.tax_id.id])],
+ })]
+ })
+ # self.env['account.move.line'].with_context(check_move_validity=False).sudo().create({
+ # 'quantity': 1,
+ # 'price_unit': self.cost+self.penalty_cost,
+ # 'move_id': invoice.id,
+ # 'name': 'Fleet Form Renew Cost',
+ # 'account_id': self.account_id.id,
+ # 'tax_ids': [(6, 0, [self.tax_id.id])],
+ #
+ # })
+ self.invoice_id = invoice.id
+ # invoice.sudo().action_invoice_open()
+
+ def set_to_draft(self):
+ for rec in self:
+ rec.state = 'draft'
+
+ def action_confirm(self):
+ for rec in self:
+ rec.state = 'confirm'
+
+ def action_approve(self):
+ for rec in self:
+ rec.vehicle_id.form_end = self.new_date
+ rec.state = 'approve'
+ rec.create_invoice()
+
+ def action_refuse(self):
+ for rec in self:
+ rec.state = 'refused'
+
+ def action_cancel(self):
+ for rec in self:
+ rec.state = 'cancel'
diff --git a/odex25_fleet/odex_fleet/models/infractions.py b/odex25_fleet/odex_fleet/models/infractions.py
new file mode 100644
index 000000000..9be37807a
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/infractions.py
@@ -0,0 +1,109 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+
+
+
+class Infractions(models.Model):
+ _name = 'vehicle.infraction'
+ _description = 'Vehicle Infraction'
+
+ vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", )
+ branch_id = fields.Many2one('res.branch', string="Branch")
+ old_branch_id = fields.Many2one('res.branch', string="Old Branch")
+ start_date = fields.Date(string="Start Date")
+ end_date = fields.Date(string="End Date")
+ vin_sn = fields.Char('Chassis Number', related='vehicle_id.vin_sn', store=True,
+ copy=False)
+ model_id = fields.Many2one('fleet.vehicle.model', 'Model', related='vehicle_id.model_id', store=True, )
+ license_plate = fields.Char(required=True, related='vehicle_id.license_plate', store=True)
+ serial_number = fields.Char(related='vehicle_id.serial_number', string="Serial Number")
+ fleet_type_id = fields.Many2one('fleet.type', string="Fleet Type", related='vehicle_id.fleet_type_id', store=True, )
+ employee_id = fields.Many2one('hr.employee', string="Driver",
+ domain="[('driver', '=', True),('vehicle_id', '=', False)]")
+ license_number = fields.Char(string="License Number", related='employee_id.license_number', store=True)
+ license_end = fields.Date(string="License End")
+ reason = fields.Text()
+ infraction_type = fields.Selection(selection=[('accident', 'Accident'),
+ ('infraction', 'Infraction'),],string="Infraction Type")
+ infraction_number = fields.Char(string="Infraction Number")
+ infraction_date = fields.Date(string="Infraction Date")
+ infraction_cost = fields.Integer(string="Infraction Cost")
+ cost_percentage = fields.Integer(string="Cost Percentage%")
+ discount_amount = fields.Integer(string="Discount Amount", compute = "get_discount_amount", store = True)
+ benefits_discounts = fields.Many2one(comodel_name='hr.salary.rule', string='Benefits/Discounts')
+ state = fields.Selection(selection=[('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('in_progress', 'In Progress'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel')], default='draft')
+ advantage_id = fields.Many2one(comodel_name='contract.advantage', string='Deduction Employee')
+
+ @api.depends('infraction_cost', 'cost_percentage')
+ def get_discount_amount(self):
+ for rec in self:
+ if rec.cost_percentage > 0 :
+ rec.discount_amount = rec.infraction_cost * rec.cost_percentage
+ else :
+ rec.discount_amount = rec.infraction_cost
+ # print(rec.discount_amount)
+
+ @api.onchange('start_date', 'end_date')
+ @api.constrains('start_date', 'end_date')
+ def check_data(self):
+ if self.start_date and self.end_date and self.start_date > self.end_date:
+ raise UserError(_('Start Date must be less than or equal End Date '))
+
+ @api.onchange('vehicle_id')
+ def get_fleet_data(self):
+ if self.vehicle_id:
+ self.old_branch_id = self.vehicle_id.branch_id.id
+ self.employee_id = self.vehicle_id.employee_id
+ self.license_number = self.vehicle_id.employee_id.license_number
+ self.license_end = self.vehicle_id.employee_id.license_end
+
+ @api.onchange('employee_id')
+ def get_emp_data(self):
+ self.license_end = self.employee_id.license_end
+
+ def action_confirm(self):
+ for rec in self:
+ rec.state = 'confirm'
+
+ def action_approve(self):
+ for rec in self:
+ rec.state = 'approve'
+
+ def action_inprogress(self):
+ for rec in self:
+ rec.state = 'in_progress'
+ contract_move_id = rec.env['contract.advantage'].create({
+ 'benefits_discounts': rec.benefits_discounts.id,
+ 'date_from': rec.start_date,
+ 'date_to': rec.end_date,
+ 'type': 'customize',
+ 'amount' : rec.discount_amount,
+ 'employee_id': rec.employee_id.id,
+ 'contract_advantage_id': rec.employee_id.contract_id.id,
+ 'penalty_id': True,
+ 'out_rule': True,
+ 'state': 'draft',
+ })
+ rec.advantage_id = contract_move_id.id
+
+ def action_refuse(self):
+ form_view_id = self.env.ref("odex_fleet.wizard_reject_reason_infraction_form").id
+ return {
+ 'name': _("Reject Reason"),
+
+ 'view_mode': 'form',
+ 'res_model': 'reject.reason.infraction.wiz',
+ 'views': [(form_view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'context': {'default_infraction_id': self.id},
+ }
+
+ def action_cancel(self):
+ for rec in self:
+ rec.sudo().state = 'cancel'
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/insurance_companies.py b/odex25_fleet/odex_fleet/models/insurance_companies.py
new file mode 100644
index 000000000..6edda61f8
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/insurance_companies.py
@@ -0,0 +1,7 @@
+from odoo import models, fields, api, _
+
+
+class InsuranceCompanies(models.Model):
+ _name = 'insurance.companies'
+
+ name = fields.Char(string='Company Name', required=True)
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/models/maintenance_request.py b/odex25_fleet/odex_fleet/models/maintenance_request.py
new file mode 100644
index 000000000..bbf979f7f
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/maintenance_request.py
@@ -0,0 +1,205 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime
+
+
+class FleetMaintenance(models.Model):
+ _name = 'fleet.maintenance'
+ _description = 'Fleet Maintenance'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ @api.model
+ def default_get(self, default_fields):
+ res = super(FleetMaintenance, self).default_get(default_fields)
+ rec = self.env['fleet.account.config'].sudo().search([('type', '=', 'maintenance'), ('state', '=', 'confirm')],
+ limit=1)
+ if rec and self.env.user.has_group("odex25_fleet_account_custom.integration_with_account"):
+ res['account_id'] = rec.account_id.id
+ res['tax_id'] = rec.tax_id.id
+ elif self.env.user.has_group("odex25_fleet_account_custom.disable_integration_with_account"):
+ pass
+ else:
+ raise ValidationError(_("You Need To Configurate Account Details"))
+ return res
+
+ name = fields.Char(string="Name")
+ next_request_date = fields.Date(string="Next Request Date")
+ date = fields.Date(string=" Request Date", default=fields.Date.context_today)
+ next_odometer = fields.Float(string="Next Odometer", compute='get_old_odometer', store=True)
+ odometer = fields.Float(string="Odometer")
+ type = fields.Selection([('corrective', 'Corrective'), ('preventive', 'Preventive')], string='Maintenance Type',
+ default="corrective")
+ state = fields.Selection([('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approve'),
+ ('paid', 'Paid'),
+ ('refused', 'Refuse'),
+ ('cancel', 'Cancel'),
+ ], string='state', default="draft")
+ vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle")
+ license_plate = fields.Char(required=True, related='vehicle_id.license_plate')
+ employee_id = fields.Many2one('hr.employee', string="Driver")
+ quotation_ids = fields.One2many('fleet.quotation', 'request_id', string="Quotations")
+ service_ids = fields.One2many('fleet.quotation.service', 'request_id', string="Quotations")
+ branch_id = fields.Many2one('hr.department', string="Branch")
+ # log_id = fields.Many2one('fleet.vehicle.log.services', string="Service Log")
+ total_cost = fields.Float(string="Total Cost", compute="get_cost", store=True)
+ total1 = fields.Float(string="Total", compute="get_total", store=True)
+ account_id = fields.Many2one('account.account', string="Account")
+ invoice_id = fields.Many2one('account.move', string="Invoice", copy=False)
+ line_id = fields.Many2one('fleet.service.line.config', string="Line", copy=False)
+ reason = fields.Text(string="Reject Reason", tracking=True, )
+ tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict')
+ user_id = fields.Many2one('res.users', string='Responsible', required=False, default=lambda self: self.env.user)
+ edit_access = fields.Boolean(compute="get_access", )
+
+ @api.onchange('vehicle_id')
+ def get_old_odometer(self):
+ for rec in self:
+ rec.next_odometer = rec.vehicle_id.odometer
+
+ def get_access(self):
+ for rec in self:
+ rec.edit_access = False
+ if rec.state == 'approve' and self.env.user.has_group('odex_fleet.fleet_group_account'):
+ rec.edit_access = True
+
+ @api.depends('service_ids')
+ def get_total(self):
+ for rec in self:
+ if rec.service_ids:
+ rec.total1 = sum(rec.service_ids.mapped('qty'))
+
+ def create_invoice(self):
+ partner = self.quotation_ids.filtered(lambda r: r.approve == True).mapped('partner_id')
+ if not partner:
+ raise ValidationError(_("You NEED To ADD And Approve Quotation Lines"))
+ amount = sum(self.quotation_ids.filtered(lambda r: r.approve == True).mapped('cost'))
+ invoice = self.env['account.move'].sudo().create({
+ 'partner_id': partner[0].id,
+ 'currency_id': self.env.user.company_id.currency_id.id,
+ # 'name': 'Fleet Service Cost Invoice ',
+ # 'account_id': partner[0].property_account_payable_id.id,
+ 'branch_id': self.vehicle_id.branch_id.id,
+ 'move_type': 'in_invoice',
+ 'invoice_date': datetime.now().today(),
+ 'invoice_line_ids': [(0, 0, {
+ 'quantity': 1,
+ 'price_unit': amount,
+ # 'move_id': invoice.id,
+ 'name': 'Maintenance Service Cost',
+ 'account_id': self.account_id.id,
+ 'tax_ids': [(6, 0, [self.tax_id.id])],
+ })]
+ })
+ # self.env['account.move.line'].with_context(check_move_validity=False).sudo().create({
+ # 'quantity': 1,
+ # 'price_unit': amount,
+ # 'move_id': invoice.id,
+ # 'name': 'Maintenance Service Cost',
+ # 'account_id': self.account_id.id,
+ # 'tax_ids': [(6, 0, [self.tax_id.id])],
+ #
+ # })
+ self.invoice_id = invoice.id
+ # invoice.sudo().action_invoice_open()
+
+ @api.depends('quotation_ids', 'quotation_ids.approve')
+ def get_cost(self):
+ for rec in self:
+ if rec.quotation_ids.filtered(lambda r: r.approve == True):
+ rec.total_cost = sum(rec.quotation_ids.filtered(lambda r: r.approve == True).mapped('cost'))
+
+ @api.onchange('vehicle_id')
+ def get_vehcile_date(self):
+ if self.vehicle_id:
+ self.odometer = self.vehicle_id.odometer
+ self.employee_id = self.vehicle_id.employee_id.id
+ self.branch_id = self.vehicle_id.branch_id.id
+
+ def action_confirm(self):
+ for rec in self:
+ record = rec.quotation_ids.sudo().filtered(lambda r: r.approve == True)
+ if not record:
+ raise ValidationError(_("You Need Approve Quotation First"))
+ rec.sudo().state = 'confirm'
+
+ def action_approve(self):
+ for rec in self:
+ rec.state = 'approve'
+ rec.vehicle_id.next_request_date = rec.next_request_date
+
+ def action_refuse(self):
+ for rec in self:
+ rec.state = 'refused'
+
+ def set_to_draft(self):
+ for rec in self:
+ rec.state = 'draft'
+
+ def action_paid(self):
+ for rec in self:
+ rec.create_invoice()
+ rec.state = 'paid'
+
+ def action_cancel(self):
+ for rec in self:
+ rec.state = 'cancel'
+
+
+class FleetQuotation(models.Model):
+ _name = 'fleet.quotation'
+ _description = 'Fleet Quotation'
+
+ cost = fields.Float(string="Cost")
+ offer = fields.Binary(string="Offer Attachment")
+ partner_id = fields.Many2one('res.partner', string="Partner")
+ approve = fields.Boolean()
+ request_id = fields.Many2one('fleet.maintenance')
+ reason = fields.Text(string="Reject Reason")
+ state = fields.Selection(related='request_id.state', store=True)
+ edit_access = fields.Boolean(compute="get_access", )
+
+ def get_access(self):
+ for rec in self:
+ rec.edit_access = False
+ if rec.state == 'approve' and self.env.user.has_group('odex_fleet.fleet_group_account'):
+ rec.edit_access = True
+
+ def action_approve(self):
+ rec = self.request_id.quotation_ids.filtered(lambda r: r.approve)
+ print("YYYYYYYYYYYY", rec)
+ if rec:
+ raise ValidationError(_("You Can Not Approve More Than One Quotation"))
+ self.approve = True
+ self.reason = False
+
+ def action_reject(self):
+ form_view_id = self.env.ref("odex_fleet.wizard_reject_reason_fleet_wiz_form").id
+ return {
+ 'name': _("Reject Reason"),
+
+ 'view_mode': 'form',
+ 'res_model': 'reject.reason.fleet.wiz',
+ 'views': [(form_view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'context': {'default_request_id': self.id},
+ }
+
+
+class FleetQuotationService(models.Model):
+ _name = 'fleet.quotation.service'
+ _description = 'Fleet Service'
+
+ qty = fields.Float(string="Cost")
+ cost = fields.Float(string="Cost")
+ number = fields.Float(string="Number")
+ total = fields.Float(string="Total", compute='_compute_total', readonly=True)
+ service_id = fields.Many2one('fleet.service.type', string="Service")
+ request_id = fields.Many2one('fleet.maintenance')
+
+ @api.onchange('number', 'qty')
+ def _compute_total(self):
+ for r in self:
+ r.total = r.number * r.qty
diff --git a/odex25_fleet/odex_fleet/models/res_config.py b/odex25_fleet/odex_fleet/models/res_config.py
new file mode 100644
index 000000000..c57c5fa76
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/res_config.py
@@ -0,0 +1,31 @@
+from odoo import fields, models
+
+
+class ResCompany(models.Model):
+ _inherit = 'res.company'
+
+
+ license = fields.Float(string="License")
+ car_license = fields.Float( string="Notify Before Car Licence")
+ delegation = fields.Float(string="Delegation")
+ form = fields.Float(string="Notify Before Form")
+ check = fields.Float(string="Notify Before Check")
+ insurance = fields.Float(string="Insurance Notify Before")
+ operation = fields.Float(string="Operation Notify Before")
+ installment = fields.Float(string="Installment Notify Before")
+ service = fields.Float( string="Service Notify Before")
+
+
+
+class ResConfig(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ license = fields.Float(related="company_id.license", string="License")
+ car_license = fields.Float(related="company_id.car_license", string="Car Licence")
+ delegation = fields.Float(related="company_id.delegation", string="Delegation")
+ form = fields.Float(related="company_id.form", string=" Form")
+ check = fields.Float(related="company_id.check", string="Check")
+ insurance = fields.Float(related="company_id.insurance", string="Insurance")
+ operation = fields.Float(related="company_id.operation", string="Operation Card")
+ installment = fields.Float(related="company_id.installment", string="Installment ")
+ service = fields.Float(related="company_id.service", string="Service")
diff --git a/odex25_fleet/odex_fleet/models/vehicle.py b/odex25_fleet/odex_fleet/models/vehicle.py
new file mode 100644
index 000000000..e48c4c4b8
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/vehicle.py
@@ -0,0 +1,682 @@
+from odoo import models, fields, api, _
+from datetime import datetime
+from odoo.exceptions import UserError, ValidationError
+from datetime import timedelta
+from dateutil.relativedelta import relativedelta
+import math
+
+
+class FleetBranch(models.Model):
+ _inherit = 'res.branch'
+
+ state_id = fields.Many2one('res.country.state', string="State", )
+
+
+class Partner(models.Model):
+ _inherit = 'res.partner'
+
+ car_owner = fields.Boolean(string="Car Owner", )
+
+
+class FleetVehicle(models.Model):
+ _inherit = 'fleet.vehicle'
+
+ owner_id = fields.Many2one('res.partner', string="Owner")
+ insurance_companies_id = fields.Many2one('insurance.companies', string="Insurance Companies")
+ employee_id = fields.Many2one('hr.employee', string="Driver")
+ driver_id = fields.Many2one(related='employee_id.user_id.partner_id', store=True, string="Driver")
+ branch_id = fields.Many2one('hr.department', string="Branch", )
+ states = fields.Many2one('res.country.state', string="State", )
+ old_branch_id = fields.Many2one('res.branch', string="Old Branch", )
+ license_end = fields.Date(string="License End")
+ check_end = fields.Date(string="Check End Date")
+ form_end = fields.Date(string="Form End Date")
+ serial_number = fields.Char(string="Serial Number")
+ computer_number = fields.Char(string="Computer Number")
+ operation_card_number = fields.Char(string="Operation Card Number")
+ operation_card_end = fields.Date(string="Operation Card End")
+ car_weight = fields.Float(string="Car Weight")
+ insurance_number = fields.Char(string="Insurance Number")
+ insurance_start_date = fields.Date(string="Insurance Start Date")
+ insurance_end_date = fields.Date(string="Insurance End Date")
+ insurance_attachment = fields.Binary(string="Insurance Docs")
+ installment_number = fields.Char(string="Installment Number")
+ fuel_consumption = fields.Float(string="Fuel consumption")
+ installment_ids = fields.One2many('insurance.installment', 'fleet_id', string="Installment")
+ service_ids = fields.One2many('fleet.service.line.config', 'fleet_id', string="Services")
+ next_request_date = fields.Date(string="Next Maintenance Date")
+ fuel_type = fields.Many2one('fuel.price', 'Fuel Type', help='Fuel Used by the vehicle')
+ model_id = fields.Many2one('fleet.vehicle.model', string="Model Type", required=True, help='Model of the vehicle')
+ location = fields.Char(string="Work Location", help='Location of the vehicle (garage, ...)')
+ car_category = fields.Many2one('car.category', 'Car Category')
+ # man_company = fields.Many2one('manufacture.company', 'Manufacture Company')
+ man_company = fields.Many2one(related='model_id.man_company_id')
+ fleet_type_id = fields.Many2one(related='model_id.fleet_type_id', string="Fleet Type", )
+ form_renew_cost = fields.Float(related='model_id.fleet_type_id.amount', string="Form Renew Cost")
+ transmission_id = fields.Many2one('transmission.setting', string="Transmission")
+ insurance_cost = fields.Float(string="Insurance Cost", compute="get_insurance_cost", store=True, readonly=False)
+ department_id = fields.Many2one('hr.department', string="Department", compute="get_department_id", store=True)
+ project_id = fields.Many2one('project.project', string='Project')
+
+ @api.depends('employee_id')
+ def get_department_id(self):
+ for rec in self:
+ if rec.employee_id:
+ rec.department_id = rec.employee_id.department_id
+
+ @api.depends('installment_ids')
+ def get_insurance_cost(self):
+ total = 0
+ for rec in self.installment_ids:
+ total += rec.amount
+ self.insurance_cost = total
+
+ @api.model
+ def fleet_expired_cron(self):
+ date = datetime.now().date()
+ operation = self.company_id.operation
+ insurance = self.company_id.insurance
+ car_license = self.env.user.company_id.car_license
+ # delegation = self.company_id.delegation
+ form = self.company_id.form
+ check = self.company_id.check
+ installment = self.company_id.installment
+ if car_license > 0:
+ date = date + relativedelta(days=car_license)
+ fleet = self.env['fleet.vehicle'].sudo().search([('license_end', '<=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.car_expiration_email_template', False)
+ template.send_mail(f.id)
+ if insurance > 0:
+ date = date + relativedelta(days=+int(insurance))
+ fleet = self.env['fleet.vehicle'].sudo().search([('insurance_end_date', '>=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.insurance_expiration_email_template', False)
+ template.send_mail(f.id)
+
+ if form > 0:
+ date = date + relativedelta(days=+int(form))
+ fleet = self.env['fleet.vehicle'].sudo().search([('form_end', '>=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.form_expiration_email_template', False)
+ template.send_mail(f.id)
+ if check > 0:
+ date = date + relativedelta(days=+int(check))
+ fleet = self.env['fleet.vehicle'].sudo().search([('check_end', '>=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.check_expiration_email_template', False)
+ template.send_mail(f.id)
+ if operation > 0:
+ date = date + relativedelta(days=+int(operation))
+ fleet = self.env['fleet.vehicle'].sudo().search([('operation_card_end', '>=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.operation_expiration_email_template', False)
+ template.send_mail(f.id)
+ if installment > 0:
+ date = date + relativedelta(days=car_license)
+ fleet = self.env['insurance.installment'].sudo().search([('date', '<=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.installment_expiration_email_template', False)
+ template.send_mail(f.id)
+
+ @api.onchange('insurance_start_date', 'insurance_end_date')
+ @api.constrains('insurance_start_date', 'insurance_end_date')
+ def check_data(self):
+ if self.insurance_start_date and self.insurance_end_date and self.insurance_start_date > self.insurance_end_date:
+ raise UserError(_('Insurance Start Date must be less than or equal Insurance End Date '))
+
+
+class FleetType(models.Model):
+ _name = 'fleet.type'
+ _description = 'Fleet Type'
+
+ name = fields.Char(string="Name")
+ amount = fields.Float(string="Renew Amount")
+
+
+class FuelPrice(models.Model):
+ _name = 'fuel.price'
+ _description = 'Fuel Price'
+ _rec_name = 'fuel_type'
+
+ fuel_type = fields.Many2one('product.product', string='Fuel Type', help='Fuel Used by the vehicle')
+ price = fields.Float(string="Price")
+ uom_id = fields.Many2one(related='fuel_type.uom_id', string='Unit of Measure', readonly=True)
+
+
+class CarCtegory(models.Model):
+ _name = 'car.category'
+ _description = 'Car Category'
+ _rec_name = 'car_category'
+
+ car_category = fields.Char('Car Category')
+
+
+class FleetVehicleModelBrand(models.Model):
+ _inherit = 'fleet.vehicle.model.brand'
+ man_company_id = fields.Many2one('manufacture.company')
+
+
+class FleetVehicleModel(models.Model):
+ _inherit = 'fleet.vehicle.model'
+
+ man_company_id = fields.Many2one(related='brand_id.man_company_id')
+ fleet_type_id = fields.Many2one('fleet.type', string="Fleet Type")
+
+
+class ManufactureCompany(models.Model):
+ _name = 'manufacture.company'
+ _description = 'Manufacture Company'
+ _rec_name = 'man_company'
+
+ man_company = fields.Char('Manufacture Company')
+ brand_ids = fields.Many2many('fleet.vehicle.model.brand')
+
+
+class TransmissionType(models.Model):
+ _name = 'transmission.setting'
+ _description = 'Trnsmission Setting'
+ _rec_name = 'transmission'
+
+ transmission = fields.Char('Transmission')
+
+
+class InsuranceInstallment(models.Model):
+ _name = 'insurance.installment'
+ _description = 'Insurance Installment'
+
+ name = fields.Char(string="Name")
+ date = fields.Date(string="Date")
+ amount = fields.Float(string="Amount")
+ paid = fields.Date(string="Paid")
+ fleet_id = fields.Many2one('fleet.vehicle', string="Fleet")
+
+
+# class FleetVehicleCost(models.Model):
+# _inherit = 'fleet.vehicle.cost'
+
+
+# branch_id = fields.Many2one('res.branch', string="Branch", default=lambda self: self.env.user.branch_id)
+# number = fields.Float(string="Number")
+# total = fields.Float(string="Total", compute='_compute_total',readonly=True)
+
+# @api.onchange('number','amount')
+# def _compute_total(self):
+# for r in self:
+# r.total = r.number * r.amount
+
+
+# @api.onchange('vehicle_id')
+# def get_branch(self):
+# if self.vehicle_id:
+# self.branch_id = self.vehicle_id.branch_id.id if self.vehicle_id.branch_id else False
+
+class FleetVehicleCost(models.Model):
+ _name = 'fleet.vehicle.cost'
+ _description = 'Cost related to a vehicle'
+ _order = 'date desc, vehicle_id asc'
+
+ name = fields.Char(related='vehicle_id.name', string='Name', store=True)
+ vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', help='Vehicle concerned by this log')
+ cost_subtype_id = fields.Many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost')
+ amount = fields.Float('Total Price')
+ cost_type = fields.Selection([
+ ('contract', 'Contract'),
+ ('services', 'Services'),
+ ('fuel', 'Fuel'),
+ ('other', 'Other')
+ ], 'Category of the cost', default="other", help='For internal purpose only', required=True)
+ parent_id = fields.Many2one('fleet.vehicle.cost', 'Parent', help='Parent cost to this current cost')
+ service_id = fields.Many2one('fleet.vehicle.log.services', 'Service', help='Service cost to this current cost')
+ cost_ids = fields.One2many('fleet.vehicle.cost', 'parent_id', 'Included Services', copy=True)
+ odometer_id = fields.Many2one('fleet.vehicle.odometer', 'Odometer',
+ help='Odometer measure of the vehicle at the moment of this log')
+ odometer = fields.Float(compute="_get_odometer", inverse='_set_odometer', string='Odometer Value',
+ help='Odometer measure of the vehicle at the moment of this log')
+ odometer_unit = fields.Selection(related='vehicle_id.odometer_unit', string="Unit", readonly=True)
+ date = fields.Date(help='Date when the cost has been executed')
+ contract_id = fields.Many2one('fleet.vehicle.log.contract', 'Contract', help='Contract attached to this cost')
+ auto_generated = fields.Boolean('Automatically Generated', readonly=True)
+ description = fields.Char("Cost Description")
+ branch_id = fields.Many2one('hr.department', string="Branch", default=lambda self: self.env.user.branch_id)
+ number = fields.Float(string="Number")
+ total = fields.Float(string="Total", compute='_compute_total', readonly=True)
+
+ @api.onchange('number', 'amount')
+ def _compute_total(self):
+ for r in self:
+ r.total = r.number * r.amount
+
+ @api.onchange('vehicle_id')
+ def get_branch(self):
+ if self.vehicle_id:
+ self.branch_id = self.vehicle_id.branch_id.id if self.vehicle_id.branch_id else False
+
+ def _get_odometer(self):
+ for record in self:
+ if record.odometer_id:
+ record.odometer = record.odometer_id.value
+
+ def _set_odometer(self):
+ for record in self:
+ if not record.odometer:
+ raise UserError(_('Emptying the odometer value of a vehicle is not allowed.'))
+ odometer = self.env['fleet.vehicle.odometer'].create({
+ 'value': record.odometer,
+ 'date': record.date or fields.Date.context_today(record),
+ 'vehicle_id': record.vehicle_id.id
+ })
+ self.odometer_id = odometer
+
+ @api.model
+ def create(self, data):
+ # make sure that the data are consistent with values of parent and contract records given
+ if 'parent_id' in data and data['parent_id']:
+ parent = self.browse(data['parent_id'])
+ data['vehicle_id'] = parent.vehicle_id.id
+ data['date'] = parent.date
+ data['cost_type'] = parent.cost_type
+ if 'contract_id' in data and data['contract_id']:
+ contract = self.env['fleet.vehicle.log.contract'].browse(data['contract_id'])
+ data['vehicle_id'] = contract.vehicle_id.id
+ data['cost_subtype_id'] = contract.cost_subtype_id.id
+ data['cost_type'] = contract.cost_type
+ if 'odometer' in data and not data['odometer']:
+ # if received value for odometer is 0, then remove it from the
+ # data as it would result to the creation of a
+ # odometer log with 0, which is to be avoided
+ del data['odometer']
+ return super(FleetVehicleCost, self).create(data)
+
+
+class FleetVehicleLogServices(models.Model):
+ _inherit = 'fleet.vehicle.log.services'
+
+ @api.model
+ def default_get(self, default_fields):
+ res = super(FleetVehicleLogServices, self).default_get(default_fields)
+ rec = self.env['fleet.account.config'].sudo().search([('type', '=', 'service'), ('state', '=', 'confirm')],
+ limit=1)
+ if rec and self.env.user.has_group("odex25_fleet_account_custom.integration_with_account"):
+ res['account_id'] = rec.account_id.id
+ res['tax_id'] = rec.tax_id.id
+ elif self.env.user.has_group("odex25_fleet_account_custom.disable_integration_with_account"):
+ pass
+ else:
+ raise ValidationError(_("You Need To Configurate Account Details"))
+ return res
+
+ branch_id = fields.Many2one('hr.department', string="Branch")
+ account_id = fields.Many2one('account.account', string="Account")
+ tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict')
+ invoice_id = fields.Many2one('account.move', string="Invoice", copy=False)
+ partner_id = fields.Many2one('res.partner', string="Service Provider", required=1)
+ request_id = fields.Many2one('fleet.maintenance', string="Maintenance Request")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('invoiced', 'Invoiced'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel'),
+
+ ], default='draft', related="status")
+
+ status = fields.Selection([('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('invoiced', 'Invoiced'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel'),
+ ], default='draft')
+ edit_access = fields.Boolean(compute="get_access", )
+ user_id = fields.Many2one('res.users', string='Responsible', required=False, default=lambda self: self.env.user)
+ cost_subtype_id = fields.Many2one('fleet.service.type', 'Type', help='Cost type purchased with this cost')
+ cost_ids = fields.One2many('fleet.vehicle.cost', 'service_id', 'Included Services', copy=True)
+ employee_id = fields.Many2one('hr.employee', string="Driver")
+ service_type_id = fields.Many2one(
+ 'fleet.service.type', 'Service Type', required=False,
+ default=lambda self: self.env.ref('fleet.type_service_service_8', raise_if_not_found=False),
+ )
+
+ def copy(self, default=None):
+ default = dict(default or {})
+ default.update({
+ 'status': 'draft',
+ })
+ return super(FleetVehicleLogServices, self).copy(default)
+
+ @api.onchange('odometer')
+ def onchange_odometer(self):
+ for rec in self:
+ if rec.odometer < rec.vehicle_id.odometer:
+ raise ValidationError(_("odometer should be more than current odometer"))
+
+ def get_access(self):
+ for rec in self:
+ rec.edit_access = False
+ if rec.status == 'approve' and self.env.user.has_group('odex_fleet.fleet_group_account'):
+ rec.edit_access = True
+
+ def set_to_draft(self):
+ for rec in self:
+ rec.status = 'draft'
+
+ def action_confirm(self):
+ self.sudo().status = 'confirm'
+
+ def action_approve(self):
+ self.status = 'approve'
+ self.vehicle_id.odometer = self.odometer
+
+ def action_cancel(self):
+ self.status = 'cancel'
+
+ def action_refuse(self):
+ self.status = 'refused'
+
+ @api.onchange('vehicle_id')
+ def get_branch(self):
+ if self.vehicle_id:
+ self.branch_id = self.vehicle_id.branch_id.id if self.vehicle_id.branch_id else False
+ self.odometer = self.vehicle_id.odometer
+ self.employee_id = self.vehicle_id.employee_id
+
+ def create_invoice(self):
+ invoice = self.env['account.move'].sudo().create({
+ 'partner_id': self.partner_id.id,
+ 'currency_id': self.env.user.company_id.currency_id.id,
+ # 'name': 'Fleet Service Cost Invoice ',
+ # 'account_id': self.partner_id.property_account_payable_id.id,
+ 'branch_id': self.vehicle_id.branch_id.id,
+ 'move_type': 'in_invoice',
+ 'invoice_date': datetime.now().today(),
+ 'invoice_line_ids': [(0, 0, {
+ 'quantity': 1,
+ 'price_unit': self.amount,
+ # 'move_id': invoice.id,
+ 'name': 'Fleet Service Cost',
+ 'account_id': self.account_id.id,
+ 'tax_ids': [(6, 0, [self.tax_id.id])],
+ })]
+ })
+ # self.env['account.move.line'].with_context(check_move_validity=False).sudo().create({
+ # 'quantity': 1,
+ # 'price_unit': self.amount,
+ # 'move_id': invoice.id,
+ # 'name': 'Fleet Service Cost',
+ # 'account_id': self.account_id.id,
+ # 'tax_ids': [(6, 0, [self.tax_id.id])],
+ #
+ # })
+ self.sudo().invoice_id = invoice.id
+ # invoice.sudo().action_invoice_open()
+ self.sudo().status = 'invoiced'
+
+ @api.onchange('cost_ids')
+ def get_amount_total(self):
+ for rec in self:
+ rec.amount = sum(rec.cost_ids.mapped('total'))
+
+
+class FleetVehicleLogContract(models.Model):
+ _inherit = 'fleet.vehicle.log.contract'
+
+ branch_id = fields.Many2one('hr.department', string="Branch")
+
+ @api.onchange('vehicle_id')
+ def get_branch(self):
+ if self.vehicle_id:
+ self.branch_id = self.vehicle_id.branch_id.id if self.vehicle_id.branch_id else False
+
+
+class FleetVehicleLogFuel(models.Model):
+ _name = 'fleet.vehicle.log.fuel'
+ _description = 'Fuel log for vehicles'
+ _inherits = {'fleet.vehicle.cost': 'cost_id'}
+
+ @api.model
+ def default_get(self, default_fields):
+ res = super(FleetVehicleLogFuel, self).default_get(default_fields)
+ service = self.env.ref('fleet.type_service_refueling', raise_if_not_found=False)
+ res.update({
+ 'date': fields.Date.context_today(self),
+ 'cost_subtype_id': service and service.id or False,
+ 'cost_type': 'fuel'
+ })
+ rec = self.env['fleet.account.config'].sudo().search([('type', '=', 'fuel'), ('state', '=', 'confirm')],
+ limit=1)
+ if rec and self.env.user.has_group("odex25_fleet_account_custom.integration_with_account"):
+ res['account_id'] = rec.account_id.id
+ res['tax_id'] = rec.tax_id.id
+ elif self.env.user.has_group("odex25_fleet_account_custom.disable_integration_with_account"):
+ print("pass")
+ # pass
+ else:
+ pass
+ # raise ValidationError(_("You Need To Configurate Account Details"))
+ return res
+
+ liter = fields.Float()
+ price_per_liter = fields.Float()
+ purchaser_id = fields.Many2one('res.partner', 'Purchaser',
+ domain="['|',('customer_rank','>',0),('employee','=',True)]")
+ inv_ref = fields.Char('Invoice Reference', size=64)
+ vendor_id = fields.Many2one('res.partner', 'Vendor', domain="[('supplier_rank','=',True)]")
+ notes = fields.Text()
+ cost_id = fields.Many2one('fleet.vehicle.cost', 'Cost', required=True, ondelete='cascade')
+ branch_id = fields.Many2one('hr.department', string="Branch")
+ account_id = fields.Many2one('account.account', string="Account")
+ tax_id = fields.Many2one('account.tax', string='Tax', ondelete='restrict')
+ invoice_id = fields.Many2one('account.move', string="Invoice", copy=False)
+ partner_id = fields.Many2one('res.partner', string="Service Provider")
+ fuel_type = fields.Many2one(related='vehicle_id.fuel_type')
+ state = fields.Selection(selection=[('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('invoiced', 'Invoiced'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel'),
+ ], default='draft')
+ amount = fields.Float('Total Untax')
+ liter = fields.Float()
+ price_tax = fields.Float(string='Tax')
+ total_price_tax = fields.Float(string='Total', )
+ price_per_liter = fields.Float()
+ cal_type = fields.Selection(selection=[('total', 'Total'), ('liter', 'Liter')], string="Calculation Type",
+ default='liter')
+ edit_access = fields.Boolean(compute="get_access", )
+ user_id = fields.Many2one('res.users', string='Responsible', required=False, default=lambda self: self.env.user)
+ employee_id = fields.Many2one('hr.employee', string="Driver")
+
+ # we need to keep this field as a related with store=True because the graph view doesn't support
+ # (1) to address fields from inherited table
+ # (2) fields that aren't stored in database
+ cost_amount = fields.Float(related='cost_id.amount', string='Amount', store=True)
+
+ @api.onchange('liter', 'price_per_liter', 'amount')
+ def _onchange_liter_price_amount(self):
+ # need to cast in float because the value receveid from web client maybe an integer (Javascript and JSON do not
+ # make any difference between 3.0 and 3). This cause a problem if you encode, for example, 2 liters at 1.5 per
+ # liter => total is computed as 3.0, then trigger an onchange that recomputes price_per_liter as 3/2=1 (instead
+ # of 3.0/2=1.5)
+ # If there is no change in the result, we return an empty dict to prevent an infinite loop due to the 3 intertwine
+ # onchange. And in order to verify that there is no change in the result, we have to limit the precision of the
+ # computation to 2 decimal
+ liter = float(self.liter)
+ price_per_liter = float(self.price_per_liter)
+ amount = float(self.amount)
+ if liter > 0 and price_per_liter > 0 and round(liter * price_per_liter, 2) != amount:
+ self.amount = round(liter * price_per_liter, 2)
+ elif amount > 0 and liter > 0 and round(amount / liter, 2) != price_per_liter:
+ self.price_per_liter = round(amount / liter, 2)
+ elif amount > 0 and price_per_liter > 0 and round(amount / price_per_liter, 2) != liter:
+ self.liter = round(amount / price_per_liter, 2)
+
+ def get_access(self):
+ for rec in self:
+ rec.edit_access = False
+ if rec.state == 'approve' and self.env.user.has_group('odex_fleet.fleet_group_account'):
+ rec.edit_access = True
+
+ def set_to_draft(self):
+ for rec in self:
+ rec.state = 'draft'
+
+ @api.onchange('cal_type', 'price_per_liter', 'liter', 'total_price_tax')
+ def _get_total(self):
+ for rec in self:
+
+ if rec.cal_type == 'total':
+ taxes = rec.tax_id.compute_all(rec.price_per_liter, None, 1, product=None,
+ partner=None)
+ val = round(sum(t.get('amount', 0.0) for t in taxes.get('taxes', [])), 2)
+ pice_tax = rec.price_per_liter + val
+ liter = rec.total_price_tax / pice_tax if val and rec.price_per_liter > 0 else 0
+ new_taxes = rec.tax_id.compute_all(rec.price_per_liter, None, liter, product=None,
+ partner=None)
+ tax = sum(t.get('amount', 0.0) for t in new_taxes.get('taxes', []))
+ rec.price_tax = tax
+ amount = rec.total_price_tax - rec.price_tax
+ rec.liter = liter if liter > 0 else 0
+ rec.amount = amount if amount > 0 else 0
+ else:
+ taxes = rec.tax_id.compute_all(rec.price_per_liter, None, rec.liter, product=None,
+ partner=None)
+ tax = round(sum(t.get('amount', 0.0) for t in taxes.get('taxes', [])), 2)
+ rec.price_tax = tax if tax > 0 else 0
+ rec.amount = rec.liter * rec.price_per_liter
+ rec.total_price_tax = round(rec.amount + rec.price_tax, 2)
+
+ # def get_account_data(self):
+ # print("in herere============")
+ # rec = self.env['fleet.account.config'].sudo().search([('type','=','fuel'),('state','=','confirm')],limit=1)
+ # if rec:
+ # self.account_id = rec.account_id.id
+ # self.tax_id = rec.tax_id.id
+ # else:
+ # raise ValidationError(_("You Need To Configurate Account Details"))
+
+ @api.constrains('odometer', 'price_per_liter')
+ def odometer_check(self):
+ for rec in self:
+ if rec.odometer <= 0:
+ raise ValidationError(_("Odometer Should Be Greater Than 0"))
+
+ @api.constrains('liter')
+ def liter_check(self):
+ for rec in self:
+ if rec.liter <= 0:
+ raise ValidationError(_("liter Should Be Greater Than 0"))
+
+ def action_confirm(self):
+ self.odometer_check()
+ self.sudo().state = 'confirm'
+
+ def action_approve(self):
+ self.state = 'approve'
+
+ def action_cancel(self):
+ self.state = 'cancel'
+
+ def action_refuse(self):
+ self.state = 'refused'
+
+ @api.onchange('vehicle_id')
+ def _onchange_vehicle(self):
+ if self.vehicle_id:
+ self.purchaser_id = self.vehicle_id.driver_id.id
+
+ self.price_per_liter = self.vehicle_id.fuel_type.price or 0
+ self.branch_id = self.vehicle_id.branch_id.id if self.vehicle_id.branch_id else False
+ self.odometer_unit = self.vehicle_id.odometer_unit
+ self.employee_id = self.vehicle_id.employee_id
+
+ def create_invoice(self):
+ invoice = self.env['account.move'].sudo().create({
+ 'partner_id': self.partner_id.id,
+ 'currency_id': self.env.user.company_id.currency_id.id,
+ 'name': 'Fuel Cost Invoice ',
+ 'journal_id': 2,
+ # 'account_id': self.partner_id.property_account_payable_id.id,
+ 'branch_id': self.vehicle_id.branch_id.id,
+ 'move_type': 'in_invoice',
+ 'invoice_date': datetime.now().today(),
+ 'invoice_line_ids': [(0, 0, {
+ 'quantity': self.liter if self.cal_type == 'liter' else 1,
+ 'price_unit': self.price_per_liter if self.cal_type == 'liter' else self.amount,
+ # 'move_id': invoice.id,
+ 'name': 'Fuel Cost',
+ 'account_id': self.account_id.id,
+ 'tax_ids': [(6, 0, [self.tax_id.id])],
+ 'product_id': self.fuel_type.fuel_type.id,
+ })]
+ })
+ # self.env['account.move.line'].with_context(check_move_validity=False).sudo().create({
+ # 'quantity': self.liter if self.cal_type== 'liter' else 1,
+ # 'price_unit': self.price_per_liter if self.cal_type== 'liter' else self.amount,
+ # 'move_id': invoice.id,
+ # 'name': 'Fuel Cost',
+ # 'account_id': self.account_id.id,
+ # 'tax_ids': [(6, 0, [self.tax_id.id])],
+ # 'product_id': self.fuel_type.fuel_type.id,
+ # # 'uom_id': self.fuel_type.uom_id.id,
+ # })
+ self.sudo().invoice_id = invoice.id
+ invoice.sudo()._compute_amount()
+ # invoice.sudo().action_invoice_open()
+ self.sudo().state = 'invoiced'
+ date = fields.Date.context_today(self)
+ data = {'value': self.odometer, 'date': date, 'vehicle_id': self.vehicle_id.id}
+ self.env['fleet.vehicle.odometer'].sudo().create(data)
+
+
+class FleetServiceConfig(models.Model):
+ _name = 'fleet.service.line.config'
+ _description = 'Fleet Serive Line'
+
+ fleet_id = fields.Many2one('fleet.vehicle')
+ service_ids = fields.Many2many('fleet.service.type', string="Service")
+ date = fields.Date(string="Next Request Date", help="Next Request Date Of Maintenance Request")
+ next_odometer = fields.Float(string="Next Odometer")
+ odometer = fields.Float(string="Next Odometer",
+ help="Determine the current mileage value to submit a maintenance request")
+ type = fields.Selection(selection=[('date', 'Date'), ('odometer', 'Odometer')],
+ string="Type")
+
+ @api.onchange('type', 'odometer')
+ def get_vals(self):
+ for rec in self:
+ if rec.type == 'odometer':
+ rec.get_next_odometer()
+
+ def get_next_odometer(self):
+ for rec in self:
+ rec.next_odometer = rec.fleet_id.odometer + rec.odometer
+
+ @api.model
+ def fleet_maintenance_cron(self):
+ date = self.env['fleet.service.line.config'].sudo().search(
+ [('type', '=', 'date'), ('date', '=', str(datetime.now().date()))])
+ odo = self.env['fleet.service.line.config'].sudo().search([('type', '=', 'odometer'),
+ ])
+ odo = odo.filtered(lambda r: r.fleet_id.odometer >= r.next_odometer)
+ print("FDDDDDDDDDDDDDDDDDDDDd", str(datetime.now().date()), date, odo.mapped('fleet_id.odometer'))
+ self.create_request(date)
+ self.create_request(odo)
+
+ def create_request(self, data):
+ for d in data:
+ self.env['fleet.maintenance'].sudo().create({
+ 'name': "Preventive Maintenance",
+ 'type': 'preventive',
+ 'vehicle_id': d.fleet_id.id,
+ 'branch_id': d.fleet_id.branch_id.id,
+ 'odometer': d.fleet_id.odometer,
+ 'license_plate': d.fleet_id.license_plate,
+ 'line_id': d.id,
+ 'employee_id': d.fleet_id.employee_id.id if d.fleet_id.employee_id else False,
+ 'service_ids': [(0, 0, {'service_id': l.id}) for l in d.service_ids]
+ })
+ if d.type == 'odometer':
+ d.get_next_odometer()
diff --git a/odex25_fleet/odex_fleet/models/vehicle_deleation.py b/odex25_fleet/odex_fleet/models/vehicle_deleation.py
new file mode 100644
index 000000000..07d956596
--- /dev/null
+++ b/odex25_fleet/odex_fleet/models/vehicle_deleation.py
@@ -0,0 +1,227 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import UserError, ValidationError
+from datetime import datetime
+from dateutil.relativedelta import relativedelta
+
+
+class VehicleDelegation(models.Model):
+ _name = 'vehicle.delegation'
+ _description = 'Vehicle Deleagation'
+ _inherit = ['mail.thread', 'mail.activity.mixin']
+
+ name = fields.Char(string="Name")
+ branch_id = fields.Many2one('res.branch', string="Branch",related="driver_department.branch_id")
+ old_branch_id = fields.Many2one('res.branch', string="Old Branch")
+ employee_id = fields.Many2one('hr.employee', string="Driver",
+ domain="[('driver', '=', True),('vehicle_id', '=', False)]")
+ state = fields.Selection(selection=[('draft', 'Draft'),
+ ('confirm', 'Confirm'),
+ ('approve', 'Approved'),
+ ('in_progress', 'In Progress'),
+ ('refused', 'Refused'),
+ ('cancel', 'Cancel'),
+ ('close', 'Close'), ], default='draft')
+ company_id = fields.Many2one('res.company', string='Company')
+ project_id = fields.Many2one('project.project', string='Project')
+ delegation_type = fields.Selection(selection=[('branch', 'Branch'), ('driver', 'driver')],
+ string="Delegation Type")
+ license_number = fields.Char(string="License Number", related='employee_id.license_number', store=True)
+ license_end = fields.Date(string="License End")
+ vehicle_id = fields.Many2one('fleet.vehicle', string="Vehicle", )
+
+ license_plate = fields.Char(required=True, related='vehicle_id.license_plate', store=True,
+ )
+ vin_sn = fields.Char('Chassis Number', related='vehicle_id.vin_sn', store=True,
+ copy=False)
+ model_id = fields.Many2one('fleet.vehicle.model', 'Model', related='vehicle_id.model_id', store=True, )
+ fleet_type_id = fields.Many2one('fleet.type', string="Fleet Type", related='vehicle_id.fleet_type_id', store=True, )
+ serial_number = fields.Char(related='vehicle_id.serial_number', string="Serial Number")
+ state_id = fields.Many2one('res.country.state', string="State", )
+ start_date = fields.Date(string="Start Date")
+ end_date = fields.Date(string="End Date")
+ reason = fields.Text(string="Reject Reason", tracking=True,)
+ custody_id = fields.Many2one('custom.employee.custody')
+ entity_type = fields.Selection(selection=[('department', 'Department'), ('project', 'Project')],
+ string="Entity Type")
+ driver_department = fields.Many2one('driver.department')
+ first_odometer = fields.Float(string='First Odometer',compute="get_first_odometer", store=True,help='The odometer value at the moment the car is authorized')
+ odometer = fields.Float(string='Last Odometer',compute="get_odometer", store=True,
+ help='Odometer measure of the vehicle at the moment of this log')
+ km_number = fields.Integer(string='KM Number', compute='get_km', store=True,help='The value of the difference between the odometer at the moment of delivery and receipt')
+ last_department_id = fields.Many2one(related='vehicle_id.department_id', string="Last Department",help='The last Department the vehicle was authorized for')
+ last_project_id = fields.Many2one('project.project', string='Last Project', compute="get_last_project", store=True)
+ last_branch_id = fields.Many2one('res.branch', string="Last Branch", compute="get_last_branch", store=True,help='The last Branch the vehicle was authorized for')
+
+ @api.depends("vehicle_id")
+ def get_first_odometer(self):
+ for rec in self :
+ if rec.vehicle_id:
+ odometer_id = self.env['fleet.vehicle.odometer'].search([('vehicle_id','=',rec.vehicle_id.id)],order="date desc",limit=1)
+ rec.first_odometer = odometer_id.value
+
+ @api.depends("vehicle_id")
+ def get_odometer(self):
+ for rec in self:
+ if rec.vehicle_id:
+ odometer_id = self.env['fleet.vehicle.odometer'].search([('vehicle_id', '=', rec.vehicle_id.id)],
+ order="date asc", limit=1)
+ rec.odometer = odometer_id.value
+
+ @api.depends("vehicle_id")
+ def get_last_project(self):
+ for rec in self:
+ obj = self.search([('vehicle_id', '=', rec.vehicle_id.name)],limit=1)
+ rec.last_project_id = obj.project_id
+
+ @api.depends("vehicle_id")
+ def get_last_branch(self):
+ for rec in self:
+ rec.last_branch_id = rec.vehicle_id.branch_id
+
+ # @api.onchange('branch_id')
+ # def onchange_branch(self):
+ # for rec in self:
+ # rec.vehicle_id.branch_id = rec.branch_id
+
+ @api.depends('odometer', 'first_odometer')
+ def get_km(self):
+ for rec in self :
+ rec.km_number = rec.odometer - rec.first_odometer
+
+ def create_custody(self):
+ print("ok")
+# for rec in self:
+# custody = rec.env['custom.employee.custody'].sudo().create({
+# 'from_hr_department': True,
+# 'employee_id': rec.employee_id.id,
+# })
+# line = rec.env['employee.custody.line'].sudo().create({
+# 'name': (_("Car Delegation %s")) % rec.vehicle_id.name,
+# 'quantity': 1.0,
+# 'employee_custody_line': custody.id,
+# })
+# custody.sudo().submit()
+# rec.custody_id = custody.id
+
+ @api.constrains('vehicle_id', 'delegation_type', 'employee_id', 'start_date', 'end_date')
+ def car_constrain(self):
+ for rec in self:
+ if self.start_date and self.end_date:
+ clause_1 = ['&', ('end_date', '<=', rec.end_date), ('end_date', '>=', rec.start_date)]
+ clause_2 = ['&', ('start_date', '<=', rec.end_date), ('start_date', '>=', rec.start_date)]
+ clause_3 = ['&', ('start_date', '<=', rec.start_date), ('end_date', '>=', rec.end_date)]
+ value = [('id', '!=', self.id), ('state', 'not in', ['close', 'cancel']), '|',
+ '|'] + clause_1 + clause_2 + clause_3
+ record = self.env['vehicle.delegation'].sudo().search(value)
+ v = record.filtered(lambda r: r.id != self.id and r.vehicle_id == self.vehicle_id)
+# e = record.filtered(
+# lambda r: r.id != self.id and r.employee_id == self.employee_id and self.employee_id)
+ if v:
+ raise ValidationError(_("You Need To Close Other Delegation Request for this Vehicle"))
+# if e:
+# raise ValidationError(_("You Need To Close Other Delegation Request for this Driver"))
+
+ @api.onchange('start_date', 'end_date')
+ @api.constrains('start_date', 'end_date')
+ def check_data(self):
+ if self.start_date and self.end_date and self.start_date > self.end_date:
+ raise UserError(_('Start Date must be less than or equal End Date '))
+
+ @api.onchange('vehicle_id')
+ def get_fleet_data(self):
+ if self.vehicle_id:
+ self.old_branch_id = self.vehicle_id.branch_id.id
+
+ @api.onchange('employee_id')
+ def get_emp_data(self):
+ self.license_end = self.employee_id.license_end
+ # self.vehicle_id.department_id = self.employee_id.department_id
+
+ def action_confirm(self):
+ for rec in self:
+ rec.state = 'confirm'
+ if rec.driver_department:
+ rec.vehicle_id.branch_id = rec.branch_id
+ rec.vehicle_id.department_id = rec.driver_department.department_id
+ elif rec.project_id:
+ rec.vehicle_id.project_id = rec.project_id
+
+ def action_approve(self):
+ for rec in self:
+ rec.state = 'approve'
+
+ def action_inprogress(self):
+ for rec in self:
+ # if rec.start_date > str(datetime.now().date()):
+ # raise ValidationError(_("You Can Start Request Early than Plan"))
+ rec.state = 'in_progress'
+ if rec.delegation_type == 'branch':
+ rec.vehicle_id.old_branch_id = rec.vehicle_id.branch_id.id
+ rec.vehicle_id.branch_id = rec.branch_id.id
+ else:
+ # rec.vehicle_id.partner_id = rec.employee_id.user_id.partner_id.id
+ rec.vehicle_id.employee_id = rec.employee_id.id
+ rec.employee_id.old_vehicle_id = rec.employee_id.vehicle_id.id
+ rec.employee_id.vehicle_id = rec.vehicle_id.id
+ rec.employee_id.delegation_start = rec.start_date
+ rec.employee_id.delegation_end = rec.end_date
+# rec.create_custody()
+
+ def action_refuse(self):
+ form_view_id = self.env.ref("odex_fleet.wizard_reject_reason_fleet_wiz_form").id
+ return {
+ 'name': _("Reject Reason"),
+
+ 'view_mode': 'form',
+ 'res_model': 'reject.reason.fleet.wiz',
+ 'views': [(form_view_id, 'form')],
+ 'type': 'ir.actions.act_window',
+ 'target': 'new',
+ 'context': {'default_delegation_id': self.id},
+ }
+
+ def action_close(self):
+ for rec in self:
+ rec.state = 'close'
+ if rec.delegation_type == 'branch':
+ rec.vehicle_id.branch_id = rec.vehicle_id.old_branch_id.id
+ else:
+ rec.vehicle_id.owner_id = False
+ rec.vehicle_id.employee_id = False
+ rec.employee_id.vehicle_id = False
+ rec.employee_id.delegation_start = False
+ rec.employee_id.delegation_end = False
+# if rec.custody_id:
+# rec.custody_id.sudo().done()
+
+ def action_cancel(self):
+ for rec in self:
+ rec.sudo().state = 'cancel'
+
+ @api.model
+ def delegation_expired_cron(self):
+ date = datetime.now().date()
+ delegation = self.company_id.delegation
+ if delegation > 0:
+ date = date + relativedelta(days=delegation)
+ fleet = self.env['vehicle.delegation'].sudo().search(
+ [('state', 'in', ['approve', 'in_progress']), ('end_date', '<=', str(date))])
+ for f in fleet:
+ template = self.env.ref('odex_fleet.delegation_expiration_email_template', False)
+ template.send_mail(f.id)
+
+ @api.model
+ def delegation_start_cron(self):
+ date = datetime.now().date()
+ fleet = self.env['vehicle.delegation'].sudo().search(
+ [('state', '=', 'approve'), ('start_date', '<=', str(date))])
+ for f in fleet:
+ f.action_inprogress()
+
+ @api.model
+ def delegation_close_cron(self):
+ date = datetime.now().date()
+ fleet = self.env['vehicle.delegation'].sudo().search(
+ [('state', '=', 'in_progress'), ('end_date', '<=', str(date))])
+ for f in fleet:
+ f.action_close()
diff --git a/odex25_fleet/odex_fleet/reports/__init__.py b/odex25_fleet/odex_fleet/reports/__init__.py
new file mode 100644
index 000000000..7a25895e4
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/__init__.py
@@ -0,0 +1,5 @@
+from . import fleet_report
+from . import maintains_report
+from . import renew_report
+from . import service_report
+from . import driver
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/driver.py b/odex25_fleet/odex_fleet/reports/driver.py
new file mode 100644
index 000000000..40ac17750
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/driver.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+
+import io
+import base64
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError, UserError
+
+from datetime import datetime,timedelta,date
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+import arabic_reshaper
+from bidi.algorithm import get_display
+import io
+import base64
+
+ # driver
+
+class Driver(models.AbstractModel):
+ _name = 'report.odex_fleet.driver_report_pdf'
+ _description = 'Report Driver'
+
+ def get_result(self, data=None):
+ form = data
+ domain = [('driver','=',True),('vehicle_id','!=',False)]
+ if form['state_ids']:
+ domain += [('branch_id.state_id','in',form['state_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain = [('delegation_start', '>=', form['date_from']), ('delegation_end', '<=', form['date_to'])]
+ if form['department_ids']:
+ domain += [('department_id.name','in',form['department_ids'])]
+ emp = self.env['hr.employee'].sudo().search(domain)
+ return emp
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+
+ # driver Delegation
+
+class DriverDelegation(models.AbstractModel):
+ _name = 'report.odex_fleet.driver_delegation_report_pdf'
+ _description = 'Report Delegation'
+
+ def get_result(self, data=None):
+ form = data
+ domain = [('delegation_type','=','driver'),('state','=','in_progress')]
+ if form['state_ids']:
+ domain += [('vehicle_id.branch_id.state_id','in',form['state_ids'])]
+ # if form['date_from'] and form['date_to']:
+ # domain += [('start_date', '>=', form['date_from']), ('end_date', '<=', form['date_to'])]
+ emp = self.env['vehicle.delegation'].sudo().search(domain)
+ return emp
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/driver_template.xml b/odex25_fleet/odex_fleet/reports/driver_template.xml
new file mode 100644
index 000000000..ccc919976
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/driver_template.xml
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+ إقرار استلام سيارة
+
+
+ أقر أنا /
+
+ الجنسية
+
+ رقم الهوية / الإقامة /
+
+ صادرة من وتنتهي في:
+
+ بأنني استلمت سيارة نوعها
+
+ موديل /
+
+ رقم اللوحة /
+
+ اللون /
+
+ من الشركة لاستخدامها في أغراض العمل وأتعهد
+ بالمحافظة عليها وعلى ملحقاتها بحالة جيدة واستخدامها أثناء الدوام اليومي ولأغراض العمل.
+
+
+ وفي حالة حدوث أي مشكلات أن أبلغ الإدارة فوراً كما أقر بمسئوليتي عن أي تلفيات تحدث للسيارة نتيجة سوء الاستخدام أو
+ عدم العناية. وبعدم تسليم السيارة لأي شخص آخر أو السماح له باستخدام السيارة وأن أسلم السيارة على حالة التي استلمتها
+ عليها فور طلب الإدارة ذلك وأن أراعي في استخدامها القوانين وأنظمة العمل المعمول بها في المملكة العربية السعودية.
+
+
+ وأقر بأنني اطلعت على جميع ما ورد بسياسة استخدام السيارات بالشركة ............................................... وأقر بالتزامي
+ الكامل بها وبما ورد فيها.
+
+
+
+ الإسم :
+
+
+
+ التوقيع :
+
+
+
+ تاريخ إستلام السيارة :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Driver Report
+
+ -
+
+
+
+
+
+
+
+
+
+
+ #
+ Driver
+ Id Number
+ Type
+ Model
+ Plate
+ State
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Driver Delegation Report
+
+
+
+
+
+
+
+ #
+ Driver
+ Id Number
+ Type
+ Model
+ Plate
+ State
+ Branch
+ Start
+ End
+ KM Number
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/fleet_report.py b/odex25_fleet/odex_fleet/reports/fleet_report.py
new file mode 100644
index 000000000..6d0da10fd
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/fleet_report.py
@@ -0,0 +1,571 @@
+# -*- coding: utf-8 -*-
+
+import io
+import base64
+import matplotlib.pyplot as plt
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError, UserError
+
+from datetime import datetime,timedelta,date
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+import arabic_reshaper
+from bidi.algorithm import get_display
+import io
+import base64
+
+class FleetBranchReport(models.AbstractModel):
+ _name = 'report.odex_fleet.fleet_branch_report_pdf'
+ _description = 'Report Branch'
+ def get_result(self, data=None):
+ form = data
+ domain = [('invoice_id','!=', False)]
+ if form['branch_ids']:
+ domain += [('branch_id','in',form['branch_ids'])]
+ if form['type_ids']:
+ domain += [('vehicle_id.fleet_type_id','in',form['type_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ if form['vehicle_del_type'] == 'department':
+ domain += [('vehicle_id.department_id.name', 'in', form['department_ids'])]
+ if form['vehicle_del_type'] == 'project' :
+ domain += [('vehicle_id.project_id.name', 'in', form['project_ids'])]
+ service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+ fuel = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+ branch = self.env['res.branch'].browse(form['branch_ids']) if form['branch_ids'] else set(service.mapped('branch_id') + fuel.mapped('branch_id'))
+ types = self.env['fleet.type'].browse(form['type_ids']) if form['type_ids'] else set(service.mapped('vehicle_id.fleet_type_id') + fuel.mapped('vehicle_id.fleet_type_id'))
+ data = {}
+ li = []
+ for b in branch:
+ b_service = service.filtered(lambda r:r.branch_id == b)
+ b_fuel = fuel.filtered(lambda r:r.branch_id == b)
+ rec = []
+ for t in types:
+ value = {}
+ value['type'] = t.name
+ value['total'] = sum(b_service.filtered(lambda r:r.vehicle_id.fleet_type_id == t).mapped('amount')) +\
+ sum(b_fuel.filtered(lambda r:r.vehicle_id.fleet_type_id == t).mapped('amount')) or 0
+ rec.append(value)
+ li.append({'branch':b.name,'data':rec,'total':sum(b_service.mapped('amount'))+sum(b_fuel.mapped('amount')) or 0})
+ tot = []
+ for t in types:
+ amount = sum(service.filtered(lambda r:r.vehicle_id.fleet_type_id == t and r.branch_id in branch).mapped('amount')) +\
+ sum(fuel.filtered(lambda r:r.vehicle_id.fleet_type_id == t and r.branch_id in branch).mapped('amount')) or 0
+ tot.append([t.name,amount])
+ data['total'] = tot
+ data['branch'] = sorted(li, key=lambda d: d['total'], reverse=False)
+ return data
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+
+# cost chart
+
+class FleetChartReport(models.AbstractModel):
+ _name = 'report.odex_fleet.all_branch_cost_report_pdf'
+ _description = 'Report Branch Cost'
+
+ def get_chart(self, cdata,type=False):
+ print("ffffffffffffffff",cdata)
+ li = []
+ labels, slices = [], []
+ for dic in cdata:
+ if type:
+ labels.append(get_display(arabic_reshaper.reshape(dic['type'])))
+ else:
+ labels.append(get_display(arabic_reshaper.reshape(dic['branch'])))
+ slices.append(round(dic['total_per'],2))
+ textprops = {"fontsize": 9}
+ plt.pie(slices, labels=labels, autopct='%1.1f%%', shadow=True, startangle=15, textprops=textprops, )
+ plt.axis('equal')
+ buffered = io.BytesIO()
+ plt.savefig(buffered, format='png')
+ plt.close()
+ return base64.b64encode(buffered.getvalue())
+
+ def bar_get_chart(self, datas,type=False):
+ li = []
+ for cdata in datas:
+ labels, slices = [], []
+ for dic in cdata['data']:
+ labels.append(get_display(arabic_reshaper.reshape(dic['branch'])))
+ slices.append(round(dic['total_per'],2))
+ line = plt.bar(labels, slices)
+ plt.xlabel('Percentage')
+ plt.ylabel("Branch")
+ for i in range(len(slices)):
+ plt.annotate(str(slices[i]), xy=(labels[i], slices[i]), ha='center', va='bottom')
+ # plt.show()
+ buffered = io.BytesIO()
+ plt.savefig(buffered, format='png')
+ plt.close()
+ li.append(base64.b64encode(buffered.getvalue()))
+ return li
+
+ def get_result(self, data=None):
+ form = data
+ domain = []
+ if form['branch_ids']:
+ domain += [('branch_id','in',form['branch_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ if form['type_ids']:
+ domain += [('vehicle_id.fleet_type_id','in',form['type_ids'])]
+ if form ['vehicle_del_type'] == 'department':
+ domain += [('vehicle_id.department_id.name','in',form['department_ids'])]
+ if form ['vehicle_del_type'] == 'project':
+ domain += [('vehicle_id.project_id.name','in',form['project_ids'])]
+
+ man = self.env['fleet.maintenance'].sudo().search(domain)
+ domain += [('invoice_id','!=', False)]
+ service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+ fuel = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+ branch = self.env['res.branch'].browse(form['branch_ids']) if form['branch_ids'] else set(service.mapped('branch_id') + fuel.mapped('branch_id')+man.mapped('branch_id')+ man.mapped('branch_id')+man.mapped('branch_id'))
+ types = self.env['fleet.type'].browse(form['type_ids']) if form['type_ids'] else set(service.mapped('vehicle_id.fleet_type_id') + fuel.mapped('vehicle_id.fleet_type_id')+man.mapped('vehicle_id.fleet_type_id'))
+ totals_alls = sum(service.mapped('amount')) + sum(fuel.mapped('amount')) + sum(man.mapped('total_cost'))
+
+ data = {}
+ li = []
+ tot = []
+ l = []
+ for t in types:
+ value = {}
+ value['type'] = t.name
+ total = sum(service.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount')) + \
+ sum(fuel.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount')) + \
+ sum(man.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('total_cost'))
+ total_per = total / totals_alls * 100 if totals_alls > 0 else 0
+ value['total'] = total
+ value['total_per'] = total_per
+ l.append(value)
+ rec = []
+ for b in branch:
+ datas = {}
+ branch_total = sum(
+ service.filtered(lambda r: r.vehicle_id.fleet_type_id == t and r.branch_id == b).mapped('amount')) + \
+ sum(fuel.filtered(lambda r: r.vehicle_id.fleet_type_id == t and r.branch_id == b).mapped(
+ 'amount')) +sum(man.filtered(lambda r: r.vehicle_id.fleet_type_id == t and r.branch_id == b).mapped(
+ 'total_cost'))
+ branch_total_per = branch_total / totals_alls * 100 if totals_alls > 0 else 0
+ datas['branch'] = b.name
+ datas['total'] = branch_total
+ datas['total_per'] = branch_total_per
+ rec.append(datas)
+ branch_branch = sum(
+ service.filtered(lambda r:r.branch_id == b).mapped('amount')) + \
+ sum(fuel.filtered(lambda r:r.branch_id == b).mapped('amount')) + sum(
+ man.filtered(lambda r:r.branch_id == b).mapped( 'total_cost'))
+ branch_per = branch_branch / totals_alls * 100 if totals_alls > 0 else 0
+ tot.append({'branch': b.name, 'total': branch_branch, 'total_per': branch_per})
+ li.append({'type': t.name, 'data': sorted(rec, key=lambda d: d['total'], reverse=True)})
+ tot = [dict(t) for t in {tuple(d.items()) for d in tot}]
+ data['branch'] = sorted(tot, key=lambda d: d['total'], reverse=True)
+ data['types'] = sorted(l, key=lambda d: d['total'], reverse=True)
+ data['branch_types'] = li
+ data['chart'] = self.get_chart(tot)
+ data['chart_main'] = self.get_chart(l,type=True)
+ data['bar_chart'] = self.bar_get_chart(li,type=True)
+
+
+ return data
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+
+
+
+# state
+
+class AllStateReport(models.AbstractModel):
+ _name = 'report.odex_fleet.state_cost_report_pdf'
+ _description = 'Report State Cotst'
+
+ def get_result(self, data=None):
+ form = data
+ domain = [('invoice_id','!=', False)]
+ if form['state_ids']:
+ domain += [('branch_id.state_id','in',form['state_ids'])]
+ if form['type_ids']:
+ domain += [('vehicle_id.fleet_type_id','in',form['type_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+ fuel = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+ branch = list(set(service.mapped('branch_id') + fuel.mapped('branch_id')))
+ state = self.env['res.country.state'].browse(form['state_ids']) if form['state_ids'] else list(set(service.mapped('branch_id.state_id') + fuel.mapped('branch_id.state_id')))
+ types = self.env['fleet.type'].browse(form['type_ids']) if form['type_ids'] else set(service.mapped('vehicle_id.fleet_type_id') + fuel.mapped('vehicle_id.fleet_type_id'))
+ last = []
+ for s in state:
+ data = {}
+ li = []
+ for b in branch:
+ if b.state_id == s:
+ b_service = service.filtered(lambda r:r.branch_id == b)
+ b_fuel = fuel.filtered(lambda r:r.branch_id == b)
+ rec = []
+ for t in types:
+ value = {}
+ value['type'] = t.name
+ value['total'] = sum(b_service.filtered(lambda r:r.vehicle_id.fleet_type_id == t).mapped('amount')) +\
+ sum(b_fuel.filtered(lambda r:r.vehicle_id.fleet_type_id == t).mapped('amount')) or 0
+ rec.append(value)
+ li.append({'branch':b.name,'data':sorted(rec, key=lambda d: d['total'], reverse=False),'total':sum(b_service.mapped('amount'))+sum(b_fuel.mapped('amount')) or 0})
+ tot = []
+ total_state = 0
+ for t in types:
+ amount = sum(service.filtered(lambda r:r.vehicle_id.fleet_type_id == t and r.branch_id.state_id == s).mapped('amount')) +\
+ sum(fuel.filtered(lambda r:r.vehicle_id.fleet_type_id == t and r.branch_id.state_id == s).mapped('amount')) or 0
+ total_state += amount
+ tot.append([t.name,amount])
+ data['total'] = tot
+ data['branch'] = li
+ data['state'] = s.name
+ data['state_total'] = total_state
+ last.append(data)
+ return last
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ print("ffffffffffffffffffff",record)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+
+
+# consumption
+
+# class FleetConsumptionReport(models.AbstractModel):
+# _name = 'report.odex_fleet.car_consumption_cost_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = []
+# if form['branch_ids']:
+# domain += [('branch_id','in',form['branch_ids'])]
+# if form['date_from'] and form['date_to']:
+# domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+# man = self.env['fleet.maintenance'].sudo().search(domain)
+# domain += [('invoice_id','!=', False)]
+# service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+# fuel = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+# branch = self.env['res.branch'].browse(form['branch_ids']) if form['branch_ids'] else set(service.mapped('branch_id') + fuel.mapped('branch_id')+man.mapped('branch_id')+ man.mapped('branch_id')+man.mapped('branch_id'))
+# types = self.env['fleet.type'].browse(form['type_ids']) if form['type_ids'] else set(service.mapped('vehicle_id.fleet_type_id') + fuel.mapped('vehicle_id.fleet_type_id')+man.mapped('vehicle_id.fleet_type_id'))
+# print("gggggggggggggggggg",types,branch)
+# data = {}
+# li = []
+# for b in branch:
+# b_service = service.filtered(lambda r:r.branch_id == b)
+# b_fuel = fuel.filtered(lambda r:r.branch_id == b)
+# b_man = man.filtered(lambda r: r.branch_id == b)
+# service_total = sum (b_service.mapped('amount'))
+# fuel_total = sum (b_fuel.mapped('amount'))
+# man_total = sum (b_man.mapped('total_cost'))
+# totals = service_total+fuel_total+man_total
+# service_total_per =service_total/totals*100 if totals>0 else 0
+# fuel_total_per =fuel_total/totals*100 if totals>0 else 0
+# man_total_per =man_total/totals*100 if totals>0 else 0
+# total_per = man_total_per+fuel_total_per+service_total_per
+# data['total'] = [[service_total,fuel_total,man_total,totals],[service_total_per,fuel_total_per,man_total_per,total_per]]
+# vehicle_ids = list(set(service.mapped('vehicle_id') + fuel.mapped('vehicle_id') + man.mapped('vehicle_id')))
+# rec = []
+# for t in types:
+# l =[]
+# value = {}
+# value['type'] = t.name
+# print("dddddddddddd",vehicle_ids)
+# # fuel_total_b = 0
+# # man_total_b = 0
+# # service_total_b = 0
+# fuel_total_b = sum(b_fuel.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount'))
+# man_total_b = sum(b_man.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('total_cost'))
+# service_total_b = sum(b_service.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount'))
+# total_total = service_total+man_total+fuel_total
+# total_total_per = totals/ total_total *100if total_total>0 else 0
+# for c in vehicle_ids:
+# if c.fleet_type_id == t:
+# z = {}
+# z['name'] = c.name
+# z['model'] = c.model_id.name
+# z['driver'] = c.employee_id.name
+# z['plate'] = c.license_plate
+# z['job'] = c.employee_id.job_id.name
+# z['fuel'] = sum(b_fuel.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('amount'))
+# z['man'] = sum(b_man.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('total_cost'))
+# z['service'] = sum(b_service.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('amount'))
+# z['total'] = z['fuel'] + z['man'] + z['service']
+# z['all_tot_per'] = z['total']/total_total*100 if total_total>0 else 0
+# # print("fffffffffff444", z['all_tot_per'] , total_total,z['total'],total_total_per)
+# # total_total_per += z['all_tot_per']
+# # fuel_total_b += z['fuel']
+# # man_total_b += z['man']
+# # service_total_b += z['service']
+# l.append(z)
+# value['data'] = l
+# value['type'] = t.name
+# value['total'] = [fuel_total_b,service_total_b,man_total_b,total_total,total_total_per]
+# rec.append(value)
+# li.append({'branch':b.name,'data':rec,'total':[fuel_total_b,service_total_b,man_total_b,total_total,total_total_per]})
+# data['branch'] = li
+# return data
+#
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# print("ddddddddddddddd",record)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+# # Form Renew
+# # renew
+# class Renew(models.AbstractModel):
+# _name = 'report.odex_fleet.renew_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = [('state','=', 'approve')]
+# if form['date_from'] and form['date_to']:
+# domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+# form = self.env['form.renew'].sudo().search(domain)
+# return form
+#
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+# # To renew
+# class ToRenew(models.AbstractModel):
+# _name = 'report.odex_fleet.to_renew_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = []
+# if form['date_from'] and form['date_to']:
+# domain = [('form_end', '>=', form['date_from']), ('form_end', '<=', form['date_to'])]
+# form = self.env['fleet.vehicle'].sudo().search(domain)
+# return form
+#
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+# # driver
+
+# class Driver(models.AbstractModel):
+# _name = 'report.odex_fleet.driver_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = [('driver','=',True),('vehicle_id','!=',False)]
+# if form['state_ids']:
+# domain += [('branch_id.state_id','in',form['state_ids'])]
+# if form['date_from'] and form['date_to']:
+# domain = [('delegation_start', '>=', form['date_from']), ('delegation_end', '<=', form['date_to'])]
+# emp = self.env['hr.employee'].sudo().search(domain)
+# return emp
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+#
+# # driver Delegation
+#
+# class DriverDelegation(models.AbstractModel):
+# _name = 'report.odex_fleet.driver_delegation_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = [('delegation_type','=','driver'),('state','=','approve')]
+# if form['state_ids']:
+# domain += [('vehicle_id.branch_id.state_id','in',form['state_ids'])]
+# if form['date_from'] and form['date_to']:
+# domain += [('start_date', '>=', form['date_from']), ('end_date', '<=', form['date_to'])]
+# emp = self.env['vehicle.delegation'].sudo().search(domain)
+# return emp
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+# Service
+# class AllStateServiceReport(models.AbstractModel):
+# _name = 'report.odex_fleet.service_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = [('invoice_id','!=', False)]
+# if form['state_ids']:
+# domain += [('branch_id.state_id','in',form['state_ids'])]
+# if form['type_ids']:
+# domain += [('fleet_type_id','in',form['type_ids'])]
+# if form['date_from'] and form['date_to']:
+# domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+# service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+# branch = service.mapped('branch_id')
+# state = self.env['res.country.state'].browse(form['state_ids']) if form['state_ids'] else service.mapped('branch_id.state_id')
+# last = []
+# for s in state:
+# data = {}
+# li = []
+# for b in branch:
+# if b.state_id == s:
+# b_service = service.filtered(lambda r:r.branch_id == b)
+# rec = []
+# for z in b_service:
+# for t in z.cost_ids:
+# value = {}
+# value['name'] = z.vehicle_id.employee_id.name
+# value['cost'] = t.amount
+# value['service'] = t.cost_subtype_id.name
+# value['vehicle'] = z.vehicle_id.fleet_type_id.name
+# value['license_number'] = z.vehicle_id.license_plate
+# rec.append(value)
+# li.append({'branch':b.name,'data':rec,'total':sum(b_service.mapped('amount')) or 0})
+# data['branch'] = li
+# data['state'] = s.name
+# last.append(data)
+# print("RRRRRRRRRRRRRRRRRR",last)
+# return last
+#
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
+# # Invoice
+# class Invoice(models.AbstractModel):
+# _name = 'report.odex_fleet.invoice_report_pdf'
+#
+# def get_result(self, data=None):
+# form = data
+# domain = [('invoice_id','!=', False)]
+# if form['vehicle_ids']:
+# domain += [('vehicle_id','in',form['vehicle_ids'])]
+# date = 0
+# if form['date_from'] and form['date_to']:
+# date = fields.Datetime.from_string(form['date_to']) - fields.Datetime.from_string(form['date_from'])
+# date = date.days
+# domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+# service = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+# # service_types = self.env['fleet.service.type'].browse(form['service_ids']) if form['service_ids'] else service.mapped('vehicle_id.fleet_type_id')
+# vehicle_ids = self.env['fleet.vehicle'].browse(form['vehicle_ids'])
+# li = []
+# print("IIIIIIIIIIIIII",date)
+# for v in vehicle_ids:
+# b_service = service.filtered(lambda r:r.vehicle_id == v)
+# invoice = b_service.mapped('invoice_id')
+# if invoice:
+# rec = {}
+# rec['service'] = "Fuel"
+# rec['car'] = v.name
+# rec['driver'] = v.employee_id.name
+# rec['type'] = v.fleet_type_id.name
+# l = []
+# total = 0
+# for t in invoice:
+# value = {}
+# value['date'] = t.date_invoice
+# value['number'] = t.number
+# value['amount'] = t.amount_total
+# total += t.amount_total
+# l.append(value)
+# rec['data'] = l
+# rec['total'] = total
+# rec['date'] = date
+# liter = round(sum(b_service.mapped('liter'))/date,2)
+# rec['liter'] = liter
+# rec['liter_price'] = round(total/liter,2)
+# li.append(rec)
+# return li
+#
+#
+#
+# @api.model
+# def _get_report_values(self, docids, data=None):
+# record = self.get_result(data)
+# print("OOOOOOOOOOOOOOOOOO",record)
+# date_to, date_from = ' / ', ' / '
+# if data['date_from'] and data['date_to']:
+# date_from = data['date_from']
+# date_to = data['date_to']
+# return {
+# 'date_from': date_from,
+# 'date_to': date_to,
+# 'docs': record,
+# }
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/fleet_template.xml b/odex25_fleet/odex_fleet/reports/fleet_template.xml
new file mode 100644
index 000000000..b56d57bb2
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/fleet_template.xml
@@ -0,0 +1,1124 @@
+
+
+
+
+
+
+
+
+
+
Total Vehicle Expense For Branch Report -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+ Total Expense
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Expense
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+ Total Expense
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Total Vehicle Expense For Branch Report -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+ Total
+ Total Percentage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+ Total
+ Total Percentage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Description
+ Total
+ Total Percentage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total Vehicle Expense By state Report -
+
+
+
+
+
+
+
+ Branch
+ Description
+ Total Expense
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+
+ Total Vehicle For State
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/reports/maintains_purchase_request.xml b/odex25_fleet/odex_fleet/reports/maintains_purchase_request.xml
new file mode 100644
index 000000000..53883af97
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/maintains_purchase_request.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+ طلب أمر شراء
+
+
+
+
+
+
+ رقم الطلب( -لوحة رقم
+ )
+ الفرع
+
+
+
+
+
+
+
+ التاريخ :
+
+
+
+
+
+
+ الموضـوع :
+
+ سيارة
+ رقم اللوحة
+
+
+
+
+
+
+
+
+ إشارة للموضوع أعلاه نرجو من سيادتكم تعميد من يلزم بصرف مبلغ و قدره إشارة للموضوع أعلاه نرجو من سيادتكم تعميد من يلزم بصرف مبلغ و قدره ( ) ريال وذلك لزوم
+ السيارة
+
+ رقم اللوحة
+
+ القائد /
+
+
+
+
+
+
+
+ م
+ البيان
+ السعر
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * المرفقات
+
+
+ * عرض السعر
+
+
+
+
+
+ مسؤول الصيانة
+
+
+
+
+ تعميد المدير العام
+
+
+
+
+
+
+
+ الإسم :........................................
+ التوقيع :........................................
+
+
+
+
+ الإسم :........................................
+ التوقيع :........................................
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/maintains_report.py b/odex25_fleet/odex_fleet/reports/maintains_report.py
new file mode 100644
index 000000000..bf761a28c
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/maintains_report.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+
+import io
+import base64
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError, UserError
+
+from datetime import datetime,timedelta,date
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+
+class FleetMaintainsReport(models.AbstractModel):
+ _name = 'report.odex_fleet.maintains_report_pdf'
+ _description = 'Report Mainatains'
+
+ def get_result(self, data=None):
+ form = data
+ domain = []
+ if form['branch_ids']:
+ domain += [('branch_id','in',form['branch_ids'])]
+ if form['report_type']:
+ domain += [('state','in',['draft','confirm'])] if form['report_type'] == 'to_maintains' else [('state','in',['approve','paid'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ if form['department_ids']:
+ domain += [('vehicle_id.department_id.name', 'in', form['department_ids'])]
+ request = self.env['fleet.maintenance'].sudo().search(domain,order="id desc")
+ return request
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'report_type': data['report_type'],
+ 'docs': record,
+ }
+
diff --git a/odex25_fleet/odex_fleet/reports/maintains_template.xml b/odex25_fleet/odex_fleet/reports/maintains_template.xml
new file mode 100644
index 000000000..3d4a5fe88
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/maintains_template.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+ Vehicle Need Maintenance Report Vehicle Maintenance Report -
+
+
+
+
+
+
+ #
+ Type
+ Model
+ Plate
+ Driver
+ State
+ Branch
+ Maintenance
+ Maintenance Date
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/renew_report.py b/odex25_fleet/odex_fleet/reports/renew_report.py
new file mode 100644
index 000000000..0df2344d5
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/renew_report.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+
+import io
+import base64
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError, UserError
+
+from datetime import datetime,timedelta,date
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+import arabic_reshaper
+from bidi.algorithm import get_display
+import io
+import base64
+
+# Form Renew
+# renew
+class Renew(models.AbstractModel):
+ _name = 'report.odex_fleet.renew_report_pdf'
+ _description = 'Report Renew'
+
+ def get_result(self, data=None):
+ form = data
+ domain = [('state','=', 'approve')]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ form = self.env['form.renew'].sudo().search(domain)
+ return form
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+# To renew
+class ToRenew(models.AbstractModel):
+ _name = 'report.odex_fleet.to_renew_report_pdf'
+ _description = 'Report To Renew'
+
+ def get_result(self, data=None):
+ form = data
+ domain = []
+ if form['date_from'] and form['date_to']:
+ domain = [('form_end', '>=', form['date_from']), ('form_end', '<=', form['date_to'])]
+ form = self.env['fleet.vehicle'].sudo().search(domain)
+ return form
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/renew_template.xml b/odex25_fleet/odex_fleet/reports/renew_template.xml
new file mode 100644
index 000000000..0d85f25d4
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/renew_template.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+ التاريخ :
+
+
+
+
+
Vehicle Form Renew Cost Report
+
+ -
+
+
+
+
+
+ Plate
+ Type
+ Branch
+ Manufacture Year
+ Serial
+ End Date
+ Cost
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ التاريخ :
+
+
+
+
Vehicle Form To Renew Cost Report
+
+ -
+
+
+
+
+
+ Plate
+ Type
+ Branch
+ Manufacture Year
+ Serial
+ End Date
+ Cost
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/service_purchase_request.xml b/odex25_fleet/odex_fleet/reports/service_purchase_request.xml
new file mode 100644
index 000000000..ea6188d5d
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/service_purchase_request.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+ طلب أمر شراء
+
+
+
+
+
+
+
+ رقم الطلب( -لوحة رقم
+ )
+ الفرع
+
+
+
+
+
+
+
+ التاريخ :
+
+
+
+
+
+
+ الموضـوع :شراء
+
+ سيارة رقم
+
+
+
+
+
+ إشارة للموضوع أعلاه نرجو من سيادتكم تعميد من يلزم بصرف مبلغ و قدره ( ) ريال وذلك لزوم
+ شراء
+
+ للسيارة
+
+ رقم
+
+ القائد /
+
+
+
+
+
+
+ م
+ البيان
+ العدد
+ السعر
+ الإجمالي
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * المرفقات
+
+
+ * عرض السعر
+
+
+
+
+
+ مسؤول الصيانة
+
+
+
+
+ تعميد المدير العام
+
+
+
+
+
+
+ الإسم :........................................
+ التوقيع :........................................
+
+
+
+
+ الإسم :........................................
+ التوقيع :........................................
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/service_report.py b/odex25_fleet/odex_fleet/reports/service_report.py
new file mode 100644
index 000000000..199fa781b
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/service_report.py
@@ -0,0 +1,259 @@
+# -*- coding: utf-8 -*-
+
+import io
+import base64
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError, UserError
+
+from datetime import datetime,timedelta,date
+from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
+import arabic_reshaper
+from bidi.algorithm import get_display
+import io
+import base64
+
+# consumption
+class FleetConsumptionReport(models.AbstractModel):
+ _name = 'report.odex_fleet.car_consumption_cost_report_pdf'
+ _description = 'Report Consumption'
+
+ def get_result(self, data=None):
+ form = data
+ domain = []
+ if form['vehicle_ids']:
+ domain += [('vehicle_id','in',form['vehicle_ids'])]
+ if form['type_ids']:
+ domain += [('vehicle_id.fleet_type_id','in',form['type_ids'])]
+ if form['branch_ids']:
+ domain += [('branch_id','in',form['branch_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ if form['department_ids']:
+ domain += [('vehicle_id.department_id.name', 'in', form['department_ids'])]
+ man = self.env['fleet.maintenance'].sudo().search(domain)
+ domain += [('invoice_id','!=', False)]
+ service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+ fuel = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+ branch = self.env['res.branch'].browse(form['branch_ids']) if form['branch_ids'] else set(service.mapped('branch_id') + fuel.mapped('branch_id')+man.mapped('branch_id')+ man.mapped('branch_id')+man.mapped('branch_id'))
+ types = self.env['fleet.type'].browse(form['type_ids']) if form['type_ids'] else set(service.mapped('vehicle_id.fleet_type_id') + fuel.mapped('vehicle_id.fleet_type_id')+man.mapped('vehicle_id.fleet_type_id'))
+ data = {}
+ li = []
+ for b in branch:
+ b_service = service.filtered(lambda r:r.branch_id == b)
+ b_fuel = fuel.filtered(lambda r:r.branch_id == b)
+ b_man = man.filtered(lambda r: r.branch_id == b)
+ service_total = sum (b_service.mapped('amount'))
+ fuel_total = sum (b_fuel.mapped('amount'))
+ man_total = sum (b_man.mapped('total_cost'))
+ totals = service_total+fuel_total+man_total
+ service_total_per =service_total/totals*100 if totals>0 else 0
+ fuel_total_per =fuel_total/totals*100 if totals>0 else 0
+ man_total_per =man_total/totals*100 if totals>0 else 0
+ total_per = man_total_per+fuel_total_per+service_total_per
+ total_values = [[service_total,fuel_total,man_total,totals],[service_total_per,fuel_total_per,man_total_per,total_per]]
+ vehicle_ids = list(set(b_service.mapped('vehicle_id') + b_fuel.mapped('vehicle_id') + b_man.mapped('vehicle_id')))
+ rec = []
+ for t in types:
+ l =[]
+ value = {}
+ fuel_total_b = sum(b_fuel.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount'))
+ man_total_b = sum(b_man.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('total_cost'))
+ service_total_b = sum(b_service.filtered(lambda r: r.vehicle_id.fleet_type_id == t).mapped('amount'))
+ total_total = fuel_total_b+man_total_b+service_total_b
+ total_total_per = 0
+ for c in vehicle_ids:
+ if c.fleet_type_id == t:
+ z = {}
+ z['name'] = c.name
+ z['model'] = c.model_id.name
+ z['driver'] = c.employee_id.name
+ z['plate'] = c.license_plate
+ z['job'] = c.employee_id.job_id.name
+ z['fuel'] = sum(b_fuel.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('amount'))
+ z['man'] = sum(b_man.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('total_cost'))
+ z['service'] = sum(b_service.filtered(lambda r:r.vehicle_id == c and r.vehicle_id.fleet_type_id == t).mapped('amount'))
+ z['total'] = z['fuel'] + z['man'] + z['service']
+ z['all_tot_per'] = z['total']/total_total*100 if total_total>0 else 0
+ total_total_per += z['all_tot_per']
+ l.append(z)
+ value['data'] = sorted(l, key=lambda d: d['total'], reverse=True)
+ value['type'] = t.name
+ value['total'] = [fuel_total_b,service_total_b,man_total_b,total_total,total_total_per]
+ rec.append(value)
+ li.append({'branch':b.name,'data':rec,'total':total_values})
+ return li
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+# Service
+class AllStateServiceReport(models.AbstractModel):
+ _name = 'report.odex_fleet.service_report_pdf'
+ _description = 'Report Fleet Service'
+
+ def get_result(self, data=None):
+ form = data
+ fleet_fuel = self.env['fleet.vehicle.log.fuel'].sudo().search([], limit=1)
+ if fleet_fuel.integration_with_accounting == True:
+ domain = [('invoice_id', '!=', False)]
+ elif fleet_fuel.integration_with_accounting == False:
+ domain = []
+ if form['state_ids']:
+ domain += [('branch_id.state_id','in',form['state_ids'])]
+ if form['type_ids']:
+ domain += [('vehicle_id.fleet_type_id','in',form['type_ids'])]
+ if form['date_from'] and form['date_to']:
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ if form['state_ids']:
+ domain += [('branch_id.state_id','in',form['state_ids'])]
+ if form['cost_subtype_ids']:
+ print("==================",form['cost_subtype_ids'])
+ domain += [('cost_subtype_id','in',form['cost_subtype_ids'])]
+ if form['department_ids']:
+ domain += [('vehicle_id.department_id.name', 'in', form['department_ids'])]
+
+ service = self.env['fleet.vehicle.log.services'].sudo().search(domain)
+ print("=================",service)
+ branch = service.mapped('branch_id')
+ state = self.env['res.country.state'].browse(form['state_ids']) if form['state_ids'] else service.mapped('branch_id.state_id')
+ last = []
+ for s in state:
+ data = {}
+ li = []
+ for b in branch:
+ if b.state_id == s:
+ b_service = service.filtered(lambda r:r.branch_id == b)
+ rec = []
+ for z in b_service:
+
+ for t in z.cost_ids:
+ value = {}
+ value['name'] = z.vehicle_id.employee_id.name
+ value['cost'] = t.total
+ value['service'] = t.cost_subtype_id.name
+ value['vehicle'] = z.vehicle_id.fleet_type_id.name
+ value['license_number'] = z.vehicle_id.license_plate
+ value['date'] = z.date
+ rec.append(value)
+ li.append({'branch':b.name,'data':rec,'total':sum(b_service.mapped('amount')) or 0})
+ data['branch'] = li
+ data['state'] = s.name
+ last.append(data)
+ return last
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
+ # Invoice
+class Invoice(models.AbstractModel):
+ _name = 'report.odex_fleet.invoice_report_pdf'
+ _description = 'Report Invoice'
+
+ def get_result(self, data=None):
+ form = data
+ domain = []
+ fleet_fuel = self.env['fleet.vehicle.log.fuel'].sudo().search([],limit=1)
+ if fleet_fuel.integration_with_accounting == True:
+ domain = [('invoice_id','!=', False)]
+ elif fleet_fuel.integration_with_accounting == False:
+ domain = []
+ if form['vehicle_ids']:
+ domain += [('vehicle_id','in',form['vehicle_ids'])]
+ date = 0
+ if form['date_from'] and form['date_to']:
+ date = fields.Datetime.from_string(form['date_to']) - fields.Datetime.from_string(form['date_from'])
+ date = date.days
+ domain += [('date', '>=', form['date_from']), ('date', '<=', form['date_to'])]
+ service = self.env['fleet.vehicle.log.fuel'].sudo().search(domain)
+ # service_types = self.env['fleet.service.type'].browse(form['service_ids']) if form['service_ids'] else service.mapped('vehicle_id.fleet_type_id')
+ vehicle_ids = self.env['fleet.vehicle'].browse(form['vehicle_ids']) if form['vehicle_ids'] else service.mapped('vehicle_id')
+ li = []
+ for v in vehicle_ids:
+ b_service = service.filtered(lambda r:r.vehicle_id == v)
+ if fleet_fuel.integration_with_accounting == True:
+ invoice = b_service.mapped('invoice_id')
+ if invoice:
+ rec = {}
+ rec['service'] = "Fuel"
+ rec['car'] = v.name
+ rec['driver'] = v.employee_id.name
+ rec['type'] = v.fleet_type_id.name
+ price = v.fuel_type.price
+ print("fffffffff",price)
+ l = []
+ total = 0
+ for t in invoice:
+ value = {}
+ value['date'] = t.invoice_date
+ value['number'] = t.ref
+ value['amount'] = t.amount_total
+ total += t.amount_total
+ l.append(value)
+ rec['data'] = l
+ rec['total'] = total
+ rec['date'] = date
+ liter = round(total/date if date>0 else 0,2)
+ rec['liter'] = liter
+ rec['liter_price'] = round(liter/price if price>0 else 0,2)
+ # rec['liter_price'] = round(total/liter if liter>0 else 0,2)
+ li.append(rec)
+ else:
+ rec = {}
+ rec['service'] = "Fuel"
+ rec['car'] = v.name
+ rec['driver'] = v.employee_id.name
+ rec['type'] = v.fleet_type_id.name
+ price = v.fuel_type.price
+ l = []
+ total = 0
+ for b in b_service:
+ value = {}
+ value['date'] = b.date
+ value['amount'] = b.amount
+ total += b.amount
+ l.append(value)
+ rec['data'] = l
+ rec['total'] = total
+ rec['date'] = date
+ liter = round(total / date if date > 0 else 0, 2)
+ rec['liter'] = liter
+ rec['liter_price'] = round(liter / price if price > 0 else 0, 2)
+ # rec['liter_price'] = round(total/liter if liter>0 else 0,2)
+ li.append(rec)
+ return li
+
+
+
+ @api.model
+ def _get_report_values(self, docids, data=None):
+ record = self.get_result(data)
+ print("OOOOOOOOOOOOOOOOOO",record)
+ date_to, date_from = ' / ', ' / '
+ if data['date_from'] and data['date_to']:
+ date_from = data['date_from']
+ date_to = data['date_to']
+ return {
+ 'date_from': date_from,
+ 'date_to': date_to,
+ 'docs': record,
+ }
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/reports/service_template.xml b/odex25_fleet/odex_fleet/reports/service_template.xml
new file mode 100644
index 000000000..4fbc70bfe
--- /dev/null
+++ b/odex25_fleet/odex_fleet/reports/service_template.xml
@@ -0,0 +1,355 @@
+
+
+
+
+
+
+
+
+
Total Vehicle Expense For Branch Report -
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #
+ Type
+ Model
+ Plate
+ Driver
+ Job
+ Fuel
+ Oil
+ Maintenance
+ Totel
+ Total Percentage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oil
+ Fuel
+ Maintenance
+ Totals
+
+
+
+
+ Total
+
+
+ Total
+
+
+
+
+ Percentage
+
+
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vehicle Service By state Report -
+
+
+
+
+
+
+
+
+
+
+ Name
+ Type
+ License
+ Service
+ Date
+ Cost
+ Total
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Invoice Report
+
+
+
+
+
+ Vehicle
+
+
+
+
+
+ From
+
+
+
+ To
+
+
+
+
+ Type
+
+
+
+
+
+ Days
+
+
+
+
+
+
+
+ Driver
+
+
+
+
+
+ Service
+
+
+
+
+
+
+
+
+
+
+ #
+
+
+ Invoice Number
+
+ Date
+ Amount
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Total
+
+
+
+
+
+
+
+ Liter Per Day
+
+
+
+
+
+
+
+ Liter Price Per Day
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/security/ir.model.access.csv b/odex25_fleet/odex_fleet/security/ir.model.access.csv
new file mode 100644
index 000000000..494ad18a0
--- /dev/null
+++ b/odex25_fleet/odex_fleet/security/ir.model.access.csv
@@ -0,0 +1,93 @@
+id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
+fleet_vehicle_delegation_access_right,fleet_delegation_model_access_right,model_vehicle_delegation,fleet.fleet_group_user,1,0,0,0
+fleet_vehicle_delegation_access_right_super,fleet_delegation_model_access_right_hr_office,model_vehicle_delegation,fleet_group_supervisor,1,0,1,0
+fleet_vehicle_delegation_access_right_hr_office,fleet_delegation_model_access_right_hr_office,model_vehicle_delegation,fleet_group_hr_officer,1,0,1,0
+fleet_vehicle_delegation_access_right_hr_man,fleet_delegation_model_access_right_hr_man,model_vehicle_delegation,fleet_group_hr,1,1,1,1
+fleet_vehicle_delegation_access_right_vice,fleet_delegation_model_access_right_vice,model_vehicle_delegation,fleet_group_vice_gm,1,1,0,1
+fleet_vehicle_form_access_right_emp,fleet_form_model_access_emp,model_form_renew,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_form_access_right_emp_super,fleet_form_model_access_emp_super,model_form_renew,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_form_access_right_acc,fleet_form_model_access_acc,model_form_renew,fleet_group_account,1,1,0,1
+fleet_vehicle_acc_access_right_acc,fleet_acc_model_access_acc,model_fleet_account_config,fleet_group_account,1,1,1,1
+fleet_vehicle_acc_access_right_emp,fleet_acc_model_access_emp,model_fleet_account_config,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_type_access_right_emp,fleet_type_model_access_emp,model_fleet_type,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_type_access_right_super,fleet_type_model_access_super,model_fleet_type,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_price_access_right_emp,fleet_price_model_access_emp,model_fuel_price,fleet.fleet_group_user,1,0,0,0
+fleet_vehicle_price_access_right_super,fleet_price_model_access_super,model_fuel_price,fleet_group_supervisor,1,0,1,0
+fleet_vehicle_price_access_right_acc,fleet_price_model_access_super,model_fuel_price,fleet_group_account,1,1,1,1
+fleet_vehicle_state_access_right_super,fleet_state_model_access_super,base.model_res_country_state,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_state_access_right_hr,fleet_state_model_access_hr,base.model_res_country_state,fleet_group_hr_officer,1,0,1,0
+fleet_vehicle_state_access_right_hr_man,fleet_state_model_access_hr_man,base.model_res_country_state,fleet_group_hr,1,1,1,1
+fleet_vehicle_branch_access_right_emp,fleet_branch_model_access_emp,branch.model_res_branch,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_branch_access_right_super,fleet_branch_model_access_super,branch.model_res_branch,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_owner_access_right_emp,fleet_owner_model_access_emp,base.model_res_partner,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_owner_access_right_super,fleet_owner_model_access_super,base.model_res_partner,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_mainten_access_right_emp,fleet_mainten_model_access_emp,model_fleet_maintenance,fleet.fleet_group_user,1,0,0,0
+fleet_vehicle_mainten_access_right_vice,fleet_mainten_model_access_vice,model_fleet_maintenance,fleet_group_vice_gm,1,0,0,0
+fleet_vehicle_mainten_access_right_hr,fleet_mainten_model_access_super,model_fleet_maintenance,fleet_group_hr,1,0,0,0
+fleet_vehicle_mainten_access_right_super,fleet_mainten_model_access_acc,model_fleet_maintenance,fleet_group_supervisor,1,1,1,0
+fleet_vehicle_mainten_access_right_acc,fleet_mainten_model_access_acc,model_fleet_maintenance,fleet_group_account,1,1,1,1
+fleet.fleet_vehicle_model_brand_access_right_user,fleet_vehicle_model_brand_access_right_user,fleet.model_fleet_vehicle_model_brand,fleet.fleet_group_user,1,1,1,0
+fleet_vehicle_model_brand_access_right_super,fleet_vehicle_model_brand_access_right_super,fleet.model_fleet_vehicle_model_brand,fleet_group_supervisor,1,1,1,1
+fleet.fleet_vehicle_model_access_right_user,fleet_vehicle_model_access_right,fleet.model_fleet_vehicle_model,fleet.fleet_group_user,1,1,1,0
+fleet_vehicle_model_access_right_user_super,fleet_vehicle_model_access_right_super,fleet.model_fleet_vehicle_model,fleet_group_supervisor,1,1,1,1
+fleet.fleet_service_type_access_right_user,fleet_service_type_access_right,fleet.model_fleet_service_type,fleet.fleet_group_user,1,0,1,0
+fleet_service_type_access_right_super,fleet_service_type_access_right_super,fleet.model_fleet_service_type,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_tag_access_right_super,fleet_vehicle_tag_access_right_super,fleet.model_fleet_vehicle_tag,fleet_group_supervisor,1,1,1,1
+fleet.fleet_vehicle_tag_access_right_user,fleet_vehicle_tag_access_right_user,fleet.model_fleet_vehicle_tag,fleet.fleet_group_user,1,0,1,0
+fleet.fleet_vehicle_access_right_user,fleet_vehicle_access_right,fleet.model_fleet_vehicle,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_access_right_super,fleet_vehicle_access_right_super,fleet.model_fleet_vehicle,fleet_group_supervisor,1,1,1,1
+fleet_vehicle_access_installment_right_user,fleet_vehicle_installment_access_right,model_insurance_installment,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_access_installment_right_super,fleet_vehicle_installment_access_right_super,model_insurance_installment,fleet_group_supervisor,1,1,1,1
+fleet.fleet_vehicle_odometer_access_right,fleet_vehicle_odometer_access_right,fleet.model_fleet_vehicle_odometer,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_odometer_access_right_super,fleet_vehicle_odometer_access_right_super,fleet.model_fleet_vehicle_odometer,fleet_group_supervisor,1,1,1,1
+access_fleet_vehicle_cost_user,access_fleet_vehicle_cost,model_fleet_vehicle_cost,fleet.fleet_group_user,1,0,1,0
+access_fleet_vehicle_cost_super,access_fleet_cost_vehicle_super,model_fleet_vehicle_cost,fleet_group_supervisor,1,1,1,0
+access_fleet_vehicle_cost_acc,access_fleet_cost_vehicle_acc,model_fleet_vehicle_cost,fleet_group_account,1,1,1,1
+fleet_vehicle_log_fuel_access_right,fleet_vehicle_log_fuel_access_right,model_fleet_vehicle_log_fuel,fleet.fleet_group_user,1,0,0,0
+fleet_vehicle_log_fuel_access_right_super,fleet_vehicle_log_fuel_access_right_super,model_fleet_vehicle_log_fuel,fleet_group_supervisor,1,0,1,0
+fleet_vehicle_log_fuel_access_right_acc,fleet_vehicle_log_fuel_access_right_acc,model_fleet_vehicle_log_fuel,fleet_group_account,1,1,1,1
+fleet.fleet_vehicle_log_services_access_right_user,fleet_vehicle_log_services_access_right_user,fleet.model_fleet_vehicle_log_services,fleet.fleet_group_user,1,0,0,0
+fleet_vehicle_log_services_access_right_super,fleet_vehicle_log_services_access_right_super,fleet.model_fleet_vehicle_log_services,fleet_group_supervisor,1,0,1,0
+fleet_vehicle_log_services_access_right_acc,fleet_vehicle_log_services_access_right_acc,fleet.model_fleet_vehicle_log_services,fleet_group_account,1,1,1,1
+fleet.fleet_vehicle_log_contract_access_right_user,fleet_vehicle_log_contract_access_right,fleet.model_fleet_vehicle_log_contract,fleet.fleet_group_user,1,0,1,0
+fleet_vehicle_log_contract_access_right_user_hr,fleet_vehicle_log_contract_access_right_hr,fleet.model_fleet_vehicle_log_contract,fleet_group_hr,1,1,1,1
+fleet_vehicle_log_contract_access_right_user_hr_off,fleet_vehicle_log_contract_access_right_hr_off,fleet.model_fleet_vehicle_log_contract,fleet_group_hr_officer,1,0,1,0
+fleet_vehicle_log_line,fleet_vehicle_log_line,model_fleet_service_line_config,,1,1,1,0
+fleet_vehicle_log_line_quotation,fleet_vehicle_log_line_quotation,model_fleet_quotation,,1,1,1,1
+fleet_vehicle_log_line_quotation_ser,fleet_vehicle_log_line_quotation_ser,model_fleet_quotation_service,,1,1,1,1
+fleet_vehicle_access_right_general,fleet_vehicle_access_right_general,fleet.model_fleet_vehicle,,1,0,0,0
+fleet_vehicle_access_right_acc,fleet_vehicle_access_right_general,fleet.model_fleet_vehicle,fleet_group_account,1,1,0,0
+fleet_vehicle_access_right_hr_off,fleet_vehicle_access_right_general,fleet.model_fleet_vehicle,fleet_group_hr_officer,1,1,0,0
+fleet_vehicle_access_right_hr_model,fleet_vehicle_access_right_hr,fleet.model_fleet_vehicle_model,fleet_group_hr_officer,1,1,0,0
+fleet_vehicle_access_right_acc_model,fleet_vehicle_access_right_hr,fleet.model_fleet_vehicle_model,fleet_group_account,1,1,0,0
+fleet_vehicle_access_right_brand,fleet_vehicle_access_right_hr,fleet.model_fleet_vehicle_model_brand,fleet_group_hr_officer,1,1,0,0
+fleet_vehicle_access_right_brand_acc,fleet_vehicle_access_right_hr,fleet.model_fleet_vehicle_model_brand,fleet_group_account,1,1,0,0
+fleet_service_type_access_right_hr,fleet_service_type_access_right,fleet.model_fleet_service_type,fleet_group_hr_officer,1,0,1,0
+fleet_service_type_access_right_acc,fleet_service_type_access_right,fleet.model_fleet_service_type,fleet_group_account,1,0,0,0
+fleet_odometer_access_right_acc,fleet_service_type_access_right,fleet.model_fleet_vehicle_odometer,fleet_group_account,1,0,1,0
+access_fleet_vehicle_cost_hr,access_fleet_vehicle_cost,model_fleet_vehicle_cost,fleet_group_hr_officer,1,1,1,0
+fleet.fleet_vehicle_state_access_right_user,fleet_vehicle_state_access_right,fleet.model_fleet_vehicle_state,,1,1,1,0
+fleet.fleet_vehicle_hr_access_right_user,fleet_vehicle_state_access_right,hr.model_hr_employee,fleet.fleet_group_user,1,1,0,0
+fleet_vehicle_hr_access_right_hr,fleet_vehicle_state_access_right,hr.model_hr_employee,fleet_group_hr_officer,1,1,0,0
+
+fleet_car_category_access_right_emp,car_category_model_access_emp,model_car_category,fleet.fleet_group_user,1,0,1,0
+fleet_car_category_access_right_super,car_category_model_access_super,model_car_category,fleet_group_supervisor,1,1,1,1
+fleet_car_category_access_right_hr,car_category_access_right,model_car_category,fleet_group_hr_officer,1,0,1,0
+fleet_car_category_access_right_acc,car_category_access_right,model_car_category,fleet_group_account,1,0,0,0
+
+fleet_transmission_setting_access_right_emp,transmission_setting_model_access_emp,model_transmission_setting,fleet.fleet_group_user,1,0,1,0
+fleet_transmission_setting_right_super,transmission_setting_model_access_super,model_transmission_setting,fleet_group_supervisor,1,1,1,1
+fleet_transmission_setting_access_right_hr,transmission_setting_access_right,model_transmission_setting,fleet_group_hr_officer,1,0,1,0
+fleet_transmission_setting_access_right_acc,transmission_setting_access_right,model_transmission_setting,fleet_group_account,1,0,0,0
+
+fleet_manufacture_company_access_right_emp,manufacture_company_model_access_emp,model_manufacture_company,fleet.fleet_group_user,1,0,1,0
+fleet_manufacture_company_access_right_super,manufacture_company_model_access_super,model_manufacture_company,fleet_group_supervisor,1,1,1,1
+fleet_manufacture_company_access_right_hr,fleet_manufacture_company_access_right,model_manufacture_company,fleet_group_hr_officer,1,0,1,0
+fleet_manufacture_company_access_right_acc,fleet_manufacture_company_access_right,model_manufacture_company,fleet_group_account,1,0,0,0
+access_fleet_wiz,fleet_wiz,model_fleet_wiz,,1,1,1,1
+access_reject_reason_fleet_wiz,reject_reason_fleet_wiz,model_reject_reason_fleet_wiz,,1,1,1,1
+access_reject_reason_infraction_wiz,reject_reason_infraction_wiz,model_reject_reason_infraction_wiz,,1,1,1,1
+access_insurance_companies,insurance_companies,model_insurance_companies,,1,1,1,1
+access_vehicle_infraction,vehicle_infraction,model_vehicle_infraction,,1,1,1,1
+access_driver_department,driver_department,model_driver_department,,1,1,1,1
+access_fleet_vehicle_assignation_log_fleet_group_user,fleet_vehicle_assignation_log fleet_group_user,fleet.model_fleet_vehicle_assignation_log,base.group_user,1,1,1,1
diff --git a/odex25_fleet/odex_fleet/security/security_view.xml b/odex25_fleet/odex_fleet/security/security_view.xml
new file mode 100644
index 000000000..ddb581d35
--- /dev/null
+++ b/odex25_fleet/odex_fleet/security/security_view.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+ Fleet Supervisor
+
+
+
+
+ Manager
+
+
+
+
+
+ Hr Officer
+
+
+
+
+ Hr Manager
+
+
+
+
+ Fleet Account Manager
+
+
+
+
+
+ GM Vice
+
+
+
+
+
+ Set To Draft
+
+
+
+ GM
+
+
+
+
+
+ Fleet Hr
+
+ [('driver','=',True)]
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/static/css/chartjs/Chart.css b/odex25_fleet/odex_fleet/static/css/chartjs/Chart.css
new file mode 100644
index 000000000..5e749593e
--- /dev/null
+++ b/odex25_fleet/odex_fleet/static/css/chartjs/Chart.css
@@ -0,0 +1,47 @@
+/*
+ * DOM element rendering detection
+ * https://davidwalsh.name/detect-node-insertion
+ */
+@keyframes chartjs-render-animation {
+ from { opacity: 0.99; }
+ to { opacity: 1; }
+}
+
+.chartjs-render-monitor {
+ animation: chartjs-render-animation 0.001s;
+}
+
+/*
+ * DOM element resizing detection
+ * https://github.com/marcj/css-element-queries
+ */
+.chartjs-size-monitor,
+.chartjs-size-monitor-expand,
+.chartjs-size-monitor-shrink {
+ position: absolute;
+ direction: ltr;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ overflow: hidden;
+ pointer-events: none;
+ visibility: hidden;
+ z-index: -1;
+}
+
+.chartjs-size-monitor-expand > div {
+ position: absolute;
+ width: 1000000px;
+ height: 1000000px;
+ left: 0;
+ top: 0;
+}
+
+.chartjs-size-monitor-shrink > div {
+ position: absolute;
+ width: 200%;
+ height: 200%;
+ left: 0;
+ top: 0;
+}
diff --git a/odex25_fleet/odex_fleet/static/css/chartjs/Chart.min.css b/odex25_fleet/odex_fleet/static/css/chartjs/Chart.min.css
new file mode 100644
index 000000000..9dc5ac2e5
--- /dev/null
+++ b/odex25_fleet/odex_fleet/static/css/chartjs/Chart.min.css
@@ -0,0 +1 @@
+@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/account_config_view.xml b/odex25_fleet/odex_fleet/views/account_config_view.xml
new file mode 100644
index 000000000..8e69ce875
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/account_config_view.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ odex.fleet.account.form
+ fleet.account.config
+
+
+
+
+
+ odex.fleet.account.tree
+ fleet.account.config
+
+
+
+
+
+
+
+
+
+ odex.fleet.account.serach
+ fleet.account.config
+
+
+
+
+
+
+
+
+
+ Fleet Account Settings
+ fleet.account.config
+
+ tree,form
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/config_view.xml b/odex25_fleet/odex_fleet/views/config_view.xml
new file mode 100644
index 000000000..cf2ceeae1
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/config_view.xml
@@ -0,0 +1,99 @@
+
+
+
+ odex.res.config.settings.view.form
+ res.config.settings
+
+
+
+
+
Fleet Notification Before
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/driver_departments.xml b/odex25_fleet/odex_fleet/views/driver_departments.xml
new file mode 100644
index 000000000..ee5b98024
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/driver_departments.xml
@@ -0,0 +1,55 @@
+
+
+
+
+ driver.department.form
+ driver.department
+
+
+
+
+
+ driver.department.tree
+ driver.department
+
+
+
+
+
+
+
+
+
+
+ driver.department.search
+ driver.department
+
+
+
+
+
+
+
+
+
+ Driver Department
+ driver.department
+ tree,form
+
+
+ Click to create a new Department.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/driver_view.xml b/odex25_fleet/odex_fleet/views/driver_view.xml
new file mode 100644
index 000000000..88b31eaac
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/driver_view.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ hr.drive.inherit
+ hr.employee
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ res.hr.kanban.inherit
+ hr.employee
+
+
+
+
+
+
+
+
+
+
+ License Type
+
+
+ License Number
+
+
+ License Start
+
+
+ License End
+
+
+ Delegation Start Date
+
+
+ Delegation End Date
+
+
+ Vehicle
+
+
+
+
+
+
+
+
+
+
+
+ Drivers
+ hr.employee
+
+ kanban,tree,form
+ [('driver','=',True)]
+ {'default_driver':True}
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/views/infractions.xml b/odex25_fleet/odex_fleet/views/infractions.xml
new file mode 100644
index 000000000..cfe4fcbf0
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/infractions.xml
@@ -0,0 +1,102 @@
+
+
+
+
+ vehicle.infraction.form
+ vehicle.infraction
+
+
+
+
+
+ vehicle.infraction.tree
+ vehicle.infraction
+
+
+
+
+
+
+
+
+
+
+
+ vehicle.infraction.search
+ vehicle.infraction
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vehicle Infractions
+ vehicle.infraction
+ tree,form
+
+
+ Click to create a new Infraction.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/insurance_companies.xml b/odex25_fleet/odex_fleet/views/insurance_companies.xml
new file mode 100644
index 000000000..e61e304d0
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/insurance_companies.xml
@@ -0,0 +1,42 @@
+
+
+
+
+ insurance.companies.form
+ insurance.companies
+
+
+
+
+
+ insurance.companies.tree
+ insurance.companies
+
+
+
+
+
+
+
+
+ Form Insurance Companies
+ insurance.companies
+ tree,form
+
+
+ Click to create a new Form Renew.
+
+
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/views/mail_template.xml b/odex25_fleet/odex_fleet/views/mail_template.xml
new file mode 100644
index 000000000..4b2bfdcf8
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/mail_template.xml
@@ -0,0 +1,152 @@
+
+
+
+
+ Driver Expiration e-mail template
+ Driver License
+
+ ${object.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب انتهاء رخصة السائق ${(object.name)} رقم ${(object.license_number)} القائد ${(object.employee_id.name)} والتي تنتهي بتاريخ ${(object.license_end)}
+
+
+ ]]>
+
+
+
+
+ Delegation Expiration e-mail template
+ Delegation End
+
+ ${object.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب انتهاء تفويض سيارة رقم ${(object.vehicle_id.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.vehicle_id.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.end_date)}
+
+
+ ]]>
+
+
+
+
+ Expiration e-mail template
+ Car License
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب انتهاء رخصة السير للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.license_end)}
+
+
+ ]]>
+
+
+
+
+ Form Expiration e-mail template
+ Car Form
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب انتهاء الاستمارة للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.form_end)}
+
+
+ ]]>
+
+
+
+
+ Check Expiration e-mail template
+ Car Check
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب موعد الفحص للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.check_end)}
+
+
+ ]]>
+
+
+
+
+
+
+ Insurance Expiration e-mail template
+ Car Insurance
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب موعد انتهاء بوليصة التامين رقم ${(object.insurance_number)} للسيارة رقم ${(object.license_plate)} والتي تنتهي بتاريخ ${(object.insurance_end_date)}
+
+
+ ]]>
+
+
+
+
+
+
+ Operation Number Expiration e-mail template
+ Car Operation Number
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب انتهاء كرت التشغيل رقم ${(object.operation_card_number)} للسيارة رقم ${(object.license_plate)} القائد ${(object.employee_id.name)} النوع ${(object.fleet_type_id.name)} والتي تنتهي بتاريخ ${(object.operation_card_number)}
+
+
+ ]]>
+
+
+
+
+ Installment e-mail template
+ Car Installment
+
+ ${object.driver_id.email}
+ ${object.lang}
+
+
+
+ عزيزي العميل
+ نود تذكيركم بقرب موعد سداد قسط التامين بوليصة رقم ${(object.fleet_id.insurance_number)} بتاريخ ${(object.date)}
+
+
+ ]]>
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/maintenance_request_view.xml b/odex25_fleet/odex_fleet/views/maintenance_request_view.xml
new file mode 100644
index 000000000..dc1993bb0
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/maintenance_request_view.xml
@@ -0,0 +1,136 @@
+
+
+
+
+ fleet.maintenance.vehicle.form
+ fleet.maintenance
+
+
+
+
+
+ fleet.vehicle.maintenance.tree
+ fleet.maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.maintenance.search
+ fleet.maintenance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fleet Maintenance
+ fleet.maintenance
+
+ tree,form
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/views/renew_view.xml b/odex25_fleet/odex_fleet/views/renew_view.xml
new file mode 100644
index 000000000..e4b6b9858
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/renew_view.xml
@@ -0,0 +1,107 @@
+
+
+
+
+ fleet.form.renew.vehicle.form
+ form.renew
+
+
+
+
+
+ fleet.renew.tree
+ form.renew
+
+
+
+
+
+
+
+
+
+
+
+ fleet.form.renew.vehicle.search
+ form.renew
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form Renew
+ form.renew
+
+ tree,form
+
+
+ Click to create a new Form Renew.
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/vehicle_deleation_view.xml b/odex25_fleet/odex_fleet/views/vehicle_deleation_view.xml
new file mode 100644
index 000000000..f8e17e3ce
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/vehicle_deleation_view.xml
@@ -0,0 +1,148 @@
+
+
+
+
+ fleet.delegation.vehicle.form
+ vehicle.delegation
+
+
+
+
+
+ fleet.vehicle.delegation.tree
+ vehicle.delegation
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.delegation.vehicle.search
+ vehicle.delegation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Driver Delegation
+ vehicle.delegation
+
+ tree,form
+ [('delegation_type','=','driver')]
+ {'default_delegation_type':'driver'}
+
+
+ Click to create a new Driver Delegation.
+
+
+
+
+
+
+ Branch Delegation
+ vehicle.delegation
+
+ tree,form
+ [('delegation_type','=','branch')]
+ {'default_delegation_type':'branch'}
+
+
+ Click to create a new Branch Delegation.
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/views/vehicle_view.xml b/odex25_fleet/odex_fleet/views/vehicle_view.xml
new file mode 100644
index 000000000..5b7d5de85
--- /dev/null
+++ b/odex25_fleet/odex_fleet/views/vehicle_view.xml
@@ -0,0 +1,921 @@
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.tree
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.kanban
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.pivot
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.graph
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.pivot
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.graph
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.search
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.cost.form
+ fleet.vehicle.cost
+
+
+
+
+
+
+ fleet.vehicle.cost.graph
+ fleet.vehicle.cost
+
+
+
+
+
+
+
+
+
+
+ Vehicle Costs
+ fleet.vehicle.cost
+
+ tree,kanban,form,graph
+ {"search_default_parent_false" : True, "search_default_groupby_vehicle_id" : True,}
+
+
+
+ Click to create a new cost.
+
+
+ Odoo helps you managing the costs for your different
+ vehicles. Costs are created automatically from services,
+ contracts (fixed or recurring) and fuel logs.
+
+
+
+
+
+
+
+
+
+ odex.fleet.vehicle.form
+ fleet.vehicle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g/km
+
+
+
+
+
+
+ kW
+
+
+
+
+ Km
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.type.model.form
+ fleet.type
+
+
+
+
+
+
+ fleet.vehicle.type.tree
+ fleet.type
+
+
+
+
+
+
+
+
+
+ Vehicle Type
+ fleet.type
+
+ tree,form
+
+
+ Click to create a new type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.fuel.price.model.form
+ fuel.price
+
+
+
+
+
+
+ fleet.vehicle.fuel.price.model.tree
+ fuel.price
+
+
+
+
+
+
+
+
+
+ Fuel Price
+ fuel.price
+
+ tree,form
+
+
+ Click to create a new Fuel Price.
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.car.category.model.form
+ car.category
+
+
+
+
+
+
+ fleet.vehicle.car.category.model.tree
+ car.category
+
+
+
+
+
+
+
+
+
+ Car Category
+ car.category
+
+ tree,form
+
+
+ Click to create a new Car Category.
+
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.manufacture.company.model.form
+ manufacture.company
+
+
+
+
+
+
+ fleet.vehicle.manufacture.company.model.tree
+ manufacture.company
+
+
+
+
+
+
+
+
+
+ Manufacture Company
+ manufacture.company
+
+ tree,form
+
+
+ Click to create a new Manufacture Company.
+
+
+
+
+
+
+
+
+
+ fleet.vehicle.transmission.setting.model.form
+ transmission.setting
+
+
+
+
+
+
+ fleet.vehicle.transmission.setting.model.tree
+ transmission.setting
+
+
+
+
+
+
+
+
+
+ Transmission Type
+ transmission.setting
+
+ tree,form
+
+
+ Click to create a new transmission .
+
+
+
+
+
+
+
+
+
+
+ odex.fleet.vehicle.model.brand.form
+ fleet.vehicle.model.brand
+
+
+
+
+
+
+
+
+
+
+
+ odex.fleet.vehicle.model.form
+ fleet.vehicle.model
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fleet.branch.inherit
+ res.branch
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Car Owner
+ ir.actions.act_window
+ res.partner
+
+ []
+ kanban,tree,form
+ [('car_owner','=',True)]
+ {'default_car_owner':True}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ odex.fleet.vehicle.log.form
+ fleet.vehicle.log.fuel
+
+
+
+
+
+
+
+
+ fleet.vehicle.log.fuel.tree
+ fleet.vehicle.log.fuel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vehicles Fuel Logs
+ fleet.vehicle.log.fuel
+
+ tree,kanban,form,graph
+ {"search_default_groupby_vehicle" : True}
+
+
+ Click to create a new fuel log.
+
+
+ Here you can add refuelling entries for all vehicles. You can
+ also filter logs of a particular vehicle using the search
+ field.
+
+
+
+
+
+
+
+
+
+ odex.fleet.vehicle.log.services.form
+ fleet.vehicle.log.services
+
+
+
+
+
+
+
+
+
+
+
+ odex.vehicle.log.services.tree
+ fleet.vehicle.log.services
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odex25_fleet/odex_fleet/wizards/__init__.py b/odex25_fleet/odex_fleet/wizards/__init__.py
new file mode 100644
index 000000000..38a3605ec
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+from . import fleet_wiz
+from . import reject_reason
+from . import reject_reason_infraction
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/wizards/fleet_view.xml b/odex25_fleet/odex_fleet/wizards/fleet_view.xml
new file mode 100644
index 000000000..0145fab19
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/fleet_view.xml
@@ -0,0 +1,267 @@
+
+
+
+
+ fleet.report.form
+ fleet.wiz
+
+
+
+
+
+
+ Fleet Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ new
+
+
+
+
+
+
+
+
+
+
+
+ Fleet State Expense Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'state_cost'}
+ new
+
+
+
+
+
+
+
+
+
+ Fleet Branch Expense Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'branch_cost'}
+ new
+
+
+
+
+
+ Fleet All Branch Expense Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'all_branch_cost'}
+ new
+
+
+
+
+
+ Fleet Maintains Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'maintains'}
+ new
+
+
+
+
+
+ Fleet Need Maintains Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'to_maintains'}
+ new
+
+
+
+
+
+
+ Fleet Need Renew Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'to_renew'}
+ new
+
+
+
+
+ Fleet Renew Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'renew'}
+ new
+
+
+
+
+
+
+ Fleet Consumption Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'car_consumption'}
+ new
+
+
+
+
+
+ Fleet Service Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'service'}
+ new
+
+
+
+
+
+ Fleet Expense Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'invoice'}
+ new
+
+
+
+
+
+
+ Fleet Driver Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'driver'}
+ new
+
+
+
+
+ Fleet Delegation Report
+ ir.actions.act_window
+ fleet.wiz
+
+ form
+ {'default_report_type':'delegation'}
+ new
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/wizards/fleet_wiz.py b/odex25_fleet/odex_fleet/wizards/fleet_wiz.py
new file mode 100644
index 000000000..004021e92
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/fleet_wiz.py
@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Expert (LCT, Life Connection Technology)
+# Copyright (C) 2020-2021 LCT
+#
+##############################################################################
+from dateutil.relativedelta import relativedelta
+from odoo.exceptions import ValidationError
+from odoo import models, fields, api, _
+
+
+class FleettWiz(models.TransientModel):
+ _name = 'fleet.wiz'
+ _description = "Fleet Wizard Report"
+
+ date_from = fields.Date(string='Date From')
+ date_to = fields.Date(string='Date To')
+ service_ids = fields.Many2many('fleet.service.type','fleet_service_wiz_rel', 'service_id', 'wiz_id', string='Service', )
+ branch_ids = fields.Many2many('res.branch', string='Branch', )
+ type_ids = fields.Many2many('fleet.type', string='Fleet Type', )
+ vehicle_ids = fields.Many2many('fleet.vehicle', string='Vehicle', )
+ state_ids = fields.Many2many('res.country.state', string=' States')
+ cost_subtype_ids = fields.Many2many('fleet.service.type', string='Service Type')
+ vehicle_del_type = fields.Selection(selection=[('department', 'Department'),
+ ('project', 'Project')])
+ department_ids = fields.Many2many('hr.department',string='Departments')
+ project_ids = fields.Many2many('project.project',string='projects')
+ report_type = fields.Selection(selection=[('branch_cost','Branch Cost'),
+ ('state_cost','State Cost'),
+ ('all_branch_cost', 'All Branch Cost'),
+ ('car_consumption','Car Consumption'),
+ ('driver','Driver'),
+ ('delegation','Delegation'),
+ ('renew','Renew'),
+ ('to_renew','To Renew'),
+ ('service','Service'),
+ ('invoice','Invoice'),
+ ('maintains','Maintenance'),
+ ('to_maintains','To Maintenance'),
+ ])
+
+
+
+ @api.constrains('date_from','date_to')
+ def check_date(self):
+ for rec in self:
+ if rec.date_from and rec.date_to:
+ if rec.date_from>rec.date_to:
+ raise ValidationError(_("Date To Should Be Greater Than Date From"))
+
+ def print_report(self):
+ data ={'state_ids':self.state_ids.ids if self.state_ids else False,'date_from':self.date_from,'date_to':self.date_to,'report_type':self.report_type,
+ 'type_ids':self.type_ids.ids if self.type_ids else False,'branch_ids':self.branch_ids.ids if self.branch_ids else False ,
+ 'vehicle_ids':self.vehicle_ids.ids if self.vehicle_ids else False,'cost_subtype_ids': self.cost_subtype_ids.ids if self.cost_subtype_ids else False,
+ 'vehicle_del_type' : self.vehicle_del_type if self.vehicle_del_type else False ,
+ 'department_ids':self.department_ids.mapped('name'),
+ 'project_ids':self.project_ids.mapped('name')}
+ if self.report_type == 'branch_cost':
+ return self.env.ref('odex_fleet.fleet_branch_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'state_cost':
+ return self.env.ref('odex_fleet.state_cost_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'all_branch_cost':
+ return self.env.ref('odex_fleet.all_branch_cost_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'car_consumption':
+ return self.env.ref('odex_fleet.car_consumption_cost_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'to_renew':
+ return self.env.ref('odex_fleet.to_renew_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'renew':
+ return self.env.ref('odex_fleet.renew_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'driver':
+ return self.env.ref('odex_fleet.driver_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'delegation':
+ return self.env.ref('odex_fleet.driver_delegation_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'service':
+ return self.env.ref('odex_fleet.service_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'service':
+ return self.env.ref('odex_fleet.service_report_pdf_act').report_action(self, data=data)
+ elif self.report_type == 'invoice':
+ return self.env.ref('odex_fleet.invoice_report_pdf_act').report_action(self, data=data)
+ elif self.report_type in ['to_maintains','maintains']:
+ return self.env.ref('odex_fleet.maintains_report_pdf_act').report_action(self, data=data)
diff --git a/odex25_fleet/odex_fleet/wizards/reject_reason.py b/odex25_fleet/odex_fleet/wizards/reject_reason.py
new file mode 100644
index 000000000..4d1e1245f
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/reject_reason.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+from odoo import models, fields, api, _
+
+
+class RejectReasonFleet(models.TransientModel):
+ _name = 'reject.reason.fleet.wiz'
+ _description = 'Reject Wiz'
+
+ reason = fields.Text()
+ delegation_id = fields.Many2one('vehicle.delegation')
+ maintenance_id = fields.Many2one('fleet.maintenance')
+ request_id = fields.Many2one('fleet.quotation')
+
+ def action_reject(self):
+ if self.delegation_id:
+ self.delegation_id.sudo().write({
+ 'state': 'refused',
+ 'reason': self.reason
+ })
+ elif self.request_id:
+ self.request_id.sudo().write({
+ 'approve': False,
+ 'reason': self.reason
+ })
diff --git a/odex25_fleet/odex_fleet/wizards/reject_reason.xml b/odex25_fleet/odex_fleet/wizards/reject_reason.xml
new file mode 100644
index 000000000..c292223bc
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/reject_reason.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ Reject Reason
+ reject.reason.fleet.wiz
+ form
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.py b/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.py
new file mode 100644
index 000000000..be230a59c
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+from odoo import models, fields, api, _
+
+
+class RejectReasonInfraction(models.TransientModel):
+ _name = 'reject.reason.infraction.wiz'
+
+ reason = fields.Text()
+ infraction_id = fields.Many2one('vehicle.infraction')
+
+ def action_reject(self):
+ if self.infraction_id:
+ self.infraction_id.sudo().write({
+ 'state': 'refused',
+ 'reason': self.reason
+ })
\ No newline at end of file
diff --git a/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.xml b/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.xml
new file mode 100644
index 000000000..70c67a172
--- /dev/null
+++ b/odex25_fleet/odex_fleet/wizards/reject_reason_infraction.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ Reject Reason Infraction
+ reject.reason.infraction.wiz
+ form
+
+
+
+
+
+
\ No newline at end of file