From f9f6b24b35c119f4a5ba36d260c3a920a4d8397e Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Mon, 28 Jan 2019 18:29:50 +0100 Subject: [PATCH 01/26] [11.0][add][purchase_force_invoiced] --- purchase_force_invoiced/README.rst | 95 ++++ purchase_force_invoiced/__init__.py | 1 + purchase_force_invoiced/__manifest__.py | 20 + purchase_force_invoiced/model/__init__.py | 2 + .../model/account_invoice.py | 19 + .../model/purchase_order.py | 26 ++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 13 + purchase_force_invoiced/readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 420 ++++++++++++++++++ purchase_force_invoiced/tests/__init__.py | 1 + .../tests/test_purchase_force_invoiced.py | 117 +++++ .../view/purchase_view.xml | 16 + 14 files changed, 737 insertions(+) create mode 100644 purchase_force_invoiced/README.rst create mode 100644 purchase_force_invoiced/__init__.py create mode 100644 purchase_force_invoiced/__manifest__.py create mode 100644 purchase_force_invoiced/model/__init__.py create mode 100644 purchase_force_invoiced/model/account_invoice.py create mode 100644 purchase_force_invoiced/model/purchase_order.py create mode 100644 purchase_force_invoiced/readme/CONTRIBUTORS.rst create mode 100644 purchase_force_invoiced/readme/DESCRIPTION.rst create mode 100644 purchase_force_invoiced/readme/USAGE.rst create mode 100644 purchase_force_invoiced/static/description/icon.png create mode 100644 purchase_force_invoiced/static/description/index.html create mode 100644 purchase_force_invoiced/tests/__init__.py create mode 100644 purchase_force_invoiced/tests/test_purchase_force_invoiced.py create mode 100644 purchase_force_invoiced/view/purchase_view.xml diff --git a/purchase_force_invoiced/README.rst b/purchase_force_invoiced/README.rst new file mode 100644 index 00000000000..b21c7f9e629 --- /dev/null +++ b/purchase_force_invoiced/README.rst @@ -0,0 +1,95 @@ +======================= +Purchase Force Invoiced +======================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/11.0/purchase_force_invoiced + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-11-0/purchase-workflow-11-0-purchase_force_invoiced + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/142/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the possibility for users to force the invoice status of the +purchase orders to 'No Bill to Receive', even when not all the +quantities ordered or delivered have been invoiced. + +This feature useful in the following scenario: + +* The supplier disputes the quantities to be billed for, after the + products have been delivered to her/him, and you agree to reduce the + quantity to invoice (without expecting a refund). + +* When migrating from a previous Odoo version, in some cases there is less + quantity billed to what was delivered, and you don't want these old purchase + orders to appear in your 'Waiting Bills' list. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +#. Create a purchase order and confirm it. +#. Receive the products/services. +#. Create an vendor bill and reduce the invoiced quantity. The purchase order + invoicing status is 'Waiting Bills'. +#. Lock the Purchase Order, to change the status of it to 'Done'. +#. Check the field 'Force Invoiced'. Now the quantities of the PO + +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 +~~~~~~~ + +* Eficent + +Contributors +~~~~~~~~~~~~ + +* Jordi Ballester + +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/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_force_invoiced/__init__.py b/purchase_force_invoiced/__init__.py new file mode 100644 index 00000000000..9186ee3ad24 --- /dev/null +++ b/purchase_force_invoiced/__init__.py @@ -0,0 +1 @@ +from . import model diff --git a/purchase_force_invoiced/__manifest__.py b/purchase_force_invoiced/__manifest__.py new file mode 100644 index 00000000000..54f21123e81 --- /dev/null +++ b/purchase_force_invoiced/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 Aleph Objects, Inc. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Purchase Force Invoiced', + 'summary': 'Allows to force the billing status of the purchase order to ' + 'Invoiced', + 'version': '11.0.1.0.0', + "author": "Eficent," + "Odoo Community Association (OCA)", + 'category': 'Purchase Management', + 'license': 'AGPL-3', + 'website': "https://github.com/OCA/purchase-workflow", + 'depends': ['purchase'], + 'data': [ + 'view/purchase_view.xml' + ], + 'installable': True, +} diff --git a/purchase_force_invoiced/model/__init__.py b/purchase_force_invoiced/model/__init__.py new file mode 100644 index 00000000000..ceef3d1ff41 --- /dev/null +++ b/purchase_force_invoiced/model/__init__.py @@ -0,0 +1,2 @@ +from . import purchase_order +from . import account_invoice diff --git a/purchase_force_invoiced/model/account_invoice.py b/purchase_force_invoiced/model/account_invoice.py new file mode 100644 index 00000000000..8aa88742320 --- /dev/null +++ b/purchase_force_invoiced/model/account_invoice.py @@ -0,0 +1,19 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 Aleph Objects, Inc. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import models + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + def _prepare_invoice_line_from_po_line(self, line): + purchase_order_line_model = self.env['purchase.order.line'] + res = super(AccountInvoice, self)._prepare_invoice_line_from_po_line( + line) + if res.get('purchase_line_id', False): + pol = purchase_order_line_model.browse(res['purchase_line_id']) + if pol.order_id.force_invoiced: + res['quantity'] = 0.0 + return res diff --git a/purchase_force_invoiced/model/purchase_order.py b/purchase_force_invoiced/model/purchase_order.py new file mode 100644 index 00000000000..d12c070f4b6 --- /dev/null +++ b/purchase_force_invoiced/model/purchase_order.py @@ -0,0 +1,26 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 Aleph Objects, Inc. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + force_invoiced = fields.Boolean( + string='Force invoiced', + help='When you set this field, the purchase order will be ' + 'considered as fully billed, even when there may be ordered ' + 'or delivered quantities pending to bill.', + readonly=True, + states={'done': [('readonly', False)]}, + copy=False, + ) + + @api.depends('force_invoiced') + def _get_invoiced(self): + super(PurchaseOrder, self)._get_invoiced() + for order in self.filtered(lambda po: po.force_invoiced and + po.invoice_status == 'to invoice'): + order.invoice_status = 'invoiced' diff --git a/purchase_force_invoiced/readme/CONTRIBUTORS.rst b/purchase_force_invoiced/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..a849220d15e --- /dev/null +++ b/purchase_force_invoiced/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Jordi Ballester \ No newline at end of file diff --git a/purchase_force_invoiced/readme/DESCRIPTION.rst b/purchase_force_invoiced/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..e1f0efb23b3 --- /dev/null +++ b/purchase_force_invoiced/readme/DESCRIPTION.rst @@ -0,0 +1,13 @@ +This module adds the possibility for users to force the invoice status of the +purchase orders to 'No Bill to Receive', even when not all the +quantities ordered or delivered have been invoiced. + +This feature useful in the following scenario: + +* The supplier disputes the quantities to be billed for, after the + products have been delivered to her/him, and you agree to reduce the + quantity to invoice (without expecting a refund). + +* When migrating from a previous Odoo version, in some cases there is less + quantity billed to what was delivered, and you don't want these old purchase + orders to appear in your 'Waiting Bills' list. diff --git a/purchase_force_invoiced/readme/USAGE.rst b/purchase_force_invoiced/readme/USAGE.rst new file mode 100644 index 00000000000..711da70d28b --- /dev/null +++ b/purchase_force_invoiced/readme/USAGE.rst @@ -0,0 +1,6 @@ +#. Create a purchase order and confirm it. +#. Receive the products/services. +#. Create an vendor bill and reduce the invoiced quantity. The purchase order + invoicing status is 'Waiting Bills'. +#. Lock the Purchase Order, to change the status of it to 'Done'. +#. Check the field 'Force Invoiced'. Now the quantities of the PO \ No newline at end of file diff --git a/purchase_force_invoiced/static/description/icon.png b/purchase_force_invoiced/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/purchase_force_invoiced/static/description/index.html b/purchase_force_invoiced/static/description/index.html new file mode 100644 index 00000000000..a43d6523f59 --- /dev/null +++ b/purchase_force_invoiced/static/description/index.html @@ -0,0 +1,420 @@ + + + + + + +Purchase Force Invoiced + + + +
+

