Skip to content

Commit

Permalink
[IMP] sale_elaboration: Allow to select multiple elaborations
Browse files Browse the repository at this point in the history
  • Loading branch information
Ernesto Tejeda committed Jun 1, 2023
1 parent d8a772c commit 3acdafb
Show file tree
Hide file tree
Showing 15 changed files with 123 additions and 49 deletions.
1 change: 1 addition & 0 deletions sale_elaboration/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ Contributors
* Sergio Teruel
* Pedro M. Baeza
* Carlos Roca
* Ernesto Tejeda

Maintainers
~~~~~~~~~~~
Expand Down
2 changes: 1 addition & 1 deletion sale_elaboration/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{
"name": "Sale Elaboration",
"summary": "Set an elaboration for any sale line",
"version": "15.0.1.0.1",
"version": "15.0.2.0.0",
"development_status": "Production/Stable",
"category": "Sale",
"website": "https://github.com/OCA/sale-workflow",
Expand Down
47 changes: 39 additions & 8 deletions sale_elaboration/i18n/de.po
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,22 @@ msgstr ""
msgid "After Date"
msgstr ""

#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Archived"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.constraint,message:sale_elaboration.constraint_product_elaboration_code_uniq
msgid "Code must be unique!"
msgstr ""

#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_res_config_settings
msgid "Config Settings"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__create_uid
msgid "Created by"
Expand All @@ -64,13 +75,17 @@ msgstr ""
msgid "Date"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_res_config_settings__group_elaboration_note_on_delivery_slip
msgid "Display Elaboration notes on Delivery Slips"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__display_name
msgid "Display Name"
msgstr "Anzeigename"

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
Expand All @@ -82,9 +97,13 @@ msgid "Elaboration Note"
msgstr ""

#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.res_config_settings_view
msgid "Elaboration notes will appear on the delivery slip"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_tree
#: model_terms:ir.ui.view,arch_db:sale_elaboration.report_elaboration_view_tree
msgid "Elaborations"
msgstr ""

Expand All @@ -93,6 +112,11 @@ msgstr ""
msgid "Elaborations Search"
msgstr ""

#. module: sale_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Group By"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__id
msgid "ID"
Expand All @@ -106,15 +130,16 @@ msgid ""
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Is Elaboration"
#: model:res.groups,name:sale_elaboration.group_elaboration_note_on_delivery_slip
msgid "Include elaboration notes on delivery slip"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_product__is_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_template__is_elaboration
msgid "Is elaboration"
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__is_elaboration
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Is Elaboration"
msgstr ""

#. module: sale_elaboration
Expand Down Expand Up @@ -144,9 +169,15 @@ msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_product_elaboration__product_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
msgid "Product"
msgstr "Produkt"

#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_stock_move_line
msgid "Product Moves (Stock Move Line)"
msgstr ""

#. module: sale_elaboration
#: model:ir.model,name:sale_elaboration.model_product_template
msgid "Product Template"
Expand All @@ -159,7 +190,7 @@ msgid "Product elaborations"
msgstr "Produktvorlage"

#. module: sale_elaboration
#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action_form
#: model:ir.actions.act_window,name:sale_elaboration.sale_elaboration_action
#: model:ir.ui.menu,name:sale_elaboration.menu_sale_elaboration
msgid "Sale Elaboration"
msgstr ""
Expand Down
18 changes: 3 additions & 15 deletions sale_elaboration/i18n/es.po
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-23 07:29+0000\n"
"PO-Revision-Date: 2022-10-23 09:31+0200\n"
"POT-Creation-Date: 2023-02-02 12:32+0000\n"
"PO-Revision-Date: 2023-02-02 13:35+0100\n"
"Last-Translator: Sergio Teruel <[email protected]>\n"
"Language-Team: \n"
"Language: es\n"
Expand Down Expand Up @@ -88,7 +88,6 @@ msgid "Display Name"
msgstr "Nombre a mostrar"

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
Expand All @@ -105,6 +104,7 @@ msgid "Elaboration notes will appear on the delivery slip"
msgstr "Las notas de elaboración aparecerán en los albaranes"

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form
msgid "Elaborations"
msgstr "Elaboraciones"
Expand Down Expand Up @@ -222,15 +222,3 @@ msgstr "Nombre corto"
#: model:ir.model,name:sale_elaboration.model_stock_picking
msgid "Transfer"
msgstr "Transferir"

#~ msgid "Is elaboration"
#~ msgstr "Es elaboración"

#~ msgid "Date on which the sales order is confirmed."
#~ msgstr "Fecha en la que un pedido es confirmado."

#~ msgid "Quotation"
#~ msgstr "Presupuesto"

#~ msgid "Confirmation Date"
#~ msgstr "Fecha de confirmación"
2 changes: 1 addition & 1 deletion sale_elaboration/i18n/sale_elaboration.pot
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ msgid "Display Name"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_id
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_search
#: model_terms:ir.ui.view,arch_db:sale_elaboration.view_sales_order_line_filter
msgid "Elaboration"
Expand All @@ -99,6 +98,7 @@ msgid "Elaboration notes will appear on the delivery slip"
msgstr ""

#. module: sale_elaboration
#: model:ir.model.fields,field_description:sale_elaboration.field_sale_order_line__elaboration_ids
#: model_terms:ir.ui.view,arch_db:sale_elaboration.elaboration_view_form
msgid "Elaborations"
msgstr ""
Expand Down
16 changes: 16 additions & 0 deletions sale_elaboration/migrations/15.0.2.0.0/post-migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright 2023 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from openupgradelib import openupgrade


@openupgrade.migrate()
def migrate(env, version):

openupgrade.m2o_to_x2m(
env.cr,
env["sale.order.line"],
"sale_order_line",
"elaboration_ids",
openupgrade.get_legacy_name("elaboration_id"),
)
9 changes: 9 additions & 0 deletions sale_elaboration/migrations/15.0.2.0.0/pre-migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright 2023 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from openupgradelib import openupgrade


@openupgrade.migrate()
def migrate(env, version):
openupgrade.rename_columns(env.cr, {"sale_order_line": [("elaboration_id", None)]})
9 changes: 5 additions & 4 deletions sale_elaboration/models/sale_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ def _create_elaboration_line(self, product, qty):
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"

elaboration_id = fields.Many2one(
comodel_name="product.elaboration", string="Elaboration", ondelete="restrict"
elaboration_ids = fields.Many2many(
comodel_name="product.elaboration",
string="Elaborations",
)
elaboration_note = fields.Char(
store=True,
Expand All @@ -58,10 +59,10 @@ class SaleOrderLine(models.Model):
)
date_order = fields.Datetime(related="order_id.date_order", string="Date")

@api.depends("elaboration_id")
@api.depends("elaboration_ids")
def _compute_elaboration_note(self):
for line in self:
line.elaboration_note = line.elaboration_id.name
line.elaboration_note = ", ".join(line.elaboration_ids.mapped("name"))

def _prepare_invoice_line(self, **optional_values):
vals = super()._prepare_invoice_line(**optional_values)
Expand Down
7 changes: 3 additions & 4 deletions sale_elaboration/models/stock_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@ def _action_done(self):
res = super()._action_done()
for pick in self.filtered(lambda x: x.picking_type_code == "outgoing"):
elaboration_lines = pick.move_lines.filtered(
lambda x: x.sale_line_id.elaboration_id
lambda x: x.sale_line_id.elaboration_ids
)
for line in elaboration_lines:
pick.sale_id._create_elaboration_line(
line.sale_line_id.elaboration_id.product_id, line.quantity_done
)
for product in line.sale_line_id.elaboration_ids.product_id:
pick.sale_id._create_elaboration_line(product, line.quantity_done)
return res


Expand Down
1 change: 1 addition & 0 deletions sale_elaboration/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
* Sergio Teruel
* Pedro M. Baeza
* Carlos Roca
* Ernesto Tejeda
10 changes: 7 additions & 3 deletions sale_elaboration/reports/report_deliveryslip.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
>
<attribute
name="t-value"
add="or (o.move_lines.mapped('sale_line_id.elaboration_id'))"
add="or (o.move_lines.sale_line_id.elaboration_ids)"
separator=" "
/>
<attribute
Expand All @@ -35,7 +35,9 @@
</xpath>
<xpath expr="//span[@t-field='move.quantity_done']/.." position="after">
<td>
<span t-field="move.sale_line_id.elaboration_id.code" />
<span
t-esc="', '.join(move.sale_line_id.elaboration_ids.mapped('code'))"
/>
</td>
</xpath>
<xpath expr="//th[@name='th_sml_quantity']" position="after">
Expand All @@ -51,7 +53,9 @@
>
<xpath expr="//td[@name='move_line_lot_qty_done']" position="after">
<td>
<span t-field="move_line.move_id.sale_line_id.elaboration_id.code" />
<span
t-esc="', '.join(move_line.move_id.sale_line_id.elaboration_ids.mapped('code'))"
/>
</td>
</xpath>
</template>
Expand Down
1 change: 1 addition & 0 deletions sale_elaboration/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ <h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<li>Sergio Teruel</li>
<li>Pedro M. Baeza</li>
<li>Carlos Roca</li>
<li>Ernesto Tejeda</li>
</ul>
</li>
</ul>
Expand Down
35 changes: 28 additions & 7 deletions sale_elaboration/tests/test_sale_elaboration.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,19 @@ def setUpClass(cls):
"product_id": cls.product_elaboration_B.id,
}
)
cls.order = cls._create_sale_order(cls, [(cls.product, 10, cls.elaboration_a)])
cls.order = cls._create_sale_order(
cls, [(cls.product, 10, [cls.elaboration_a])]
)

