diff --git a/sale_order_template_space/__init__.py b/sale_order_template_space/__init__.py index 0650744f6..9b4296142 100644 --- a/sale_order_template_space/__init__.py +++ b/sale_order_template_space/__init__.py @@ -1 +1,2 @@ from . import models +from . import wizard diff --git a/sale_order_template_space/__manifest__.py b/sale_order_template_space/__manifest__.py index e59701c58..a18da1fd3 100644 --- a/sale_order_template_space/__manifest__.py +++ b/sale_order_template_space/__manifest__.py @@ -10,13 +10,17 @@ "depends": [ "sale_management", "sales_team", + "sale_order_line_input", + "sale_order_shorcut_line", ], "data": [ "security/ir.model.access.csv", + "wizard/wiz_duplicate_sale_line_views.xml", "views/sale_order_template_space_views.xml", "views/sale_order_template_views.xml", "views/sale_order_template_line_views.xml", "views/sale_order_views.xml", + "views/sale_order_line_views.xml", ], "installable": True, } diff --git a/sale_order_template_space/i18n/es.po b/sale_order_template_space/i18n/es.po index 2e2377520..a9bcaf60f 100644 --- a/sale_order_template_space/i18n/es.po +++ b/sale_order_template_space/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-19 08:46+0000\n" -"PO-Revision-Date: 2024-02-19 08:46+0000\n" +"POT-Creation-Date: 2024-04-17 12:13+0000\n" +"PO-Revision-Date: 2024-04-17 12:13+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -25,6 +25,11 @@ msgstr "# Líneas plantilla venta" msgid "Sale Template Lines" msgstr "Líneas plantilla venta" +#. module: sale_order_template_space +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Cancel" +msgstr "Cancelar" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.view_order_form msgid "Create sale lines" @@ -33,12 +38,14 @@ msgstr "Crear líneas de venta" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__create_uid #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__create_uid +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__create_uid msgid "Created by" msgstr "Creado por" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__create_date #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__create_date +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__create_date msgid "Created on" msgstr "Creado el" @@ -50,9 +57,22 @@ msgstr "Borrar líneas venta" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__display_name #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__display_name +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__display_name msgid "Display Name" msgstr "Mostrar Nombre" +#. module: sale_order_template_space +#: model:ir.actions.server,name:sale_order_template_space.model_sale_order_line_action_duplicate +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Duplicate Line" +msgstr "Duplicar línea" + +#. module: sale_order_template_space +#: model:ir.actions.act_window,name:sale_order_template_space.wiz_duplicate_sale_line_action +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Duplicate Sale Order Line" +msgstr "Duplicar línea de pedido de venta" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.sale_order_template_line_filter msgid "Group By" @@ -61,24 +81,28 @@ msgstr "Agrupar por" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__id #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__id +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__id msgid "ID" -msgstr "" +msgstr "ID" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space____last_update #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space____last_update +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line____last_update msgid "Last Modified on" msgstr "Última modificación el" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__write_uid #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__write_uid +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__write_uid msgid "Last Updated by" msgstr "Última actualización opr" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__write_date #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__write_date +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__write_date msgid "Last Updated on" msgstr "Última actualización el" @@ -130,6 +154,11 @@ msgstr "Renumerar secuencia líneas" msgid "Sale Order" msgstr "Pedido de venta" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__sale_line_id +msgid "Sale Order Line" +msgstr "Línea pedido venta" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.view_sales_order_filter msgid "Sale Order Line Space" @@ -191,11 +220,21 @@ msgstr "Buscar estancias" msgid "Sequence" msgstr "Secuencia" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__sequence_to_view +msgid "Sequence to view" +msgstr "Secuencia para ver" + #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__space_id msgid "Space" msgstr "Buscar estancias" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__space_sequence +msgid "Space Sequence" +msgstr "Secuencia espacio" + #. module: sale_order_template_space #: model:ir.actions.act_window,name:sale_order_template_space.action_sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template__space_ids @@ -216,7 +255,26 @@ msgstr "Estancias para plantillas de pedido de venta" msgid "Spaces For Sale Orders" msgstr "Estancias para pedidos de venta" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__sale_order_template_line_sequence +msgid "Template Line Sequence" +msgstr "Secuencia línea plantilla" + #. module: sale_order_template_space #: model:ir.actions.act_window,name:sale_order_template_space.action_editabable_template_orders_lines msgid "Template Order Lines" msgstr "Plantilla línea de pedido" + +#. module: sale_order_template_space +#: model:ir.model,name:sale_order_template_space.model_wiz_duplicate_sale_line +msgid "Wizard for duplicate sale line" +msgstr "Asistente para duplicar línea de venta" + +#. module: sale_order_template_space +#. odoo-python +#: code:addons/sale_order_template_space/models/sale_order_line.py:0 +#, python-format +msgid "" +"You can only duplicate 1 at a time, because then the screenmust be " +"refreshed." +msgstr "Solo puede duplicar 1 línea a la vez, porque se debe de refrescar la pantalla." diff --git a/sale_order_template_space/i18n/sale_order_template_space.pot b/sale_order_template_space/i18n/sale_order_template_space.pot index 91574843a..1823016c3 100644 --- a/sale_order_template_space/i18n/sale_order_template_space.pot +++ b/sale_order_template_space/i18n/sale_order_template_space.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-19 08:45+0000\n" -"PO-Revision-Date: 2024-02-19 08:45+0000\n" +"POT-Creation-Date: 2024-04-17 12:12+0000\n" +"PO-Revision-Date: 2024-04-17 12:12+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -25,6 +25,11 @@ msgstr "" msgid "Sale Template Lines" msgstr "" +#. module: sale_order_template_space +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Cancel" +msgstr "" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.view_order_form msgid "Create sale lines" @@ -33,12 +38,14 @@ msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__create_uid #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__create_uid +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__create_uid msgid "Created by" msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__create_date #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__create_date +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__create_date msgid "Created on" msgstr "" @@ -50,9 +57,22 @@ msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__display_name #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__display_name +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__display_name msgid "Display Name" msgstr "" +#. module: sale_order_template_space +#: model:ir.actions.server,name:sale_order_template_space.model_sale_order_line_action_duplicate +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Duplicate Line" +msgstr "" + +#. module: sale_order_template_space +#: model:ir.actions.act_window,name:sale_order_template_space.wiz_duplicate_sale_line_action +#: model_terms:ir.ui.view,arch_db:sale_order_template_space.wiz_duplicate_sale_line_form_view +msgid "Duplicate Sale Order Line" +msgstr "" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.sale_order_template_line_filter msgid "Group By" @@ -61,24 +81,28 @@ msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__id #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__id +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__id msgid "ID" msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space____last_update #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space____last_update +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line____last_update msgid "Last Modified on" msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__write_uid #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__write_uid +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__write_uid msgid "Last Updated by" msgstr "" #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__write_date #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template_space__write_date +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__write_date msgid "Last Updated on" msgstr "" @@ -130,6 +154,11 @@ msgstr "" msgid "Sale Order" msgstr "" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_wiz_duplicate_sale_line__sale_line_id +msgid "Sale Order Line" +msgstr "" + #. module: sale_order_template_space #: model_terms:ir.ui.view,arch_db:sale_order_template_space.view_sales_order_filter msgid "Sale Order Line Space" @@ -191,11 +220,21 @@ msgstr "" msgid "Sequence" msgstr "" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__sequence_to_view +msgid "Sequence to view" +msgstr "" + #. module: sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_space__space_id msgid "Space" msgstr "" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__space_sequence +msgid "Space Sequence" +msgstr "" + #. module: sale_order_template_space #: model:ir.actions.act_window,name:sale_order_template_space.action_sale_order_template_space #: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_template__space_ids @@ -216,7 +255,26 @@ msgstr "" msgid "Spaces For Sale Orders" msgstr "" +#. module: sale_order_template_space +#: model:ir.model.fields,field_description:sale_order_template_space.field_sale_order_line__sale_order_template_line_sequence +msgid "Template Line Sequence" +msgstr "" + #. module: sale_order_template_space #: model:ir.actions.act_window,name:sale_order_template_space.action_editabable_template_orders_lines msgid "Template Order Lines" msgstr "" + +#. module: sale_order_template_space +#: model:ir.model,name:sale_order_template_space.model_wiz_duplicate_sale_line +msgid "Wizard for duplicate sale line" +msgstr "" + +#. module: sale_order_template_space +#. odoo-python +#: code:addons/sale_order_template_space/models/sale_order_line.py:0 +#, python-format +msgid "" +"You can only duplicate 1 at a time, because then the screenmust be " +"refreshed." +msgstr "" diff --git a/sale_order_template_space/models/sale_order_line.py b/sale_order_template_space/models/sale_order_line.py index 6bdcafd00..fe43bb99c 100644 --- a/sale_order_template_space/models/sale_order_line.py +++ b/sale_order_template_space/models/sale_order_line.py @@ -1,13 +1,56 @@ # Copyright 2024 Alfredo de la Fuente - AvanzOSC # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import fields, models +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class SaleOrderLine(models.Model): _inherit = "sale.order.line" + _order = "order_id, sequence_to_view, id" sale_order_space_id = fields.Many2one( string="Sale Order Space", comodel_name="sale.order.space", copy=False, ) + space_sequence = fields.Integer( + string="Space Sequence", + related="sale_order_space_id.sequence", + store=True, + copy=False, + readonly=True, + ) + sale_order_template_line_sequence = fields.Integer( + string="Template Line Sequence", default=0, copy=False + ) + sequence_to_view = fields.Char( + string="Sequence to view", + compute="_compute_sequence_to_view", + store=True, + related=False, + copy=False, + ) + + @api.depends("space_sequence", "sale_order_template_line_sequence", "sequence") + def _compute_sequence_to_view(self): + for line in self: + line_sequence = line.sequence if line.sequence >= 0 else line.sequence * -1 + sequence_to_view = "{}{}{}".format( + str(line.space_sequence).zfill(2), + str(line.sale_order_template_line_sequence).zfill(3), + line_sequence, + ) + line.sequence_to_view = sequence_to_view + + def action_duplicate_line(self): + if len(self) > 1: + raise ValidationError( + _( + "You can only duplicate 1 at a time, because then the screen" + "must be refreshed." + ) + ) + action = self.env["ir.actions.actions"]._for_xml_id( + "sale_order_template_space.wiz_duplicate_sale_line_action" + ) + return action diff --git a/sale_order_template_space/models/sale_order_space.py b/sale_order_template_space/models/sale_order_space.py index 40ed0ef6d..57a89b32a 100644 --- a/sale_order_template_space/models/sale_order_space.py +++ b/sale_order_template_space/models/sale_order_space.py @@ -86,6 +86,7 @@ def action_create_lines(self): template_lines += line if template_lines: sale_space._template_lines_to_sale_lines(template_lines) + sale_space.sale_order_id.action_put_section_in_lines() def _template_lines_to_sale_lines(self, template_lines): for line in template_lines: @@ -93,17 +94,13 @@ def _template_lines_to_sale_lines(self, template_lines): self.env["sale.order.line"].create(vals) def _catch_values_to_create_sale_line(self, line): - space_sequence = self.sequence - line_sequence = "{}{}{}".format( - line.sale_order_template_id.sequence, space_sequence, line.sequence - ) vals = { "order_id": self.sale_order_id.id, - "sequence": int(line_sequence), "name": line.name, "display_type": line.display_type, "product_uom_qty": line.product_uom_qty, "sale_order_space_id": self.id, + "sale_order_template_line_sequence": str(line.sequence).zfill(3), } if line.product_id: vals["product_id"] = line.product_id.id diff --git a/sale_order_template_space/models/sale_order_template_space.py b/sale_order_template_space/models/sale_order_template_space.py index a352de140..87ec90002 100644 --- a/sale_order_template_space/models/sale_order_template_space.py +++ b/sale_order_template_space/models/sale_order_template_space.py @@ -8,10 +8,7 @@ class SaleOrderTemplateSpace(models.Model): _description = "Spaces For Sale Order Templates" _order = "name" - name = fields.Char( - required=True, - copy=False, - ) + name = fields.Char(required=True, copy=False) sale_template_ids = fields.Many2many( string="Sale Order Templates", comodel_name="sale.order.template", diff --git a/sale_order_template_space/security/ir.model.access.csv b/sale_order_template_space/security/ir.model.access.csv index 16836e6b8..3f52cb851 100644 --- a/sale_order_template_space/security/ir.model.access.csv +++ b/sale_order_template_space/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_sale_order_template_space_user,sale.order.template.space,model_sale_order_template_space,sales_team.group_sale_salesman,1,0,0,0 access_sale_order_template_space_manager,sale.order.template.space,model_sale_order_template_space,sales_team.group_sale_manager,1,1,1,1 access_sale_order_spacer,sale.order.space,model_sale_order_space,sales_team.group_sale_salesman,1,1,1,1 +access_wiz_duplicate_sale_line_user,wiz.duplicate.sale.line.user,model_wiz_duplicate_sale_line,sales_team.group_sale_salesman,1,1,1,1 diff --git a/sale_order_template_space/views/sale_order_line_views.xml b/sale_order_template_space/views/sale_order_line_views.xml new file mode 100644 index 000000000..b11f13899 --- /dev/null +++ b/sale_order_template_space/views/sale_order_line_views.xml @@ -0,0 +1,27 @@ + + + + sale.order.line + + + + + + + + + + + + + Duplicate Line + + + form,list + code + action = records.action_duplicate_line() + + diff --git a/sale_order_template_space/views/sale_order_template_line_views.xml b/sale_order_template_space/views/sale_order_template_line_views.xml index bab17782b..39d90aa51 100644 --- a/sale_order_template_space/views/sale_order_template_line_views.xml +++ b/sale_order_template_space/views/sale_order_template_line_views.xml @@ -1,6 +1,7 @@ + sale.order.template.line.editable.tree sale.order.template.line diff --git a/sale_order_template_space/views/sale_order_views.xml b/sale_order_template_space/views/sale_order_views.xml index 5aa69df5f..8d19f967f 100644 --- a/sale_order_template_space/views/sale_order_views.xml +++ b/sale_order_template_space/views/sale_order_views.xml @@ -42,6 +42,14 @@ + + + + + diff --git a/sale_order_template_space/wizard/__init__.py b/sale_order_template_space/wizard/__init__.py new file mode 100644 index 000000000..41cf1be83 --- /dev/null +++ b/sale_order_template_space/wizard/__init__.py @@ -0,0 +1 @@ +from . import wiz_duplicate_sale_line diff --git a/sale_order_template_space/wizard/wiz_duplicate_sale_line.py b/sale_order_template_space/wizard/wiz_duplicate_sale_line.py new file mode 100644 index 000000000..75fdc45dd --- /dev/null +++ b/sale_order_template_space/wizard/wiz_duplicate_sale_line.py @@ -0,0 +1,32 @@ +# Copyright 2024 Alfredo de la Fuente - AvanzOSC +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from odoo import api, fields, models + + +class WizDuplicateSaleLine(models.TransientModel): + _name = "wiz.duplicate.sale.line" + _description = "Wizard for duplicate sale line" + + sale_line_id = fields.Many2one( + string="Sale Order Line", + comodel_name="sale.order.line", + ) + + @api.model + def default_get(self, fields): + result = super().default_get(fields) + if ( + "active_model" in self.env.context + and self.env.context.get("active_model", "aa") == "sale.order.line" + ): + result.update( + { + "sale_line_id": self.env.context.get("active_id"), + } + ) + return result + + def button_duplicate(self): + if self.sale_line_id: + self.sale_line_id.copy({"sequence": self.sale_line_id.sequence}) + return self.sale_line_id.order_id.action_view_sale_lines() diff --git a/sale_order_template_space/wizard/wiz_duplicate_sale_line_views.xml b/sale_order_template_space/wizard/wiz_duplicate_sale_line_views.xml new file mode 100644 index 000000000..f9a6052b7 --- /dev/null +++ b/sale_order_template_space/wizard/wiz_duplicate_sale_line_views.xml @@ -0,0 +1,32 @@ + + + + wiz.duplicate.sale.line.form.view + wiz.duplicate.sale.line + +
+ + + + +
+
+ +
+
+ + + Duplicate Sale Order Line + wiz.duplicate.sale.line + form + new + {} + +