Purchase Force Invoiced

+ + +

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

+

This module adds the possibility for users to force the invoice status of the +purchase orders to ‘No Bill to Receive’, even when not all the +quantities ordered or delivered have been invoiced.

+

This feature useful in the following scenario:

+
    +
  • The supplier disputes the quantities to be billed for, after the +products have been delivered to her/him, and you agree to reduce the +quantity to invoice (without expecting a refund).
  • +
  • When migrating from a previous Odoo version, in some cases there is less +quantity billed to what was delivered, and you don’t want these old purchase +orders to appear in your ‘Waiting Bills’ list.
  • +
+

Table of contents

+ +
+

Usage

+
    +
  1. Create a purchase order and confirm it.
  2. +
  3. Receive the products/services.
  4. +
  5. Create an vendor bill and reduce the invoiced quantity. The purchase order +invoicing status is ‘Waiting Bills’.
  6. +
  7. Lock the Purchase Order, to change the status of it to ‘Done’.
  8. +
  9. Check the field ‘Force Invoiced’. Now the quantities of the PO
  10. +
+
+
+

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

+
    +
  • Eficent
  • +
+
+
+

Contributors

+ +
+
+

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/purchase-workflow project on GitHub.

+

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

+
+
+
+ + diff --git a/purchase_force_invoiced/tests/__init__.py b/purchase_force_invoiced/tests/__init__.py new file mode 100644 index 00000000000..fd7bf0b4396 --- /dev/null +++ b/purchase_force_invoiced/tests/__init__.py @@ -0,0 +1 @@ +from . import test_purchase_force_invoiced diff --git a/purchase_force_invoiced/tests/test_purchase_force_invoiced.py b/purchase_force_invoiced/tests/test_purchase_force_invoiced.py new file mode 100644 index 00000000000..a15e11e1a84 --- /dev/null +++ b/purchase_force_invoiced/tests/test_purchase_force_invoiced.py @@ -0,0 +1,117 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 Aleph Objects, Inc. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields +from odoo.tests.common import TransactionCase + + +class TestPurchaseForceInvoiced(TransactionCase): + + def setUp(self): + super(TestPurchaseForceInvoiced, self).setUp() + self.purchase_order_model = self.env['purchase.order'] + self.purchase_order_line_model = self.env['purchase.order.line'] + self.account_invoice_model = self.env['account.invoice'] + self.account_invoice_line = self.env['account.invoice.line'] + + # Data + product_ctg = self._create_product_category() + self.service_1 = self._create_product('test_product1', + product_ctg) + self.service_2 = self._create_product('test_product2', + product_ctg) + self.customer = self._create_supplier('Test Supplier') + + def _create_supplier(self, name): + """Create a Partner.""" + return self.env['res.partner'].create({ + 'name': name, + 'email': 'example@yourcompany.com', + 'supplier': True, + 'phone': 123456, + }) + + def _create_product_category(self): + product_ctg = self.env['product.category'].create({ + 'name': 'test_product_ctg', + }) + return product_ctg + + def _create_product(self, name, product_ctg): + product = self.env['product.product'].create({ + 'name': name, + 'categ_id': product_ctg.id, + 'type': 'service', + 'purchase_method': 'receive', + }) + return product + + def _create_invoice_from_purchase(self, purchase): + + invoice = self.account_invoice_model.create({ + 'partner_id': purchase.partner_id.id, + 'purchase_id': purchase.id, + 'account_id': purchase.partner_id.property_account_payable_id.id, + 'type': 'in_invoice', + }) + invoice.purchase_order_change() + + return invoice + + def test_purchase_order(self): + po = self.purchase_order_model.create({ + 'partner_id': self.customer.id, + }) + pol1 = self.purchase_order_line_model.create({ + 'name': self.service_1.name, + 'product_id': self.service_1.id, + 'product_qty': 1, + 'product_uom': self.service_1.uom_po_id.id, + 'price_unit': 500.0, + 'date_planned': fields.Date.today(), + 'order_id': po.id + }) + pol2 = self.purchase_order_line_model.create({ + 'name': self.service_2.name, + 'product_id': self.service_2.id, + 'product_qty': 2, + 'product_uom': self.service_2.uom_po_id.id, + 'price_unit': 500.0, + 'date_planned': fields.Date.today(), + 'order_id': po.id + }) + + # confirm quotation + po.button_confirm() + # update quantities delivered + pol1.qty_received = 1 + pol2.qty_received = 2 + + self.assertEquals(po.invoice_status, 'to invoice', + "The invoice status should be To Invoice") + + self._create_invoice_from_purchase(po) + self.assertEquals(po.invoice_status, 'invoiced', + "The invoice status should be Invoiced") + + # Reduce the invoiced qty + for line in pol2.invoice_lines: + line.quantity = 1 + self.assertEquals(po.invoice_status, 'to invoice', + "The invoice status should be To Invoice") + # We set the force invoiced. + po.button_done() + po.force_invoiced = True + self.assertEquals(po.invoice_status, 'invoiced', + "The invoice status should be Invoiced") + invoice = self._create_invoice_from_purchase(po) + invoice_qty = sum(invoice.mapped('invoice_line_ids.quantity')) + self.assertEqual(invoice_qty, 0.0) + # We remove the force invoiced. + po.force_invoiced = False + self.assertEquals(po.invoice_status, 'to invoice', + "The invoice status should be To Invoice") + invoice = self._create_invoice_from_purchase(po) + invoice_qty = sum(invoice.mapped('invoice_line_ids.quantity')) + self.assertEqual(invoice_qty, 1.0) diff --git a/purchase_force_invoiced/view/purchase_view.xml b/purchase_force_invoiced/view/purchase_view.xml new file mode 100644 index 00000000000..28e132f0263 --- /dev/null +++ b/purchase_force_invoiced/view/purchase_view.xml @@ -0,0 +1,16 @@ + + + + + purchase.order.form + purchase.order + + + + + + + + + From 6f0ee7948b329b7198cff2d1012ad4c713375a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Villarreal=20Ortega?= <32061121+hveficent@users.noreply.github.com> Date: Fri, 10 May 2019 11:37:05 +0200 Subject: [PATCH 02/26] Apply suggestions from code review Co-Authored-By: Eric @ Elico Corp --- purchase_force_invoiced/README.rst | 10 +++++----- purchase_force_invoiced/__manifest__.py | 2 +- purchase_force_invoiced/readme/DESCRIPTION.rst | 4 ++-- purchase_force_invoiced/readme/USAGE.rst | 6 +++--- purchase_force_invoiced/static/description/index.html | 10 +++++----- purchase_force_invoiced/view/purchase_view.xml | 3 +++ 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/purchase_force_invoiced/README.rst b/purchase_force_invoiced/README.rst index b21c7f9e629..3e355150fde 100644 --- a/purchase_force_invoiced/README.rst +++ b/purchase_force_invoiced/README.rst @@ -27,9 +27,9 @@ Purchase Force Invoiced This module adds the possibility for users to force the invoice status of the purchase orders to 'No Bill to Receive', even when not all the -quantities ordered or delivered have been invoiced. +quantities, ordered or delivered, have been invoiced. -This feature useful in the following scenario: +This feature is useful in the following scenario: * The supplier disputes the quantities to be billed for, after the products have been delivered to her/him, and you agree to reduce the @@ -49,10 +49,10 @@ Usage #. Create a purchase order and confirm it. #. Receive the products/services. -#. Create an vendor bill and reduce the invoiced quantity. The purchase order +#. Create a vendor bill and reduce the invoiced quantity. The purchase order invoicing status is 'Waiting Bills'. -#. Lock the Purchase Order, to change the status of it to 'Done'. -#. Check the field 'Force Invoiced'. Now the quantities of the PO +#. Lock the Purchase Order and change its status to 'Done'. +#. Check the field 'Force Invoiced'. Bug Tracker =========== diff --git a/purchase_force_invoiced/__manifest__.py b/purchase_force_invoiced/__manifest__.py index 54f21123e81..5973e411c5a 100644 --- a/purchase_force_invoiced/__manifest__.py +++ b/purchase_force_invoiced/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Purchase Force Invoiced', 'summary': 'Allows to force the billing status of the purchase order to ' - 'Invoiced', + '"Invoiced"', 'version': '11.0.1.0.0', "author": "Eficent," "Odoo Community Association (OCA)", diff --git a/purchase_force_invoiced/readme/DESCRIPTION.rst b/purchase_force_invoiced/readme/DESCRIPTION.rst index e1f0efb23b3..d855cbe5833 100644 --- a/purchase_force_invoiced/readme/DESCRIPTION.rst +++ b/purchase_force_invoiced/readme/DESCRIPTION.rst @@ -1,8 +1,8 @@ This module adds the possibility for users to force the invoice status of the purchase orders to 'No Bill to Receive', even when not all the -quantities ordered or delivered have been invoiced. +quantities, ordered or delivered, have been invoiced. -This feature useful in the following scenario: +This feature is useful in the following scenario: * The supplier disputes the quantities to be billed for, after the products have been delivered to her/him, and you agree to reduce the diff --git a/purchase_force_invoiced/readme/USAGE.rst b/purchase_force_invoiced/readme/USAGE.rst index 711da70d28b..f4991e40a35 100644 --- a/purchase_force_invoiced/readme/USAGE.rst +++ b/purchase_force_invoiced/readme/USAGE.rst @@ -1,6 +1,6 @@ #. Create a purchase order and confirm it. #. Receive the products/services. -#. Create an vendor bill and reduce the invoiced quantity. The purchase order +#. Create a vendor bill and reduce the invoiced quantity. The purchase order invoicing status is 'Waiting Bills'. -#. Lock the Purchase Order, to change the status of it to 'Done'. -#. Check the field 'Force Invoiced'. Now the quantities of the PO \ No newline at end of file +#. Lock the Purchase Order and change its status to 'Done'. +#. Check the field 'Force Invoiced'. diff --git a/purchase_force_invoiced/static/description/index.html b/purchase_force_invoiced/static/description/index.html index a43d6523f59..0ae9167a760 100644 --- a/purchase_force_invoiced/static/description/index.html +++ b/purchase_force_invoiced/static/description/index.html @@ -348,8 +348,8 @@

