From 2e854b88b484cbd88de13b5853676fb002727f0d Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 11 Jul 2019 15:03:22 +0200 Subject: [PATCH 1/3] [ADD] module from 8.0 serie --- pos_invoicing/README.rst | 93 ++++++++++++++++++ pos_invoicing/__init__.py | 1 + pos_invoicing/__openerp__.py | 27 +++++ pos_invoicing/demo/res_groups.xml | 13 +++ pos_invoicing/i18n/fr.po | 50 ++++++++++ pos_invoicing/models/__init__.py | 5 + pos_invoicing/models/account_invoice.py | 39 ++++++++ pos_invoicing/models/account_voucher.py | 28 ++++++ pos_invoicing/models/pos_order.py | 18 ++++ pos_invoicing/models/pos_session.py | 70 +++++++++++++ pos_invoicing/readme/CONTRIBUTORS.rst | 2 + pos_invoicing/readme/DESCRIPTION.rst | 25 +++++ pos_invoicing/readme/ROADMAP.rst | 4 + .../description/account_invoice_form.png | Bin 0 -> 32949 bytes pos_invoicing/static/description/icon.png | Bin 0 -> 4113 bytes pos_invoicing/tests/__init__.py | 2 + pos_invoicing/tests/test_module.py | 92 +++++++++++++++++ pos_invoicing/views/view_account_invoice.xml | 21 ++++ 18 files changed, 490 insertions(+) create mode 100644 pos_invoicing/README.rst create mode 100644 pos_invoicing/__init__.py create mode 100644 pos_invoicing/__openerp__.py create mode 100644 pos_invoicing/demo/res_groups.xml create mode 100644 pos_invoicing/i18n/fr.po create mode 100644 pos_invoicing/models/__init__.py create mode 100644 pos_invoicing/models/account_invoice.py create mode 100644 pos_invoicing/models/account_voucher.py create mode 100644 pos_invoicing/models/pos_order.py create mode 100644 pos_invoicing/models/pos_session.py create mode 100644 pos_invoicing/readme/CONTRIBUTORS.rst create mode 100644 pos_invoicing/readme/DESCRIPTION.rst create mode 100644 pos_invoicing/readme/ROADMAP.rst create mode 100644 pos_invoicing/static/description/account_invoice_form.png create mode 100644 pos_invoicing/static/description/icon.png create mode 100644 pos_invoicing/tests/__init__.py create mode 100644 pos_invoicing/tests/test_module.py create mode 100644 pos_invoicing/views/view_account_invoice.xml diff --git a/pos_invoicing/README.rst b/pos_invoicing/README.rst new file mode 100644 index 00000000..c8b17163 --- /dev/null +++ b/pos_invoicing/README.rst @@ -0,0 +1,93 @@ +========================= +Point Of Sale - Invoicing +========================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-grap%2Fgrap--odoo--incubator-lightgray.png?logo=github + :target: https://github.com/grap/grap-odoo-incubator/tree/8.0/pos_invoicing + :alt: grap/grap-odoo-incubator + +|badge1| |badge2| |badge3| + +When you pay a pos_order, and then create an invoice : + +* you mustn't register a payment against the invoice as the payment + already exists in POS +* The POS payment will be reconciled with the invoice when the session + is closed +* You mustn't modify the invoice because the amount could become + different from the one registered in POS. Thus we have to + automatically validate the created invoice + +Functionality +------------- +About the invoices created from POS after payment: + +* automatically validate them and don't allow modifications +* Disable the Pay Button +* Don't display them in the Customer Payment tool + +Technically +----------- + +add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the +items that shouldn't be paid. + +.. figure:: https://raw.githubusercontent.com/grap/grap-odoo-incubator/8.0/pos_invoicing/static/description/account_invoice_form.png + +**Table of contents** + +.. contents:: + :local: + +Known issues / Roadmap +====================== + +* This module reconcile invoiced orders only if a customer has one invoice per + session. + +* It should be great to use the OCA module ``pos_autoreconcile``. + +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 +~~~~~~~ + +* GRAP + +Contributors +~~~~~~~~~~~~ + +* Sylvain LE GAL +* Julien WESTE + +Maintainers +~~~~~~~~~~~ + + + +This module is part of the `grap/grap-odoo-incubator `_ project on GitHub. + + +You are welcome to contribute. diff --git a/pos_invoicing/__init__.py b/pos_invoicing/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/pos_invoicing/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pos_invoicing/__openerp__.py b/pos_invoicing/__openerp__.py new file mode 100644 index 00000000..52e877d7 --- /dev/null +++ b/pos_invoicing/__openerp__.py @@ -0,0 +1,27 @@ +# coding: utf-8 +# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + 'name': 'Point Of Sale - Invoicing', + 'summary': 'Handle invoicing from Point Of Sale', + 'version': '8.0.3.0.0', + 'category': 'Point of Sale', + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'point_of_sale', + ], + 'data': [ + 'views/view_account_invoice.xml', + ], + 'demo': [ + 'demo/res_groups.xml', + ], + 'images': [ + 'static/description/account_invoice_form.png', + ], + 'installable': False, +} diff --git a/pos_invoicing/demo/res_groups.xml b/pos_invoicing/demo/res_groups.xml new file mode 100644 index 00000000..2c5779c4 --- /dev/null +++ b/pos_invoicing/demo/res_groups.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/pos_invoicing/i18n/fr.po b/pos_invoicing/i18n/fr.po new file mode 100644 index 00000000..675f5b7c --- /dev/null +++ b/pos_invoicing/i18n/fr.po @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_invoicing +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-08-02 13:14+0000\n" +"PO-Revision-Date: 2018-08-02 13:14+0000\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: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_account_voucher +msgid "Accounting Voucher" +msgstr "Justificatif comptable" + +#. module: pos_invoicing +#: help:account.invoice,pos_pending_payment:0 +msgid "Indicates an invoice for which there are pending payments in the Point of Sale. \n" +"The invoice will be marked as paid when the session will be closed." +msgstr "La case est cochée si il y a des paiements en cours dans le point de vente. \n" +"La facture sera marquée comme payée quand la session sera fermée." + +#. module: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_account_invoice +msgid "Invoice" +msgstr "Facture" + +#. module: pos_invoicing +#: view:account.invoice:pos_invoicing.view_account_invoice_form +#: field:account.invoice,pos_pending_payment:0 +msgid "PoS - Pending Payment" +msgstr "PdV - Paiement en cours" + +#. module: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_pos_order +msgid "Point of Sale" +msgstr "Point de Vente" + +#. module: pos_invoicing +#: code:addons/pos_invoicing/models/account_invoice.py:37 +#, python-format +msgid "You can not realize this action on the invoice(s) %s because there are pending payments in the Point of Sale." +msgstr "Vous ne pouvez pas réaliser cette action sur la / les facture(s) %s car il y a des paiements en cours dans le point de vente." diff --git a/pos_invoicing/models/__init__.py b/pos_invoicing/models/__init__.py new file mode 100644 index 00000000..e64dd454 --- /dev/null +++ b/pos_invoicing/models/__init__.py @@ -0,0 +1,5 @@ +# coding: utf-8 +from . import pos_order +from . import pos_session +from . import account_invoice +from . import account_voucher diff --git a/pos_invoicing/models/account_invoice.py b/pos_invoicing/models/account_invoice.py new file mode 100644 index 00000000..3c0d9285 --- /dev/null +++ b/pos_invoicing/models/account_invoice.py @@ -0,0 +1,39 @@ +# coding: utf-8 +# Copyright (C) 2018 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import _, api, fields, models +from openerp.exceptions import Warning as UserError + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + pos_pending_payment = fields.Boolean( + string='PoS - Pending Payment', readonly=True, + oldname='forbid_payment', + help="Indicates an invoice for which there are pending payments in the" + " Point of Sale. \nThe invoice will be marked as paid when the session" + " will be closed.") + + # Overload Section + @api.multi + def action_cancel(self): + self._check_pos_pending_payment() + return super(AccountInvoice, self).action_cancel() + + @api.multi + def invoice_pay_customer(self): + self._check_pos_pending_payment() + return super(AccountInvoice, self).invoice_pay_customer() + + @api.multi + def _check_pos_pending_payment(self): + invoices = self.filtered(lambda x: x.pos_pending_payment) + if invoices: + raise UserError(_( + "You can not realize this action on the invoice(s) %s because" + " there are pending payments in the Point of Sale.") % ( + ', '.join(invoices.mapped('name')))) diff --git a/pos_invoicing/models/account_voucher.py b/pos_invoicing/models/account_voucher.py new file mode 100644 index 00000000..216979d7 --- /dev/null +++ b/pos_invoicing/models/account_voucher.py @@ -0,0 +1,28 @@ +# coding: utf-8 +# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import api, models + + +class AccountVoucher(models.Model): + _inherit = 'account.voucher' + + # Override section + @api.multi + def recompute_voucher_lines( + self, partner_id, journal_id, price, currency_id, ttype, date): + + move_line_obj = self.env['account.move.line'] + + res = super(AccountVoucher, self).recompute_voucher_lines( + partner_id, journal_id, price, currency_id, ttype, date) + + for voucher_type in ['line_dr_ids', 'line_cr_ids']: + for voucher_line in res['value'][voucher_type]: + move_line = move_line_obj.browse(voucher_line['move_line_id']) + if move_line.invoice.pos_pending_payment: + res['value'][voucher_type].remove(voucher_line) + return res diff --git a/pos_invoicing/models/pos_order.py b/pos_invoicing/models/pos_order.py new file mode 100644 index 00000000..545f6b55 --- /dev/null +++ b/pos_invoicing/models/pos_order.py @@ -0,0 +1,18 @@ +# coding: utf-8 +# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import api, models + + +class PosOrder(models.Model): + _inherit = 'pos.order' + + @api.multi + def action_invoice(self): + res = super(PosOrder, self).action_invoice() + self.mapped('invoice_id').write({'pos_pending_payment': True}) + self.mapped('invoice_id').signal_workflow('invoice_open') + return res diff --git a/pos_invoicing/models/pos_session.py b/pos_invoicing/models/pos_session.py new file mode 100644 index 00000000..8f74195f --- /dev/null +++ b/pos_invoicing/models/pos_session.py @@ -0,0 +1,70 @@ +# coding: utf-8 +# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +from openerp import api, models + +_logger = logging.getLogger(__name__) + + +class PosSession(models.Model): + _inherit = 'pos.session' + + @api.multi + def wkf_action_close(self): + move_line_obj = self.env['account.move.line'] + + res = super(PosSession, self).wkf_action_close() + + # Get All Pos Order invoiced during the current Sessions + orders = self.order_ids.filtered(lambda x: x.invoice_id) + + for order in orders: + # Get accounting partner + partner = order.partner_id.parent_id or order.partner_id + + # Search all Sale Move Lines to reconcile in Sale Journal + sale_move_lines = [] + sale_total = 0 + + for move_line in order.invoice_id.move_id.line_id: + if (move_line.partner_id.id == partner.id and + move_line.account_id.type == 'receivable'): + sale_move_lines.append(move_line) + sale_total += move_line.debit - move_line.credit + + # Search all move Line to reconcile in Payment Journals + payment_move_lines = [] + payment_total = 0 + + statement_ids = order.mapped('statement_ids.statement_id').ids + move_lines = move_line_obj.search([ + ('statement_id', 'in', statement_ids), + ('partner_id', '=', partner.id), + ('reconcile_id', '=', False)]) + for move_line in move_lines: + if (move_line.account_id.type == 'receivable'): + payment_move_lines.append(move_line) + payment_total += move_line.debit - move_line.credit + + # Try to reconcile + if payment_total != - sale_total: + # Unable to reconcile + _logger.warning( + "Unable to reconcile the payment of %s #%d." + "(partner : %s)" % ( + order.name, order.id, partner.name)) + else: + # Reconcile move lines + move_lines = move_line_obj.browse( + [x.id for x in sale_move_lines] + + [x.id for x in payment_move_lines]) + move_lines.reconcile('manual', False, False, False) + # Unflag the invoice as 'PoS Pending Payment' + order.invoice_id.pos_pending_payment = False + + return res diff --git a/pos_invoicing/readme/CONTRIBUTORS.rst b/pos_invoicing/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..7754037b --- /dev/null +++ b/pos_invoicing/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Sylvain LE GAL +* Julien WESTE diff --git a/pos_invoicing/readme/DESCRIPTION.rst b/pos_invoicing/readme/DESCRIPTION.rst new file mode 100644 index 00000000..6875c12b --- /dev/null +++ b/pos_invoicing/readme/DESCRIPTION.rst @@ -0,0 +1,25 @@ +When you pay a pos_order, and then create an invoice : + +* you mustn't register a payment against the invoice as the payment + already exists in POS +* The POS payment will be reconciled with the invoice when the session + is closed +* You mustn't modify the invoice because the amount could become + different from the one registered in POS. Thus we have to + automatically validate the created invoice + +Functionality +------------- +About the invoices created from POS after payment: + +* automatically validate them and don't allow modifications +* Disable the Pay Button +* Don't display them in the Customer Payment tool + +Technically +----------- + +add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the +items that shouldn't be paid. + +.. figure:: ../static/description/account_invoice_form.png diff --git a/pos_invoicing/readme/ROADMAP.rst b/pos_invoicing/readme/ROADMAP.rst new file mode 100644 index 00000000..e09f972b --- /dev/null +++ b/pos_invoicing/readme/ROADMAP.rst @@ -0,0 +1,4 @@ +* This module reconcile invoiced orders only if a customer has one invoice per + session. + +* It should be great to use the OCA module ``pos_autoreconcile``. diff --git a/pos_invoicing/static/description/account_invoice_form.png b/pos_invoicing/static/description/account_invoice_form.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee85da2a9c1cc044967c45f2456d1847d12ae1e GIT binary patch literal 32949 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 literal 0 HcmV?d00001 diff --git a/pos_invoicing/static/description/icon.png b/pos_invoicing/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f52ccf0893dba796c5615289afe3f93c66a07ff GIT binary patch literal 4113 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 H>m2tVih0@a literal 0 HcmV?d00001 diff --git a/pos_invoicing/tests/__init__.py b/pos_invoicing/tests/__init__.py new file mode 100644 index 00000000..17b82062 --- /dev/null +++ b/pos_invoicing/tests/__init__.py @@ -0,0 +1,2 @@ +# coding: utf-8 +from . import test_module diff --git a/pos_invoicing/tests/test_module.py b/pos_invoicing/tests/test_module.py new file mode 100644 index 00000000..a7dc96ae --- /dev/null +++ b/pos_invoicing/tests/test_module.py @@ -0,0 +1,92 @@ +# coding: utf-8 +# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) +# @author: Julien WESTE +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import time +from openerp.tests.common import TransactionCase + + +class TestPosInvoicing(TransactionCase): + """Tests for POS Invoicing Module""" + + def setUp(self): + super(TestPosInvoicing, self).setUp() + + # Get Registry + self.session_obj = self.env['pos.session'] + self.order_obj = self.env['pos.order'] + + # Get Object + self.config = self.env.ref('point_of_sale.pos_config_main') + self.partner_A = self.env.ref('base.res_partner_2') + self.partner_B = self.env.ref('base.res_partner_12') + self.product = self.env.ref('product.product_product_48') + self.payment_journal = self.env.ref('account.cash_journal') + + # Test Section + def test_01_invoice_with_payment(self): + """Test the workflow: Draft Order -> Payment -> Invoice""" + # Opening Session + session = self.session_obj.create({'config_id': self.config.id}) + + # TODO FIXME, for the time being, reconciliation is not + # set if a customer make many invoices in the same pos session. + # self._create_order(session, self.partner_A, 100, True) + # self._create_order(session, self.partner_A, 200, True) + self._create_order(session, self.partner_B, 400, True) + + # The Invoice must be unpayable but in 'open' state + # Invoice created by order should be in open state + invoiced_orders = session.mapped('order_ids').filtered( + lambda x: x.state == 'invoiced') + invoices = invoiced_orders.mapped('invoice_id') + + self.assertEquals( + [x for x in invoices.mapped('state') if x != 'open'], [], + "All invoices generated from PoS should be in the 'open' state" + " when session is opened") + + self.assertEquals( + [x for x in invoices.mapped('pos_pending_payment') if not x], + [], + "All invoices generated from PoS should be marked as PoS Pending" + " Payment when session is opened") + + # Close Session + session.signal_workflow('close') + + self.assertEquals( + [x for x in invoices.mapped('state') if x != 'paid'], [], + "All invoices generated from PoS should be in the 'paid' state" + " when session is closed") + + self.assertEquals( + [x for x in invoices.mapped('pos_pending_payment') if x], [], + "Invoices generated from PoS should not be marked as PoS Pending" + " Payment when session is closed") + + # Private Section + def _create_order(self, session, partner, amount, with_invoice): + # create Pos Order + order = self.order_obj.create({ + 'session_id': session.id, + 'partner_id': partner.id, + 'lines': [[0, False, { + 'product_id': self.product.id, + 'qty': 1, + 'price_unit': amount, + }]], + }) + # Finish Payment + self.order_obj.add_payment(order.id, { + 'journal': self.payment_journal.id, + 'payment_date': time.strftime('%Y-%m-%d'), + 'amount': amount, + }) + # Mark as Paid + order.signal_workflow('paid') + if with_invoice: + order.action_invoice() + return order diff --git a/pos_invoicing/views/view_account_invoice.xml b/pos_invoicing/views/view_account_invoice.xml new file mode 100644 index 00000000..13a9fba2 --- /dev/null +++ b/pos_invoicing/views/view_account_invoice.xml @@ -0,0 +1,21 @@ + + + + + + account.invoice + + + + + + + + + + From aabc8174a4a9566617390d50ff73765df4180e26 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 11 Jul 2019 18:22:43 +0200 Subject: [PATCH 2/3] [MIG] pos_invoicing from 8.0 to 12.0 --- .../{__openerp__.py => __manifest__.py} | 15 +- pos_invoicing/demo/res_groups.xml | 13 -- pos_invoicing/i18n/fr.po | 38 +++-- pos_invoicing/i18n/pos_invoicing.pot | 56 +++++++ pos_invoicing/models/__init__.py | 3 +- pos_invoicing/models/account_invoice.py | 14 +- pos_invoicing/models/account_payment.py | 22 +++ pos_invoicing/models/account_voucher.py | 28 ---- pos_invoicing/models/pos_order.py | 13 +- pos_invoicing/models/pos_session.py | 59 +------ pos_invoicing/readme/DESCRIPTION.rst | 43 +++-- pos_invoicing/readme/ROADMAP.rst | 4 - .../description/account_invoice_form.png | Bin 32949 -> 38653 bytes pos_invoicing/static/description/icon.png | Bin 4113 -> 0 bytes pos_invoicing/tests/__init__.py | 1 - pos_invoicing/tests/test_module.py | 148 ++++++++++-------- pos_invoicing/views/view_account_invoice.xml | 9 +- 17 files changed, 235 insertions(+), 231 deletions(-) rename pos_invoicing/{__openerp__.py => __manifest__.py} (64%) delete mode 100644 pos_invoicing/demo/res_groups.xml create mode 100644 pos_invoicing/i18n/pos_invoicing.pot create mode 100644 pos_invoicing/models/account_payment.py delete mode 100644 pos_invoicing/models/account_voucher.py delete mode 100644 pos_invoicing/readme/ROADMAP.rst delete mode 100644 pos_invoicing/static/description/icon.png diff --git a/pos_invoicing/__openerp__.py b/pos_invoicing/__manifest__.py similarity index 64% rename from pos_invoicing/__openerp__.py rename to pos_invoicing/__manifest__.py index 52e877d7..ca80289e 100644 --- a/pos_invoicing/__openerp__.py +++ b/pos_invoicing/__manifest__.py @@ -1,4 +1,3 @@ -# coding: utf-8 # Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) # @author: Julien WESTE # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) @@ -6,10 +5,10 @@ { 'name': 'Point Of Sale - Invoicing', 'summary': 'Handle invoicing from Point Of Sale', - 'version': '8.0.3.0.0', + 'version': '12.0.3.0.0', 'category': 'Point of Sale', - 'author': 'GRAP', - 'website': 'http://www.grap.coop', + 'author': 'GRAP, Odoo Community Association (OCA)', + 'website': 'http://www.github.com/OCA/pos', 'license': 'AGPL-3', 'depends': [ 'point_of_sale', @@ -17,11 +16,5 @@ 'data': [ 'views/view_account_invoice.xml', ], - 'demo': [ - 'demo/res_groups.xml', - ], - 'images': [ - 'static/description/account_invoice_form.png', - ], - 'installable': False, + 'installable': True, } diff --git a/pos_invoicing/demo/res_groups.xml b/pos_invoicing/demo/res_groups.xml deleted file mode 100644 index 2c5779c4..00000000 --- a/pos_invoicing/demo/res_groups.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - diff --git a/pos_invoicing/i18n/fr.po b/pos_invoicing/i18n/fr.po index 675f5b7c..a79f6952 100644 --- a/pos_invoicing/i18n/fr.po +++ b/pos_invoicing/i18n/fr.po @@ -1,13 +1,13 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_invoicing +# * pos_invoicing # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-02 13:14+0000\n" -"PO-Revision-Date: 2018-08-02 13:14+0000\n" +"POT-Creation-Date: 2019-07-11 16:18+0000\n" +"PO-Revision-Date: 2019-07-11 16:18+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -16,12 +16,7 @@ msgstr "" "Plural-Forms: \n" #. module: pos_invoicing -#: model:ir.model,name:pos_invoicing.model_account_voucher -msgid "Accounting Voucher" -msgstr "Justificatif comptable" - -#. module: pos_invoicing -#: help:account.invoice,pos_pending_payment:0 +#: model:ir.model.fields,help:pos_invoicing.field_account_invoice__pos_pending_payment msgid "Indicates an invoice for which there are pending payments in the Point of Sale. \n" "The invoice will be marked as paid when the session will be closed." msgstr "La case est cochée si il y a des paiements en cours dans le point de vente. \n" @@ -33,18 +28,29 @@ msgid "Invoice" msgstr "Facture" #. module: pos_invoicing -#: view:account.invoice:pos_invoicing.view_account_invoice_form -#: field:account.invoice,pos_pending_payment:0 +#: model:ir.model,name:pos_invoicing.model_account_payment +msgid "Payments" +msgstr "Paiements" + +#. module: pos_invoicing +#: model:ir.model.fields,field_description:pos_invoicing.field_account_invoice__pos_pending_payment msgid "PoS - Pending Payment" msgstr "PdV - Paiement en cours" #. module: pos_invoicing -#: model:ir.model,name:pos_invoicing.model_pos_order -msgid "Point of Sale" -msgstr "Point de Vente" +#: model:ir.model,name:pos_invoicing.model_pos_session +msgid "Point of Sale Session" +msgstr "Session du point de vente" #. module: pos_invoicing -#: code:addons/pos_invoicing/models/account_invoice.py:37 +#: code:addons/pos_invoicing/models/account_invoice.py:36 +#: code:addons/pos_invoicing/models/account_invoice.py:38 #, python-format msgid "You can not realize this action on the invoice(s) %s because there are pending payments in the Point of Sale." msgstr "Vous ne pouvez pas réaliser cette action sur la / les facture(s) %s car il y a des paiements en cours dans le point de vente." + +#. module: pos_invoicing +#: code:addons/pos_invoicing/models/account_payment.py:17 +#, python-format +msgid "You can not realize this action on the payments(s) %s because there are pending payments in the Point of Sale." +msgstr "Vous ne pouvez pas réaliser cette action sur la / les paiement(s) %s car il y a des paiements en cours dans le point de vente." diff --git a/pos_invoicing/i18n/pos_invoicing.pot b/pos_invoicing/i18n/pos_invoicing.pot new file mode 100644 index 00000000..51cc170a --- /dev/null +++ b/pos_invoicing/i18n/pos_invoicing.pot @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_invoicing +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-11 16:17+0000\n" +"PO-Revision-Date: 2019-07-11 16:17+0000\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: pos_invoicing +#: model:ir.model.fields,help:pos_invoicing.field_account_invoice__pos_pending_payment +msgid "Indicates an invoice for which there are pending payments in the Point of Sale. \n" +"The invoice will be marked as paid when the session will be closed." +msgstr "" + +#. module: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_account_invoice +msgid "Invoice" +msgstr "" + +#. module: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_account_payment +msgid "Payments" +msgstr "" + +#. module: pos_invoicing +#: model:ir.model.fields,field_description:pos_invoicing.field_account_invoice__pos_pending_payment +msgid "PoS - Pending Payment" +msgstr "" + +#. module: pos_invoicing +#: model:ir.model,name:pos_invoicing.model_pos_session +msgid "Point of Sale Session" +msgstr "" + +#. module: pos_invoicing +#: code:addons/pos_invoicing/models/account_invoice.py:36 +#: code:addons/pos_invoicing/models/account_invoice.py:38 +#, python-format +msgid "You can not realize this action on the invoice(s) %s because there are pending payments in the Point of Sale." +msgstr "" + +#. module: pos_invoicing +#: code:addons/pos_invoicing/models/account_payment.py:17 +#, python-format +msgid "You can not realize this action on the payments(s) %s because there are pending payments in the Point of Sale." +msgstr "" + diff --git a/pos_invoicing/models/__init__.py b/pos_invoicing/models/__init__.py index e64dd454..10c66764 100644 --- a/pos_invoicing/models/__init__.py +++ b/pos_invoicing/models/__init__.py @@ -1,5 +1,4 @@ -# coding: utf-8 from . import pos_order from . import pos_session from . import account_invoice -from . import account_voucher +from . import account_payment diff --git a/pos_invoicing/models/account_invoice.py b/pos_invoicing/models/account_invoice.py index 3c0d9285..40da0a1b 100644 --- a/pos_invoicing/models/account_invoice.py +++ b/pos_invoicing/models/account_invoice.py @@ -1,11 +1,10 @@ -# coding: utf-8 # Copyright (C) 2018 - Today: GRAP (http://www.grap.coop) # @author: Julien WESTE # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import _, api, fields, models -from openerp.exceptions import Warning as UserError +from odoo import _, api, fields, models +from odoo.exceptions import Warning as UserError class AccountInvoice(models.Model): @@ -25,9 +24,12 @@ class AccountInvoice(models.Model): return super(AccountInvoice, self).action_cancel() @api.multi - def invoice_pay_customer(self): - self._check_pos_pending_payment() - return super(AccountInvoice, self).invoice_pay_customer() + def _get_outstanding_info_JSON(self): + self.ensure_one() + if self.pos_pending_payment: + return + else: + return super()._get_outstanding_info_JSON() @api.multi def _check_pos_pending_payment(self): diff --git a/pos_invoicing/models/account_payment.py b/pos_invoicing/models/account_payment.py new file mode 100644 index 00000000..c414fe02 --- /dev/null +++ b/pos_invoicing/models/account_payment.py @@ -0,0 +1,22 @@ +# Copyright (C) 2019 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import _, api, models +from odoo.exceptions import Warning as UserError + + +class AccountPayment(models.Model): + _inherit = 'account.payment' + + @api.multi + def post(self): + payments = self.filtered( + lambda x: any(x.mapped('invoice_ids.pos_pending_payment'))) + if payments: + raise UserError(_( + "You can not realize this action on the payments(s) %s because" + " there are pending payments in the Point of Sale.") % ( + ', '.join( + [x for x in payments.mapped('communication') if x]))) + return super().post() diff --git a/pos_invoicing/models/account_voucher.py b/pos_invoicing/models/account_voucher.py deleted file mode 100644 index 216979d7..00000000 --- a/pos_invoicing/models/account_voucher.py +++ /dev/null @@ -1,28 +0,0 @@ -# coding: utf-8 -# Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) -# @author: Julien WESTE -# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from openerp import api, models - - -class AccountVoucher(models.Model): - _inherit = 'account.voucher' - - # Override section - @api.multi - def recompute_voucher_lines( - self, partner_id, journal_id, price, currency_id, ttype, date): - - move_line_obj = self.env['account.move.line'] - - res = super(AccountVoucher, self).recompute_voucher_lines( - partner_id, journal_id, price, currency_id, ttype, date) - - for voucher_type in ['line_dr_ids', 'line_cr_ids']: - for voucher_line in res['value'][voucher_type]: - move_line = move_line_obj.browse(voucher_line['move_line_id']) - if move_line.invoice.pos_pending_payment: - res['value'][voucher_type].remove(voucher_line) - return res diff --git a/pos_invoicing/models/pos_order.py b/pos_invoicing/models/pos_order.py index 545f6b55..8d52330b 100644 --- a/pos_invoicing/models/pos_order.py +++ b/pos_invoicing/models/pos_order.py @@ -1,18 +1,17 @@ -# coding: utf-8 # Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) # @author: Julien WESTE # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import api, models +from odoo import models class PosOrder(models.Model): _inherit = 'pos.order' - @api.multi - def action_invoice(self): - res = super(PosOrder, self).action_invoice() - self.mapped('invoice_id').write({'pos_pending_payment': True}) - self.mapped('invoice_id').signal_workflow('invoice_open') + def _prepare_invoice(self): + res = super()._prepare_invoice() + res.update({ + 'pos_pending_payment': True, + }) return res diff --git a/pos_invoicing/models/pos_session.py b/pos_invoicing/models/pos_session.py index 8f74195f..3485181d 100644 --- a/pos_invoicing/models/pos_session.py +++ b/pos_invoicing/models/pos_session.py @@ -1,4 +1,3 @@ -# coding: utf-8 # Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) # @author: Julien WESTE # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) @@ -6,7 +5,7 @@ import logging -from openerp import api, models +from odoo import api, models _logger = logging.getLogger(__name__) @@ -15,56 +14,8 @@ class PosSession(models.Model): _inherit = 'pos.session' @api.multi - def wkf_action_close(self): - move_line_obj = self.env['account.move.line'] - - res = super(PosSession, self).wkf_action_close() - - # Get All Pos Order invoiced during the current Sessions - orders = self.order_ids.filtered(lambda x: x.invoice_id) - - for order in orders: - # Get accounting partner - partner = order.partner_id.parent_id or order.partner_id - - # Search all Sale Move Lines to reconcile in Sale Journal - sale_move_lines = [] - sale_total = 0 - - for move_line in order.invoice_id.move_id.line_id: - if (move_line.partner_id.id == partner.id and - move_line.account_id.type == 'receivable'): - sale_move_lines.append(move_line) - sale_total += move_line.debit - move_line.credit - - # Search all move Line to reconcile in Payment Journals - payment_move_lines = [] - payment_total = 0 - - statement_ids = order.mapped('statement_ids.statement_id').ids - move_lines = move_line_obj.search([ - ('statement_id', 'in', statement_ids), - ('partner_id', '=', partner.id), - ('reconcile_id', '=', False)]) - for move_line in move_lines: - if (move_line.account_id.type == 'receivable'): - payment_move_lines.append(move_line) - payment_total += move_line.debit - move_line.credit - - # Try to reconcile - if payment_total != - sale_total: - # Unable to reconcile - _logger.warning( - "Unable to reconcile the payment of %s #%d." - "(partner : %s)" % ( - order.name, order.id, partner.name)) - else: - # Reconcile move lines - move_lines = move_line_obj.browse( - [x.id for x in sale_move_lines] + - [x.id for x in payment_move_lines]) - move_lines.reconcile('manual', False, False, False) - # Unflag the invoice as 'PoS Pending Payment' - order.invoice_id.pos_pending_payment = False - + def action_pos_session_close(self): + res = super().action_pos_session_close() + orders = self.mapped('order_ids').filtered(lambda x: x.invoice_id) + orders.mapped('invoice_id').write({'pos_pending_payment': False}) return res diff --git a/pos_invoicing/readme/DESCRIPTION.rst b/pos_invoicing/readme/DESCRIPTION.rst index 6875c12b..fe8605cb 100644 --- a/pos_invoicing/readme/DESCRIPTION.rst +++ b/pos_invoicing/readme/DESCRIPTION.rst @@ -1,25 +1,38 @@ -When you pay a pos_order, and then create an invoice : +This module extend the Point of Sale Odoo module, regarding invoicing. -* you mustn't register a payment against the invoice as the payment - already exists in POS -* The POS payment will be reconciled with the invoice when the session - is closed -* You mustn't modify the invoice because the amount could become - different from the one registered in POS. Thus we have to - automatically validate the created invoice +This module prevent to make some mistakes in Odoo Point of Sale +regarding invoices generated via Point of Sale. -Functionality -------------- -About the invoices created from POS after payment: +Without this module +~~~~~~~~~~~~~~~~~~~ -* automatically validate them and don't allow modifications -* Disable the Pay Button -* Don't display them in the Customer Payment tool +When an invoice generated from Point of Sale is confirmed +it is in a 'open' state, until the session is closed, and the entries are +generated. At this step, invoice will be marked as 'paid' and the related +accounting moves will be reconcilied. +So, as long as the session is not closed, any user can: + +* cancel the invoice; +* register a payment; +* reconcile the invoice with an existing payment; + +All that action should be prohibited. + +With that module +~~~~~~~~~~~~~~~~ + +All those actions will not be possible anymore. + + +Note that the changes only impact the opened invoice coming from point of sale, +before the session is closed. Technically ----------- -add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the +* add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the items that shouldn't be paid. +This field is checked when the invoice is created from point of sale, +and is unchecked, when the session is closed. .. figure:: ../static/description/account_invoice_form.png diff --git a/pos_invoicing/readme/ROADMAP.rst b/pos_invoicing/readme/ROADMAP.rst deleted file mode 100644 index e09f972b..00000000 --- a/pos_invoicing/readme/ROADMAP.rst +++ /dev/null @@ -1,4 +0,0 @@ -* This module reconcile invoiced orders only if a customer has one invoice per - session. - -* It should be great to use the OCA module ``pos_autoreconcile``. diff --git a/pos_invoicing/static/description/account_invoice_form.png b/pos_invoicing/static/description/account_invoice_form.png index 1ee85da2a9c1cc044967c45f2456d1847d12ae1e..9bf2c6cf601171b0006593dc7622a398701befc5 100644 GIT binary patch literal 38653 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 literal 32949 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 diff --git a/pos_invoicing/static/description/icon.png b/pos_invoicing/static/description/icon.png deleted file mode 100644 index 7f52ccf0893dba796c5615289afe3f93c66a07ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4113 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 H>m2tVih0@a diff --git a/pos_invoicing/tests/__init__.py b/pos_invoicing/tests/__init__.py index 17b82062..d9b96c4f 100644 --- a/pos_invoicing/tests/__init__.py +++ b/pos_invoicing/tests/__init__.py @@ -1,2 +1 @@ -# coding: utf-8 from . import test_module diff --git a/pos_invoicing/tests/test_module.py b/pos_invoicing/tests/test_module.py index a7dc96ae..cb106689 100644 --- a/pos_invoicing/tests/test_module.py +++ b/pos_invoicing/tests/test_module.py @@ -1,92 +1,102 @@ -# coding: utf-8 # Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) # @author: Julien WESTE # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import time -from openerp.tests.common import TransactionCase +from odoo import fields +from odoo.tests.common import TransactionCase +from odoo.exceptions import Warning as UserError -class TestPosInvoicing(TransactionCase): - """Tests for POS Invoicing Module""" +class TestModule(TransactionCase): def setUp(self): - super(TestPosInvoicing, self).setUp() + super(TestModule, self).setUp() # Get Registry - self.session_obj = self.env['pos.session'] - self.order_obj = self.env['pos.order'] + self.PosOrder = self.env['pos.order'] + self.AccountPayment = self.env['account.payment'] # Get Object - self.config = self.env.ref('point_of_sale.pos_config_main') - self.partner_A = self.env.ref('base.res_partner_2') - self.partner_B = self.env.ref('base.res_partner_12') - self.product = self.env.ref('product.product_product_48') - self.payment_journal = self.env.ref('account.cash_journal') + self.pos_product = self.env.ref('point_of_sale.whiteboard_pen') + self.pricelist = self.env.ref('product.list0') + self.partner = self.env.ref('base.res_partner_12') - # Test Section - def test_01_invoice_with_payment(self): - """Test the workflow: Draft Order -> Payment -> Invoice""" - # Opening Session - session = self.session_obj.create({'config_id': self.config.id}) - - # TODO FIXME, for the time being, reconciliation is not - # set if a customer make many invoices in the same pos session. - # self._create_order(session, self.partner_A, 100, True) - # self._create_order(session, self.partner_A, 200, True) - self._create_order(session, self.partner_B, 400, True) + # Create a new pos config and open it + self.pos_config = self.env.ref('point_of_sale.pos_config_main').copy() + self.pos_config.open_session_cb() - # The Invoice must be unpayable but in 'open' state - # Invoice created by order should be in open state - invoiced_orders = session.mapped('order_ids').filtered( - lambda x: x.state == 'invoiced') - invoices = invoiced_orders.mapped('invoice_id') - - self.assertEquals( - [x for x in invoices.mapped('state') if x != 'open'], [], - "All invoices generated from PoS should be in the 'open' state" - " when session is opened") + # Test Section + def test_order_invoice(self): + order = self._create_order() - self.assertEquals( - [x for x in invoices.mapped('pos_pending_payment') if not x], - [], - "All invoices generated from PoS should be marked as PoS Pending" - " Payment when session is opened") + # Check if invoice is correctly set + self.assertEquals(order.invoice_id.pos_pending_payment, True) - # Close Session - session.signal_workflow('close') + # Try to register payment should fail on this invoice should fail + with self.assertRaises(UserError): + payment = self.register_payment(order.invoice_id) + payment.post() - self.assertEquals( - [x for x in invoices.mapped('state') if x != 'paid'], [], - "All invoices generated from PoS should be in the 'paid' state" - " when session is closed") + # Try to register a payment not linked to this invoice should be ok + payment = self.register_payment() + payment.post() - self.assertEquals( - [x for x in invoices.mapped('pos_pending_payment') if x], [], - "Invoices generated from PoS should not be marked as PoS Pending" - " Payment when session is closed") + # Once closed check if the invoice is correctly set + self.pos_config.current_session_id.action_pos_session_closing_control() + self.assertEquals(order.invoice_id.pos_pending_payment, False) # Private Section - def _create_order(self, session, partner, amount, with_invoice): - # create Pos Order - order = self.order_obj.create({ - 'session_id': session.id, - 'partner_id': partner.id, - 'lines': [[0, False, { - 'product_id': self.product.id, - 'qty': 1, - 'price_unit': amount, - }]], + def register_payment(self, invoice_id=False): + journal = self.pos_config.journal_ids[0] + return self.AccountPayment.create({ + 'invoice_ids': invoice_id and [(4, invoice_id.id, None)] or False, + 'payment_type': 'inbound', + 'partner_type': 'customer', + 'payment_date': fields.Datetime.now(), + 'partner_id': self.partner.id, + 'amount': 0.9, + 'journal_id': journal.id, + 'payment_method_id': journal.inbound_payment_method_ids[0].id, }) - # Finish Payment - self.order_obj.add_payment(order.id, { - 'journal': self.payment_journal.id, - 'payment_date': time.strftime('%Y-%m-%d'), - 'amount': amount, - }) - # Mark as Paid - order.signal_workflow('paid') - if with_invoice: - order.action_invoice() + + def _create_order(self): + # Create order + order_data = { + 'id': u'0006-001-0010', + 'to_invoice': True, + 'data': { + 'pricelist_id': self.pricelist.id, + 'user_id': 1, + 'name': 'Order 0006-001-0010', + 'partner_id': self.partner.id, + 'amount_paid': 0.9, + 'pos_session_id': self.pos_config.current_session_id.id, + 'lines': [[0, 0, { + 'product_id': self.pos_product.id, + 'price_unit': 0.9, + 'qty': 1, + 'price_subtotal': 0.9, + 'price_subtotal_incl': 0.9, + }]], + 'statement_ids': [[0, 0, { + 'journal_id': self.pos_config.journal_ids[0].id, + 'amount': 0.9, + 'name': fields.Datetime.now(), + 'account_id': + self.env.user.partner_id.property_account_receivable_id.id, + 'statement_id': + self.pos_config.current_session_id.statement_ids[0].id, + }]], + 'creation_date': u'2018-09-27 15:51:03', + 'amount_tax': 0, + 'fiscal_position_id': False, + 'uid': u'00001-001-0001', + 'amount_return': 0, + 'sequence_number': 1, + 'amount_total': 0.9, + }} + + result = self.PosOrder.create_from_ui([order_data]) + order = self.PosOrder.browse(result[0]) return order diff --git a/pos_invoicing/views/view_account_invoice.xml b/pos_invoicing/views/view_account_invoice.xml index 13a9fba2..2beabcbe 100644 --- a/pos_invoicing/views/view_account_invoice.xml +++ b/pos_invoicing/views/view_account_invoice.xml @@ -5,17 +5,16 @@ Copyright (C) 2013 - Today: GRAP (http://www.grap.coop) @author: Sylvain LE GAL (https://twitter.com/legalsylvain) License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). --> - + account.invoice - - + - + - + From daa10b383cdb853ce846c86d4e7b71c18e234d7e Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 11 Jul 2019 18:25:37 +0200 Subject: [PATCH 3/3] [DOC] update readme --- pos_invoicing/README.rst | 85 +++++++++++++++++----------- pos_invoicing/readme/DESCRIPTION.rst | 5 +- 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/pos_invoicing/README.rst b/pos_invoicing/README.rst index c8b17163..852113aa 100644 --- a/pos_invoicing/README.rst +++ b/pos_invoicing/README.rst @@ -13,58 +13,70 @@ Point Of Sale - Invoicing .. |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-grap%2Fgrap--odoo--incubator-lightgray.png?logo=github - :target: https://github.com/grap/grap-odoo-incubator/tree/8.0/pos_invoicing - :alt: grap/grap-odoo-incubator +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpos-lightgray.png?logo=github + :target: https://github.com/OCA/pos/tree/12.0/pos_invoicing + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-12-0/pos-12-0-pos_invoicing + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/184/12.0 + :alt: Try me on Runbot -|badge1| |badge2| |badge3| +|badge1| |badge2| |badge3| |badge4| |badge5| -When you pay a pos_order, and then create an invoice : +This module extend the Point of Sale Odoo module, regarding invoicing. -* you mustn't register a payment against the invoice as the payment - already exists in POS -* The POS payment will be reconciled with the invoice when the session - is closed -* You mustn't modify the invoice because the amount could become - different from the one registered in POS. Thus we have to - automatically validate the created invoice +This module prevent to make some mistakes in Odoo Point of Sale +regarding invoices generated via Point of Sale. -Functionality -------------- -About the invoices created from POS after payment: +Without this module +~~~~~~~~~~~~~~~~~~~ -* automatically validate them and don't allow modifications -* Disable the Pay Button -* Don't display them in the Customer Payment tool +When an invoice generated from Point of Sale is confirmed +it is in a 'open' state, until the session is closed, and the entries are +generated. At this step, invoice will be marked as 'paid' and the related +accounting moves will be reconcilied. +So, as long as the session is not closed, any user can: + +* cancel the invoice; +* register a payment; +* reconcile the invoice with an existing payment; + +All that action should be prohibited because the payment exists. + +With that module +~~~~~~~~~~~~~~~~ + +All those actions will not be possible anymore. + + +Note that the changes only impact the opened invoice coming from point of sale, +before the session is closed. Technically ----------- -add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the -items that shouldn't be paid. +* add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the + items that shouldn't be paid. + +This field is checked when the invoice is created from point of sale, +and is unchecked, when the session is closed. -.. figure:: https://raw.githubusercontent.com/grap/grap-odoo-incubator/8.0/pos_invoicing/static/description/account_invoice_form.png +.. figure:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_invoicing/static/description/account_invoice_form.png **Table of contents** .. contents:: :local: -Known issues / Roadmap -====================== - -* This module reconcile invoiced orders only if a customer has one invoice per - session. - -* It should be great to use the OCA module ``pos_autoreconcile``. - Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +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. @@ -85,9 +97,16 @@ Contributors Maintainers ~~~~~~~~~~~ +This module is maintained by the OCA. +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org -This module is part of the `grap/grap-odoo-incubator `_ project on GitHub. +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/pos `_ project on GitHub. -You are welcome to contribute. +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pos_invoicing/readme/DESCRIPTION.rst b/pos_invoicing/readme/DESCRIPTION.rst index fe8605cb..8c1500ba 100644 --- a/pos_invoicing/readme/DESCRIPTION.rst +++ b/pos_invoicing/readme/DESCRIPTION.rst @@ -16,7 +16,7 @@ So, as long as the session is not closed, any user can: * register a payment; * reconcile the invoice with an existing payment; -All that action should be prohibited. +All that action should be prohibited because the payment exists. With that module ~~~~~~~~~~~~~~~~ @@ -31,7 +31,8 @@ Technically ----------- * add a ``pos_pending_payment`` field on the ``account.invoice`` to mark the -items that shouldn't be paid. + items that shouldn't be paid. + This field is checked when the invoice is created from point of sale, and is unchecked, when the session is closed.