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
+ {}
+
+