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 @@ + + + + + + + + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + \ 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 @@ + + + + + + + + + + + + \ 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 @@ + + + + + + + + + + + + + + + + \ 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.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