From fb69e0c24aba664e2044d30e02eebf33e6791996 Mon Sep 17 00:00:00 2001 From: Mateu Griful Date: Mon, 12 Apr 2021 17:45:03 +0200 Subject: [PATCH 01/18] [ADD] sale_order_invoice_amount --- sale_order_invoice_amount/README.rst | 77 ++++ sale_order_invoice_amount/__init__.py | 1 + sale_order_invoice_amount/__manifest__.py | 15 + .../i18n/sale_order_invoice_amount.pot | 39 ++ sale_order_invoice_amount/models/__init__.py | 1 + .../models/sale_order.py | 39 ++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 4 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 424 ++++++++++++++++++ sale_order_invoice_amount/tests/__init__.py | 1 + .../tests/test_sale_order_invoice_amount.py | 113 +++++ .../views/sale_order_view.xml | 29 ++ 13 files changed, 745 insertions(+) create mode 100644 sale_order_invoice_amount/README.rst create mode 100644 sale_order_invoice_amount/__init__.py create mode 100644 sale_order_invoice_amount/__manifest__.py create mode 100644 sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot create mode 100644 sale_order_invoice_amount/models/__init__.py create mode 100644 sale_order_invoice_amount/models/sale_order.py create mode 100644 sale_order_invoice_amount/readme/CONTRIBUTORS.rst create mode 100644 sale_order_invoice_amount/readme/DESCRIPTION.rst create mode 100644 sale_order_invoice_amount/static/description/icon.png create mode 100644 sale_order_invoice_amount/static/description/index.html create mode 100644 sale_order_invoice_amount/tests/__init__.py create mode 100644 sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py create mode 100644 sale_order_invoice_amount/views/sale_order_view.xml diff --git a/sale_order_invoice_amount/README.rst b/sale_order_invoice_amount/README.rst new file mode 100644 index 00000000000..fb9734c0690 --- /dev/null +++ b/sale_order_invoice_amount/README.rst @@ -0,0 +1,77 @@ +========================= +Sale Order Invoice Amount +========================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/13.0/sale_order_invoice_amount + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-13-0/sale-workflow-13-0-sale_order_invoice_amount + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/167/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The purpose of this module is to add two fields in the sale order model: + +* invoiced_amount: total invoiced amount. +* uninvoiced_amount: total uninvoiced amount. + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Mateu Griful +* Lois Rilo + +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. + +This module is part of the `OCA/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_invoice_amount/__init__.py b/sale_order_invoice_amount/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/sale_order_invoice_amount/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_order_invoice_amount/__manifest__.py b/sale_order_invoice_amount/__manifest__.py new file mode 100644 index 00000000000..f9d4e72ef6f --- /dev/null +++ b/sale_order_invoice_amount/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +{ + "name": "Sale Order Invoice Amount", + "version": "13.0.1.0.1", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "category": "Sales", + "license": "LGPL-3", + "summary": "Display the invoiced and uninvoiced total in the sale order", + "depends": ["sale"], + "data": ["views/sale_order_view.xml"], + "installable": True, +} diff --git a/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot new file mode 100644 index 00000000000..0389440abaa --- /dev/null +++ b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_invoice_amount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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: sale_order_invoice_amount +#: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__invoiced_amount +msgid "Invoiced Amount" +msgstr "" + +#. module: sale_order_invoice_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount +msgid "Invoiced Total" +msgstr "" + +#. module: sale_order_invoice_amount +#: model:ir.model,name:sale_order_invoice_amount.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_order_invoice_amount +#: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +msgid "Uninvoiced Amount" +msgstr "" + +#. module: sale_order_invoice_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount +msgid "Uninvoiced Total" +msgstr "" diff --git a/sale_order_invoice_amount/models/__init__.py b/sale_order_invoice_amount/models/__init__.py new file mode 100644 index 00000000000..6aacb753131 --- /dev/null +++ b/sale_order_invoice_amount/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order diff --git a/sale_order_invoice_amount/models/sale_order.py b/sale_order_invoice_amount/models/sale_order.py new file mode 100644 index 00000000000..38075d673e9 --- /dev/null +++ b/sale_order_invoice_amount/models/sale_order.py @@ -0,0 +1,39 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + + _inherit = "sale.order" + + invoiced_amount = fields.Monetary( + string="Invoiced Amount", compute="_compute_invoice_amount", store=True, + ) + + uninvoiced_amount = fields.Monetary( + string="Uninvoiced Amount", compute="_compute_invoice_amount", store=True, + ) + + @api.depends( + "state", + "invoice_ids", + "invoice_ids.amount_total_signed", + "amount_total", + "invoice_ids.state", + ) + def _compute_invoice_amount(self): + for rec in self: + if rec.state != "cancel" and rec.invoice_ids: + rec.invoiced_amount = 0.0 + for invoice in rec.invoice_ids: + if invoice.state != "cancel": + rec.invoiced_amount += invoice.amount_total_signed + rec.uninvoiced_amount = max(0, rec.amount_total - rec.invoiced_amount) + else: + rec.invoiced_amount = 0.0 + if rec.state in ["draft", "sent", "cancel"]: + rec.uninvoiced_amount = 0.0 + else: + rec.uninvoiced_amount = rec.amount_total diff --git a/sale_order_invoice_amount/readme/CONTRIBUTORS.rst b/sale_order_invoice_amount/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..087dd29233f --- /dev/null +++ b/sale_order_invoice_amount/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Mateu Griful +* Lois Rilo diff --git a/sale_order_invoice_amount/readme/DESCRIPTION.rst b/sale_order_invoice_amount/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..6da9b552511 --- /dev/null +++ b/sale_order_invoice_amount/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +The purpose of this module is to add two fields in the sale order model: + +* invoiced_amount: total invoiced amount. +* uninvoiced_amount: total uninvoiced amount. diff --git a/sale_order_invoice_amount/static/description/icon.png b/sale_order_invoice_amount/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}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/sale_order_invoice_amount/static/description/index.html b/sale_order_invoice_amount/static/description/index.html new file mode 100644 index 00000000000..957357b26f7 --- /dev/null +++ b/sale_order_invoice_amount/static/description/index.html @@ -0,0 +1,424 @@ + + + + + + +Sale Order Invoice Amount + + + +
+

Sale Order Invoice Amount

+ + +

Beta License: LGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

The purpose of this module is to add two fields in the sale order model:

+
    +
  • invoiced_amount: total invoiced amount.
  • +
  • uninvoiced_amount: total uninvoiced amount.
  • +
+

Table of contents

+ +
+

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

+
    +
  • ForgeFlow
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

This module is part of the OCA/sale-workflow project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/sale_order_invoice_amount/tests/__init__.py b/sale_order_invoice_amount/tests/__init__.py new file mode 100644 index 00000000000..15963146727 --- /dev/null +++ b/sale_order_invoice_amount/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_order_invoice_amount diff --git a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py new file mode 100644 index 00000000000..6bb99cf1a75 --- /dev/null +++ b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py @@ -0,0 +1,113 @@ +# Copyright (C) 2021 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo.tests import common + + +class TestSaleOrderInvoiceAmount(common.SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + # Partners + cls.res_partner_1 = cls.env["res.partner"].create({"name": "Wood Corner"}) + cls.res_partner_address_1 = cls.env["res.partner"].create( + {"name": "Willie Burke", "parent_id": cls.res_partner_1.id} + ) + cls.res_partner_2 = cls.env["res.partner"].create({"name": "Partner 12"}) + + # Products + cls.product_1 = cls.env["product.product"].create( + {"name": "Desk Combination", "type": "product"} + ) + cls.product_2 = cls.env["product.product"].create( + {"name": "Conference Chair", "type": "product"} + ) + cls.product_3 = cls.env["product.product"].create( + {"name": "Repair Services", "type": "service"} + ) + + # Location + cls.stock_warehouse = cls.env["stock.warehouse"].search( + [("company_id", "=", cls.env.company.id)], limit=1 + ) + cls.stock_location_14 = cls.env["stock.location"].create( + {"name": "Shelf 2", "location_id": cls.stock_warehouse.lot_stock_id.id} + ) + # Replenish products + cls.env["stock.quant"]._update_available_quantity( + cls.product_1, cls.stock_location_14, 10 + ) + cls.env["stock.quant"]._update_available_quantity( + cls.product_2, cls.stock_location_14, 10 + ) + # Sale Order + cls.tax = cls.env["account.tax"].create( + {"name": "Tax 15", "type_tax_use": "sale", "amount": 21} + ) + cls.sale_order_1 = cls.env["sale.order"].create( + {"partner_id": cls.res_partner_1.id} + ) + cls.order_line_1 = cls.env["sale.order.line"].create( + { + "order_id": cls.sale_order_1.id, + "product_id": cls.product_1.id, + "product_uom": cls.product_1.uom_id.id, + "product_uom_qty": 10.0, + "price_unit": 10.0, + "tax_id": cls.tax, + } + ) + cls.order_line_2 = cls.env["sale.order.line"].create( + { + "order_id": cls.sale_order_1.id, + "product_id": cls.product_2.id, + "product_uom": cls.product_2.uom_id.id, + "product_uom_qty": 25.0, + "price_unit": 4.0, + "tax_id": cls.tax, + } + ) + cls.order_line_3 = cls.env["sale.order.line"].create( + { + "order_id": cls.sale_order_1.id, + "product_id": cls.product_3.id, + "product_uom": cls.product_3.uom_id.id, + "product_uom_qty": 20.0, + "price_unit": 5.0, + "tax_id": cls.tax, + } + ) + + def test_sale_order_invoiced_amount(self): + + self.assertEqual( + self.sale_order_1.invoiced_amount, 0.0, "Invoiced Amount should be 0.0", + ) + context_payment = { + "active_ids": [self.sale_order_1.id], + "active_id": self.sale_order_1.id, + } + payment = ( + self.env["sale.advance.payment.inv"] + .with_context(context_payment) + .create({"advance_payment_method": "fixed", "fixed_amount": 100}) + ) + + payment.create_invoices() + self.assertEqual( + self.sale_order_1.invoiced_amount, 100.0, "Invoiced Amount should be 100", + ) + self.assertEqual( + self.sale_order_1.uninvoiced_amount, + 263.0, + "Uninvoiced Amount should be 263", + ) + + self.sale_order_1.action_confirm() + self.sale_order_1._create_invoices(final=True) + self.assertEqual( + self.sale_order_1.invoiced_amount, + 363.0, + "Invoiced Amount should be calculated", + ) diff --git a/sale_order_invoice_amount/views/sale_order_view.xml b/sale_order_invoice_amount/views/sale_order_view.xml new file mode 100644 index 00000000000..838d9c0f170 --- /dev/null +++ b/sale_order_invoice_amount/views/sale_order_view.xml @@ -0,0 +1,29 @@ + + + + sale.order.form.invoiced.amount + sale.order + + + + + + + + + + sale.order.tree.invoiced_amount + sale.order + + + + + + + + + From 703e1e36e93fbf249454106881bcb6c69eb2e10b Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Tue, 14 Dec 2021 17:44:29 +0530 Subject: [PATCH 02/18] [IMP] sale_order_invoice_amount: black, isort, prettier --- sale_order_invoice_amount/models/sale_order.py | 8 ++++++-- .../tests/test_sale_order_invoice_amount.py | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/sale_order_invoice_amount/models/sale_order.py b/sale_order_invoice_amount/models/sale_order.py index 38075d673e9..4cbef9fbe4c 100644 --- a/sale_order_invoice_amount/models/sale_order.py +++ b/sale_order_invoice_amount/models/sale_order.py @@ -9,11 +9,15 @@ class SaleOrder(models.Model): _inherit = "sale.order" invoiced_amount = fields.Monetary( - string="Invoiced Amount", compute="_compute_invoice_amount", store=True, + string="Invoiced Amount", + compute="_compute_invoice_amount", + store=True, ) uninvoiced_amount = fields.Monetary( - string="Uninvoiced Amount", compute="_compute_invoice_amount", store=True, + string="Uninvoiced Amount", + compute="_compute_invoice_amount", + store=True, ) @api.depends( diff --git a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py index 6bb99cf1a75..6b3f7d70ee6 100644 --- a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py +++ b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py @@ -82,7 +82,9 @@ def setUpClass(cls): def test_sale_order_invoiced_amount(self): self.assertEqual( - self.sale_order_1.invoiced_amount, 0.0, "Invoiced Amount should be 0.0", + self.sale_order_1.invoiced_amount, + 0.0, + "Invoiced Amount should be 0.0", ) context_payment = { "active_ids": [self.sale_order_1.id], @@ -96,7 +98,9 @@ def test_sale_order_invoiced_amount(self): payment.create_invoices() self.assertEqual( - self.sale_order_1.invoiced_amount, 100.0, "Invoiced Amount should be 100", + self.sale_order_1.invoiced_amount, + 100.0, + "Invoiced Amount should be 100", ) self.assertEqual( self.sale_order_1.uninvoiced_amount, From 5c505208e3767d64071c20634b47b6423fa9978f Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Wed, 15 Dec 2021 10:04:35 +0530 Subject: [PATCH 03/18] [MIG] sale_order_invoice_amount: Migration to 14.0 --- sale_order_invoice_amount/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_order_invoice_amount/__manifest__.py b/sale_order_invoice_amount/__manifest__.py index f9d4e72ef6f..fb7a0dc2b39 100644 --- a/sale_order_invoice_amount/__manifest__.py +++ b/sale_order_invoice_amount/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Sale Order Invoice Amount", - "version": "13.0.1.0.1", + "version": "14.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/sale-workflow", "category": "Sales", From a18df3b82cca5f04cd5fbf23865af47562168530 Mon Sep 17 00:00:00 2001 From: Jasmin Solanki Date: Wed, 22 Dec 2021 14:12:51 +0530 Subject: [PATCH 04/18] [MIG] sale_order_invoice_amount: Migration to 15.0 --- sale_order_invoice_amount/README.rst | 10 ++--- sale_order_invoice_amount/__manifest__.py | 9 ++++- .../i18n/sale_order_invoice_amount.pot | 8 +++- .../models/sale_order.py | 35 +++++++++++++++-- .../static/description/index.html | 6 +-- .../static/src/xml/tax_totals.xml | 39 +++++++++++++++++++ .../tests/test_sale_order_invoice_amount.py | 5 +-- .../views/sale_order_view.xml | 11 ------ 8 files changed, 95 insertions(+), 28 deletions(-) create mode 100644 sale_order_invoice_amount/static/src/xml/tax_totals.xml diff --git a/sale_order_invoice_amount/README.rst b/sale_order_invoice_amount/README.rst index fb9734c0690..f9aaa48497f 100644 --- a/sale_order_invoice_amount/README.rst +++ b/sale_order_invoice_amount/README.rst @@ -14,13 +14,13 @@ Sale Order Invoice Amount :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/sale-workflow/tree/13.0/sale_order_invoice_amount + :target: https://github.com/OCA/sale-workflow/tree/15.0/sale_order_invoice_amount :alt: OCA/sale-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/sale-workflow-13-0/sale-workflow-13-0-sale_order_invoice_amount + :target: https://translation.odoo-community.org/projects/sale-workflow-15-0/sale-workflow-15-0-sale_order_invoice_amount :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/167/13.0 + :target: https://runbot.odoo-community.org/runbot/167/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -41,7 +41,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. @@ -72,6 +72,6 @@ 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. -This module is part of the `OCA/sale-workflow `_ project on GitHub. +This module is part of the `OCA/sale-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_invoice_amount/__manifest__.py b/sale_order_invoice_amount/__manifest__.py index fb7a0dc2b39..706344d41ce 100644 --- a/sale_order_invoice_amount/__manifest__.py +++ b/sale_order_invoice_amount/__manifest__.py @@ -3,13 +3,18 @@ { "name": "Sale Order Invoice Amount", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/sale-workflow", "category": "Sales", "license": "LGPL-3", "summary": "Display the invoiced and uninvoiced total in the sale order", - "depends": ["sale"], + "depends": ["sale", "account"], "data": ["views/sale_order_view.xml"], "installable": True, + "assets": { + "web.assets_qweb": [ + "sale_order_invoice_amount/static/src/xml/**/*", + ], + }, } diff --git a/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot index 0389440abaa..2dbcf9ee8d4 100644 --- a/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot +++ b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -14,7 +14,10 @@ msgstr "" "Plural-Forms: \n" #. module: sale_order_invoice_amount +#. openerp-web +#: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 #: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__invoiced_amount +#, python-format msgid "Invoiced Amount" msgstr "" @@ -29,7 +32,10 @@ msgid "Sales Order" msgstr "" #. module: sale_order_invoice_amount +#. openerp-web +#: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 #: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +#, python-format msgid "Uninvoiced Amount" msgstr "" diff --git a/sale_order_invoice_amount/models/sale_order.py b/sale_order_invoice_amount/models/sale_order.py index 4cbef9fbe4c..25251141cee 100644 --- a/sale_order_invoice_amount/models/sale_order.py +++ b/sale_order_invoice_amount/models/sale_order.py @@ -1,21 +1,20 @@ # Copyright (C) 2021 ForgeFlow S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) +import json from odoo import api, fields, models +from odoo.tools.misc import formatLang class SaleOrder(models.Model): - _inherit = "sale.order" invoiced_amount = fields.Monetary( - string="Invoiced Amount", compute="_compute_invoice_amount", store=True, ) uninvoiced_amount = fields.Monetary( - string="Uninvoiced Amount", compute="_compute_invoice_amount", store=True, ) @@ -41,3 +40,33 @@ def _compute_invoice_amount(self): rec.uninvoiced_amount = 0.0 else: rec.uninvoiced_amount = rec.amount_total + + @api.depends( + "order_line.tax_id", + "order_line.price_unit", + "amount_total", + "amount_untaxed", + "state", + "invoice_ids", + "invoice_ids.amount_total_signed", + "amount_total", + "invoice_ids.state", + ) + def _compute_tax_totals_json(self): + res = super(SaleOrder, self)._compute_tax_totals_json() + lang_env = self.with_context(lang=self.partner_id.lang).env + total_json = json.loads(self.tax_totals_json) + total_json.update( + { + "invoiced_amount": self.invoiced_amount, + "formatted_invoiced_amount": formatLang( + lang_env, self.invoiced_amount, currency_obj=self.currency_id + ), + "uninvoiced_amount": self.uninvoiced_amount, + "formatted_uninvoiced_amount": formatLang( + lang_env, self.uninvoiced_amount, currency_obj=self.currency_id + ), + } + ) + self.tax_totals_json = json.dumps(total_json) + return res diff --git a/sale_order_invoice_amount/static/description/index.html b/sale_order_invoice_amount/static/description/index.html index 957357b26f7..e09f8f041be 100644 --- a/sale_order_invoice_amount/static/description/index.html +++ b/sale_order_invoice_amount/static/description/index.html @@ -367,7 +367,7 @@

Sale Order Invoice Amount

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: LGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

+

Beta License: LGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

The purpose of this module is to add two fields in the sale order model:

  • invoiced_amount: total invoiced amount.
  • @@ -390,7 +390,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.

    @@ -415,7 +415,7 @@

    Maintainers

    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.

    -

    This module is part of the OCA/sale-workflow project on GitHub.

    +

    This module is part of the OCA/sale-workflow project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/sale_order_invoice_amount/static/src/xml/tax_totals.xml b/sale_order_invoice_amount/static/src/xml/tax_totals.xml new file mode 100644 index 00000000000..92dd141fd26 --- /dev/null +++ b/sale_order_invoice_amount/static/src/xml/tax_totals.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +
    + + + +
    + + + +
    +
    +
    +
    diff --git a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py index 6b3f7d70ee6..585a3a66e57 100644 --- a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py +++ b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py @@ -4,7 +4,7 @@ from odoo.tests import common -class TestSaleOrderInvoiceAmount(common.SavepointCase): +class TestSaleOrderInvoiceAmount(common.TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -80,7 +80,6 @@ def setUpClass(cls): ) def test_sale_order_invoiced_amount(self): - self.assertEqual( self.sale_order_1.invoiced_amount, 0.0, @@ -92,7 +91,7 @@ def test_sale_order_invoiced_amount(self): } payment = ( self.env["sale.advance.payment.inv"] - .with_context(context_payment) + .with_context(**context_payment) .create({"advance_payment_method": "fixed", "fixed_amount": 100}) ) diff --git a/sale_order_invoice_amount/views/sale_order_view.xml b/sale_order_invoice_amount/views/sale_order_view.xml index 838d9c0f170..e21770bd437 100644 --- a/sale_order_invoice_amount/views/sale_order_view.xml +++ b/sale_order_invoice_amount/views/sale_order_view.xml @@ -1,16 +1,5 @@ - - sale.order.form.invoiced.amount - sale.order - - - - - - - - sale.order.tree.invoiced_amount sale.order From cf702f8488f91f684acba42dfc45639d86a41c51 Mon Sep 17 00:00:00 2001 From: Cesar Andres Sanchez Date: Fri, 1 Jul 2022 00:48:15 +0200 Subject: [PATCH 05/18] [MIG] sale_order_invoicing_finished_task: Migration to 15.0 --- .../tests/test_sale_order_invoice_amount.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py index 585a3a66e57..28c42cdfa08 100644 --- a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py +++ b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py @@ -15,7 +15,6 @@ def setUpClass(cls): {"name": "Willie Burke", "parent_id": cls.res_partner_1.id} ) cls.res_partner_2 = cls.env["res.partner"].create({"name": "Partner 12"}) - # Products cls.product_1 = cls.env["product.product"].create( {"name": "Desk Combination", "type": "product"} @@ -26,7 +25,6 @@ def setUpClass(cls): cls.product_3 = cls.env["product.product"].create( {"name": "Repair Services", "type": "service"} ) - # Location cls.stock_warehouse = cls.env["stock.warehouse"].search( [("company_id", "=", cls.env.company.id)], limit=1 From de1a4921e6f18813a7feb641f2c9d186c981806b Mon Sep 17 00:00:00 2001 From: Javier Iniesta Date: Wed, 22 Mar 2023 10:00:46 +0100 Subject: [PATCH 06/18] [MIG] sale_order_invoice_amount: Migration to 16.0 --- sale_order_invoice_amount/__init__.py | 1 + sale_order_invoice_amount/__manifest__.py | 16 +++- sale_order_invoice_amount/hooks.py | 91 +++++++++++++++++++ sale_order_invoice_amount/i18n/es.po | 47 ++++++++++ .../i18n/sale_order_invoice_amount.pot | 22 +++-- .../models/sale_order.py | 48 +++++----- .../static/src/xml/tax_totals.xml | 56 ++++++------ .../tests/test_sale_order_invoice_amount.py | 56 +++++++----- .../views/sale_order_view.xml | 4 +- 9 files changed, 247 insertions(+), 94 deletions(-) create mode 100644 sale_order_invoice_amount/hooks.py create mode 100644 sale_order_invoice_amount/i18n/es.po diff --git a/sale_order_invoice_amount/__init__.py b/sale_order_invoice_amount/__init__.py index 0650744f6bc..6d58305f5dd 100644 --- a/sale_order_invoice_amount/__init__.py +++ b/sale_order_invoice_amount/__init__.py @@ -1 +1,2 @@ from . import models +from .hooks import pre_init_hook diff --git a/sale_order_invoice_amount/__manifest__.py b/sale_order_invoice_amount/__manifest__.py index 706344d41ce..840976f6c44 100644 --- a/sale_order_invoice_amount/__manifest__.py +++ b/sale_order_invoice_amount/__manifest__.py @@ -3,18 +3,24 @@ { "name": "Sale Order Invoice Amount", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "website": "https://github.com/OCA/sale-workflow", "category": "Sales", "license": "LGPL-3", "summary": "Display the invoiced and uninvoiced total in the sale order", - "depends": ["sale", "account"], - "data": ["views/sale_order_view.xml"], + "depends": [ + "sale", + "account", + ], + "data": [ + "views/sale_order_view.xml", + ], "installable": True, + "pre_init_hook": "pre_init_hook", "assets": { - "web.assets_qweb": [ - "sale_order_invoice_amount/static/src/xml/**/*", + "web.assets_backend": [ + "sale_order_invoice_amount/static/src/xml/*", ], }, } diff --git a/sale_order_invoice_amount/hooks.py b/sale_order_invoice_amount/hooks.py new file mode 100644 index 00000000000..837554718e4 --- /dev/null +++ b/sale_order_invoice_amount/hooks.py @@ -0,0 +1,91 @@ +def _add_new_columns(cr): + cr.execute( + """ +ALTER TABLE + sale_order +ADD COLUMN IF NOT EXISTS + invoiced_amount numeric, +ADD COLUMN IF NOT EXISTS + uninvoiced_amount numeric + """ + ) + + +def _update_amounts_for_cancel_invoices(cr): + cr.execute( + """ +UPDATE + sale_order +SET + invoiced_amount = 0.0, + uninvoiced_amount = sale_order.amount_total +WHERE + sale_order.state = 'cancel' + """ + ) + + +def _update_amounts_for_non_cancel_invoices(cr): + cr.execute( + """ +WITH amt AS( + SELECT + sale_order_id, + COALESCE(SUM(amount_total_in_currency_signed), 0) AS invoiced_amount, + CASE + WHEN SUM(amount_total_in_currency_signed) IS NULL + THEN amount_total + WHEN amount_total - SUM( + amount_total_in_currency_signed + ) > 0.0 THEN amount_total - SUM( + amount_total_in_currency_signed) + ELSE 0.0 + END AS uninvoiced_amount + FROM ( + SELECT DISTINCT + sale_order.id AS sale_order_id, + sale_order.amount_total AS amount_total, + account_move.id AS account_move_id, + account_move.amount_total_in_currency_signed as amount_total_in_currency_signed + FROM + sale_order + LEFT JOIN sale_order_line + ON sale_order_line.order_id = sale_order.id + LEFT JOIN sale_order_line_invoice_rel + ON sale_order_line_invoice_rel.order_line_id = sale_order_line.id + LEFT JOIN account_move_line + ON sale_order_line_invoice_rel.invoice_line_id = account_move_line.id + LEFT JOIN account_move + ON account_move_line.move_id = account_move.id + WHERE + sale_order.state != 'cancel' + AND ( + account_move IS NULL + OR ( + account_move.move_type IN ('out_invoice', 'out_refund') + AND account_move.state != 'cancel' + ) + ) + ) AS distinct_account_move + GROUP BY sale_order_id, amount_total +) +UPDATE sale_order + SET invoiced_amount = amt.invoiced_amount, + uninvoiced_amount = amt.uninvoiced_amount +FROM amt +WHERE sale_order.id = amt.sale_order_id + """ + ) + + +def _update_amounts(cr): + _update_amounts_for_cancel_invoices(cr) + _update_amounts_for_non_cancel_invoices(cr) + + +def pre_init_hook(cr): + """ + Add columns to avoid Memory error on an existing Odoo instance with lots of data + """ + _add_new_columns(cr) + _update_amounts(cr) diff --git a/sale_order_invoice_amount/i18n/es.po b/sale_order_invoice_amount/i18n/es.po new file mode 100644 index 00000000000..ad387e0d768 --- /dev/null +++ b/sale_order_invoice_amount/i18n/es.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_order_invoice_amount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: sale_order_invoice_amount +#. odoo-javascript +#: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 +#: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__invoiced_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount +#, python-format +msgid "Invoiced Amount" +msgstr "Importe facturado" + +#. module: sale_order_invoice_amount +#: model:ir.model.fields,help:sale_order_invoice_amount.field_sale_order__invoiced_amount +msgid "Order amount already invoiced." +msgstr "Importe del pedido ya facturado." + +#. module: sale_order_invoice_amount +#: model:ir.model.fields,help:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +msgid "Order amount to be invoiced" +msgstr "Importe del pedido pendiente de facturar" + +#. module: sale_order_invoice_amount +#: model:ir.model,name:sale_order_invoice_amount.model_sale_order +msgid "Sales Order" +msgstr "Pedidos de venta" + +#. module: sale_order_invoice_amount +#. odoo-javascript +#: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 +#: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount +#, python-format +msgid "Uninvoiced Amount" +msgstr "Importe no facturado" diff --git a/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot index 2dbcf9ee8d4..b97f75a6e4f 100644 --- a/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot +++ b/sale_order_invoice_amount/i18n/sale_order_invoice_amount.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -14,16 +14,22 @@ msgstr "" "Plural-Forms: \n" #. module: sale_order_invoice_amount -#. openerp-web +#. odoo-javascript #: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 #: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__invoiced_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount #, python-format msgid "Invoiced Amount" msgstr "" #. module: sale_order_invoice_amount -#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount -msgid "Invoiced Total" +#: model:ir.model.fields,help:sale_order_invoice_amount.field_sale_order__invoiced_amount +msgid "Order amount already invoiced." +msgstr "" + +#. module: sale_order_invoice_amount +#: model:ir.model.fields,help:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +msgid "Order amount to be invoiced" msgstr "" #. module: sale_order_invoice_amount @@ -32,14 +38,10 @@ msgid "Sales Order" msgstr "" #. module: sale_order_invoice_amount -#. openerp-web +#. odoo-javascript #: code:addons/sale_order_invoice_amount/static/src/xml/tax_totals.xml:0 #: model:ir.model.fields,field_description:sale_order_invoice_amount.field_sale_order__uninvoiced_amount +#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount #, python-format msgid "Uninvoiced Amount" msgstr "" - -#. module: sale_order_invoice_amount -#: model_terms:ir.ui.view,arch_db:sale_order_invoice_amount.view_order_tree_invoiced_amount -msgid "Uninvoiced Total" -msgstr "" diff --git a/sale_order_invoice_amount/models/sale_order.py b/sale_order_invoice_amount/models/sale_order.py index 25251141cee..ad315ee25bf 100644 --- a/sale_order_invoice_amount/models/sale_order.py +++ b/sale_order_invoice_amount/models/sale_order.py @@ -1,7 +1,5 @@ # Copyright (C) 2021 ForgeFlow S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -import json - from odoo import api, fields, models from odoo.tools.misc import formatLang @@ -12,27 +10,30 @@ class SaleOrder(models.Model): invoiced_amount = fields.Monetary( compute="_compute_invoice_amount", store=True, + help="Order amount already invoiced.", ) uninvoiced_amount = fields.Monetary( compute="_compute_invoice_amount", store=True, + help="Order amount to be invoiced", ) @api.depends( "state", "invoice_ids", - "invoice_ids.amount_total_signed", + "invoice_ids.amount_total_in_currency_signed", "amount_total", "invoice_ids.state", ) def _compute_invoice_amount(self): for rec in self: if rec.state != "cancel" and rec.invoice_ids: - rec.invoiced_amount = 0.0 + invoiced_amount = 0.0 for invoice in rec.invoice_ids: if invoice.state != "cancel": - rec.invoiced_amount += invoice.amount_total_signed + invoiced_amount += invoice.amount_total_in_currency_signed + rec.invoiced_amount = invoiced_amount rec.uninvoiced_amount = max(0, rec.amount_total - rec.invoiced_amount) else: rec.invoiced_amount = 0.0 @@ -48,25 +49,26 @@ def _compute_invoice_amount(self): "amount_untaxed", "state", "invoice_ids", - "invoice_ids.amount_total_signed", + "invoice_ids.amount_total_in_currency_signed", "amount_total", "invoice_ids.state", ) - def _compute_tax_totals_json(self): - res = super(SaleOrder, self)._compute_tax_totals_json() - lang_env = self.with_context(lang=self.partner_id.lang).env - total_json = json.loads(self.tax_totals_json) - total_json.update( - { - "invoiced_amount": self.invoiced_amount, - "formatted_invoiced_amount": formatLang( - lang_env, self.invoiced_amount, currency_obj=self.currency_id - ), - "uninvoiced_amount": self.uninvoiced_amount, - "formatted_uninvoiced_amount": formatLang( - lang_env, self.uninvoiced_amount, currency_obj=self.currency_id - ), - } - ) - self.tax_totals_json = json.dumps(total_json) + def _compute_tax_totals(self): + res = super()._compute_tax_totals() + for order in self: + lang_env = order.with_context(lang=order.partner_id.lang).env + order.tax_totals.update( + { + "invoiced_amount": order.invoiced_amount, + "formatted_invoiced_amount": formatLang( + lang_env, order.invoiced_amount, currency_obj=order.currency_id + ), + "uninvoiced_amount": order.uninvoiced_amount, + "formatted_uninvoiced_amount": formatLang( + lang_env, + order.uninvoiced_amount, + currency_obj=order.currency_id, + ), + } + ) return res diff --git a/sale_order_invoice_amount/static/src/xml/tax_totals.xml b/sale_order_invoice_amount/static/src/xml/tax_totals.xml index 92dd141fd26..ed40a34d20b 100644 --- a/sale_order_invoice_amount/static/src/xml/tax_totals.xml +++ b/sale_order_invoice_amount/static/src/xml/tax_totals.xml @@ -5,35 +5,33 @@ t-inherit="account.TaxTotalsField" t-inherit-mode="extension" > - - - - - - - - - - -
    - - - -
    - - - -
    + + + + + + + + + + + + + + + + + diff --git a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py index 28c42cdfa08..8c2b26ec1d4 100644 --- a/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py +++ b/sale_order_invoice_amount/tests/test_sale_order_invoice_amount.py @@ -10,35 +10,23 @@ def setUpClass(cls): super().setUpClass() # Partners - cls.res_partner_1 = cls.env["res.partner"].create({"name": "Wood Corner"}) - cls.res_partner_address_1 = cls.env["res.partner"].create( + partner_model = cls.env["res.partner"] + cls.res_partner_1 = partner_model.create({"name": "Wood Corner"}) + cls.res_partner_address_1 = partner_model.create( {"name": "Willie Burke", "parent_id": cls.res_partner_1.id} ) - cls.res_partner_2 = cls.env["res.partner"].create({"name": "Partner 12"}) + cls.res_partner_2 = partner_model.create({"name": "Partner 12"}) # Products - cls.product_1 = cls.env["product.product"].create( - {"name": "Desk Combination", "type": "product"} + product_model = cls.env["product.product"] + cls.product_1 = product_model.create( + {"name": "Desk Combination", "type": "consu"} ) - cls.product_2 = cls.env["product.product"].create( - {"name": "Conference Chair", "type": "product"} + cls.product_2 = product_model.create( + {"name": "Conference Chair", "type": "consu"} ) - cls.product_3 = cls.env["product.product"].create( + cls.product_3 = product_model.create( {"name": "Repair Services", "type": "service"} ) - # Location - cls.stock_warehouse = cls.env["stock.warehouse"].search( - [("company_id", "=", cls.env.company.id)], limit=1 - ) - cls.stock_location_14 = cls.env["stock.location"].create( - {"name": "Shelf 2", "location_id": cls.stock_warehouse.lot_stock_id.id} - ) - # Replenish products - cls.env["stock.quant"]._update_available_quantity( - cls.product_1, cls.stock_location_14, 10 - ) - cls.env["stock.quant"]._update_available_quantity( - cls.product_2, cls.stock_location_14, 10 - ) # Sale Order cls.tax = cls.env["account.tax"].create( {"name": "Tax 15", "type_tax_use": "sale", "amount": 21} @@ -46,7 +34,8 @@ def setUpClass(cls): cls.sale_order_1 = cls.env["sale.order"].create( {"partner_id": cls.res_partner_1.id} ) - cls.order_line_1 = cls.env["sale.order.line"].create( + sale_order_line_model = cls.env["sale.order.line"] + cls.order_line_1 = sale_order_line_model.create( { "order_id": cls.sale_order_1.id, "product_id": cls.product_1.id, @@ -56,7 +45,7 @@ def setUpClass(cls): "tax_id": cls.tax, } ) - cls.order_line_2 = cls.env["sale.order.line"].create( + cls.order_line_2 = sale_order_line_model.create( { "order_id": cls.sale_order_1.id, "product_id": cls.product_2.id, @@ -66,7 +55,7 @@ def setUpClass(cls): "tax_id": cls.tax, } ) - cls.order_line_3 = cls.env["sale.order.line"].create( + cls.order_line_3 = sale_order_line_model.create( { "order_id": cls.sale_order_1.id, "product_id": cls.product_3.id, @@ -112,3 +101,20 @@ def test_sale_order_invoiced_amount(self): 363.0, "Invoiced Amount should be calculated", ) + tax_totals = self.sale_order_1.tax_totals + self.assertEqual( + tax_totals["invoiced_amount"], + 363.0, + ) + self.assertEqual( + tax_totals["uninvoiced_amount"], + 0.0, + ) + self.assertEqual( + tax_totals["formatted_invoiced_amount"], + "$\xa0363.00", + ) + self.assertEqual( + tax_totals["formatted_uninvoiced_amount"], + "$\xa00.00", + ) diff --git a/sale_order_invoice_amount/views/sale_order_view.xml b/sale_order_invoice_amount/views/sale_order_view.xml index e21770bd437..6be26d7335e 100644 --- a/sale_order_invoice_amount/views/sale_order_view.xml +++ b/sale_order_invoice_amount/views/sale_order_view.xml @@ -6,10 +6,10 @@ - + From a5acbc5a9b203c70e1f901fda738d8b5a6892454 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 5 Jun 2023 15:47:29 +0000 Subject: [PATCH 07/18] [UPD] README.rst --- sale_order_invoice_amount/README.rst | 10 +++++----- .../static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sale_order_invoice_amount/README.rst b/sale_order_invoice_amount/README.rst index f9aaa48497f..ecc941d7ba1 100644 --- a/sale_order_invoice_amount/README.rst +++ b/sale_order_invoice_amount/README.rst @@ -14,13 +14,13 @@ Sale Order Invoice Amount :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/sale-workflow/tree/15.0/sale_order_invoice_amount + :target: https://github.com/OCA/sale-workflow/tree/16.0/sale_order_invoice_amount :alt: OCA/sale-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/sale-workflow-15-0/sale-workflow-15-0-sale_order_invoice_amount + :target: https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_order_invoice_amount :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/167/15.0 + :target: https://runbot.odoo-community.org/runbot/167/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -41,7 +41,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. @@ -72,6 +72,6 @@ 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. -This module is part of the `OCA/sale-workflow `_ project on GitHub. +This module is part of the `OCA/sale-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_invoice_amount/static/description/index.html b/sale_order_invoice_amount/static/description/index.html index e09f8f041be..525342a8ad7 100644 --- a/sale_order_invoice_amount/static/description/index.html +++ b/sale_order_invoice_amount/static/description/index.html @@ -367,7 +367,7 @@

    Sale Order Invoice Amount

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: LGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

    +

    Beta License: LGPL-3 OCA/sale-workflow Translate me on Weblate Try me on Runbot

    The purpose of this module is to add two fields in the sale order model:

    • invoiced_amount: total invoiced amount.
    • @@ -390,7 +390,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.

      @@ -415,7 +415,7 @@

      Maintainers

      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.

      -

      This module is part of the OCA/sale-workflow project on GitHub.

      +

      This module is part of the OCA/sale-workflow project on GitHub.

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      From e01576a344110bf90665f595e276f83a544e639c Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 5 Jun 2023 19:08:30 +0000 Subject: [PATCH 08/18] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: sale-workflow-16.0/sale-workflow-16.0-sale_order_invoice_amount Translate-URL: https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_order_invoice_amount/ --- sale_order_invoice_amount/i18n/es.po | 1 + 1 file changed, 1 insertion(+) diff --git a/sale_order_invoice_amount/i18n/es.po b/sale_order_invoice_amount/i18n/es.po index ad387e0d768..3558c1f4522 100644 --- a/sale_order_invoice_amount/i18n/es.po +++ b/sale_order_invoice_amount/i18n/es.po @@ -8,6 +8,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" From 99b3e0169bf8fe173c66982d27d6aabfa13e99c9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 16:28:27 +0000 Subject: [PATCH 09/18] [UPD] README.rst --- sale_order_invoice_amount/README.rst | 15 ++++---- .../static/description/index.html | 34 ++++++++++--------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/sale_order_invoice_amount/README.rst b/sale_order_invoice_amount/README.rst index ecc941d7ba1..48cb89f1fb6 100644 --- a/sale_order_invoice_amount/README.rst +++ b/sale_order_invoice_amount/README.rst @@ -2,10 +2,13 @@ Sale Order Invoice Amount ========================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:8d74084a69946712a920d793b786352721864c5a43464e1c7ca0dfe9ec799b96 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Sale Order Invoice Amount .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/sale-workflow-16-0/sale-workflow-16-0-sale_order_invoice_amount :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/167/16.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| The purpose of this module is to add two fields in the sale order model: @@ -40,7 +43,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 +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/sale_order_invoice_amount/static/description/index.html b/sale_order_invoice_amount/static/description/index.html index 525342a8ad7..aa740951a90 100644 --- a/sale_order_invoice_amount/static/description/index.html +++ b/sale_order_invoice_amount/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sale Order Invoice Amount