From 2545a5173ef96ea2575947d8db505a9579db54bb Mon Sep 17 00:00:00 2001
From: david
Date: Mon, 23 Nov 2020 18:30:30 +0100
Subject: [PATCH 01/11] [ADD] stock_picking_report_valued_sale_mrp: New module
---
.../README.rst | 114 +++++
.../__init__.py | 1 +
.../__manifest__.py | 20 +
.../stock_picking_report_valued_sale_mrp.pot | 40 ++
.../models/__init__.py | 2 +
.../models/stock_move.py | 21 +
.../models/stock_move_line.py | 87 ++++
.../readme/CONTRIBUTORS.rst | 3 +
.../readme/DESCRIPTION.rst | 4 +
.../readme/ROADMAP.rst | 13 +
.../readme/USAGE.rst | 7 +
.../report/stock_picking_report_valued.xml | 52 ++
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 458 ++++++++++++++++++
.../tests/__init__.py | 1 +
.../test_stock_picking_report_valued_mrp.py | 68 +++
16 files changed, 891 insertions(+)
create mode 100644 stock_picking_report_valued_sale_mrp/README.rst
create mode 100644 stock_picking_report_valued_sale_mrp/__init__.py
create mode 100644 stock_picking_report_valued_sale_mrp/__manifest__.py
create mode 100644 stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
create mode 100644 stock_picking_report_valued_sale_mrp/models/__init__.py
create mode 100644 stock_picking_report_valued_sale_mrp/models/stock_move.py
create mode 100644 stock_picking_report_valued_sale_mrp/models/stock_move_line.py
create mode 100644 stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
create mode 100644 stock_picking_report_valued_sale_mrp/readme/DESCRIPTION.rst
create mode 100644 stock_picking_report_valued_sale_mrp/readme/ROADMAP.rst
create mode 100644 stock_picking_report_valued_sale_mrp/readme/USAGE.rst
create mode 100644 stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
create mode 100644 stock_picking_report_valued_sale_mrp/static/description/icon.png
create mode 100644 stock_picking_report_valued_sale_mrp/static/description/index.html
create mode 100644 stock_picking_report_valued_sale_mrp/tests/__init__.py
create mode 100644 stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
diff --git a/stock_picking_report_valued_sale_mrp/README.rst b/stock_picking_report_valued_sale_mrp/README.rst
new file mode 100644
index 0000000..858d714
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/README.rst
@@ -0,0 +1,114 @@
+===================================
+Valued picking linked with MRP Kits
+===================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--reporting-lightgray.png?logo=github
+ :target: https://github.com/OCA/stock-logistics-reporting/tree/12.0/stock_picking_report_valued_sale_mrp
+ :alt: OCA/stock-logistics-reporting
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/stock-logistics-reporting-12-0/stock-logistics-reporting-12-0-stock_picking_report_valued_sale_mrp
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/151/12.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module extends the functionality of `stock_picking_report_valued` with
+compatibility of MRP kits. Now we'll be able to correctly summarize the picking
+value related to the selled kit with a relations of components and serials/lots
+delivered.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To test this module:
+
+#. Configure some products with traceability and make them kit components.
+#. Sell the kits and go to the stock picking.
+#. Print the valued delivery slip:
+ - The total amount will now be correct.
+ - The kit components will be summarized in a single kit product line.
+
+Known issues / Roadmap
+======================
+
+* Matching selled kits and their delivered components it's quite tricky. There
+ are two possible approaches to findout from the component how many units
+ correspond with every whole kit:
+
+ - We could have a link to the original BoM line and guess it from it. This
+ approach is the one that Odoo has taken in v13 with the sale order line
+ deliveried quantities computation. The main issue is that if the original
+ BoM changes then we'd loose the correct units per kit reference.
+
+ - Another aproach (the one in this module) is to compute the component units
+ per kit matching the sale order line and its related moves demands. But if
+ the user manually adjust the demand on one model without adjusting it in
+ the order we'll have an incorrect reference as well.
+
+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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa `_:
+
+ * David Vidal
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-chienandalu| image:: https://github.com/chienandalu.png?size=40px
+ :target: https://github.com/chienandalu
+ :alt: chienandalu
+
+Current `maintainer `__:
+
+|maintainer-chienandalu|
+
+This module is part of the `OCA/stock-logistics-reporting `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/stock_picking_report_valued_sale_mrp/__init__.py b/stock_picking_report_valued_sale_mrp/__init__.py
new file mode 100644
index 0000000..0650744
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
new file mode 100644
index 0000000..c61a15f
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -0,0 +1,20 @@
+# Copyright 2020 Tecnativa - David Vidal
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ "name": "Valued picking linked with MRP Kits",
+ "summary": "Allow to summarize the picking related with the selled kits",
+ "version": "12.0.1.0.0",
+ "development_status": "Beta",
+ "category": "Warehouse Management",
+ "website": "https://github.com/OCA/stock-logistics-reporting",
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "maintainers": ["chienandalu"],
+ "license": "AGPL-3",
+ "depends": [
+ "stock_picking_report_valued",
+ "sale_mrp",
+ ],
+ "data": [
+ "report/stock_picking_report_valued.xml",
+ ],
+}
diff --git a/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot b/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
new file mode 100644
index 0000000..8d1607f
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
@@ -0,0 +1,40 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * stock_picking_report_valued_sale_mrp
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \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: stock_picking_report_valued_sale_mrp
+#: model:ir.model.fields,field_description:stock_picking_report_valued_sale_mrp.field_stock_move_line__phantom_delivered_qty
+msgid "Phantom Delivered Qty"
+msgstr ""
+
+#. module: stock_picking_report_valued_sale_mrp
+#: model:ir.model.fields,field_description:stock_picking_report_valued_sale_mrp.field_stock_move_line__phantom_line
+msgid "Phantom Line"
+msgstr ""
+
+#. module: stock_picking_report_valued_sale_mrp
+#: model:ir.model.fields,field_description:stock_picking_report_valued_sale_mrp.field_stock_move_line__phantom_product_id
+msgid "Product Kit"
+msgstr ""
+
+#. module: stock_picking_report_valued_sale_mrp
+#: model:ir.model,name:stock_picking_report_valued_sale_mrp.model_stock_move_line
+msgid "Product Moves (Stock Move Line)"
+msgstr ""
+
+#. module: stock_picking_report_valued_sale_mrp
+#: model:ir.model,name:stock_picking_report_valued_sale_mrp.model_stock_move
+msgid "Stock Move"
+msgstr ""
+
diff --git a/stock_picking_report_valued_sale_mrp/models/__init__.py b/stock_picking_report_valued_sale_mrp/models/__init__.py
new file mode 100644
index 0000000..f800274
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/models/__init__.py
@@ -0,0 +1,2 @@
+from . import stock_move
+from . import stock_move_line
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move.py b/stock_picking_report_valued_sale_mrp/models/stock_move.py
new file mode 100644
index 0000000..58c4e87
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move.py
@@ -0,0 +1,21 @@
+# Copyright 2020 Tecnativa - David Vidal
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import models
+
+
+class StockMove(models.Model):
+ _inherit = 'stock.move'
+
+ def _get_components_per_kit(self):
+ """Compute how many kit components were demanded from this line. We
+ rely on the matching of sale order and pickings demands, but if those
+ were manually changed, it could lead to inconsistencies"""
+ self.ensure_one()
+ sale_line = self.sale_line_id
+ if not sale_line or not sale_line.product_id._is_phantom_bom():
+ return 0
+ component_demand = sum(
+ sale_line.move_ids.filtered(
+ lambda x: x.product_id == self.product_id and
+ not x.origin_returned_move_id).mapped("product_uom_qty"))
+ return component_demand / sale_line.product_uom_qty
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
new file mode 100644
index 0000000..1ffae10
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -0,0 +1,87 @@
+# Copyright 2020 Tecnativa - David Vidal
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import api, fields, models
+
+
+class StockMoveLine(models.Model):
+ _inherit = 'stock.move.line'
+
+ phantom_product_id = fields.Many2one(
+ comodel_name="product.product",
+ compute="_compute_phantom_product_id",
+ compute_sudo=True,
+ string="Product Kit",
+ readonly=True,
+ )
+ phantom_line = fields.Boolean(
+ compute="_compute_sale_order_line_fields",
+ compute_sudo=True,
+ )
+ phantom_delivered_qty = fields.Float(
+ compute="_compute_sale_order_line_fields",
+ compute_sudo=True,
+ )
+
+ @api.depends("sale_line")
+ def _compute_phantom_product_id(self):
+ """Relate every line with its kit product"""
+ for line in self.filtered(
+ lambda x: x.sale_line.product_id._is_phantom_bom()):
+ line.phantom_product_id = line.sale_line.product_id
+
+ def _compute_sale_order_line_fields(self):
+ """For kits we only want to store the value in one of the move lines to
+ avoid duplicate the amounts. We also need to recompute the total
+ amounts according to the corresponding delivered kits"""
+ super()._compute_sale_order_line_fields()
+ kit_lines = self.filtered("phantom_product_id")
+ for sale_line in kit_lines.mapped("sale_line"):
+ move_lines = kit_lines.filtered(
+ lambda x: x.sale_line == sale_line)
+ # Deduct the kit quantity from the first component in the picking.
+ # If the the kit is partially delivered, this could lead to an
+ # unacurate value.
+ phantom_line = move_lines[:1]
+ if not phantom_line:
+ continue
+ price_unit = (
+ sale_line.price_subtotal / sale_line.product_uom_qty
+ if sale_line.product_uom_qty else sale_line.price_reduce)
+ # Compute how many kits were delivered from the components and
+ # the original demand. Note that if the qty is edited in the sale
+ # order this could lead to inconsitencies.
+ components_per_kit = phantom_line.move_id._get_components_per_kit()
+ phantom_line_qty_done = sum(move_lines.filtered(
+ lambda x: x.product_id == phantom_line.product_id
+ ).mapped("qty_done"))
+ quantity = phantom_line_qty_done / components_per_kit
+ taxes = phantom_line.sale_tax_id.compute_all(
+ price_unit=price_unit,
+ currency=phantom_line.currency_id,
+ quantity=quantity,
+ product=phantom_line.product_id,
+ partner=sale_line.order_id.partner_shipping_id)
+ if sale_line.company_id.tax_calculation_rounding_method == (
+ 'round_globally'):
+ price_tax = sum(
+ t.get('amount', 0.0) for t in taxes.get('taxes', []))
+ else:
+ price_tax = taxes['total_included'] - taxes['total_excluded']
+ phantom_line.update({
+ 'sale_tax_description': ', '.join(
+ t.name or t.description for t in phantom_line.sale_tax_id),
+ 'sale_price_subtotal': taxes['total_excluded'],
+ 'sale_price_tax': price_tax,
+ 'sale_price_total': taxes['total_included'],
+ 'phantom_line': True,
+ 'phantom_delivered_qty': quantity,
+ })
+ # Remove the other lines
+ redundant_lines = move_lines[1:]
+ if redundant_lines:
+ redundant_lines.update({
+ 'sale_tax_description': '',
+ 'sale_price_subtotal': 0,
+ 'sale_price_tax': 0,
+ 'sale_price_total': 0,
+ })
diff --git a/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000..94b6ba9
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Tecnativa `_:
+
+ * David Vidal
diff --git a/stock_picking_report_valued_sale_mrp/readme/DESCRIPTION.rst b/stock_picking_report_valued_sale_mrp/readme/DESCRIPTION.rst
new file mode 100644
index 0000000..2f89d7d
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/readme/DESCRIPTION.rst
@@ -0,0 +1,4 @@
+This module extends the functionality of `stock_picking_report_valued` with
+compatibility of MRP kits. Now we'll be able to correctly summarize the picking
+value related to the selled kit with a relations of components and serials/lots
+delivered.
diff --git a/stock_picking_report_valued_sale_mrp/readme/ROADMAP.rst b/stock_picking_report_valued_sale_mrp/readme/ROADMAP.rst
new file mode 100644
index 0000000..ff53ca0
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/readme/ROADMAP.rst
@@ -0,0 +1,13 @@
+* Matching selled kits and their delivered components it's quite tricky. There
+ are two possible approaches to findout from the component how many units
+ correspond with every whole kit:
+
+ - We could have a link to the original BoM line and guess it from it. This
+ approach is the one that Odoo has taken in v13 with the sale order line
+ deliveried quantities computation. The main issue is that if the original
+ BoM changes then we'd loose the correct units per kit reference.
+
+ - Another aproach (the one in this module) is to compute the component units
+ per kit matching the sale order line and its related moves demands. But if
+ the user manually adjust the demand on one model without adjusting it in
+ the order we'll have an incorrect reference as well.
diff --git a/stock_picking_report_valued_sale_mrp/readme/USAGE.rst b/stock_picking_report_valued_sale_mrp/readme/USAGE.rst
new file mode 100644
index 0000000..53cec3f
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/readme/USAGE.rst
@@ -0,0 +1,7 @@
+To test this module:
+
+#. Configure some products with traceability and make them kit components.
+#. Sell the kits and go to the stock picking.
+#. Print the valued delivery slip:
+ - The total amount will now be correct.
+ - The kit components will be summarized in a single kit product line.
diff --git a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
new file mode 100644
index 0000000..16b3258
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+ o.valued and o.sale_id and o.move_line_ids and (move_line.phantom_line or not move_line.phantom_product_id)
+
+
+ o.move_line_ids.filtered(lambda x: not x.phantom_product_id or x.phantom_line)
+
+
+ not move_line.phantom_line
+
+
+
+
+
+ not move_line.phantom_line
+
+
+
+
+
+ not move_line.phantom_line
+
+
+ |
+
+
+ |
+
+
+ not move_line.phantom_line
+
+
+
+
+
+
+
+
+
+
diff --git a/stock_picking_report_valued_sale_mrp/static/description/icon.png b/stock_picking_report_valued_sale_mrp/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~!
zVpnB`o+K7|Al`Q_U;eD$B
zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA
z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__
zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_
zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I
z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U
z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)(
z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH
zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW
z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx
zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h
zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9
zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz#
z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA
zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K=
z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS
zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C
zuVl&0duN<;uOsB3%T9Fp8t{ED108)`y_~Hnd9AUX7h-H?jVuU|}My+C=TjH(jKz
zqMVr0re3S$H@t{zI95qa)+Crz*5Zj}Ao%4Z><+W(nOZd?gDnfNBC3>M8WE61$So|P
zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO
z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1
zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_
zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8
zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ>
zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN
z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h
zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d
zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB
zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz
z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I
zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X
zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD
z#z-)AXwSRY?OPefw^iI+
z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd
z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs
z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I
z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$
z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV
z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s
zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6
zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u
zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q
zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH
zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c
zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT
zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+
z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ
zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy
zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC)
zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a
zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x!
zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X
zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8
z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A
z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H
zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n=
z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK
z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z
zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h
z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD
z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW
zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@
zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz
z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y<
zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X
zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6
zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6%
z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(|
z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ
z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H
zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6
z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d}
z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A
zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB
z
z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp
zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zls4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6#
z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f#
zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC
zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv!
zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG
z-wfS
zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9
z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE#
z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz
zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t
z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN
zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q
ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k
zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG
z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff
z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1
zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO
zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$
zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV(
z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb
zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4
z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{
zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx}
z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov
zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22
zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq
zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t<
z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k
z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp
z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{}
zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/stock_picking_report_valued_sale_mrp/static/description/index.html b/stock_picking_report_valued_sale_mrp/static/description/index.html
new file mode 100644
index 0000000..e02c1ee
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/static/description/index.html
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+Valued picking linked with MRP Kits
+
+
+
+
+
Valued picking linked with MRP Kits
+
+
+

+
This module extends the functionality of stock_picking_report_valued with
+compatibility of MRP kits. Now we’ll be able to correctly summarize the picking
+value related to the selled kit with a relations of components and serials/lots
+delivered.
+
Table of contents
+
+
+
+
To test this module:
+
+- Configure some products with traceability and make them kit components.
+- Sell the kits and go to the stock picking.
+- Print the valued delivery slip:
+- The total amount will now be correct.
+- The kit components will be summarized in a single kit product line.
+
+
+
+
+
+- Matching selled kits and their delivered components it’s quite tricky. There
+are two possible approaches to findout from the component how many units
+correspond with every whole kit:
+- We could have a link to the original BoM line and guess it from it. This
+approach is the one that Odoo has taken in v13 with the sale order line
+deliveried quantities computation. The main issue is that if the original
+BoM changes then we’d loose the correct units per kit reference.
+- Another aproach (the one in this module) is to compute the component units
+per kit matching the sale order line and its related moves demands. But if
+the user manually adjust the demand on one model without adjusting it in
+the order we’ll have an incorrect reference as well.
+
+
+
+
+
+
+
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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
Current maintainer:
+

+
This module is part of the OCA/stock-logistics-reporting project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/stock_picking_report_valued_sale_mrp/tests/__init__.py b/stock_picking_report_valued_sale_mrp/tests/__init__.py
new file mode 100644
index 0000000..bb8c419
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_stock_picking_report_valued_mrp
diff --git a/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
new file mode 100644
index 0000000..5f43e18
--- /dev/null
+++ b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
@@ -0,0 +1,68 @@
+# Copyright 2020 Tecnativa - David Vidal
+from odoo.addons.stock_picking_report_valued.tests\
+ .test_stock_picking_valued import TestStockPickingValued
+from odoo.tests import Form
+
+
+class TestStockPickingValuedMrp(TestStockPickingValued):
+
+ @classmethod
+ def setUpClass(cls):
+ """We want to run parent class tests again to ensure everything
+ works as expected even if no kits are present"""
+ super().setUpClass()
+ cls.res_partner = cls.env["res.partner"]
+ cls.product_product = cls.env["product.product"]
+ cls.product_kit = cls.product_product.create({
+ "name": "Product test 1",
+ "type": "consu",
+ })
+ cls.product_kit_comp_1 = cls.product_product.create({
+ "name": "Product Component 1",
+ "type": "product",
+ })
+ cls.product_kit_comp_2 = cls.product_product.create({
+ "name": "Product Component 2",
+ "type": "product",
+ })
+ cls.bom = cls.env["mrp.bom"].create({
+ "product_id": cls.product_kit.id,
+ "product_tmpl_id": cls.product_kit.product_tmpl_id.id,
+ "type": "phantom",
+ "bom_line_ids": [
+ (0, 0, {
+ "product_id": cls.product_kit_comp_1.id,
+ "product_qty": 2,
+ }),
+ (0, 0, {
+ "product_id": cls.product_kit_comp_2.id,
+ "product_qty": 4,
+ })
+ ]})
+ cls.product_2 = cls.product_product.create({
+ "name": "Product test 2",
+ "type": "product",
+ })
+ order_form = Form(cls.env["sale.order"])
+ order_form.partner_id = cls.partner
+ with order_form.order_line.new() as line_form:
+ line_form.product_id = cls.product_kit
+ line_form.product_uom_qty = 5
+ line_form.price_unit = 29.9
+ line_form.tax_id.clear()
+ line_form.tax_id.add(cls.tax10)
+ cls.sale_order_3 = order_form.save()
+ cls.sale_order_3.action_confirm()
+ # Maybe other modules create additional lines in the create
+ # method in sale.order model, so let's find the correct line.
+ cls.order_line = cls.sale_order_3.order_line.filtered(
+ lambda r: r.product_id == cls.product_kit)
+ cls.order_out_picking = cls.sale_order_3.picking_ids
+
+ def test_01_picking_confirmed(self):
+ for line in self.order_out_picking.move_lines:
+ line.quantity_done = line.product_uom_qty
+ self.order_out_picking.button_validate()
+ self.assertAlmostEqual(self.order_out_picking.amount_untaxed, 149.5)
+ self.assertAlmostEqual(self.order_out_picking.amount_tax, 14.95)
+ self.assertAlmostEqual(self.order_out_picking.amount_total, 164.45)
From ebc6734c9285e9330836f0f96bf8aa55a89c33ed Mon Sep 17 00:00:00 2001
From: david
Date: Wed, 16 Dec 2020 09:45:11 +0100
Subject: [PATCH 02/11] [FIX] stock_picking_report_valued_sale_mrp: error when
no sale line
---
stock_picking_report_valued_sale_mrp/__manifest__.py | 2 +-
stock_picking_report_valued_sale_mrp/models/stock_move_line.py | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index c61a15f..d5fbc69 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "12.0.1.0.0",
+ "version": "12.0.1.0.1",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index 1ffae10..3cf1699 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -26,7 +26,8 @@ class StockMoveLine(models.Model):
def _compute_phantom_product_id(self):
"""Relate every line with its kit product"""
for line in self.filtered(
- lambda x: x.sale_line.product_id._is_phantom_bom()):
+ lambda x: x.sale_line and
+ x.sale_line.product_id._is_phantom_bom()):
line.phantom_product_id = line.sale_line.product_id
def _compute_sale_order_line_fields(self):
From c05ea98509aa4f47e28045433e29694e35aebfc6 Mon Sep 17 00:00:00 2001
From: david
Date: Thu, 22 Apr 2021 17:32:30 +0200
Subject: [PATCH 03/11] [FIX] stock_picking_report_valued_sale_mrp: ignored
cancelled order
We want to consider backordered moves even if they're cancelled but not
cancelled moves from cancelled orders, that must be filtered. Otherwise,
they pullute the amounts computation.
---
stock_picking_report_valued_sale_mrp/__manifest__.py | 2 +-
.../models/stock_move.py | 9 ++++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index d5fbc69..b647ce1 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "12.0.1.0.1",
+ "version": "12.0.1.0.2",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move.py b/stock_picking_report_valued_sale_mrp/models/stock_move.py
index 58c4e87..c81369d 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move.py
@@ -17,5 +17,12 @@ class StockMove(models.Model):
component_demand = sum(
sale_line.move_ids.filtered(
lambda x: x.product_id == self.product_id and
- not x.origin_returned_move_id).mapped("product_uom_qty"))
+ not x.origin_returned_move_id and
+ (
+ x.state != "cancel" or (
+ x.state == "cancel" and x.backorder_id
+ )
+ )
+ ).mapped("product_uom_qty")
+ )
return component_demand / sale_line.product_uom_qty
From 496067464175883d3a1e0f5ea4b5cb6bf555992d Mon Sep 17 00:00:00 2001
From: david
Date: Thu, 6 May 2021 16:26:53 +0200
Subject: [PATCH 04/11] [IMP] stock_picking_report_valued_sale_mrp: black,
isort, prettier
---
.../__manifest__.py | 9 +--
.../models/stock_move.py | 12 +--
.../models/stock_move_line.py | 73 ++++++++++---------
.../report/stock_picking_report_valued.xml | 62 ++++++++++++----
.../test_stock_picking_report_valued_mrp.py | 71 +++++++++---------
5 files changed, 129 insertions(+), 98 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index b647ce1..d626354 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -10,11 +10,6 @@
"author": "Tecnativa, Odoo Community Association (OCA)",
"maintainers": ["chienandalu"],
"license": "AGPL-3",
- "depends": [
- "stock_picking_report_valued",
- "sale_mrp",
- ],
- "data": [
- "report/stock_picking_report_valued.xml",
- ],
+ "depends": ["stock_picking_report_valued", "sale_mrp"],
+ "data": ["report/stock_picking_report_valued.xml"],
}
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move.py b/stock_picking_report_valued_sale_mrp/models/stock_move.py
index c81369d..1b8fa3e 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move.py
@@ -4,7 +4,7 @@ from odoo import models
class StockMove(models.Model):
- _inherit = 'stock.move'
+ _inherit = "stock.move"
def _get_components_per_kit(self):
"""Compute how many kit components were demanded from this line. We
@@ -16,13 +16,9 @@ class StockMove(models.Model):
return 0
component_demand = sum(
sale_line.move_ids.filtered(
- lambda x: x.product_id == self.product_id and
- not x.origin_returned_move_id and
- (
- x.state != "cancel" or (
- x.state == "cancel" and x.backorder_id
- )
- )
+ lambda x: x.product_id == self.product_id
+ and not x.origin_returned_move_id
+ and (x.state != "cancel" or (x.state == "cancel" and x.backorder_id))
).mapped("product_uom_qty")
)
return component_demand / sale_line.product_uom_qty
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index 3cf1699..9bf6778 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -4,7 +4,7 @@ from odoo import api, fields, models
class StockMoveLine(models.Model):
- _inherit = 'stock.move.line'
+ _inherit = "stock.move.line"
phantom_product_id = fields.Many2one(
comodel_name="product.product",
@@ -14,20 +14,18 @@ class StockMoveLine(models.Model):
readonly=True,
)
phantom_line = fields.Boolean(
- compute="_compute_sale_order_line_fields",
- compute_sudo=True,
+ compute="_compute_sale_order_line_fields", compute_sudo=True,
)
phantom_delivered_qty = fields.Float(
- compute="_compute_sale_order_line_fields",
- compute_sudo=True,
+ compute="_compute_sale_order_line_fields", compute_sudo=True,
)
@api.depends("sale_line")
def _compute_phantom_product_id(self):
"""Relate every line with its kit product"""
for line in self.filtered(
- lambda x: x.sale_line and
- x.sale_line.product_id._is_phantom_bom()):
+ lambda x: x.sale_line and x.sale_line.product_id._is_phantom_bom()
+ ):
line.phantom_product_id = line.sale_line.product_id
def _compute_sale_order_line_fields(self):
@@ -37,8 +35,7 @@ class StockMoveLine(models.Model):
super()._compute_sale_order_line_fields()
kit_lines = self.filtered("phantom_product_id")
for sale_line in kit_lines.mapped("sale_line"):
- move_lines = kit_lines.filtered(
- lambda x: x.sale_line == sale_line)
+ move_lines = kit_lines.filtered(lambda x: x.sale_line == sale_line)
# Deduct the kit quantity from the first component in the picking.
# If the the kit is partially delivered, this could lead to an
# unacurate value.
@@ -47,42 +44,52 @@ class StockMoveLine(models.Model):
continue
price_unit = (
sale_line.price_subtotal / sale_line.product_uom_qty
- if sale_line.product_uom_qty else sale_line.price_reduce)
+ if sale_line.product_uom_qty
+ else sale_line.price_reduce
+ )
# Compute how many kits were delivered from the components and
# the original demand. Note that if the qty is edited in the sale
# order this could lead to inconsitencies.
components_per_kit = phantom_line.move_id._get_components_per_kit()
- phantom_line_qty_done = sum(move_lines.filtered(
- lambda x: x.product_id == phantom_line.product_id
- ).mapped("qty_done"))
+ phantom_line_qty_done = sum(
+ move_lines.filtered(
+ lambda x: x.product_id == phantom_line.product_id
+ ).mapped("qty_done")
+ )
quantity = phantom_line_qty_done / components_per_kit
taxes = phantom_line.sale_tax_id.compute_all(
price_unit=price_unit,
currency=phantom_line.currency_id,
quantity=quantity,
product=phantom_line.product_id,
- partner=sale_line.order_id.partner_shipping_id)
+ partner=sale_line.order_id.partner_shipping_id,
+ )
if sale_line.company_id.tax_calculation_rounding_method == (
- 'round_globally'):
- price_tax = sum(
- t.get('amount', 0.0) for t in taxes.get('taxes', []))
+ "round_globally"
+ ):
+ price_tax = sum(t.get("amount", 0.0) for t in taxes.get("taxes", []))
else:
- price_tax = taxes['total_included'] - taxes['total_excluded']
- phantom_line.update({
- 'sale_tax_description': ', '.join(
- t.name or t.description for t in phantom_line.sale_tax_id),
- 'sale_price_subtotal': taxes['total_excluded'],
- 'sale_price_tax': price_tax,
- 'sale_price_total': taxes['total_included'],
- 'phantom_line': True,
- 'phantom_delivered_qty': quantity,
- })
+ price_tax = taxes["total_included"] - taxes["total_excluded"]
+ phantom_line.update(
+ {
+ "sale_tax_description": ", ".join(
+ t.name or t.description for t in phantom_line.sale_tax_id
+ ),
+ "sale_price_subtotal": taxes["total_excluded"],
+ "sale_price_tax": price_tax,
+ "sale_price_total": taxes["total_included"],
+ "phantom_line": True,
+ "phantom_delivered_qty": quantity,
+ }
+ )
# Remove the other lines
redundant_lines = move_lines[1:]
if redundant_lines:
- redundant_lines.update({
- 'sale_tax_description': '',
- 'sale_price_subtotal': 0,
- 'sale_price_tax': 0,
- 'sale_price_total': 0,
- })
+ redundant_lines.update(
+ {
+ "sale_tax_description": "",
+ "sale_price_subtotal": 0,
+ "sale_price_tax": 0,
+ "sale_price_total": 0,
+ }
+ )
diff --git a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
index 16b3258..b66f4c9 100644
--- a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
+++ b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
@@ -1,48 +1,78 @@
-
+
-
-
- o.valued and o.sale_id and o.move_line_ids and (move_line.phantom_line or not move_line.phantom_product_id)
+
+
+ o.valued and o.sale_id and o.move_line_ids and (move_line.phantom_line or not move_line.phantom_product_id)
- o.move_line_ids.filtered(lambda x: not x.phantom_product_id or x.phantom_line)
+ o.move_line_ids.filtered(lambda x: not x.phantom_product_id or x.phantom_line)
not move_line.phantom_line
-
+
-
+
not move_line.phantom_line
-
-
+
+
not move_line.phantom_line
-
-
- |
+
+
+
not move_line.phantom_line
-
+
diff --git a/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
index 5f43e18..0ac2989 100644
--- a/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
+++ b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
@@ -1,11 +1,12 @@
# Copyright 2020 Tecnativa - David Vidal
-from odoo.addons.stock_picking_report_valued.tests\
- .test_stock_picking_valued import TestStockPickingValued
from odoo.tests import Form
+from odoo.addons.stock_picking_report_valued.tests.test_stock_picking_valued import (
+ TestStockPickingValued,
+)
+
class TestStockPickingValuedMrp(TestStockPickingValued):
-
@classmethod
def setUpClass(cls):
"""We want to run parent class tests again to ensure everything
@@ -13,36 +14,37 @@ class TestStockPickingValuedMrp(TestStockPickingValued):
super().setUpClass()
cls.res_partner = cls.env["res.partner"]
cls.product_product = cls.env["product.product"]
- cls.product_kit = cls.product_product.create({
- "name": "Product test 1",
- "type": "consu",
- })
- cls.product_kit_comp_1 = cls.product_product.create({
- "name": "Product Component 1",
- "type": "product",
- })
- cls.product_kit_comp_2 = cls.product_product.create({
- "name": "Product Component 2",
- "type": "product",
- })
- cls.bom = cls.env["mrp.bom"].create({
- "product_id": cls.product_kit.id,
- "product_tmpl_id": cls.product_kit.product_tmpl_id.id,
- "type": "phantom",
- "bom_line_ids": [
- (0, 0, {
- "product_id": cls.product_kit_comp_1.id,
- "product_qty": 2,
- }),
- (0, 0, {
- "product_id": cls.product_kit_comp_2.id,
- "product_qty": 4,
- })
- ]})
- cls.product_2 = cls.product_product.create({
- "name": "Product test 2",
- "type": "product",
- })
+ cls.product_kit = cls.product_product.create(
+ {"name": "Product test 1", "type": "consu"}
+ )
+ cls.product_kit_comp_1 = cls.product_product.create(
+ {"name": "Product Component 1", "type": "product"}
+ )
+ cls.product_kit_comp_2 = cls.product_product.create(
+ {"name": "Product Component 2", "type": "product"}
+ )
+ cls.bom = cls.env["mrp.bom"].create(
+ {
+ "product_id": cls.product_kit.id,
+ "product_tmpl_id": cls.product_kit.product_tmpl_id.id,
+ "type": "phantom",
+ "bom_line_ids": [
+ (
+ 0,
+ 0,
+ {"product_id": cls.product_kit_comp_1.id, "product_qty": 2},
+ ),
+ (
+ 0,
+ 0,
+ {"product_id": cls.product_kit_comp_2.id, "product_qty": 4},
+ ),
+ ],
+ }
+ )
+ cls.product_2 = cls.product_product.create(
+ {"name": "Product test 2", "type": "product"}
+ )
order_form = Form(cls.env["sale.order"])
order_form.partner_id = cls.partner
with order_form.order_line.new() as line_form:
@@ -56,7 +58,8 @@ class TestStockPickingValuedMrp(TestStockPickingValued):
# Maybe other modules create additional lines in the create
# method in sale.order model, so let's find the correct line.
cls.order_line = cls.sale_order_3.order_line.filtered(
- lambda r: r.product_id == cls.product_kit)
+ lambda r: r.product_id == cls.product_kit
+ )
cls.order_out_picking = cls.sale_order_3.picking_ids
def test_01_picking_confirmed(self):
From 284abd42483fbe800d8c6d5fab993b853ab7a22b Mon Sep 17 00:00:00 2001
From: david
Date: Fri, 4 Jun 2021 11:41:05 +0200
Subject: [PATCH 05/11] [MIG] stock_picking_report_valued_sale_mrp: Migration
to 13.0
---
stock_picking_report_valued_sale_mrp/README.rst | 11 ++++++-----
stock_picking_report_valued_sale_mrp/__manifest__.py | 2 +-
.../i18n/stock_picking_report_valued_sale_mrp.pot | 7 +++----
.../models/stock_move.py | 6 +++++-
.../models/stock_move_line.py | 11 +++++++++--
.../readme/CONTRIBUTORS.rst | 1 +
.../report/stock_picking_report_valued.xml | 6 +++---
.../static/description/index.html | 7 ++++---
.../tests/test_stock_picking_report_valued_mrp.py | 4 ++++
9 files changed, 36 insertions(+), 19 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/README.rst b/stock_picking_report_valued_sale_mrp/README.rst
index 858d714..094b8ce 100644
--- a/stock_picking_report_valued_sale_mrp/README.rst
+++ b/stock_picking_report_valued_sale_mrp/README.rst
@@ -14,13 +14,13 @@ Valued picking linked with MRP Kits
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--reporting-lightgray.png?logo=github
- :target: https://github.com/OCA/stock-logistics-reporting/tree/12.0/stock_picking_report_valued_sale_mrp
+ :target: https://github.com/OCA/stock-logistics-reporting/tree/13.0/stock_picking_report_valued_sale_mrp
:alt: OCA/stock-logistics-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/stock-logistics-reporting-12-0/stock-logistics-reporting-12-0-stock_picking_report_valued_sale_mrp
+ :target: https://translation.odoo-community.org/projects/stock-logistics-reporting-13-0/stock-logistics-reporting-13-0-stock_picking_report_valued_sale_mrp
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/151/12.0
+ :target: https://runbot.odoo-community.org/runbot/151/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -69,7 +69,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -87,6 +87,7 @@ Contributors
* `Tecnativa `_:
* David Vidal
+ * Carlos Roca
Maintainers
~~~~~~~~~~~
@@ -109,6 +110,6 @@ Current `maintainer `__:
|maintainer-chienandalu|
-This module is part of the `OCA/stock-logistics-reporting `_ project on GitHub.
+This module is part of the `OCA/stock-logistics-reporting `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index d626354..af7fe8d 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "12.0.1.0.2",
+ "version": "13.0.1.0.0",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot b/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
index 8d1607f..4d3fe13 100644
--- a/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
+++ b/stock_picking_report_valued_sale_mrp/i18n/stock_picking_report_valued_sale_mrp.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * stock_picking_report_valued_sale_mrp
+# * stock_picking_report_valued_sale_mrp
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"Last-Translator: <>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,4 +37,3 @@ msgstr ""
#: model:ir.model,name:stock_picking_report_valued_sale_mrp.model_stock_move
msgid "Stock Move"
msgstr ""
-
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move.py b/stock_picking_report_valued_sale_mrp/models/stock_move.py
index 1b8fa3e..4b459b1 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move.py
@@ -12,7 +12,11 @@ class StockMove(models.Model):
were manually changed, it could lead to inconsistencies"""
self.ensure_one()
sale_line = self.sale_line_id
- if not sale_line or not sale_line.product_id._is_phantom_bom():
+ if (
+ not sale_line
+ or not sale_line.product_id.get_components()
+ or sale_line.product_id.ids == sale_line.product_id.get_components()
+ ):
return 0
component_demand = sum(
sale_line.move_ids.filtered(
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index 9bf6778..67278c4 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -23,8 +23,11 @@ class StockMoveLine(models.Model):
@api.depends("sale_line")
def _compute_phantom_product_id(self):
"""Relate every line with its kit product"""
+ self.write({"phantom_product_id": False})
for line in self.filtered(
- lambda x: x.sale_line and x.sale_line.product_id._is_phantom_bom()
+ lambda x: x.sale_line
+ and x.sale_line.product_id.get_components()
+ and x.sale_line.product_id.ids != x.sale_line.product_id.get_components()
):
line.phantom_product_id = line.sale_line.product_id
@@ -33,7 +36,11 @@ class StockMoveLine(models.Model):
avoid duplicate the amounts. We also need to recompute the total
amounts according to the corresponding delivered kits"""
super()._compute_sale_order_line_fields()
- kit_lines = self.filtered("phantom_product_id")
+ pickings = self.mapped("picking_id")
+ kit_lines = pickings.move_line_ids.filtered("phantom_product_id")
+ pickings.move_line_ids.write(
+ {"phantom_line": False, "phantom_delivered_qty": 0.0}
+ )
for sale_line in kit_lines.mapped("sale_line"):
move_lines = kit_lines.filtered(lambda x: x.sale_line == sale_line)
# Deduct the kit quantity from the first component in the picking.
diff --git a/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
index 94b6ba9..1bed2df 100644
--- a/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
+++ b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
@@ -1,3 +1,4 @@
* `Tecnativa `_:
* David Vidal
+ * Carlos Roca
diff --git a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
index b66f4c9..60ecdc5 100644
--- a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
+++ b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
@@ -28,17 +28,17 @@
/>
not move_line.phantom_line
diff --git a/stock_picking_report_valued_sale_mrp/static/description/index.html b/stock_picking_report_valued_sale_mrp/static/description/index.html
index e02c1ee..e3876fd 100644
--- a/stock_picking_report_valued_sale_mrp/static/description/index.html
+++ b/stock_picking_report_valued_sale_mrp/static/description/index.html
@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of stock_picking_report_valued with
compatibility of MRP kits. Now we’ll be able to correctly summarize the picking
value related to the selled kit with a relations of components and serials/lots
@@ -420,7 +420,7 @@ the order we’ll have an incorrect reference as well.
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.
+feedback.
Do not contact contributors directly about support or help with technical issues.
diff --git a/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
index 0ac2989..2b13685 100644
--- a/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
+++ b/stock_picking_report_valued_sale_mrp/tests/test_stock_picking_report_valued_mrp.py
@@ -69,3 +69,7 @@ class TestStockPickingValuedMrp(TestStockPickingValued):
self.assertAlmostEqual(self.order_out_picking.amount_untaxed, 149.5)
self.assertAlmostEqual(self.order_out_picking.amount_tax, 14.95)
self.assertAlmostEqual(self.order_out_picking.amount_total, 164.45)
+ # Run the report to detect hidden errors
+ self.env.ref("stock.action_report_delivery").render_qweb_html(
+ self.order_out_picking.ids
+ )
From 3f2d9d2bf2577b1cfa03e48944698aa43d4ed1fa Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Fri, 25 Feb 2022 19:51:05 +0100
Subject: [PATCH 06/11] [FIX] stock_picking_report_valued_sale_mrp: Don't write
on compute field
Update/direct assignation should be used instead.
---
stock_picking_report_valued_sale_mrp/__manifest__.py | 2 +-
.../models/stock_move_line.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index af7fe8d..14abc55 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "13.0.1.0.0",
+ "version": "13.0.1.0.1",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index 67278c4..718d3c1 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -23,7 +23,7 @@ class StockMoveLine(models.Model):
@api.depends("sale_line")
def _compute_phantom_product_id(self):
"""Relate every line with its kit product"""
- self.write({"phantom_product_id": False})
+ self.phantom_product_id = False
for line in self.filtered(
lambda x: x.sale_line
and x.sale_line.product_id.get_components()
@@ -38,7 +38,7 @@ class StockMoveLine(models.Model):
super()._compute_sale_order_line_fields()
pickings = self.mapped("picking_id")
kit_lines = pickings.move_line_ids.filtered("phantom_product_id")
- pickings.move_line_ids.write(
+ pickings.move_line_ids.update(
{"phantom_line": False, "phantom_delivered_qty": 0.0}
)
for sale_line in kit_lines.mapped("sale_line"):
From bdbe7cdf6aa63986d63e1cb94244bce6d1816b45 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Sat, 30 Apr 2022 20:14:23 +0200
Subject: [PATCH 07/11] [FIX] stock_picking_report_valued_sale_mrp: Avoid
inheritance problem
odoo.tools.convert.ParseError: "Element '' cannot be located in parent view
---
stock_picking_report_valued_sale_mrp/__manifest__.py | 2 +-
.../report/stock_picking_report_valued.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index 14abc55..ce515eb 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "13.0.1.0.1",
+ "version": "13.0.1.0.2",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
index 60ecdc5..ea9511a 100644
--- a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
+++ b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
@@ -13,7 +13,7 @@
name="t-if"
>o.valued and o.sale_id and o.move_line_ids and (move_line.phantom_line or not move_line.phantom_product_id)
-
+
o.move_line_ids.filtered(lambda x: not x.phantom_product_id or x.phantom_line)
From aa61d9fa87359e29f230ce4dfe10e18b4e39d9e0 Mon Sep 17 00:00:00 2001
From: david
Date: Tue, 23 Nov 2021 13:36:15 +0100
Subject: [PATCH 08/11] [FIX] stock_picking_report_valued_sale_mrp:
multipicking
When the recordset comes from multiple picking we could get a wrong
calculation of the mrp lines in the report when the conditions of same
component for the same order line would apply. So for every picking we
have to compute the kits valuations independently.
TT33076
---
.../__manifest__.py | 2 +-
.../models/stock_move_line.py | 13 +++++++++++--
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index ce515eb..c1a34d5 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "13.0.1.0.2",
+ "version": "13.0.1.0.3",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index 718d3c1..f8a8d3a 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -37,13 +37,22 @@ class StockMoveLine(models.Model):
amounts according to the corresponding delivered kits"""
super()._compute_sale_order_line_fields()
pickings = self.mapped("picking_id")
- kit_lines = pickings.move_line_ids.filtered("phantom_product_id")
pickings.move_line_ids.update(
{"phantom_line": False, "phantom_delivered_qty": 0.0}
)
+ for picking in pickings:
+ self.filtered(
+ lambda x: x.picking_id == picking
+ )._compute_sale_order_line_fields_by_picking()
+
+ def _compute_sale_order_line_fields_by_picking(self):
+ """We want to compute the lines value by picking to avoid mixing lines
+ if they weren't shipped altogether.
+ """
+ kit_lines = self.filtered("phantom_product_id")
for sale_line in kit_lines.mapped("sale_line"):
move_lines = kit_lines.filtered(lambda x: x.sale_line == sale_line)
- # Deduct the kit quantity from the first component in the picking.
+ # Deduce the kit quantity from the first component in the picking.
# If the the kit is partially delivered, this could lead to an
# unacurate value.
phantom_line = move_lines[:1]
From dd5f80d0ab93976df6b466a22d175470adb20444 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Wed, 1 Mar 2023 11:38:56 +0100
Subject: [PATCH 09/11] [IMP] stock_picking_report_valued_sale_mrp: black,
isort, prettier
---
.../odoo/addons/stock_picking_report_valued_sale_mrp | 1 +
setup/stock_picking_report_valued_sale_mrp/setup.py | 6 ++++++
.../models/stock_move_line.py | 9 ++++++---
3 files changed, 13 insertions(+), 3 deletions(-)
create mode 120000 setup/stock_picking_report_valued_sale_mrp/odoo/addons/stock_picking_report_valued_sale_mrp
create mode 100644 setup/stock_picking_report_valued_sale_mrp/setup.py
diff --git a/setup/stock_picking_report_valued_sale_mrp/odoo/addons/stock_picking_report_valued_sale_mrp b/setup/stock_picking_report_valued_sale_mrp/odoo/addons/stock_picking_report_valued_sale_mrp
new file mode 120000
index 0000000..01fd4ce
--- /dev/null
+++ b/setup/stock_picking_report_valued_sale_mrp/odoo/addons/stock_picking_report_valued_sale_mrp
@@ -0,0 +1 @@
+../../../../stock_picking_report_valued_sale_mrp
\ No newline at end of file
diff --git a/setup/stock_picking_report_valued_sale_mrp/setup.py b/setup/stock_picking_report_valued_sale_mrp/setup.py
new file mode 100644
index 0000000..28c57bb
--- /dev/null
+++ b/setup/stock_picking_report_valued_sale_mrp/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)
diff --git a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
index f8a8d3a..b940356 100644
--- a/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
+++ b/stock_picking_report_valued_sale_mrp/models/stock_move_line.py
@@ -14,10 +14,12 @@ class StockMoveLine(models.Model):
readonly=True,
)
phantom_line = fields.Boolean(
- compute="_compute_sale_order_line_fields", compute_sudo=True,
+ compute="_compute_sale_order_line_fields",
+ compute_sudo=True,
)
phantom_delivered_qty = fields.Float(
- compute="_compute_sale_order_line_fields", compute_sudo=True,
+ compute="_compute_sale_order_line_fields",
+ compute_sudo=True,
)
@api.depends("sale_line")
@@ -35,7 +37,7 @@ class StockMoveLine(models.Model):
"""For kits we only want to store the value in one of the move lines to
avoid duplicate the amounts. We also need to recompute the total
amounts according to the corresponding delivered kits"""
- super()._compute_sale_order_line_fields()
+ res = super()._compute_sale_order_line_fields()
pickings = self.mapped("picking_id")
pickings.move_line_ids.update(
{"phantom_line": False, "phantom_delivered_qty": 0.0}
@@ -44,6 +46,7 @@ class StockMoveLine(models.Model):
self.filtered(
lambda x: x.picking_id == picking
)._compute_sale_order_line_fields_by_picking()
+ return res
def _compute_sale_order_line_fields_by_picking(self):
"""We want to compute the lines value by picking to avoid mixing lines
From 18f595f1b05ccd40aa81fcd8dc7f6ef44623624c Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Mon, 6 Mar 2023 13:12:59 +0100
Subject: [PATCH 10/11] [MIG] stock_picking_report_valued_sale_mrp: Migration
to 15.0
---
.../README.rst | 15 ++--
.../__manifest__.py | 2 +-
.../readme/CONTRIBUTORS.rst | 1 +
.../report/stock_picking_report_valued.xml | 87 ++++++++++++++-----
.../static/description/index.html | 9 +-
.../test_stock_picking_report_valued_mrp.py | 2 +-
6 files changed, 82 insertions(+), 34 deletions(-)
diff --git a/stock_picking_report_valued_sale_mrp/README.rst b/stock_picking_report_valued_sale_mrp/README.rst
index 094b8ce..b0c0d36 100644
--- a/stock_picking_report_valued_sale_mrp/README.rst
+++ b/stock_picking_report_valued_sale_mrp/README.rst
@@ -14,14 +14,14 @@ Valued picking linked with MRP Kits
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--reporting-lightgray.png?logo=github
- :target: https://github.com/OCA/stock-logistics-reporting/tree/13.0/stock_picking_report_valued_sale_mrp
+ :target: https://github.com/OCA/stock-logistics-reporting/tree/15.0/stock_picking_report_valued_sale_mrp
:alt: OCA/stock-logistics-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/stock-logistics-reporting-13-0/stock-logistics-reporting-13-0-stock_picking_report_valued_sale_mrp
+ :target: https://translation.odoo-community.org/projects/stock-logistics-reporting-15-0/stock-logistics-reporting-15-0-stock_picking_report_valued_sale_mrp
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/151/13.0
- :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/stock-logistics-reporting&target_branch=15.0
+ :alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -69,7 +69,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -88,6 +88,7 @@ Contributors
* David Vidal
* Carlos Roca
+ * Ernesto Tejeda
Maintainers
~~~~~~~~~~~
@@ -110,6 +111,6 @@ Current `maintainer `__:
|maintainer-chienandalu|
-This module is part of the `OCA/stock-logistics-reporting `_ project on GitHub.
+This module is part of the `OCA/stock-logistics-reporting `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/stock_picking_report_valued_sale_mrp/__manifest__.py b/stock_picking_report_valued_sale_mrp/__manifest__.py
index c1a34d5..2cd8ffc 100644
--- a/stock_picking_report_valued_sale_mrp/__manifest__.py
+++ b/stock_picking_report_valued_sale_mrp/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Valued picking linked with MRP Kits",
"summary": "Allow to summarize the picking related with the selled kits",
- "version": "13.0.1.0.3",
+ "version": "15.0.1.0.0",
"development_status": "Beta",
"category": "Warehouse Management",
"website": "https://github.com/OCA/stock-logistics-reporting",
diff --git a/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
index 1bed2df..5fcb48e 100644
--- a/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
+++ b/stock_picking_report_valued_sale_mrp/readme/CONTRIBUTORS.rst
@@ -2,3 +2,4 @@
* David Vidal
* Carlos Roca
+ * Ernesto Tejeda
diff --git a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
index ea9511a..5d3091d 100644
--- a/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
+++ b/stock_picking_report_valued_sale_mrp/report/stock_picking_report_valued.xml
@@ -1,23 +1,74 @@
-
+
+ env["stock.move.line"]
+
+
+ env["stock.move.line"]
+
+
+
+
+
o.valued and o.sale_id and o.move_line_ids and (move_line.phantom_line or not move_line.phantom_product_id)
+ >not move_line.phantom_product_id or move_line.phantom_line
-
+
o.move_line_ids.filtered(lambda x: not x.phantom_product_id or x.phantom_line)
+ name="t-if"
+ >not move_line.phantom_product_id or move_line.phantom_line
+
+ not move_line.phantom_product_id or move_line.phantom_line
+
+
+
+
+
+
+
+
+
+ o.valued and o.sale_id and o.move_line_ids and is_outgoing and (move_line.phantom_line or not move_line.phantom_product_id)
+
+
+
not move_line.phantom_line
@@ -28,24 +79,19 @@
/>
- not move_line.phantom_line
-
-
-
-
+
not move_line.phantom_line
-
+
@@ -78,5 +124,4 @@
-
diff --git a/stock_picking_report_valued_sale_mrp/static/description/index.html b/stock_picking_report_valued_sale_mrp/static/description/index.html
index e3876fd..8b51af0 100644
--- a/stock_picking_report_valued_sale_mrp/static/description/index.html
+++ b/stock_picking_report_valued_sale_mrp/static/description/index.html
@@ -3,7 +3,7 @@
-
+
Valued picking linked with MRP Kits
|