From 15429f38dc5b62c68722a9e68b3a6ed90414c2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Tue, 19 Apr 2022 11:57:33 +0200 Subject: [PATCH] [NEW] Addons creation - product_rental_inspection --- product_rental_inspection/__init__.py | 3 + product_rental_inspection/__manifest__.py | 64 +++++ product_rental_inspection/i18n/fr.po | 263 ++++++++++++++++++ product_rental_inspection/models/__init__.py | 4 + .../models/product_inspection.py | 138 +++++++++ .../models/stock_picking.py | 27 ++ .../report/inspection_report.xml | 15 + .../report/inspection_report_template.xml | 44 +++ .../security/ir.model.access.csv | 3 + .../security/security.xml | 11 + product_rental_inspection/views/menus.xml | 8 + .../views/product_inspection.xml | 108 +++++++ product_rental_inspection/views/sequence.xml | 16 ++ .../views/stock_picking.xml | 16 ++ 14 files changed, 720 insertions(+) create mode 100755 product_rental_inspection/__init__.py create mode 100755 product_rental_inspection/__manifest__.py create mode 100644 product_rental_inspection/i18n/fr.po create mode 100644 product_rental_inspection/models/__init__.py create mode 100755 product_rental_inspection/models/product_inspection.py create mode 100644 product_rental_inspection/models/stock_picking.py create mode 100755 product_rental_inspection/report/inspection_report.xml create mode 100755 product_rental_inspection/report/inspection_report_template.xml create mode 100755 product_rental_inspection/security/ir.model.access.csv create mode 100755 product_rental_inspection/security/security.xml create mode 100644 product_rental_inspection/views/menus.xml create mode 100755 product_rental_inspection/views/product_inspection.xml create mode 100755 product_rental_inspection/views/sequence.xml create mode 100644 product_rental_inspection/views/stock_picking.xml diff --git a/product_rental_inspection/__init__.py b/product_rental_inspection/__init__.py new file mode 100755 index 0000000..cde864b --- /dev/null +++ b/product_rental_inspection/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/product_rental_inspection/__manifest__.py b/product_rental_inspection/__manifest__.py new file mode 100755 index 0000000..ccdbc9a --- /dev/null +++ b/product_rental_inspection/__manifest__.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +{ + "name": "Product Rental Inspection", + "category": "Product", + "version": "14.0.1.0", + "summary": "Register inspection process and cost on your rental booking", + "author": "Elabore", + "website": "https://elabore.coop/", + "installable": True, + "application": False, + "auto_install": False, + "description": """ +========================= +Product Rental Inspection +========================= +This module allows the registering of inspection process on the rent products. + +Installation +============ +Just install product_rental_inspection, all dependencies will be installed by default. + +Known issues / Roadmap +====================== + +Bug Tracker +=========== +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ +* Elabore: `Icon `_. + +Contributors +------------ +* Stéphan Sainléger + +Funders +------- +The development of this module has been financially supported by: +* Elabore (https://elabore.coop) + +Maintainer +---------- +This module is maintained by ELABORE. + +""", + "depends": ["product_rental_bookings"], + "data": [ + "security/ir.model.access.csv", + "views/product_inspection.xml", + "views/stock_picking.xml", + "views/sequence.xml", + "report/inspection_report.xml", + "report/inspection_report_template.xml", + "views/menus.xml", + ], + "qweb": [], +} diff --git a/product_rental_inspection/i18n/fr.po b/product_rental_inspection/i18n/fr.po new file mode 100644 index 0000000..c9eb811 --- /dev/null +++ b/product_rental_inspection/i18n/fr.po @@ -0,0 +1,263 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_rental_inspection +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-09-29 14:44+0000\n" +"PO-Revision-Date: 2021-09-29 14:44+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: product_rental_inspection +#: model:ir.actions.report,print_report_name:product_rental_inspection.report_inspection_pass +msgid "'Inspection Report'" +msgstr "'Rapport d'inspection'" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.inspection_report_template +msgid "#No." +msgstr "#Num" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.inspection_report_template +msgid "" +"Inspection Date:\n" +"
" +msgstr "" +"Date d'inspection :\n" +"
" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.inspection_report_template +msgid "" +"Responsible:\n" +"
" +msgstr "" +"Responsable :\n" +"
" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.inspection_report_template +msgid "" +"Source Document:\n" +"
" +"Document source :\n" +"
" + +#. module: product_rental_inspection +#: code:addons/product_rental_inspection/models/product_contract.py:0 +#: code:addons/product_rental_inspection/models/product_inspection.py:0 +#, python-format +msgid "Account Move" +msgstr "Mouvement de compte" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__company_id +msgid "Company" +msgstr "Société" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_form_id +msgid "Create Invoice" +msgstr "Créer une facture" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__create_uid +msgid "Created by" +msgstr "Créer par" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__create_date +msgid "Created on" +msgstr "Créer le" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__currency_id +msgid "Currency" +msgstr "Devise" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__customer_id +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_search +msgid "Customer" +msgstr "Client" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__date +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.product_booking_id +msgid "Date" +msgstr "Date" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__total_delayed_amount +msgid "Delayed Amount" +msgstr "" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__delayed_line_ids +msgid "Delayed Lines" +msgstr "" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: product_rental_inspection +#: model:ir.model.fields.selection,name:product_rental_inspection.selection__rental_product_inspection__state__done +#: model:ir.model.fields.selection,name:product_rental_inspection.selection__rental_product_operation__state__done +msgid "Done" +msgstr "Fait" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__total_fuel_charged +msgid "Fuel Charged Amount" +msgstr "Montant frais carburant" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__id +msgid "ID" +msgstr "" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_product_delayed__inspection_id +msgid "Inspection" +msgstr "" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.view_rental_order_graph +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.view_rental_order_pivot +msgid "Inspection Analysis" +msgstr "Analyse d'inspection" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_form_id +msgid "Inspection Number" +msgstr "Numéro d'inspection" + +#. module: product_rental_inspection +#: model:ir.actions.report,name:product_rental_inspection.report_inspection_pass +msgid "Inspection Report" +msgstr "Rapport d'inspection" + +#. module: product_rental_inspection +#: model:ir.ui.menu,name:product_rental_inspection.product_inspection_analysis +msgid "Inspections" +msgstr "" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.stock_picking_form_inherit +msgid "Inspections Created" +msgstr "Inspections créées" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__write_date +msgstr "Dernière mise à jour le" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__location_id +msgid "Location" +msgstr "Point de vente" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_form_id +msgid "Mark as Done" +msgstr "Marqué comme Fait" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_search +msgid "Name" +msgstr "Nom" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_form_id +msgid "Pause Inspection" +msgstr "Mettre en pause l'inspection" + +#. module: product_rental_inspection +#: model:ir.model.fields.selection,name:product_rental_inspection.selection__rental_product_inspection__state__pause +msgid "Paused" +msgstr "En pause" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__phone +msgid "Phone Number" +msgstr "Numéro de téléphone" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__product_id +msgid "Product" +msgstr "Article" + +#. module: product_rental_inspection +#: code:addons/product_rental_inspection/models/product_inspection.py:0 +#: model:ir.model,name:product_rental_inspection.model_rental_product_inspection +#, python-format +msgid "Product Inspection" +msgstr "Inspection du produit" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.inspection_report_template +msgid "Product:" +msgstr "Produit :" + +#. module: product_rental_inspection +#: model:ir.model.fields.selection,name:product_rental_inspection.selection__rental_product_inspection__state__ready +msgid "Ready" +msgstr "Prêt" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__ref_number +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_search +msgid "Reference Number" +msgstr "Numéro de référence" + +#. module: product_rental_inspection +#: code:addons/product_rental_inspection/models/stock_picking.py:0 +#: model:ir.actions.act_window,name:product_rental_inspection.action_product_inspection_analysis +#: model:ir.actions.act_window,name:product_rental_inspection.action_product_inspection_move +#, python-format +msgid "Rental Inspection" +msgstr "Inspection de location" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__responsible_person_id +msgid "Responsible" +msgstr "Responsable" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_form_id +msgid "Resume Inspection" +msgstr "Reprendre l'inspection" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__source_document +msgid "Source Document" +msgstr "Document source" + +#. module: product_rental_inspection +#: model:ir.model.fields,field_description:product_rental_inspection.field_rental_product_inspection__state +msgid "State" +msgstr "État" + +#. module: product_rental_inspection +#: model_terms:ir.ui.view,arch_db:product_rental_inspection.rental_product_inspection_search +msgid "Undone" +msgstr "Revenir en arrière" \ No newline at end of file diff --git a/product_rental_inspection/models/__init__.py b/product_rental_inspection/models/__init__.py new file mode 100644 index 0000000..d11f2e8 --- /dev/null +++ b/product_rental_inspection/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import product_inspection +from . import stock_picking diff --git a/product_rental_inspection/models/product_inspection.py b/product_rental_inspection/models/product_inspection.py new file mode 100755 index 0000000..0358e3f --- /dev/null +++ b/product_rental_inspection/models/product_inspection.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- + +from datetime import date + +from odoo import models, fields, api, _ + + +class RentalProductInspection(models.Model): + _name = "rental.product.inspection" + _description = "Product Inspection" + _rec_name = "ref_number" + + product_id = fields.Many2one("product.product", string="Product") + ref_number = fields.Char(string="Reference Number", default="New") + customer_id = fields.Many2one("res.partner", string="Customer") + location_id = fields.Many2one("stock.location", string="Location") + phone = fields.Char(string="Phone Number") + responsible_person_id = fields.Many2one("hr.employee", string="Responsible") + source_document = fields.Char(string="Source Document") + date = fields.Datetime(string="Date", default=lambda self: fields.Datetime.now()) + state = fields.Selection( + [("ready", "Ready"), ("pause", "Paused"), ("done", "Done")], default="ready" + ) + delayed_line_ids = fields.One2many( + "product.delayed", "inspection_id", string="Delayed Lines" + ) + company_id = fields.Many2one( + "res.company", string="Company", default=lambda self: self.env.user.company_id + ) + total_delayed_amount = fields.Float(string="Delayed Amount", readonly=True) + total_fuel_charged = fields.Float(string="Fuel Charged Amount") + currency_id = fields.Many2one("res.currency", related="company_id.currency_id") + + def create_invoice(self): + inv_obj = self.env["account.move"] + total_amount = 0 + invoice_line_data = [] + account_id = self.env["account.account"].search( + [("code", "like", "708000"), ("company_id", "=", self.company_id.id)] + ) + if not account_id: + user_type_id = self.env.ref("account.data_account_type_revenue") + account_id = self.env["account.account"].create( + { + "code": "708000", + "name": "Location", + "company_id": self.company_id.id, + "user_type_id": user_type_id.id, + } + ) + for each_delay in self.delayed_line_ids: + if each_delay.invoice_state == "draft" and each_delay.delayed_amount > 0: + total_amount += each_delay.delayed_amount + invoice_line_data.append( + ( + 0, + 0, + { + "product_id": self.product_id.id, + "name": "Delay Charge Invoice " + self.ref_number, + "account_id": account_id.id, + "price_unit": each_delay.delayed_amount, + "quantity": 1, + }, + ) + ) + each_delay.invoice_state = "to_invoice" + + if total_amount > 0: + invoice = inv_obj.create( + { + "ref": self.ref_number, + "invoice_origin": self.ref_number, + "partner_id": self.customer_id.id, + "move_type": "out_invoice", + "invoice_date": date.today(), + "invoice_line_ids": invoice_line_data, + } + ) + invoice.action_post() + + if invoice: + return { + "name": _("Account Move"), + "view_mode": "form", + "view_id": self.env.ref("account.view_move_form").id, + "view_type": "tree,form", + "res_model": "account.move", + "type": "ir.actions.act_window", + "res_id": invoice.id, + } + + @api.model + def default_get(self, vals): + res = super(RentalProductInspection, self).default_get(vals) + sequence = self.env["ir.sequence"].next_by_code("product_inspection") or _( + "Product Inspection" + ) + if self._context.get("active_model") == "stock.picking": + res.update( + { + "ref_number": sequence, + } + ) + return res + + @api.onchange("customer_id") + def onchange_filter_product(self): + if self._context.get("product_list"): + return { + "domain": { + "product_id": [("id", "in", self._context.get("product_list"))] + } + } + + def done(self): + self.state = "done" + + def pause(self): + self.state = "pause" + + def resume(self): + self.state = "ready" + + +class ProductDelayed(models.Model): + _name = "product.delayed" + _description = "Product Delayed" + + inspection_id = fields.Many2one("rental.product.inspection", string="Inspection") + name = fields.Char(string="Description") + product_id = fields.Many2one("product.product", string="Product Name") + delay_cost_per_hour = fields.Float(string="Cost/Hour") + delayed_hours = fields.Float(string="Total Hours") + delayed_amount = fields.Float(string="Delayed Amount") + invoice_state = fields.Selection( + [("draft", "Draft"), ("to_invoice", "To Invoice")], default="draft" + ) diff --git a/product_rental_inspection/models/stock_picking.py b/product_rental_inspection/models/stock_picking.py new file mode 100644 index 0000000..a0fef5e --- /dev/null +++ b/product_rental_inspection/models/stock_picking.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from odoo import models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + def action_view_inspections(self): + product_ids = [ + product.product_id.id for product in self.move_ids_without_package + ] + ctx = { + "default_customer_id": self.partner_id.id, + "default_source_document": self.origin, + "default_location_id": self.location_id.id, + "default_phone": self.partner_id.phone, + "product_list": product_ids, + } + return { + "name": _("Rental Inspection"), + "view_type": "form", + "view_mode": "tree,form", + "res_model": "rental.product.inspection", + "type": "ir.actions.act_window", + "context": ctx, + } diff --git a/product_rental_inspection/report/inspection_report.xml b/product_rental_inspection/report/inspection_report.xml new file mode 100755 index 0000000..3d4c621 --- /dev/null +++ b/product_rental_inspection/report/inspection_report.xml @@ -0,0 +1,15 @@ + + + + + Inspection Report + rental.product.inspection + qweb-pdf + product_rental_bookings.inspection_report_template + product_rental_bookings.inspection_report_template + 'Inspection Report' + + report + + + \ No newline at end of file diff --git a/product_rental_inspection/report/inspection_report_template.xml b/product_rental_inspection/report/inspection_report_template.xml new file mode 100755 index 0000000..05829f4 --- /dev/null +++ b/product_rental_inspection/report/inspection_report_template.xml @@ -0,0 +1,44 @@ + + + + + + \ No newline at end of file diff --git a/product_rental_inspection/security/ir.model.access.csv b/product_rental_inspection/security/ir.model.access.csv new file mode 100755 index 0000000..0a33a5e --- /dev/null +++ b/product_rental_inspection/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_rental_product_inspection,access_rental_product_inspection,model_rental_product_inspection,,1,1,1,1 +access_product_delayed,access_product_delayed,model_product_delayed,base.group_user,1,1,1,1 diff --git a/product_rental_inspection/security/security.xml b/product_rental_inspection/security/security.xml new file mode 100755 index 0000000..8b8d76a --- /dev/null +++ b/product_rental_inspection/security/security.xml @@ -0,0 +1,11 @@ + + + + + Product Inspection Rule + + + ['|',('company_id','=',user.company_id.id),('company_id','=',False)] + + + \ No newline at end of file diff --git a/product_rental_inspection/views/menus.xml b/product_rental_inspection/views/menus.xml new file mode 100644 index 0000000..593438b --- /dev/null +++ b/product_rental_inspection/views/menus.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/product_rental_inspection/views/product_inspection.xml b/product_rental_inspection/views/product_inspection.xml new file mode 100755 index 0000000..7eaf215 --- /dev/null +++ b/product_rental_inspection/views/product_inspection.xml @@ -0,0 +1,108 @@ + + + + + + Product Inspection + rental.product.inspection + + + + + + + + + + + + Product Inspection + rental.product.inspection + +
+
+ +
+ +
+

+ +

+

+ +

+
+ + + + + + + + + + + + + + + +
+
+
+
+ + + Product Inspection + rental.product.inspection + + + + + + + + + + + + rental.product.inspection.pivot + rental.product.inspection + + + + + + + + + + rental.product.inspection.pivot + rental.product.inspection + + + + + + + + + + Rental Inspection + rental.product.inspection + tree,form + {'search_default_undone': 1} + + + + Rental Inspection + rental.product.inspection + pivot,graph + + +
+
\ No newline at end of file diff --git a/product_rental_inspection/views/sequence.xml b/product_rental_inspection/views/sequence.xml new file mode 100755 index 0000000..8381f6c --- /dev/null +++ b/product_rental_inspection/views/sequence.xml @@ -0,0 +1,16 @@ + + + + + + + Product Inspection + product_inspection + INS + 2 + /%(month)s/%(day)s + + + + + \ No newline at end of file diff --git a/product_rental_inspection/views/stock_picking.xml b/product_rental_inspection/views/stock_picking.xml new file mode 100644 index 0000000..924f0ef --- /dev/null +++ b/product_rental_inspection/views/stock_picking.xml @@ -0,0 +1,16 @@ + + + + + view.picking.form.inherit.inspection + stock.picking + + + +