Purchase Force Invoiced

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

This module adds the possibility for users to force the invoice status of the purchase orders to ‘No Bill to Receive’, even when not all the -quantities ordered or delivered have been invoiced.

-

This feature useful in the following scenario:

+quantities, ordered or delivered, have been invoiced.

+

This feature is useful in the following scenario:

  • The supplier disputes the quantities to be billed for, after the products have been delivered to her/him, and you agree to reduce the @@ -376,10 +376,10 @@

    Usage

    1. Create a purchase order and confirm it.
    2. Receive the products/services.
    3. -
    4. Create an vendor bill and reduce the invoiced quantity. The purchase order +
    5. Create a vendor bill and reduce the invoiced quantity. The purchase order invoicing status is ‘Waiting Bills’.
    6. -
    7. Lock the Purchase Order, to change the status of it to ‘Done’.
    8. -
    9. Check the field ‘Force Invoiced’. Now the quantities of the PO
    10. +
    11. Lock the Purchase Order and change its status to ‘Done’.
    12. +
    13. Check the field ‘Force Invoiced’.
    diff --git a/purchase_force_invoiced/view/purchase_view.xml b/purchase_force_invoiced/view/purchase_view.xml index 28e132f0263..6597f89086c 100644 --- a/purchase_force_invoiced/view/purchase_view.xml +++ b/purchase_force_invoiced/view/purchase_view.xml @@ -1,4 +1,7 @@ + From b273b05a32c164948ca516c3091fed87b85a434b Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 3 Jul 2019 20:54:59 +0000 Subject: [PATCH 03/26] [UPD] Update purchase_force_invoiced.pot --- .../i18n/purchase_force_invoiced.pot | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 purchase_force_invoiced/i18n/purchase_force_invoiced.pot diff --git a/purchase_force_invoiced/i18n/purchase_force_invoiced.pot b/purchase_force_invoiced/i18n/purchase_force_invoiced.pot new file mode 100644 index 00000000000..2b67f713c64 --- /dev/null +++ b/purchase_force_invoiced/i18n/purchase_force_invoiced.pot @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_force_invoiced +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.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: purchase_force_invoiced +#: model:ir.model.fields,field_description:purchase_force_invoiced.field_purchase_order_force_invoiced +msgid "Force invoiced" +msgstr "" + +#. module: purchase_force_invoiced +#: model:ir.model,name:purchase_force_invoiced.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: purchase_force_invoiced +#: model:ir.model,name:purchase_force_invoiced.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_force_invoiced +#: model:ir.model.fields,help:purchase_force_invoiced.field_purchase_order_force_invoiced +msgid "When you set this field, the purchase order will be considered as fully billed, even when there may be ordered or delivered quantities pending to bill." +msgstr "" + From abc80981681fafa2591105dc07caf0f85728dca2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Jul 2019 21:34:44 +0000 Subject: [PATCH 04/26] [UPD] README.rst --- .../static/description/index.html | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/purchase_force_invoiced/static/description/index.html b/purchase_force_invoiced/static/description/index.html index 0ae9167a760..aaf93fb59e0 100644 --- a/purchase_force_invoiced/static/description/index.html +++ b/purchase_force_invoiced/static/description/index.html @@ -3,13 +3,13 @@ - + Purchase Force Invoiced