From 83fec9264fc4fe92dfff35fafc9e997bfafb29cd Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Wed, 13 Nov 2019 00:53:56 +0100 Subject: [PATCH] Initial check-in of the module sale_advance_payment_management --- sale_advance_payment_management/__init__.py | 2 + .../__manifest__.py | 32 +++++++ .../models/__init__.py | 2 + .../models/account_move_line.py | 32 +++++++ .../models/sale.py | 14 +++ .../views/account_bank_statement.xml | 23 +++++ .../views/account_move_line.xml | 24 ++++++ .../views/sale.xml | 25 ++++++ .../wizard/__init__.py | 1 + .../wizard/account_bank_statement_sale.py | 86 +++++++++++++++++++ .../account_bank_statement_sale_view.xml | 49 +++++++++++ 11 files changed, 290 insertions(+) create mode 100644 sale_advance_payment_management/__init__.py create mode 100644 sale_advance_payment_management/__manifest__.py create mode 100644 sale_advance_payment_management/models/__init__.py create mode 100644 sale_advance_payment_management/models/account_move_line.py create mode 100644 sale_advance_payment_management/models/sale.py create mode 100644 sale_advance_payment_management/views/account_bank_statement.xml create mode 100644 sale_advance_payment_management/views/account_move_line.xml create mode 100644 sale_advance_payment_management/views/sale.xml create mode 100644 sale_advance_payment_management/wizard/__init__.py create mode 100644 sale_advance_payment_management/wizard/account_bank_statement_sale.py create mode 100644 sale_advance_payment_management/wizard/account_bank_statement_sale_view.xml diff --git a/sale_advance_payment_management/__init__.py b/sale_advance_payment_management/__init__.py new file mode 100644 index 0000000..9b42961 --- /dev/null +++ b/sale_advance_payment_management/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/sale_advance_payment_management/__manifest__.py b/sale_advance_payment_management/__manifest__.py new file mode 100644 index 0000000..6a8e92f --- /dev/null +++ b/sale_advance_payment_management/__manifest__.py @@ -0,0 +1,32 @@ +# Copyright 2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Sale Advance Payment Management', + 'version': '12.0.1.0.0', + 'category': 'Sales', + 'license': 'AGPL-3', + 'summary': 'Link payment to sale orders', + 'description': """ +Sale Advance Payment Management +=============================== + +This module adds a link between payment and sale orders. It allows to see advanced payment directly on the sale order form view. + +This module targets B2B companies that don't want to generate a down payment invoice for an advanced payment. + +This module has been written by Alexis de Lattre from Akretion +. + """, + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'depends': ['sale'], + 'data': [ + 'wizard/account_bank_statement_sale_view.xml', + 'views/account_bank_statement.xml', + 'views/sale.xml', + 'views/account_move_line.xml', + ], + 'installable': True, +} diff --git a/sale_advance_payment_management/models/__init__.py b/sale_advance_payment_management/models/__init__.py new file mode 100644 index 0000000..33896fc --- /dev/null +++ b/sale_advance_payment_management/models/__init__.py @@ -0,0 +1,2 @@ +from . import sale +from . import account_move_line diff --git a/sale_advance_payment_management/models/account_move_line.py b/sale_advance_payment_management/models/account_move_line.py new file mode 100644 index 0000000..601f3ef --- /dev/null +++ b/sale_advance_payment_management/models/account_move_line.py @@ -0,0 +1,32 @@ +# Copyright 2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class AccountMoveLine(models.Model): + _inherit = 'account.move.line' + + sale_id = fields.Many2one('sale.order', string='Sale Order') + account_internal_type = fields.Selection( + related='account_id.user_type_id.type', store=True, + string='Account Internal Type') + + @api.constrains('sale_id', 'account_id') + def sale_id_check(self): + for line in self: + if line.sale_id and line.account_id.internal_type != 'receivable': + raise ValidationError(_( + "The account move line '%s' is linked to sale order '%s' " + "but it uses account '%s' which is not a receivable " + "account.") + % (line.name, + line.sale_id.name, + line.account_id.display_name)) + + @api.onchange('account_id') + def sale_advance_payement_account_id_change(self): + if self.sale_id and self.account_id.user_type_id.type != 'receivable': + self.sale_id = False diff --git a/sale_advance_payment_management/models/sale.py b/sale_advance_payment_management/models/sale.py new file mode 100644 index 0000000..f62c5bd --- /dev/null +++ b/sale_advance_payment_management/models/sale.py @@ -0,0 +1,14 @@ +# Copyright 2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + payment_line_ids = fields.One2many( + 'account.move.line', 'sale_id', string='Advance Payments', + readonly=True) + # residual diff --git a/sale_advance_payment_management/views/account_bank_statement.xml b/sale_advance_payment_management/views/account_bank_statement.xml new file mode 100644 index 0000000..03a9a4e --- /dev/null +++ b/sale_advance_payment_management/views/account_bank_statement.xml @@ -0,0 +1,23 @@ + + + + + + + + advance_payment.account.bank.statement.form + account.bank.statement + + + + + + + + diff --git a/sale_advance_payment_management/views/account_move_line.xml b/sale_advance_payment_management/views/account_move_line.xml new file mode 100644 index 0000000..e59d7d0 --- /dev/null +++ b/sale_advance_payment_management/views/account_move_line.xml @@ -0,0 +1,24 @@ + + + + + + + + advance_payment.account.move.line.form + account.move.line + + + + + + + + + + + diff --git a/sale_advance_payment_management/views/sale.xml b/sale_advance_payment_management/views/sale.xml new file mode 100644 index 0000000..c9cd0f1 --- /dev/null +++ b/sale_advance_payment_management/views/sale.xml @@ -0,0 +1,25 @@ + + + + + + + + advance_payment.sale.order.form + sale.order + + + + + + + + + + + + diff --git a/sale_advance_payment_management/wizard/__init__.py b/sale_advance_payment_management/wizard/__init__.py new file mode 100644 index 0000000..cb77527 --- /dev/null +++ b/sale_advance_payment_management/wizard/__init__.py @@ -0,0 +1 @@ +from . import account_bank_statement_sale diff --git a/sale_advance_payment_management/wizard/account_bank_statement_sale.py b/sale_advance_payment_management/wizard/account_bank_statement_sale.py new file mode 100644 index 0000000..8d86a85 --- /dev/null +++ b/sale_advance_payment_management/wizard/account_bank_statement_sale.py @@ -0,0 +1,86 @@ +# Copyright 2019 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class AccountBankStatementSale(models.TransientModel): + _name = 'account.bank.statement.sale' + _description = 'Account Bank Statement Sale' + + statement_id = fields.Many2one('account.bank.statement', readonly=True) + line_ids = fields.One2many( + 'account.bank.statement.sale.line', 'wizard_id', string='Lines') + + @api.model + def _prepare_line(self, move_line): + vals = { + 'move_line_id': move_line.id, + 'sale_id': move_line.sale_id.id or False, + 'date': move_line.date, + 'credit': move_line.credit, + 'partner_id': move_line.partner_id.id, + 'account_id': move_line.account_id.id, + 'name': move_line.name, + 'company_currency_id': move_line.company_currency_id.id, + } + return vals + + @api.model + def default_get(self, fields_list): + res = super(AccountBankStatementSale, self).default_get(fields_list) + assert self._context.get('active_model') == 'account.bank.statement' + statement_id = self._context.get('active_id') + statement = self.env['account.bank.statement'].browse(statement_id) + res.update({ + 'line_ids': [], + 'statement_id': statement_id, + }) + for st_line in statement.line_ids: + if ( + st_line.amount > 0 and + st_line.partner_id and + st_line.journal_entry_ids): + for line in st_line.journal_entry_ids: + if ( + line.account_id.user_type_id.type == 'receivable' + and + line.partner_id and + not line.full_reconcile_id and + not line.matched_debit_ids and + not line.matched_credit_ids): + lvals = self._prepare_line(line) + res['line_ids'].append((0, 0, lvals)) + if not res['line_ids']: + raise UserError(_( + "The bank statement '%s' doesn't contain any processed line " + "with a positive amount which is not reconciled.") + % statement.display_name) + return res + + def validate(self): + self.ensure_one() + for line in self.line_ids: + if line.move_line_id.sale_id != line.sale_id: + line.move_line_id.sale_id = line.sale_id.id + + +class AccountBankStatementSaleLine(models.TransientModel): + _name = 'account.bank.statement.sale.line' + _description = 'Account Bank Statement Sale Lines' + + wizard_id = fields.Many2one( + 'account.bank.statement.sale', ondelete='cascade') + move_line_id = fields.Many2one( + 'account.move.line', string='Move Line', required=True) + date = fields.Date(related='move_line_id.date') + credit = fields.Monetary( + related='move_line_id.credit', currency_field='company_currency_id') + partner_id = fields.Many2one(related='move_line_id.partner_id') + account_id = fields.Many2one(related='move_line_id.account_id') + name = fields.Char(related='move_line_id.name') + company_currency_id = fields.Many2one( + related='move_line_id.company_currency_id') + sale_id = fields.Many2one('sale.order', string='Sale Order') diff --git a/sale_advance_payment_management/wizard/account_bank_statement_sale_view.xml b/sale_advance_payment_management/wizard/account_bank_statement_sale_view.xml new file mode 100644 index 0000000..5350e01 --- /dev/null +++ b/sale_advance_payment_management/wizard/account_bank_statement_sale_view.xml @@ -0,0 +1,49 @@ + + + + + + + + account.bank.statement.sale.form + account.bank.statement.sale + +
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + Link to Quotation/Sale Orders + account.bank.statement.sale + form + new + + + +