def _create_sale_order(self, products_info):
order_form = Form(self.env["sale.order"])
order_form.partner_id = self.partner
for product, qty, elaboration in products_info:
for product, qty, elaborations in products_info:
with order_form.order_line.new() as line_form:
line_form.product_id = product
line_form.product_uom_qty = qty
if elaboration:
line_form.elaboration_id = elaboration
for elaboration in elaborations:
line_form.elaboration_ids.add(elaboration)
return order_form.save()

def test_search_elaboration(self):
Expand All @@ -83,7 +85,7 @@ def test_search_elaboration(self):
self.assertEqual(len(elaboration), 1)

def test_sale_elaboration_change(self):
self.order.order_line.elaboration_id = self.elaboration_b.id
self.order.order_line.elaboration_ids = self.elaboration_b
self.assertEqual(self.order.order_line.elaboration_note, "Elaboration B")

def test_sale_elaboration(self):
Expand Down Expand Up @@ -114,8 +116,8 @@ def test_sale_elaboration_multi(self):
def test_invoice_elaboration(self):
self.order = self._create_sale_order(
[
(self.product_elaboration_A, 1, False),
(self.product_elaboration_B, 1, False),
(self.product_elaboration_A, 1, []),
(self.product_elaboration_B, 1, []),
]
)
self.order.order_line.filtered(
Expand Down Expand Up @@ -147,3 +149,22 @@ def test_sale_elaboration_change_product(self):
self.order.order_line.product_id = self.product
self.order.order_line.product_id_change()
self.assertFalse(self.order.order_line.is_elaboration)

def test_multi_elaboration_per_line(self):
product2 = self.env["product.product"].create({"name": "product 2"})
with Form(self.order) as order_form:
with order_form.order_line.new() as line_form:
line_form.product_id = product2
line_form.product_uom_qty = 1
line_form.elaboration_ids.add(self.elaboration_a)
line_form.elaboration_ids.add(self.elaboration_b)
self.order.action_confirm()
move_lines = self.order.picking_ids.move_lines
move_line_a = move_lines.filtered(lambda r: r.product_id == self.product)
move_line_a.quantity_done = 10.0
move_line_b = move_lines.filtered(lambda r: r.product_id == product2)
move_line_b.quantity_done = 1.0
self.order.picking_ids._action_done()
elaboration_lines = self.order.order_line.filtered("is_elaboration")
self.assertEqual(len(elaboration_lines), 2)
self.assertEqual(sum(elaboration_lines.mapped("product_uom_qty")), 12.0)
Loading

0 comments on commit 3acdafb

Please sign in to comment.