diff --git a/.gitignore b/.gitignore index c505b25c..bfd2a51d 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ var/ *.egg-info/ .installed.cfg *.egg +.idea # PyInstaller # Usually these files are written by a python script from a template diff --git a/account_cash_invoice/README.rst b/account_cash_invoice/README.rst new file mode 100644 index 00000000..6e02582a --- /dev/null +++ b/account_cash_invoice/README.rst @@ -0,0 +1,57 @@ +.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg + :alt: License: LGPL-3 + +=============== +PoS Pay invoice +=============== + +This modules allows to pay an existing Supplier Invoice / Customer Refund, or +to collect payment for an existing Customer Invoice, using the PoS +backend session. + + +Usage +===== + +#. Go to *Point of Sale / Dashboard* and create and/or open an existing + Session. +#. Press the button **Pay Invoice** to pay a Supplier Invoice or a Customer + Refund. You will need to select the expected Journal +#. Select **Collect Payment from Invoice** in to receive a payment of an + existing Customer Invoice or a Supplier Refund. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/repo/github-com-oca-pos-184 + + +Known issues / Roadmap +====================== + +* Cannot pay invoices in a different currency than that defined in the journal + associated to the payment method used to pay/collect payment. + + +Credits +======= + +Contributors +------------ + +* Enric Tobella + + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/account_cash_invoice/__init__.py b/account_cash_invoice/__init__.py new file mode 100644 index 00000000..d35b1e82 --- /dev/null +++ b/account_cash_invoice/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import models +from . import wizard diff --git a/account_cash_invoice/__manifest__.py b/account_cash_invoice/__manifest__.py new file mode 100644 index 00000000..11c980e3 --- /dev/null +++ b/account_cash_invoice/__manifest__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + 'name': 'Account cash invoice', + 'version': '10.0.1.0.0', + 'category': 'Account', + 'author': "Creu Blanca," + "Odoo Community Association (OCA)", + 'website': 'https://github.com/OCA/pos', + 'summary': 'Pay and receive invoices from bank statements', + "license": "LGPL-3", + 'depends': [ + "account", + ], + 'data': [ + "wizard/cash_invoice_out.xml", + "wizard/cash_invoice_in.xml", + ], +} diff --git a/account_cash_invoice/models/__init__.py b/account_cash_invoice/models/__init__.py new file mode 100644 index 00000000..ecac888f --- /dev/null +++ b/account_cash_invoice/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import account_bank_statement_line diff --git a/account_cash_invoice/models/account_bank_statement_line.py b/account_cash_invoice/models/account_bank_statement_line.py new file mode 100644 index 00000000..2dfd0b5b --- /dev/null +++ b/account_cash_invoice/models/account_bank_statement_line.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models + + +class AccountBankStatementLine(models.Model): + _inherit = 'account.bank.statement.line' + + invoice_id = fields.Many2one( + 'account.invoice', + string='Invoice', + readonly=True + ) + + @api.multi + def fast_counterpart_creation(self): + for st_line in self: + if not st_line.invoice_id: + super( + AccountBankStatementLine, st_line + ).fast_counterpart_creation() + else: + invoice = st_line.invoice_id + move_line = invoice.move_id.line_ids.filtered( + lambda r: r.account_id.id == invoice.account_id.id + ) + vals = { + 'name': st_line.name, + 'debit': st_line.amount < 0 and -st_line.amount or 0.0, + 'credit': st_line.amount > 0 and st_line.amount or 0.0, + 'move_line': move_line + } + st_line.process_reconciliation(counterpart_aml_dicts=[vals]) diff --git a/account_cash_invoice/static/description/icon.png b/account_cash_invoice/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/account_cash_invoice/static/description/icon.png differ diff --git a/account_cash_invoice/tests/__init__.py b/account_cash_invoice/tests/__init__.py new file mode 100644 index 00000000..510806cb --- /dev/null +++ b/account_cash_invoice/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import test_pay_invoice diff --git a/account_cash_invoice/tests/test_pay_invoice.py b/account_cash_invoice/tests/test_pay_invoice.py new file mode 100644 index 00000000..2b26ec44 --- /dev/null +++ b/account_cash_invoice/tests/test_pay_invoice.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo.tests import common + + +class TestSessionPayInvoice(common.TransactionCase): + def setUp(self): + super(TestSessionPayInvoice, self).setUp() + self.company = self.env.ref('base.main_company') + partner = self.env.ref('base.partner_demo') + self.invoice_out = self.env['account.invoice'].create({ + 'company_id': self.company.id, + 'partner_id': partner.id, + 'date_invoice': '2016-03-12', + 'type': 'out_invoice', + }) + account = self.env['account.account'].create({ + 'code': 'test_cash_pay_invoice', + 'company_id': self.company.id, + 'name': 'Test', + 'user_type_id': self.env.ref( + 'account.data_account_type_revenue').id + }) + self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_delivery_02').id, + 'invoice_id': self.invoice_out.id, + 'account_id': account.id, + 'name': 'Producto de prueba', + 'quantity': 1.0, + 'price_unit': 100.0, + }) + self.invoice_out._onchange_invoice_line_ids() + self.invoice_out.action_invoice_open() + self.invoice_out.number = '2999/99999' + self.invoice_in = self.env['account.invoice'].create({ + 'partner_id': partner.id, + 'company_id': self.company.id, + 'type': 'in_invoice', + 'date_invoice': '2016-03-12', + }) + self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_delivery_02').id, + 'invoice_id': self.invoice_in.id, + 'name': 'Producto de prueba', + 'account_id': account.id, + 'quantity': 1.0, + 'price_unit': 100.0, + }) + self.invoice_in._onchange_invoice_line_ids() + self.invoice_in.action_invoice_open() + self.invoice_in.number = '2999/99999' + self.journal = self.env['account.journal'].search([ + ('company_id', '=', self.company.id), + ('type', '=', 'cash') + ], limit=1).ensure_one() + + def test_bank_statement(self): + statement = self.env['account.bank.statement'].create({ + 'name': 'Statment', + 'journal_id': self.journal.id + }) + in_invoice = self.env['cash.invoice.in'].with_context( + active_ids=statement.ids, active_model='account.bank.statement' + ).create({ + 'invoice_id': self.invoice_in.id, + 'amount': 100.0 + }) + in_invoice.run() + out_invoice = self.env['cash.invoice.out'].with_context( + active_ids=statement.ids, active_model='account.bank.statement' + ).create({ + 'invoice_id': self.invoice_out.id, + 'amount': 100.0 + }) + out_invoice.run() + statement.balance_end_real = statement.balance_start + statement.check_confirm_bank() + self.assertEqual(self.invoice_out.residual, 0.) + self.assertEqual(self.invoice_in.residual, 0.) diff --git a/account_cash_invoice/wizard/__init__.py b/account_cash_invoice/wizard/__init__.py new file mode 100644 index 00000000..030f06a1 --- /dev/null +++ b/account_cash_invoice/wizard/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import cash_invoice_in +from . import cash_invoice_out diff --git a/account_cash_invoice/wizard/cash_invoice_in.py b/account_cash_invoice/wizard/cash_invoice_in.py new file mode 100644 index 00000000..2a4f11da --- /dev/null +++ b/account_cash_invoice/wizard/cash_invoice_in.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models + + +class CashInvoiceIn(models.TransientModel): + _name = 'cash.invoice.in' + _inherit = 'cash.box.out' + + def _default_value(self, default_function): + active_model = self.env.context.get('active_model', False) + if active_model: + active_ids = self.env.context.get('active_ids', False) + return default_function(active_model, active_ids) + return None + + def _default_company(self): + return self._default_value(self.default_company) + + def _default_currency(self): + return self._default_value(self.default_currency) + + def _default_journals(self): + return self._default_value(self.default_journals) + + def _default_journal(self): + journals = self._default_journals() + if journals and len(journals.ids) > 0: + return self.env['account.journal'].browse( + journals.ids[0] + ).ensure_one() + + def _default_journal_count(self): + return len(self._default_journals().ids) + + invoice_id = fields.Many2one( + 'account.invoice', + string='Invoice', + required=True + ) + name = fields.Char( + related='invoice_id.number' + ) + company_id = fields.Many2one( + 'res.company', + default=_default_company, + required=True, + readonly=True + ) + currency_id = fields.Many2one( + 'res.currency', + default=_default_currency, + required=True, + readonly=True + ) + journal_ids = fields.Many2many( + 'account.journal', + default=_default_journals, + required=True, + readonly=True + ) + journal_id = fields.Many2one( + 'account.journal', + required=True, + default=_default_journal + ) + journal_count = fields.Integer( + default=_default_journal_count, + readonly=True + ) + + def default_company(self, active_model, active_ids): + return self.env[active_model].browse(active_ids)[0].company_id + + def default_currency(self, active_model, active_ids): + return self.default_company(active_model, active_ids).currency_id + + def default_journals(self, active_model, active_ids): + return self.env[active_model].browse(active_ids)[0].journal_id + + @api.onchange('journal_ids') + def compute_journal_count(self): + self.journal_count = len(self.journal_ids.ids) + + @api.onchange('invoice_id') + def _onchange_invoice(self): + self.amount = self.invoice_id.residual + + @api.multi + def _calculate_values_for_statement_line(self, record): + res = super(CashInvoiceIn, self)._calculate_values_for_statement_line( + record + ) + res['invoice_id'] = self.invoice_id.id + res['account_id'] = self.invoice_id.account_id.id + res['ref'] = self.invoice_id.number + res['partner_id'] = self.invoice_id.partner_id.id + return res diff --git a/account_cash_invoice/wizard/cash_invoice_in.xml b/account_cash_invoice/wizard/cash_invoice_in.xml new file mode 100644 index 00000000..8b520fe2 --- /dev/null +++ b/account_cash_invoice/wizard/cash_invoice_in.xml @@ -0,0 +1,49 @@ + + + + cash_invoice_in_form + cash.invoice.in + form + +
+ + + + + + + +
+
+
+
+
+ + +
diff --git a/account_cash_invoice/wizard/cash_invoice_out.py b/account_cash_invoice/wizard/cash_invoice_out.py new file mode 100644 index 00000000..68dee676 --- /dev/null +++ b/account_cash_invoice/wizard/cash_invoice_out.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models + + +class CashInvoiceOut(models.TransientModel): + _name = 'cash.invoice.out' + _inherit = 'cash.box.in' + + def _default_value(self, default_function): + active_model = self.env.context.get('active_model', False) + if active_model: + active_ids = self.env.context.get('active_ids', False) + return default_function(active_model, active_ids) + return None + + def _default_company(self): + return self._default_value(self.default_company) + + def _default_currency(self): + return self._default_value(self.default_currency) + + def _default_journals(self): + return self._default_value(self.default_journals) + + def _default_journal(self): + journals = self._default_journals() + if journals and len(journals.ids) > 0: + return self.env['account.journal'].browse( + journals.ids[0] + ).ensure_one() + + def _default_journal_count(self): + return len(self._default_journals()) + + invoice_id = fields.Many2one( + 'account.invoice', + string='Invoice', + required=True + ) + name = fields.Char( + related='invoice_id.number' + ) + company_id = fields.Many2one( + 'res.company', + default=_default_company, + required=True, + readonly=True + ) + currency_id = fields.Many2one( + 'res.currency', + default=_default_currency, + required=True, + readonly=True) + journal_ids = fields.Many2many( + 'account.journal', + default=_default_journals, + required=True, + readonly=True + ) + journal_id = fields.Many2one( + 'account.journal', + required=True, + default=_default_journal + ) + journal_count = fields.Integer( + default=_default_journal_count, + readonly=True + ) + + def default_company(self, active_model, active_ids): + return self.env[active_model].browse(active_ids)[0].company_id + + def default_currency(self, active_model, active_ids): + return self.default_company(active_model, active_ids).currency_id + + def default_journals(self, active_model, active_ids): + return self.env[active_model].browse(active_ids)[0].journal_id + + @api.onchange('journal_ids') + def compute_journal_count(self): + self.journal_count = len(self.journal_ids.ids) + + @api.onchange('journal_id') + def _onchange_journal(self): + self.currency_id = (self.journal_id.currency_id or + self.journal_id.company_id.currency_id) + + @api.onchange('invoice_id') + def _onchange_invoice(self): + self.amount = self.invoice_id.residual + + @api.multi + def _calculate_values_for_statement_line(self, record): + res = super(CashInvoiceOut, self)._calculate_values_for_statement_line( + record + ) + res['invoice_id'] = self.invoice_id.id + res['account_id'] = self.invoice_id.account_id.id + res['ref'] = self.invoice_id.number + res['partner_id'] = self.invoice_id.partner_id.id + return res diff --git a/account_cash_invoice/wizard/cash_invoice_out.xml b/account_cash_invoice/wizard/cash_invoice_out.xml new file mode 100644 index 00000000..0060a598 --- /dev/null +++ b/account_cash_invoice/wizard/cash_invoice_out.xml @@ -0,0 +1,48 @@ + + + + cash_invoice_out_form + cash.invoice.out + form + +
+ + + + + + + +
+
+
+
+
+ +
diff --git a/pos_session_pay_invoice/README.rst b/pos_session_pay_invoice/README.rst new file mode 100644 index 00000000..e8585e61 --- /dev/null +++ b/pos_session_pay_invoice/README.rst @@ -0,0 +1,56 @@ +.. image:: https://img.shields.io/badge/licence-LGPL--3-blue.svg + :alt: License: LGPL-3 + +======================== +Account cash Pay invoice +======================== + +This modules allows to pay an existing Supplier Invoice / Customer Refund, or +to collect payment for an existing Customer Invoice, using bank statements. + + +Usage +===== + +#. Go to *Accounting / Dashboard* and create and/or open an existing + bank statement. +#. Press the button **Pay Invoice** to pay a Supplier Invoice or a Customer + Refund. You will need to select the expected Journal +#. Select **Collect Payment from Invoice** in to receive a payment of an + existing Customer Invoice or a Supplier Refund. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/repo/github-com-oca-pos-184 + + +Known issues / Roadmap +====================== + +* Cannot pay invoices in a different currency than that defined in the journal + associated to the payment method used to pay/collect payment. + + +Credits +======= + +Contributors +------------ + +* Enric Tobella + + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/pos_session_pay_invoice/__init__.py b/pos_session_pay_invoice/__init__.py new file mode 100644 index 00000000..577a9637 --- /dev/null +++ b/pos_session_pay_invoice/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import wizard diff --git a/pos_session_pay_invoice/__manifest__.py b/pos_session_pay_invoice/__manifest__.py new file mode 100644 index 00000000..6531bf39 --- /dev/null +++ b/pos_session_pay_invoice/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + 'name': 'POS Pay invoice', + 'version': '10.0.1.0.0', + 'category': 'Point Of Sale', + 'author': "Creu Blanca," + "Odoo Community Association (OCA)", + 'website': 'https://github.com/OCA/pos', + 'summary': 'Pay and receive invoices from PoS Session', + "license": "LGPL-3", + 'depends': [ + "point_of_sale", "account_cash_invoice" + ], + 'data': [ + "wizard/cash_invoice_out.xml", + "wizard/cash_invoice_in.xml", + "views/pos_session.xml", + "views/account_bank_statement.xml", + ], +} diff --git a/pos_session_pay_invoice/static/description/icon.png b/pos_session_pay_invoice/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/pos_session_pay_invoice/static/description/icon.png differ diff --git a/pos_session_pay_invoice/tests/__init__.py b/pos_session_pay_invoice/tests/__init__.py new file mode 100644 index 00000000..510806cb --- /dev/null +++ b/pos_session_pay_invoice/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import test_pay_invoice diff --git a/pos_session_pay_invoice/tests/test_pay_invoice.py b/pos_session_pay_invoice/tests/test_pay_invoice.py new file mode 100644 index 00000000..4cd5a09a --- /dev/null +++ b/pos_session_pay_invoice/tests/test_pay_invoice.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo.tests import common + + +class TestSessionPayInvoice(common.TransactionCase): + def setUp(self): + super(TestSessionPayInvoice, self).setUp() + self.company = self.env.ref('base.main_company') + partner = self.env.ref('base.partner_demo') + self.invoice_out = self.env['account.invoice'].create({ + 'company_id': self.company.id, + 'partner_id': partner.id, + 'date_invoice': '2016-03-12', + 'type': 'out_invoice', + }) + account = self.env['account.account'].create({ + 'code': 'test_cash_pay_invoice', + 'company_id': self.company.id, + 'name': 'Test', + 'user_type_id': self.env.ref( + 'account.data_account_type_revenue').id + }) + self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_delivery_02').id, + 'invoice_id': self.invoice_out.id, + 'account_id': account.id, + 'name': 'Producto de prueba', + 'quantity': 1.0, + 'price_unit': 100.0, + }) + self.invoice_out._onchange_invoice_line_ids() + self.invoice_out.action_invoice_open() + self.invoice_out.number = '2999/99999' + self.invoice_in = self.env['account.invoice'].create({ + 'partner_id': partner.id, + 'company_id': self.company.id, + 'type': 'in_invoice', + 'date_invoice': '2016-03-12', + }) + self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_delivery_02').id, + 'invoice_id': self.invoice_in.id, + 'name': 'Producto de prueba', + 'account_id': account.id, + 'quantity': 1.0, + 'price_unit': 100.0, + }) + self.invoice_in._onchange_invoice_line_ids() + self.invoice_in.action_invoice_open() + self.invoice_in.number = '2999/99999' + self.config = self.env.ref('point_of_sale.pos_config_main') + self.config.cash_control = True + + def test_pos_invoice(self): + self.config.open_session_cb() + session = self.config.current_session_id + self.assertIsNotNone(session.statement_ids) + session.action_pos_session_open() + in_invoice = self.env['cash.invoice.in'].with_context( + active_ids=session.ids, active_model='pos.session' + ).create({ + 'invoice_id': self.invoice_in.id, + 'amount': 100.0 + }) + in_invoice.run() + out_invoice = self.env['cash.invoice.out'].with_context( + active_ids=session.ids, active_model='pos.session' + ).create({ + 'invoice_id': self.invoice_out.id, + 'amount': 75.0 + }) + out_invoice.run() + box = self.env['cash.box.in'].with_context( + active_ids=session.ids, active_model='pos.session' + ).create({ + 'name': "Testing", + 'amount': 25.0 + }) + box.run() + session.action_pos_session_closing_control() + session.action_pos_session_closing_control() + self.assertEqual(self.invoice_out.residual, 25.) + self.assertEqual(self.invoice_in.residual, 0.) diff --git a/pos_session_pay_invoice/views/account_bank_statement.xml b/pos_session_pay_invoice/views/account_bank_statement.xml new file mode 100644 index 00000000..95b1170d --- /dev/null +++ b/pos_session_pay_invoice/views/account_bank_statement.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/pos_session_pay_invoice/views/pos_session.xml b/pos_session_pay_invoice/views/pos_session.xml new file mode 100644 index 00000000..38e2e71d --- /dev/null +++ b/pos_session_pay_invoice/views/pos_session.xml @@ -0,0 +1,43 @@ + + + + pos.config.kanban.view + pos.config + + + + + + + + + pos.session.form.view + pos.session + + + + + + + + + diff --git a/pos_session_pay_invoice/wizard/__init__.py b/pos_session_pay_invoice/wizard/__init__.py new file mode 100644 index 00000000..030f06a1 --- /dev/null +++ b/pos_session_pay_invoice/wizard/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from . import cash_invoice_in +from . import cash_invoice_out diff --git a/pos_session_pay_invoice/wizard/cash_invoice_in.py b/pos_session_pay_invoice/wizard/cash_invoice_in.py new file mode 100644 index 00000000..6c77fcdb --- /dev/null +++ b/pos_session_pay_invoice/wizard/cash_invoice_in.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, models, _ +from odoo.exceptions import UserError + + +class CashInvoiceIn(models.TransientModel): + _inherit = 'cash.invoice.in' + + def default_company(self, active_model, active_ids): + if active_model == 'pos.session': + active = self.env[active_model].browse(active_ids) + return active[0].config_id.company_id + return super(CashInvoiceIn, self).default_company( + active_model, active_ids + ) + + def default_journals(self, active_model, active_ids): + if active_model == 'pos.session': + active = self.env[active_model].browse(active_ids) + if not active.cash_register_id: + raise UserError(_( + "There is no cash register for this Pos session" + )) + return active.cash_register_id.journal_id + return super(CashInvoiceIn, self).default_journals( + active_model, active_ids + ) + + def default_currency(self, active_model, active_ids): + if active_model == 'pos.session': + journal = self._default_journal() + if journal.currency_id: + return journal.currency_id + return super(CashInvoiceIn, self).default_currency( + active_model, active_ids + ) + + @api.multi + def run(self): + active_model = self.env.context.get('active_model', False) + active_ids = self.env.context.get('active_ids', False) + if active_model == 'pos.session': + bank_statements = [ + session.statement_ids.filtered( + lambda r: r.journal_id.id == self.journal_id.id + ) + for session in self.env[active_model].browse(active_ids) + ] + if not bank_statements: + raise UserError(_('Bank Statement was not found')) + return self._run(bank_statements) + else: + return super(CashInvoiceIn, self).run() diff --git a/pos_session_pay_invoice/wizard/cash_invoice_in.xml b/pos_session_pay_invoice/wizard/cash_invoice_in.xml new file mode 100644 index 00000000..fb1483cf --- /dev/null +++ b/pos_session_pay_invoice/wizard/cash_invoice_in.xml @@ -0,0 +1,12 @@ + + + + diff --git a/pos_session_pay_invoice/wizard/cash_invoice_out.py b/pos_session_pay_invoice/wizard/cash_invoice_out.py new file mode 100644 index 00000000..19bee735 --- /dev/null +++ b/pos_session_pay_invoice/wizard/cash_invoice_out.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, models, _ +from odoo.exceptions import UserError + + +class CashInvoiceOut(models.TransientModel): + _inherit = 'cash.invoice.out' + + def default_company(self, active_model, active_ids): + if active_model == 'pos.session': + active = self.env[active_model].browse(active_ids) + return active[0].config_id.company_id + return super(CashInvoiceOut, self).default_company( + active_model, active_ids + ) + + def default_currency(self, active_model, active_ids): + if active_model == 'pos.session': + journal = self._default_journal() + if journal.currency_id: + return journal.currency_id + return super(CashInvoiceOut, self).default_currency( + active_model, active_ids + ) + + def default_journals(self, active_model, active_ids): + if active_model == 'pos.session': + active = self.env[active_model].browse(active_ids) + return self.env['account.journal'].browse( + [r.journal_id.id for r in active.statement_ids]) + return super(CashInvoiceOut, self).default_journals( + active_model, active_ids + ) + + @api.multi + def run(self): + active_model = self.env.context.get('active_model', False) + active_ids = self.env.context.get('active_ids', False) + if active_model == 'pos.session': + bank_statements = [ + session.statement_ids.filtered( + lambda r: r.journal_id.id == self.journal_id.id + ) + for session in self.env[active_model].browse(active_ids) + ] + if not bank_statements: + raise UserError(_('Bank Statement was not found')) + return self._run(bank_statements) + else: + return super(CashInvoiceOut, self).run() diff --git a/pos_session_pay_invoice/wizard/cash_invoice_out.xml b/pos_session_pay_invoice/wizard/cash_invoice_out.xml new file mode 100644 index 00000000..0af983ef --- /dev/null +++ b/pos_session_pay_invoice/wizard/cash_invoice_out.xml @@ -0,0 +1,12 @@ + + + +