From f0e84cebd99f6a6ce374720648ba24299f27a439 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 22 Oct 2018 12:27:50 +0200 Subject: [PATCH 01/52] [ADD] account_spread_cost_revenue --- account_spread_cost_revenue/README.rst | 170 ++++ account_spread_cost_revenue/__init__.py | 4 + account_spread_cost_revenue/__manifest__.py | 29 + .../data/spread_cron.xml | 17 + .../models/__init__.py | 8 + .../models/account_invoice.py | 45 ++ .../models/account_invoice_line.py | 65 ++ .../models/account_spread.py | 461 +++++++++++ .../models/account_spread_line.py | 150 ++++ .../models/account_spread_template.py | 78 ++ .../models/res_company.py | 20 + .../readme/CONFIGURE.rst | 12 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/CREDITS.rst | 3 + .../readme/DESCRIPTION.rst | 1 + .../readme/HISTORY.rst | 5 + .../readme/ROADMAP.rst | 2 + account_spread_cost_revenue/readme/USAGE.rst | 74 ++ .../security/account_spread_security.xml | 13 + .../security/ir.model.access.csv | 7 + .../static/description/create_spread.png | Bin 0 -> 61691 bytes .../static/description/icon.png | Bin 0 -> 6755 bytes .../static/description/index.html | 503 ++++++++++++ .../static/description/invoice_line_1.png | Bin 0 -> 13119 bytes .../static/description/invoice_line_2.png | Bin 0 -> 13213 bytes .../static/description/spread.png | Bin 0 -> 51752 bytes .../static/description/update_spread.png | Bin 0 -> 66304 bytes .../static/src/js/account_spread.js | 62 ++ .../static/src/less/account_spread.less | 5 + .../templates/assets.xml | 11 + account_spread_cost_revenue/tests/__init__.py | 5 + .../tests/test_account_invoice_spread.py | 726 ++++++++++++++++++ .../tests/test_account_spread_cost_revenue.py | 351 +++++++++ .../tests/test_compute_spread_board.py | 597 ++++++++++++++ .../views/account_invoice.xml | 24 + .../views/account_spread.xml | 178 +++++ .../views/account_spread_template.xml | 55 ++ .../views/res_company.xml | 25 + .../wizards/__init__.py | 3 + ...account_spread_invoice_line_link_wizard.py | 181 +++++ ...ccount_spread_invoice_line_link_wizard.xml | 32 + 41 files changed, 3923 insertions(+) create mode 100644 account_spread_cost_revenue/README.rst create mode 100644 account_spread_cost_revenue/__init__.py create mode 100644 account_spread_cost_revenue/__manifest__.py create mode 100644 account_spread_cost_revenue/data/spread_cron.xml create mode 100644 account_spread_cost_revenue/models/__init__.py create mode 100644 account_spread_cost_revenue/models/account_invoice.py create mode 100644 account_spread_cost_revenue/models/account_invoice_line.py create mode 100644 account_spread_cost_revenue/models/account_spread.py create mode 100644 account_spread_cost_revenue/models/account_spread_line.py create mode 100644 account_spread_cost_revenue/models/account_spread_template.py create mode 100644 account_spread_cost_revenue/models/res_company.py create mode 100644 account_spread_cost_revenue/readme/CONFIGURE.rst create mode 100644 account_spread_cost_revenue/readme/CONTRIBUTORS.rst create mode 100644 account_spread_cost_revenue/readme/CREDITS.rst create mode 100644 account_spread_cost_revenue/readme/DESCRIPTION.rst create mode 100644 account_spread_cost_revenue/readme/HISTORY.rst create mode 100644 account_spread_cost_revenue/readme/ROADMAP.rst create mode 100644 account_spread_cost_revenue/readme/USAGE.rst create mode 100644 account_spread_cost_revenue/security/account_spread_security.xml create mode 100644 account_spread_cost_revenue/security/ir.model.access.csv create mode 100644 account_spread_cost_revenue/static/description/create_spread.png create mode 100644 account_spread_cost_revenue/static/description/icon.png create mode 100644 account_spread_cost_revenue/static/description/index.html create mode 100644 account_spread_cost_revenue/static/description/invoice_line_1.png create mode 100644 account_spread_cost_revenue/static/description/invoice_line_2.png create mode 100644 account_spread_cost_revenue/static/description/spread.png create mode 100644 account_spread_cost_revenue/static/description/update_spread.png create mode 100644 account_spread_cost_revenue/static/src/js/account_spread.js create mode 100644 account_spread_cost_revenue/static/src/less/account_spread.less create mode 100644 account_spread_cost_revenue/templates/assets.xml create mode 100644 account_spread_cost_revenue/tests/__init__.py create mode 100644 account_spread_cost_revenue/tests/test_account_invoice_spread.py create mode 100644 account_spread_cost_revenue/tests/test_account_spread_cost_revenue.py create mode 100644 account_spread_cost_revenue/tests/test_compute_spread_board.py create mode 100644 account_spread_cost_revenue/views/account_invoice.xml create mode 100644 account_spread_cost_revenue/views/account_spread.xml create mode 100644 account_spread_cost_revenue/views/account_spread_template.xml create mode 100644 account_spread_cost_revenue/views/res_company.xml create mode 100644 account_spread_cost_revenue/wizards/__init__.py create mode 100644 account_spread_cost_revenue/wizards/account_spread_invoice_line_link_wizard.py create mode 100644 account_spread_cost_revenue/wizards/account_spread_invoice_line_link_wizard.xml diff --git a/account_spread_cost_revenue/README.rst b/account_spread_cost_revenue/README.rst new file mode 100644 index 00000000..8b6d7adf --- /dev/null +++ b/account_spread_cost_revenue/README.rst @@ -0,0 +1,170 @@ +=================== +Cost-Revenue Spread +=================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Faccount--financial--tools-lightgray.png?logo=github + :target: https://github.com/OCA/account-financial-tools/tree/11.0/account_spread_cost_revenue + :alt: OCA/account-financial-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-tools-11-0/account-financial-tools-11-0-account_spread_cost_revenue + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/92/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows to spread costs or revenues over a customizable periods, to even out cost or invoice spikes. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To be able to access the full spreading features, the user must belong to *Show Full Accounting Features* group. + +On the form view of the company, in the *Account Spread* tab, you can configure +the journals in which the spread journal items will be generated by default: + +* the *Default Spread Journal for Revenues*, +* the *Default Spread Journal for Expenses*. + +In the same *Account Spread* tab, you can also configure the Spread Balance Sheet Accounts used by default: + +* the *Default Spread Account for Revenues*, +* the *Default Spread Account for Expenses*. + +Usage +===== + +Under Invoicing -> Adviser -> Accounting Entries -> Spread Costs/Revenues, create a new spread board. + +Complete the definition of the spreading criteria, by setting the the fields: + +* *Debit Account* +* *Credit Account* +* *Estimated Amount* (The total amount to spread) +* *Number of Repetitions* +* *Period Type* (Duration of each period) +* *Start date* +* *Journal* + +.. figure:: static/description/spread.png + :alt: Create a new spread board + +Click on the button on the top-left to calculate the spread lines. + +.. figure:: static/description/create_spread.png + :alt: The spreading board is defined + +A cron job will automatically create the accounting moves for all the lines having date previous that the current day (today). + +.. figure:: static/description/update_spread.png + :alt: The spreading board is updated by the cron job + +By default, the status of the created accounting moves is unposted, so you should post them manually one by one. +To allow the automatic posting of the accounting moves, set the flag *Auto-post lines* to True. + +Create an invoice or vendor bill in draft. On its lines, the spreading right-arrow icon are displayed in dark-grey color. + +.. figure:: static/description/invoice_line_1.png + :alt: On the invoice line the spreading icon is displayed + +Click on the spreading right-arrow icon. A wizard prompts to enter a *Spread Action Type*: + +- *Link to existing spread board* +- *Create from spread template* +- *Create new spread board* + +Select *Link to existing spread board* and enter the previously generated Spread Board. Click on Confirm button: +the selected Spread Board will be automatically displayed. + +Go back to the draft invoice/bill. The spreading functionality is now enabled on the invoice line: +the spreading right-arrow icon is now displayed in green color. + +.. figure:: static/description/invoice_line_2.png + :alt: On the invoice line the spreading icon is displayed in green color + +Validate the invoice/bill. Click on the spreading (green) right-arrow icon to open the spread board, then click +on the smart button *Reconciled entries*: the moves of the spread lines are reconciled with the move of the invoice line. + +In case the Subtotal Price of the invoice line is different than the *Estimated Amount* of the spread board, the spread +lines (not yet posted) will be recalculated when validating the invoice/bill. + +Click on button *Recalculate entire spread* button in the spread board to force the recalculation of the spread lines: +this will also reset all the journal entries previously created. + +Known issues / Roadmap +====================== + +* Verify last day of month +* Not yet compatible with cutoff module: create module for adaptation? + +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 +~~~~~~~ + +* Onestein + +Contributors +~~~~~~~~~~~~ + +* Andrea Stirpe + +Other credits +~~~~~~~~~~~~~ + +Part of the code in this module (in particular the computation of the spread lines) +is highly inspired by the Assets Management module from the standard +Odoo 11.0 Community developed by Odoo SA. + +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. + +.. |maintainer-astirpe| image:: https://github.com/astirpe.png?size=40px + :target: https://github.com/astirpe + :alt: astirpe + +Current `maintainer `__: + +|maintainer-astirpe| + +This module is part of the `OCA/account-financial-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_spread_cost_revenue/__init__.py b/account_spread_cost_revenue/__init__.py new file mode 100644 index 00000000..adc6207f --- /dev/null +++ b/account_spread_cost_revenue/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizards diff --git a/account_spread_cost_revenue/__manifest__.py b/account_spread_cost_revenue/__manifest__.py new file mode 100644 index 00000000..caa3d132 --- /dev/null +++ b/account_spread_cost_revenue/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright 2016-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Cost-Revenue Spread", + "summary": "Spread costs and revenues over a custom period", + "version": "11.0.1.0.0", + "development_status": "Beta", + "author": "Onestein,Odoo Community Association (OCA)", + "maintainers": ["astirpe"], + "license": "AGPL-3", + "website": "https://github.com/OCA/account-financial-tools/", + "category": "Accounting & Finance", + "depends": [ + "account", + ], + "data": [ + "security/ir.model.access.csv", + "security/account_spread_security.xml", + "views/account_spread.xml", + "views/account_invoice.xml", + "views/res_company.xml", + "views/account_spread_template.xml", + "templates/assets.xml", + "wizards/account_spread_invoice_line_link_wizard.xml", + "data/spread_cron.xml", + ], + "installable": True, +} diff --git a/account_spread_cost_revenue/data/spread_cron.xml b/account_spread_cost_revenue/data/spread_cron.xml new file mode 100644 index 00000000..202f14c7 --- /dev/null +++ b/account_spread_cost_revenue/data/spread_cron.xml @@ -0,0 +1,17 @@ + + + + + Cost/revenue Spread: Create Entries + + + 1 + days + -1 + + + code + model._create_entries() + + + diff --git a/account_spread_cost_revenue/models/__init__.py b/account_spread_cost_revenue/models/__init__.py new file mode 100644 index 00000000..e7d567cb --- /dev/null +++ b/account_spread_cost_revenue/models/__init__.py @@ -0,0 +1,8 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_invoice +from . import account_invoice_line +from . import account_spread_line +from . import account_spread +from . import account_spread_template +from . import res_company diff --git a/account_spread_cost_revenue/models/account_invoice.py b/account_spread_cost_revenue/models/account_invoice.py new file mode 100644 index 00000000..078844fe --- /dev/null +++ b/account_spread_cost_revenue/models/account_invoice.py @@ -0,0 +1,45 @@ +# Copyright 2016-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class AccountInvoice(models.Model): + _inherit = 'account.invoice' + + @api.multi + def action_move_create(self): + """Invoked when validating the invoices.""" + res = super().action_move_create() + for invoice in self: + spreads = invoice.invoice_line_ids.mapped('spread_id') + spreads.compute_spread_board() + spreads.reconcile_spread_moves() + return res + + @api.multi + def invoice_line_move_line_get(self): + """Copying expense/revenue account from spread to move lines.""" + res = super().invoice_line_move_line_get() + for line in res: + invl_id = line.get('invl_id') + invl = self.env['account.invoice.line'].browse(invl_id) + if invl.spread_id: + if invl.invoice_id.type in ('out_invoice', 'in_refund'): + account = invl.spread_id.debit_account_id + else: + account = invl.spread_id.credit_account_id + line['account_id'] = account.id + return res + + @api.multi + def action_cancel(self): + """Cancel the spread lines and their related moves when + the invoice is canceled.""" + res = super().action_cancel() + for invoice_line in self.mapped('invoice_line_ids'): + moves = invoice_line.spread_id.line_ids.mapped('move_id') + moves.button_cancel() + moves.unlink() + invoice_line.spread_id.line_ids.unlink() + return res diff --git a/account_spread_cost_revenue/models/account_invoice_line.py b/account_spread_cost_revenue/models/account_invoice_line.py new file mode 100644 index 00000000..f188e1fc --- /dev/null +++ b/account_spread_cost_revenue/models/account_invoice_line.py @@ -0,0 +1,65 @@ +# Copyright 2016-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class AccountInvoiceLine(models.Model): + _inherit = 'account.invoice.line' + + spread_id = fields.Many2one( + 'account.spread', + string='Spread Board', + copy=False) + spread_check = fields.Selection([ + ('linked', 'Linked'), + ('unlinked', 'Unlinked'), + ('unavailable', 'Unavailable') + ], compute='_compute_spread_check') + + @api.depends('spread_id', 'invoice_id.state') + def _compute_spread_check(self): + for line in self: + if line.spread_id: + line.spread_check = 'linked' + elif line.invoice_id.state == 'draft': + line.spread_check = 'unlinked' + else: + line.spread_check = 'unavailable' + + @api.multi + def spread_details(self): + """Button on the invoice lines tree view of the invoice + form to show the spread form view.""" + if not self: + # In case the widget clicked before the creation of the line + return + + if self.spread_id: + return { + 'name': _('Spread Details'), + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.spread', + 'type': 'ir.actions.act_window', + 'target': 'current', + 'readonly': False, + 'res_id': self.spread_id.id, + } + + # In case no spread board is linked to the invoice line + # open the wizard to link them + ctx = dict( + self.env.context, + default_invoice_line_id=self.id, + default_company_id=self.invoice_id.company_id.id, + ) + return { + 'name': _('Link Invoice Line with Spread Board'), + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.spread.invoice.line.link.wizard', + 'type': 'ir.actions.act_window', + 'target': 'new', + 'context': ctx, + } diff --git a/account_spread_cost_revenue/models/account_spread.py b/account_spread_cost_revenue/models/account_spread.py new file mode 100644 index 00000000..c196ea33 --- /dev/null +++ b/account_spread_cost_revenue/models/account_spread.py @@ -0,0 +1,461 @@ +# Copyright 2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import calendar +import time + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.addons import decimal_precision as dp +from odoo.exceptions import UserError, ValidationError +from odoo.tools import float_is_zero + + +class AccountSpread(models.Model): + _name = 'account.spread' + _description = 'Account Spread' + _inherit = ['mail.thread'] + + name = fields.Char(required=True) + template_id = fields.Many2one( + 'account.spread.template', + string='Spread Template') + invoice_type = fields.Selection([ + ('out_invoice', 'Customer Invoice'), + ('in_invoice', 'Vendor Bill'), + ('out_refund', 'Customer Credit Note'), + ('in_refund', 'Vendor Credit Note')], + required=True) + spread_type = fields.Selection([ + ('sale', 'Customer'), + ('purchase', 'Supplier')], + compute='_compute_spread_type', + required=True) + period_number = fields.Integer( + string='Number of Repetitions', + default=12, + help="Define the number of spread lines", + required=True) + period_type = fields.Selection([ + ('month', 'Month'), + ('quarter', 'Quarter'), + ('year', 'Year')], + default='month', + help="Period length for the entries", + required=True) + credit_account_id = fields.Many2one( + 'account.account', + string='Credit Account', + required=True) + debit_account_id = fields.Many2one( + 'account.account', + string='Debit Account', + required=True) + is_credit_account_deprecated = fields.Boolean( + compute='_compute_deprecated_accounts') + is_debit_account_deprecated = fields.Boolean( + compute='_compute_deprecated_accounts') + unspread_amount = fields.Float( + digits=dp.get_precision('Account'), + compute='_compute_amounts') + unposted_amount = fields.Float( + digits=dp.get_precision('Account'), + compute='_compute_amounts') + posted_amount = fields.Float( + digits=dp.get_precision('Account'), + compute='_compute_amounts') + total_amount = fields.Float( + digits=dp.get_precision('Account'), + compute='_compute_amounts') + line_ids = fields.One2many( + 'account.spread.line', + 'spread_id', + string='Spread Lines') + spread_date = fields.Date( + string='Start Date', + default=time.strftime('%Y-01-01'), + required=True) + journal_id = fields.Many2one( + 'account.journal', + string='Journal', + required=True) + invoice_line_ids = fields.One2many( + 'account.invoice.line', + 'spread_id', + copy=False, + string='Invoice Lines') + invoice_line_id = fields.Many2one( + 'account.invoice.line', + string='Invoice line', + compute='_compute_invoice_line', + inverse='_inverse_invoice_line', + store=True) + invoice_id = fields.Many2one( + related='invoice_line_id.invoice_id', + readonly=True, + store=True, + string='Invoice') + estimated_amount = fields.Float(digits=dp.get_precision('Account')) + company_id = fields.Many2one( + 'res.company', + default=lambda self: self.env.user.company_id, + string='Company', + required=True) + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + required=True, + default=lambda self: self.env.user.company_id.currency_id.id) + account_analytic_id = fields.Many2one( + 'account.analytic.account', + string='Analytic Account') + analytic_tag_ids = fields.Many2many( + 'account.analytic.tag', + string='Analytic Tags') + move_line_auto_post = fields.Boolean('Auto-post lines', default=True) + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + if 'company_id' not in fields: + company_id = self.env.user.company_id.id + else: + company_id = res['company_id'] + default_journal = self.env['account.journal'].search([ + ('type', '=', 'general'), + ('company_id', '=', company_id) + ], limit=1) + if 'journal_id' not in res and default_journal: + res['journal_id'] = default_journal.id + return res + + @api.depends('invoice_type') + def _compute_spread_type(self): + for spread in self: + if spread.invoice_type in ['out_invoice', 'out_refund']: + spread.spread_type = 'sale' + else: + spread.spread_type = 'purchase' + + @api.depends('invoice_line_ids', 'invoice_line_ids.invoice_id') + def _compute_invoice_line(self): + for spread in self: + invoice_lines = spread.invoice_line_ids + line = invoice_lines and invoice_lines[0] or False + spread.invoice_line_id = line + + @api.multi + def _inverse_invoice_line(self): + for spread in self: + invoice_line = spread.invoice_line_id + spread.write({ + 'invoice_line_ids': [(6, 0, [invoice_line.id])], + }) + + @api.depends( + 'estimated_amount', 'invoice_line_id.price_subtotal', + 'line_ids.move_id.amount', 'line_ids.move_id.state') + def _compute_amounts(self): + for spread in self: + moves_amount = 0.0 + posted_amount = 0.0 + total_amount = spread.estimated_amount + if spread.invoice_line_id: + total_amount = spread.invoice_line_id.price_subtotal + for spread_line in spread.line_ids: + if spread_line.move_id: + moves_amount += spread_line.amount + if spread_line.move_id.state == 'posted': + posted_amount += spread_line.amount + spread.unspread_amount = total_amount - moves_amount + spread.unposted_amount = total_amount - posted_amount + spread.posted_amount = posted_amount + spread.total_amount = total_amount + + @api.multi + def _get_spread_entry_name(self, seq): + """Use this method to customise the name of the accounting entry.""" + self.ensure_one() + return (self.name or '') + '/' + str(seq) + + @api.onchange('template_id') + def onchange_template(self): + if self.template_id: + if self.template_id.spread_type == 'sale': + if self.invoice_type in ['in_invoice', 'in_refund']: + self.invoice_type = 'out_invoice' + else: + if self.invoice_type in ['out_invoice', 'out_refund']: + self.invoice_type = 'in_invoice' + + @api.onchange('invoice_type', 'company_id') + def onchange_invoice_type(self): + company = self.company_id + if not self.env.context.get('default_journal_id'): + journal = company.default_spread_expense_journal_id + if self.invoice_type in ('out_invoice', 'in_refund'): + journal = company.default_spread_revenue_journal_id + if journal: + self.journal_id = journal + + if not self.env.context.get('default_debit_account_id'): + if self.invoice_type in ('out_invoice', 'in_refund'): + debit_account_id = company.default_spread_revenue_account_id + self.debit_account_id = debit_account_id + + if not self.env.context.get('default_credit_account_id'): + if self.invoice_type in ('in_invoice', 'out_refund'): + credit_account_id = company.default_spread_expense_account_id + self.credit_account_id = credit_account_id + + @api.constrains('invoice_id', 'invoice_type') + def _check_invoice_type(self): + for spread in self: + if not spread.invoice_id: + pass + elif spread.invoice_type != spread.invoice_id.type: + raise ValidationError(_( + 'The Invoice Type does not correspond to the Invoice')) + + @api.constrains('journal_id') + def _check_journal(self): + for spread in self: + moves = spread.mapped('line_ids.move_id').filtered('journal_id') + if any(move.journal_id != spread.journal_id for move in moves): + raise ValidationError(_( + 'The Journal is not consistent with the account moves.')) + + @api.constrains('template_id', 'invoice_type') + def _check_template_invoice_type(self): + for spread in self: + if spread.invoice_type in ['in_invoice', 'in_refund']: + if spread.template_id.spread_type == 'sale': + raise ValidationError(_( + 'The Spread Template (Sales) is not compatible ' + 'with selected invoice type')) + elif spread.invoice_type in ['out_invoice', 'out_refund']: + if spread.template_id.spread_type == 'purchase': + raise ValidationError(_( + 'The Spread Template (Purchases) is not compatible ' + 'with selected invoice type')) + + @api.multi + def _compute_spread_period_duration(self): + """Converts the selected period_type to number of months.""" + self.ensure_one() + if self.period_type == 'year': + return 12 + elif self.period_type == 'quarter': + return 3 + return 1 + + @api.multi + def _init_line_date(self, posted_line_ids): + """Calculates the initial spread date. This method + is used by "def _compute_spread_board()" method. + """ + self.ensure_one() + if posted_line_ids: + # if we already have some previous validated entries, + # starting date is last entry + method period + last_date = fields.Date.from_string(posted_line_ids[-1].date) + months = self._compute_spread_period_duration() + spread_date = last_date + relativedelta(months=months) + else: + spread_date = fields.Date.from_string(self.spread_date) + return spread_date + + @api.multi + def _next_line_date(self, month_day, date): + """Calculates the next spread date. This method + is used by "def _compute_spread_board()" method. + """ + self.ensure_one() + months = self._compute_spread_period_duration() + date = date + relativedelta(months=months) + # get the last day of the month + if month_day > 28: + max_day_in_month = calendar.monthrange(date.year, date.month)[1] + date = date.replace(day=min(max_day_in_month, month_day)) + return date + + @api.multi + def _compute_spread_board(self): + """Creates the spread lines. This method is highly inspired + from method compute_depreciation_board() present in standard + "account_asset" module, developed by Odoo SA. + """ + self.ensure_one() + + posted_line_ids = self.line_ids.filtered( + lambda x: x.move_id.state == 'posted').sorted( + key=lambda l: l.date) + unposted_line_ids = self.line_ids.filtered( + lambda x: not x.move_id.state == 'posted') + + # Remove old unposted spread lines. + commands = [(2, line_id.id, False) for line_id in unposted_line_ids] + + if self.unposted_amount != 0.0: + unposted_amount = self.unposted_amount + + spread_date = self._init_line_date(posted_line_ids) + + month_day = spread_date.day + number_of_periods = self._get_number_of_periods(month_day) + + for x in range(len(posted_line_ids), number_of_periods): + sequence = x + 1 + amount = self._compute_board_amount( + sequence, unposted_amount, number_of_periods + ) + amount = self.currency_id.round(amount) + rounding = self.currency_id.rounding + if float_is_zero(amount, precision_rounding=rounding): + continue + unposted_amount -= amount + vals = { + 'amount': amount, + 'spread_id': self.id, + 'name': self._get_spread_entry_name(sequence), + 'date': self._get_last_day_of_month(spread_date), + } + commands.append((0, False, vals)) + + spread_date = self._next_line_date(month_day, spread_date) + + self.write({'line_ids': commands}) + self.message_post(body=_("Spread table created.")) + + @api.multi + def _get_number_of_periods(self, month_day): + """Calculates the number of spread lines.""" + self.ensure_one() + if month_day != 1: + return self.period_number + 1 + return self.period_number + + @staticmethod + def _get_last_day_of_month(spread_date): + return fields.Date.to_string(spread_date + relativedelta(day=31)) + + @api.multi + def _compute_board_amount(self, sequence, amount, number_of_periods): + """Calculates the amount for the spread lines.""" + self.ensure_one() + amount_to_spread = self.total_amount + if sequence != number_of_periods: + amount = amount_to_spread / self.period_number + if sequence == 1: + date = fields.Datetime.from_string(self.spread_date) + month_days = calendar.monthrange(date.year, date.month)[1] + days = month_days - date.day + 1 + period = self.period_number + amount = (amount_to_spread / period) / month_days * days + return amount + + @api.multi + def compute_spread_board(self): + """Checks whether the spread lines should be calculated. + In case checks pass, invoke "def _compute_spread_board()" method. + """ + for spread in self: + if spread.total_amount < 0.0: + raise UserError( + _("Cannot spread negative amounts of invoice lines")) + if spread.total_amount: + spread._compute_spread_board() + + @api.multi + def action_recalculate_spread(self): + """Recalculate spread""" + self.ensure_one() + spread_lines = self.mapped('line_ids').filtered('move_id') + spread_lines.unlink_move() + self.compute_spread_board() + self.env['account.spread.line']._create_entries() + + @api.multi + def action_undo_spread(self): + """Undo spreading: Remove all created moves, + restore original account on move line""" + self.ensure_one() + self.mapped('line_ids').filtered('move_id').unlink_move() + self.mapped('line_ids').unlink() + + @api.multi + def action_unlink_invoice_line(self): + """Unlink the invoice line from the spread board""" + self.ensure_one() + if self.invoice_id.state != 'draft': + raise UserError( + _("Cannot unlink invoice lines if the invoice is validated")) + self._action_unlink_invoice_line() + + @api.multi + def _action_unlink_invoice_line(self): + for spread in self: + spread_mls = spread.line_ids.mapped('move_id.line_ids') + spread_mls.remove_move_reconcile() + spread.write({'invoice_line_ids': [(5, 0, 0)]}) + + @api.multi + def reconcile_spread_moves(self): + for spread in self: + spread._reconcile_spread_moves() + + @api.multi + def _reconcile_spread_moves(self, created_moves=False): + """Reconcile spread moves if possible""" + self.ensure_one() + + if not self.invoice_id.number: + return + + spread_mls = self.line_ids.mapped('move_id.line_ids') + if created_moves: + spread_mls |= created_moves.mapped('line_ids') + if self.invoice_type in ('in_invoice', 'out_refund'): + spread_mls = spread_mls.filtered(lambda x: x.credit != 0.) + else: + spread_mls = spread_mls.filtered(lambda x: x.debit != 0.) + + invoice_mls = self.invoice_id.move_id.mapped('line_ids') + if self.invoice_id.type in ('in_invoice', 'out_refund'): + invoice_mls = invoice_mls.filtered(lambda x: x.debit != 0.) + else: + invoice_mls = invoice_mls.filtered(lambda x: x.credit != 0.) + + to_be_reconciled = self.env['account.move.line'] + if len(invoice_mls) > 1: + # Refine selection of move line. + # The name is formatted the same way as it is done when creating + # move lines in method "def invoice_line_move_line_get()" of + # standard account module + raw_name = self.invoice_line_id.name + formatted_name = raw_name.split('\n')[0][:64] + for move_line in invoice_mls: + if move_line.name == formatted_name: + to_be_reconciled |= move_line + else: + to_be_reconciled = invoice_mls + + if len(to_be_reconciled) == 1: + do_reconcile = spread_mls + to_be_reconciled + do_reconcile.remove_move_reconcile() + do_reconcile.reconcile() + + @api.multi + def _compute_deprecated_accounts(self): + for spread in self: + debit_deprecated = bool(spread.debit_account_id.deprecated) + credit_deprecated = bool(spread.credit_account_id.deprecated) + spread.is_debit_account_deprecated = debit_deprecated + spread.is_credit_account_deprecated = credit_deprecated + + @api.multi + def open_reconcile_view(self): + self.ensure_one() + spread_mls = self.line_ids.mapped('move_id.line_ids') + return spread_mls.open_reconcile_view() diff --git a/account_spread_cost_revenue/models/account_spread_line.py b/account_spread_cost_revenue/models/account_spread_line.py new file mode 100644 index 00000000..47ba0656 --- /dev/null +++ b/account_spread_cost_revenue/models/account_spread_line.py @@ -0,0 +1,150 @@ +# Copyright 2016-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.addons import decimal_precision as dp +from odoo.exceptions import UserError + + +class AccountInvoiceSpreadLine(models.Model): + _name = 'account.spread.line' + _description = 'Account Spread Lines' + _order = 'date' + + name = fields.Char('Description', readonly=True) + amount = fields.Float(digits=dp.get_precision('Account'), required=True) + date = fields.Date(required=True) + spread_id = fields.Many2one( + 'account.spread', string='Spread Board', ondelete='cascade') + move_id = fields.Many2one( + 'account.move', string='Journal Entry', readonly=True) + + @api.multi + def create_and_reconcile_moves(self): + grouped_lines = {} + for spread_line in self: + spread = spread_line.spread_id + spread_line_list = grouped_lines.get( + spread, self.env['account.spread.line']) + grouped_lines.update({ + spread: spread_line_list + spread_line + }) + for spread in grouped_lines: + created_moves = grouped_lines[spread]._create_moves() + + if created_moves: + post_msg = _("Created move(s) ") + post_msg += ", ".join(str(id) for id in created_moves.ids) + spread.message_post(body=post_msg) + + spread._reconcile_spread_moves(created_moves) + if created_moves and spread.move_line_auto_post: + created_moves.post() + + @api.multi + def create_move(self): + """Button to manually create a move from a spread line entry. + """ + self.ensure_one() + self.create_and_reconcile_moves() + + @api.multi + def _create_moves(self): + created_moves = self.env['account.move'] + for line in self: + if line.move_id: + raise UserError(_('This spread line is already linked to a ' + 'journal entry! Please post or delete it.')) + + move_vals = line._prepare_move() + move = self.env['account.move'].create(move_vals) + + line.write({'move_id': move.id}) + created_moves += move + return created_moves + + @api.multi + def _prepare_move(self): + self.ensure_one() + + spread_date = self.env.context.get('spread_date') or self.date + spread = self.spread_id + analytic = spread.account_analytic_id + analytic_tags = [(4, tag.id, None) for tag in spread.analytic_tag_ids] + + company_currency = spread.company_id.currency_id + current_currency = spread.currency_id + not_same_curr = company_currency != current_currency + amount = current_currency.with_context(date=spread_date).compute( + self.amount, company_currency) + + line_ids = [(0, 0, { + 'name': spread.name.split('\n')[0][:64], + 'account_id': spread.debit_account_id.id, + 'debit': amount, + 'credit': 0.0, + 'analytic_account_id': analytic.id, + 'analytic_tag_ids': analytic_tags, + 'currency_id': not_same_curr and current_currency.id or False, + 'amount_currency': not_same_curr and - 1.0 * self.amount or 0.0, + }), (0, 0, { + 'name': spread.name.split('\n')[0][:64], + 'account_id': spread.credit_account_id.id, + 'credit': amount, + 'debit': 0.0, + 'analytic_account_id': analytic.id, + 'analytic_tag_ids': analytic_tags, + 'currency_id': not_same_curr and current_currency.id or False, + 'amount_currency': not_same_curr and self.amount or 0.0, + })] + + return { + 'name': self.spread_id and self.spread_id.name or "/", + 'ref': self.name, + 'date': spread_date, + 'journal_id': spread.journal_id.id, + 'line_ids': line_ids, + 'company_id': spread.company_id.id, + } + + @api.multi + def open_move(self): + """Used by a button to manually view a move from a + spread line entry. + """ + self.ensure_one() + return { + 'name': _("Journal Entry"), + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'account.move', + 'view_id': False, + 'type': 'ir.actions.act_window', + 'res_id': self.move_id.id, + } + + @api.multi + def unlink_move(self): + """Used by a button to manually unlink a move + from a spread line entry. + """ + for line in self: + move = line.move_id + if move.state == 'posted': + move.button_cancel() + move.line_ids.remove_move_reconcile() + post_msg = _("Deleted move %s") % line.move_id.id + move.unlink() + line.move_id = False + line.spread_id.message_post(body=post_msg) + + @api.model + def _create_entries(self): + """Find spread line entries where date is in the past and + create moves for them. Method also called by the cron job. + """ + lines = self.search([ + ('date', '<=', fields.Date.today()), + ('move_id', '=', False) + ]) + lines.create_and_reconcile_moves() diff --git a/account_spread_cost_revenue/models/account_spread_template.py b/account_spread_cost_revenue/models/account_spread_template.py new file mode 100644 index 00000000..530e6367 --- /dev/null +++ b/account_spread_cost_revenue/models/account_spread_template.py @@ -0,0 +1,78 @@ +# Copyright 2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountSpreadTemplate(models.Model): + _name = 'account.spread.template' + _description = 'Account Spread Template' + + name = fields.Char(required=True) + spread_type = fields.Selection([ + ('sale', 'Customer'), + ('purchase', 'Supplier')], + default='sale', + required=True) + company_id = fields.Many2one( + 'res.company', + default=lambda self: self.env.user.company_id, + string='Company', + required=True) + spread_journal_id = fields.Many2one( + 'account.journal', + string='Journal', + required=True) + spread_account_id = fields.Many2one( + 'account.account', + string='Spread Balance Sheet Account', + required=True) + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + if 'company_id' not in fields: + company_id = self.env.user.company_id.id + else: + company_id = res['company_id'] + default_journal = self.env['account.journal'].search([ + ('type', '=', 'general'), + ('company_id', '=', company_id)], + limit=1) + if 'spread_journal_id' not in res and default_journal: + res['spread_journal_id'] = default_journal.id + return res + + @api.onchange('spread_type', 'company_id') + def onchange_spread_type(self): + company = self.company_id + if self.spread_type == 'sale': + account = company.default_spread_revenue_account_id + journal = company.default_spread_revenue_journal_id + else: + account = company.default_spread_expense_account_id + journal = company.default_spread_expense_journal_id + if account: + self.spread_account_id = account + if journal: + self.spread_journal_id = journal + + def _prepare_spread_from_template(self): + self.ensure_one() + company = self.company_id + spread_vals = { + 'name': self.name, + 'template_id': self.id, + 'journal_id': self.spread_journal_id.id, + 'company_id': company.id, + } + + if self.spread_type == 'sale': + invoice_type = 'out_invoice' + spread_vals['debit_account_id'] = self.spread_account_id.id + else: + invoice_type = 'in_invoice' + spread_vals['credit_account_id'] = self.spread_account_id.id + + spread_vals['invoice_type'] = invoice_type + return spread_vals diff --git a/account_spread_cost_revenue/models/res_company.py b/account_spread_cost_revenue/models/res_company.py new file mode 100644 index 00000000..edd7207c --- /dev/null +++ b/account_spread_cost_revenue/models/res_company.py @@ -0,0 +1,20 @@ +# Copyright 2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + default_spread_revenue_account_id = fields.Many2one( + 'account.account', string='Revenue Spread Account') + + default_spread_expense_account_id = fields.Many2one( + 'account.account', string='Expense Spread Account') + + default_spread_revenue_journal_id = fields.Many2one( + 'account.journal', string='Revenue Spread Journal') + + default_spread_expense_journal_id = fields.Many2one( + 'account.journal', string='Expense Spread Journal') diff --git a/account_spread_cost_revenue/readme/CONFIGURE.rst b/account_spread_cost_revenue/readme/CONFIGURE.rst new file mode 100644 index 00000000..9550b10b --- /dev/null +++ b/account_spread_cost_revenue/readme/CONFIGURE.rst @@ -0,0 +1,12 @@ +To be able to access the full spreading features, the user must belong to *Show Full Accounting Features* group. + +On the form view of the company, in the *Account Spread* tab, you can configure +the journals in which the spread journal items will be generated by default: + +* the *Default Spread Journal for Revenues*, +* the *Default Spread Journal for Expenses*. + +In the same *Account Spread* tab, you can also configure the Spread Balance Sheet Accounts used by default: + +* the *Default Spread Account for Revenues*, +* the *Default Spread Account for Expenses*. diff --git a/account_spread_cost_revenue/readme/CONTRIBUTORS.rst b/account_spread_cost_revenue/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..4518218c --- /dev/null +++ b/account_spread_cost_revenue/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Andrea Stirpe diff --git a/account_spread_cost_revenue/readme/CREDITS.rst b/account_spread_cost_revenue/readme/CREDITS.rst new file mode 100644 index 00000000..9a3666a4 --- /dev/null +++ b/account_spread_cost_revenue/readme/CREDITS.rst @@ -0,0 +1,3 @@ +Part of the code in this module (in particular the computation of the spread lines) +is highly inspired by the Assets Management module from the standard +Odoo 11.0 Community developed by Odoo SA. diff --git a/account_spread_cost_revenue/readme/DESCRIPTION.rst b/account_spread_cost_revenue/readme/DESCRIPTION.rst new file mode 100644 index 00000000..d37dce99 --- /dev/null +++ b/account_spread_cost_revenue/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Allows to spread costs or revenues over a customizable periods, to even out cost or invoice spikes. diff --git a/account_spread_cost_revenue/readme/HISTORY.rst b/account_spread_cost_revenue/readme/HISTORY.rst new file mode 100644 index 00000000..07877aaf --- /dev/null +++ b/account_spread_cost_revenue/readme/HISTORY.rst @@ -0,0 +1,5 @@ +11.0.1.0.0 +~~~~~~~~~~ + +* [ADD] Module account_spread_cost_revenue. + (`#715 `_) diff --git a/account_spread_cost_revenue/readme/ROADMAP.rst b/account_spread_cost_revenue/readme/ROADMAP.rst new file mode 100644 index 00000000..2999cff1 --- /dev/null +++ b/account_spread_cost_revenue/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +* Verify last day of month +* Add help in fields definition diff --git a/account_spread_cost_revenue/readme/USAGE.rst b/account_spread_cost_revenue/readme/USAGE.rst new file mode 100644 index 00000000..01b54162 --- /dev/null +++ b/account_spread_cost_revenue/readme/USAGE.rst @@ -0,0 +1,74 @@ +Define Spread Costs/Revenues Board +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Under Invoicing -> Adviser -> Accounting Entries -> Spread Costs/Revenues, create a new spread board. + +Complete the definition of the spreading criteria, by setting the the fields: + +* *Debit Account* +* *Credit Account* +* *Estimated Amount* (The total amount to spread) +* *Number of Repetitions* +* *Period Type* (Duration of each period) +* *Start date* +* *Journal* + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/11.0/account_spread_cost_revenue/static/description/spread.png + :alt: Create a new spread board + +Click on the button on the top-left to calculate the spread lines. + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/11.0/account_spread_cost_revenue/static/description/create_spread.png + :alt: The spreading board is defined + +A cron job will automatically create the accounting moves for all the lines having date previous that the current day (today). + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/11.0/account_spread_cost_revenue/static/description/update_spread.png + :alt: The spreading board is updated by the cron job + +By default, the status of the created accounting moves is posted. +To disable the automatic posting of the accounting moves, set the flag *Auto-post lines* to False. + +Click on button *Recalculate entire spread* button in the spread board to force the recalculation of the spread lines: +this will also reset all the journal entries previously created. + +Link Invoice to Spread Costs/Revenues Board +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create an invoice or vendor bill in draft. On its lines, the spreading right-arrow icon are displayed in dark-grey color. + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/11.0/account_spread_cost_revenue/static/description/invoice_line_1.png + :alt: On the invoice line the spreading icon is displayed + +Click on the spreading right-arrow icon. A wizard prompts to enter a *Spread Action Type*: + +- *Link to existing spread board* +- *Create from spread template* +- *Create new spread board* + +Select *Link to existing spread board* and enter the previously generated Spread Board. Click on Confirm button: +the selected Spread Board will be automatically displayed. + +Go back to the draft invoice/bill. The spreading functionality is now enabled on the invoice line: +the spreading right-arrow icon is now displayed in green color. + +.. figure:: https://raw.githubusercontent.com/OCA/account-financial-tools/11.0/account_spread_cost_revenue/static/description/invoice_line_2.png + :alt: On the invoice line the spreading icon is displayed in green color + +Validate the invoice/bill. Click on the spreading (green) right-arrow icon to open the spread board, then click +on the smart button *Reconciled entries*: the moves of the spread lines are reconciled with the move of the invoice line. + +In case the Subtotal Price of the invoice line is different than the *Estimated Amount* of the spread board, the spread +lines (not yet posted) will be recalculated when validating the invoice/bill. + +Define Spread Costs/Revenues Template +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Under Invoicing -> Configuration -> Accounting -> Spread Templates, create a new spread template. + +* *Spread Type* +* *Spread Balance Sheet Account* +* *Journal* + +When creating a new Spread Costs/Revenues Board, select the right template. +This way the above fields will be copied to the Spread Board. diff --git a/account_spread_cost_revenue/security/account_spread_security.xml b/account_spread_cost_revenue/security/account_spread_security.xml new file mode 100644 index 00000000..15e1b675 --- /dev/null +++ b/account_spread_cost_revenue/security/account_spread_security.xml @@ -0,0 +1,13 @@ + + + + + + Account Spread multi-company + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + diff --git a/account_spread_cost_revenue/security/ir.model.access.csv b/account_spread_cost_revenue/security/ir.model.access.csv new file mode 100644 index 00000000..a4e7d04a --- /dev/null +++ b/account_spread_cost_revenue/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_spread_cost_revenue_full,Full access on account.spread,model_account_spread,account.group_account_manager,1,1,1,1 +access_account_spread_cost_revenue_read,Read access on account.spread,model_account_spread,account.group_account_user,1,0,0,0 +access_account_spread_cost_revenue_line_full,Full access on account.spread.line,model_account_spread_line,account.group_account_manager,1,1,1,1 +access_account_spread_cost_revenue_line_read,Read access on account.spread.line,model_account_spread_line,account.group_account_user,1,0,0,0 +access_account_spread_cost_revenue_template_full,Full access on account.spread.template,model_account_spread_template,account.group_account_manager,1,1,1,1 +access_account_spread_cost_revenue_template_read,Read access on account.spread.template,model_account_spread_template,account.group_account_user,1,0,0,0 diff --git a/account_spread_cost_revenue/static/description/create_spread.png b/account_spread_cost_revenue/static/description/create_spread.png new file mode 100644 index 0000000000000000000000000000000000000000..27bb3c3ef1aa10e6e23fc52ce64a0d0c6c19b997 GIT binary patch literal 61691 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 F{|}jxXYc?3 literal 0 HcmV?d00001 diff --git a/account_spread_cost_revenue/static/description/index.html b/account_spread_cost_revenue/static/description/index.html new file mode 100644 index 00000000..01247ace --- /dev/null +++ b/account_spread_cost_revenue/static/description/index.html @@ -0,0 +1,503 @@ + + + + + + +Cost-Revenue Spread + + + + + + diff --git a/account_spread_cost_revenue/static/description/invoice_line_1.png b/account_spread_cost_revenue/static/description/invoice_line_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d899114b4df4b842dc1ea60d8c5ea0776fd4ba5 GIT binary patch literal 13119 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 Pz`)2#DN2@$8~Fb>T8r$E literal 0 HcmV?d00001 diff --git a/account_spread_cost_revenue/static/description/invoice_line_2.png b/account_spread_cost_revenue/static/description/invoice_line_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b5278cac3c2335130739fb82e12aea76ed1acb65 GIT binary patch literal 13213 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 literal 0 HcmV?d00001 diff --git a/account_spread_cost_revenue/static/description/spread.png b/account_spread_cost_revenue/static/description/spread.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2140b8c15fca2e3a2cd1e49c17eccef73d070b GIT binary patch literal 51752 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 S^)C?MAt53wTrQ~V|Nj7M#n|Hj literal 0 HcmV?d00001 diff --git a/account_spread_cost_revenue/static/description/update_spread.png b/account_spread_cost_revenue/static/description/update_spread.png new file mode 100644 index 0000000000000000000000000000000000000000..44b6dd3298a33e3a0f68f7197de89166fb275828 GIT binary patch literal 66304 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

L?W5e|RDzQ?| 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 g-+7AvZgqprE$w#F-VL', { + type: 'button', + title: title, + }).addClass(style + className); + this.$el.html($button); + }, + + /** + * @private + * @param {MouseEvent} event + */ + _onClick: function (event) { + event.stopPropagation(); + this.trigger_up('button_clicked', { + attrs: { + name: 'spread_details', + type: 'object', + }, + record: this.record, + }); + }, + }); + + registry.add("spread_line_widget", AccountSpreadWidget); + +}); diff --git a/account_spread_cost_revenue/static/src/less/account_spread.less b/account_spread_cost_revenue/static/src/less/account_spread.less new file mode 100644 index 00000000..1d496402 --- /dev/null +++ b/account_spread_cost_revenue/static/src/less/account_spread.less @@ -0,0 +1,5 @@ +.o_web_client .o_spread_line { + &.o_is_linked { + color: @brand-success; + } +} diff --git a/account_spread_cost_revenue/templates/assets.xml b/account_spread_cost_revenue/templates/assets.xml new file mode 100644 index 00000000..7079537f --- /dev/null +++ b/account_spread_cost_revenue/templates/assets.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/account_spread_cost_revenue/tests/__init__.py b/account_spread_cost_revenue/tests/__init__.py new file mode 100644 index 00000000..cbf5a95a --- /dev/null +++ b/account_spread_cost_revenue/tests/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_account_spread_cost_revenue +from . import test_compute_spread_board +from . import test_account_invoice_spread diff --git a/account_spread_cost_revenue/tests/test_account_invoice_spread.py b/account_spread_cost_revenue/tests/test_account_invoice_spread.py new file mode 100644 index 00000000..33ad9653 --- /dev/null +++ b/account_spread_cost_revenue/tests/test_account_invoice_spread.py @@ -0,0 +1,726 @@ +# Copyright 2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tools import convert_file +from odoo.modules.module import get_module_resource +from odoo.exceptions import UserError, ValidationError +from odoo.addons.account.tests.account_test_classes import AccountingTestCase + + +class TestAccountInvoiceSpread(AccountingTestCase): + + def _load(self, module, *args): + convert_file( + self.cr, + 'account_spread_cost_revenue', + get_module_resource(module, *args), + {}, 'init', False, 'test', self.registry._assertion_report) + + def setUp(self): + super().setUp() + self._load('account', 'test', 'account_minimal_test.xml') + + type_receivable = self.env.ref('account.data_account_type_receivable') + type_payable = self.env.ref('account.data_account_type_payable') + + def get_account(obj): + return self.env['account.account'].search([ + ('user_type_id', '=', obj.id), + ('reconcile', '=', True), + ], limit=1) + + self.invoice_account = get_account(type_receivable) + self.invoice_line_account = get_account(type_payable) + + self.spread_account = self.env['account.account'].search([ + ('user_type_id', '=', type_payable.id), + ('id', '!=', self.invoice_line_account.id) + ], limit=1) + + partner = self.env['res.partner'].create({ + 'name': 'Partner Name', + 'supplier': True, + }) + self.invoice = self.env['account.invoice'].with_context( + default_type='in_invoice' + ).create({ + 'partner_id': partner.id, + 'account_id': self.invoice_account.id, + 'type': 'in_invoice', + }) + self.invoice_line = self.env['account.invoice.line'].create({ + 'quantity': 1.0, + 'price_unit': 1000.0, + 'invoice_id': self.invoice.id, + 'name': 'product that cost 1000', + 'account_id': self.invoice_account.id, + }) + + analytic_tags = [(6, 0, self.env.ref('analytic.tag_contract').ids)] + self.analytic_account = self.env['account.analytic.account'].create({ + 'name': 'test account', + }) + self.spread = self.env['account.spread'].create({ + 'name': 'test', + 'debit_account_id': self.spread_account.id, + 'credit_account_id': self.invoice_line_account.id, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01', + 'estimated_amount': 1000.0, + 'journal_id': self.invoice.journal_id.id, + 'invoice_type': 'in_invoice', + 'account_analytic_id': self.analytic_account.id, + 'analytic_tag_ids': analytic_tags, + }) + + self.invoice_2 = self.env['account.invoice'].with_context( + default_type='out_invoice' + ).create({ + 'partner_id': partner.id, + 'account_id': self.invoice_account.id, + 'type': 'out_invoice', + }) + self.invoice_line_2 = self.env['account.invoice.line'].create({ + 'quantity': 1.0, + 'price_unit': 1000.0, + 'invoice_id': self.invoice_2.id, + 'name': 'product that cost 1000', + 'account_id': self.invoice_line_account.id, + }) + self.spread2 = self.env['account.spread'].create({ + 'name': 'test2', + 'debit_account_id': self.spread_account.id, + 'credit_account_id': self.invoice_line_account.id, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01', + 'estimated_amount': 1000.0, + 'journal_id': self.invoice_2.journal_id.id, + 'invoice_type': 'out_invoice', + }) + + def test_01_wizard_defaults(self): + my_company = self.env.user.company_id + Wizard = self.env['account.spread.invoice.line.link.wizard'] + wizard1 = Wizard.with_context( + default_invoice_line_id=self.invoice_line.id, + default_company_id=my_company.id, + ).create({}) + + self.assertEqual(wizard1.invoice_line_id, self.invoice_line) + self.assertEqual(wizard1.invoice_line_id.invoice_id, self.invoice) + self.assertEqual(wizard1.invoice_type, 'in_invoice') + self.assertFalse(wizard1.spread_id) + self.assertEqual(wizard1.company_id, my_company) + self.assertEqual(wizard1.spread_action_type, 'link') + self.assertFalse(wizard1.spread_account_id) + self.assertFalse(wizard1.spread_journal_id) + + wizard2 = Wizard.with_context( + default_invoice_line_id=self.invoice_line_2.id, + default_company_id=my_company.id, + ).create({}) + + self.assertEqual(wizard2.invoice_line_id, self.invoice_line_2) + self.assertEqual(wizard2.invoice_line_id.invoice_id, self.invoice_2) + self.assertEqual(wizard2.invoice_type, 'out_invoice') + self.assertFalse(wizard2.spread_id) + self.assertEqual(wizard2.company_id, my_company) + self.assertEqual(wizard2.spread_action_type, 'link') + self.assertFalse(wizard2.spread_account_id) + self.assertFalse(wizard2.spread_journal_id) + + def test_02_wizard_defaults(self): + my_company = self.env.user.company_id + Wizard = self.env['account.spread.invoice.line.link.wizard'] + + account_revenue = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + account_payable = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_payable').id)], + limit=1) + exp_journal = self.ref('account_spread_cost_revenue.expenses_journal') + sales_journal = self.ref('account_spread_cost_revenue.sales_journal') + my_company.default_spread_revenue_account_id = account_revenue + my_company.default_spread_expense_account_id = account_payable + my_company.default_spread_revenue_journal_id = sales_journal + my_company.default_spread_expense_journal_id = exp_journal + + self.assertTrue(my_company.default_spread_revenue_account_id) + self.assertTrue(my_company.default_spread_expense_account_id) + self.assertTrue(my_company.default_spread_revenue_journal_id) + self.assertTrue(my_company.default_spread_expense_journal_id) + + wizard1 = Wizard.with_context( + default_invoice_line_id=self.invoice_line.id, + default_company_id=my_company.id, + ).create({}) + + self.assertEqual(wizard1.invoice_line_id, self.invoice_line) + self.assertEqual(wizard1.invoice_line_id.invoice_id, self.invoice) + self.assertEqual(wizard1.invoice_type, 'in_invoice') + self.assertFalse(wizard1.spread_id) + self.assertEqual(wizard1.company_id, my_company) + self.assertEqual(wizard1.spread_action_type, 'link') + self.assertFalse(wizard1.spread_account_id) + self.assertFalse(wizard1.spread_journal_id) + + res_onchange = wizard1.onchange_invoice_type() + self.assertTrue(res_onchange) + self.assertTrue(res_onchange.get('domain')) + + wizard1._onchange_spread_journal_account() + self.assertTrue(wizard1.spread_account_id) + self.assertTrue(wizard1.spread_journal_id) + self.assertEqual(wizard1.spread_account_id, account_payable) + self.assertEqual(wizard1.spread_journal_id.id, exp_journal) + + wizard2 = Wizard.with_context( + default_invoice_line_id=self.invoice_line_2.id, + default_company_id=my_company.id, + ).create({}) + + self.assertEqual(wizard2.invoice_line_id, self.invoice_line_2) + self.assertEqual(wizard2.invoice_line_id.invoice_id, self.invoice_2) + self.assertEqual(wizard2.invoice_type, 'out_invoice') + self.assertFalse(wizard2.spread_id) + self.assertEqual(wizard2.company_id, my_company) + self.assertEqual(wizard2.spread_action_type, 'link') + self.assertFalse(wizard2.spread_account_id) + self.assertFalse(wizard2.spread_journal_id) + + res_onchange = wizard2.onchange_invoice_type() + self.assertTrue(res_onchange) + self.assertTrue(res_onchange.get('domain')) + + wizard2._onchange_spread_journal_account() + self.assertTrue(wizard2.spread_account_id) + self.assertTrue(wizard2.spread_journal_id) + self.assertEqual(wizard2.spread_account_id, account_revenue) + self.assertEqual(wizard2.spread_journal_id.id, sales_journal) + + def test_03_link_invoice_line_with_spread_sheet(self): + + my_company = self.env.user.company_id + Wizard = self.env['account.spread.invoice.line.link.wizard'] + wizard1 = Wizard.with_context( + default_invoice_line_id=self.invoice_line.id, + default_company_id=my_company.id, + ).create({}) + self.assertEqual(wizard1.spread_action_type, 'link') + + wizard1.spread_account_id = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + wizard1.spread_journal_id = self.ref( + 'account_spread_cost_revenue.expenses_journal') + wizard1.spread_id = self.spread + res_action = wizard1.confirm() + self.assertTrue(isinstance(res_action, dict)) + self.assertTrue(res_action.get('res_id')) + self.assertEqual(res_action.get('res_id'), self.spread.id) + self.assertTrue(self.spread.invoice_line_id) + self.assertEqual(self.spread.invoice_line_id, self.invoice_line) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.invoice.journal_id.update_posted = True + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + self.assertTrue(line.move_id.journal_id.update_posted) + for ml in line.move_id.line_ids: + ml_analytic_account = ml.analytic_account_id + analytic_tag = self.env.ref('analytic.tag_contract') + self.assertEqual(ml_analytic_account, self.analytic_account) + self.assertEqual(ml.analytic_tag_ids, analytic_tag) + + self.spread.invoice_id.action_cancel() + + self.assertTrue(self.spread.invoice_line_id) + with self.assertRaises(UserError): + self.spread.action_unlink_invoice_line() + self.assertTrue(self.spread.invoice_line_id) + + def test_04_new_spread_sheet(self): + + my_company = self.env.user.company_id + Wizard = self.env['account.spread.invoice.line.link.wizard'] + + spread_account = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + spread_journal_id = self.ref( + 'account_spread_cost_revenue.expenses_journal') + + wizard1 = Wizard.with_context( + default_invoice_line_id=self.invoice_line.id, + default_company_id=my_company.id, + ).create({ + 'spread_action_type': 'new', + }) + self.assertEqual(wizard1.spread_action_type, 'new') + + wizard1.write({ + 'spread_account_id': spread_account.id, + 'spread_journal_id': spread_journal_id, + }) + + res_action = wizard1.confirm() + self.assertTrue(isinstance(res_action, dict)) + self.assertFalse(res_action.get('res_id')) + self.assertTrue(res_action.get('context')) + res_context = res_action.get('context') + self.assertTrue(res_context.get('default_name')) + self.assertTrue(res_context.get('default_invoice_type')) + self.assertTrue(res_context.get('default_invoice_line_id')) + self.assertTrue(res_context.get('default_debit_account_id')) + self.assertTrue(res_context.get('default_credit_account_id')) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + wizard2 = Wizard.with_context( + default_invoice_line_id=self.invoice_line_2.id, + default_company_id=my_company.id, + ).create({ + 'spread_action_type': 'new', + }) + self.assertEqual(wizard2.spread_action_type, 'new') + + wizard2.write({ + 'spread_account_id': spread_account.id, + 'spread_journal_id': spread_journal_id, + }) + + res_action = wizard2.confirm() + self.assertTrue(isinstance(res_action, dict)) + self.assertFalse(res_action.get('res_id')) + self.assertTrue(res_action.get('context')) + res_context = res_action.get('context') + self.assertTrue(res_context.get('default_name')) + self.assertTrue(res_context.get('default_invoice_type')) + self.assertTrue(res_context.get('default_invoice_line_id')) + self.assertTrue(res_context.get('default_debit_account_id')) + self.assertTrue(res_context.get('default_credit_account_id')) + + spread_lines = self.spread2.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread2.compute_spread_board() + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + def test_05_new_spread_sheet_from_template(self): + + my_company = self.env.user.company_id + Wizard = self.env['account.spread.invoice.line.link.wizard'] + + spread_account = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_payable').id)], + limit=1) + self.assertTrue(spread_account) + spread_journal_id = self.ref( + 'account_spread_cost_revenue.expenses_journal') + + template = self.env['account.spread.template'].create({ + 'name': 'test', + 'spread_type': 'purchase', + 'spread_account_id': spread_account.id, + 'spread_journal_id': spread_journal_id, + }) + + wizard1 = Wizard.with_context( + default_invoice_line_id=self.invoice_line.id, + default_company_id=my_company.id, + ).create({ + 'spread_action_type': 'template', + 'template_id': template.id, + }) + self.assertEqual(wizard1.spread_action_type, 'template') + + res_action = wizard1.confirm() + self.assertTrue(isinstance(res_action, dict)) + self.assertTrue(res_action.get('res_id')) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + wizard2 = Wizard.with_context( + default_invoice_line_id=self.invoice_line_2.id, + default_company_id=my_company.id, + ).create({ + 'spread_action_type': 'new', + }) + self.assertEqual(wizard2.spread_action_type, 'new') + + wizard2.write({ + 'spread_account_id': spread_account.id, + 'spread_journal_id': spread_journal_id, + }) + + res_action = wizard2.confirm() + self.assertTrue(isinstance(res_action, dict)) + self.assertFalse(res_action.get('res_id')) + self.assertTrue(res_action.get('context')) + res_context = res_action.get('context') + self.assertTrue(res_context.get('default_name')) + self.assertTrue(res_context.get('default_invoice_type')) + self.assertTrue(res_context.get('default_invoice_line_id')) + self.assertTrue(res_context.get('default_debit_account_id')) + self.assertTrue(res_context.get('default_credit_account_id')) + + spread_lines = self.spread2.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread2.compute_spread_board() + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + def test_06_open_wizard(self): + + res_action = self.invoice_line.spread_details() + self.assertTrue(isinstance(res_action, dict)) + self.assertFalse(res_action.get('res_id')) + self.assertTrue(res_action.get('context')) + + def test_07_unlink_invoice_line_and_spread_sheet(self): + + self.assertFalse(self.spread.invoice_line_id) + self.invoice_line.spread_id = self.spread + self.assertTrue(self.spread.invoice_line_id) + self.spread.action_unlink_invoice_line() + self.assertFalse(self.spread.invoice_line_id) + + self.assertFalse(self.spread2.invoice_line_id) + self.invoice_line_2.spread_id = self.spread2 + self.assertTrue(self.spread2.invoice_line_id) + self.spread2.action_unlink_invoice_line() + self.assertFalse(self.spread2.invoice_line_id) + + def test_08_invoice_multi_line(self): + self.invoice_line.copy() + self.assertEqual(len(self.invoice.invoice_line_ids), 2) + + self.invoice.invoice_line_ids[0].spread_id = self.spread + self.assertTrue(self.spread.invoice_line_id) + self.assertEqual(self.spread.invoice_line_id, self.invoice_line) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + # Validate invoice + self.invoice.action_invoice_open() + + def test_09_no_link_invoice(self): + + balance_sheet = self.spread.credit_account_id + + # Validate invoice + self.invoice.action_invoice_open() + + invoice_mls = self.invoice.move_id.mapped('line_ids') + self.assertTrue(invoice_mls) + for invoice_ml in invoice_mls: + if invoice_ml.debit: + self.assertNotEqual(invoice_ml.account_id, balance_sheet) + + def test_10_link_vendor_bill_line_with_spread_sheet(self): + + copied_line = self.invoice_line.copy() + copied_line.name = 'new test line' + self.spread.write({ + 'estimated_amount': 1000.0, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07', + 'invoice_line_id': self.invoice_line.id, + 'move_line_auto_post': False, + }) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + expense_account = self.spread.debit_account_id + balance_sheet = self.spread.credit_account_id + self.assertTrue(balance_sheet.reconcile) + + spread_mls = self.spread.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertEqual(spread_ml.account_id, expense_account) + if spread_ml.credit: + self.assertEqual(spread_ml.account_id, balance_sheet) + + # Validate invoice + self.invoice.action_invoice_open() + + invoice_mls = self.invoice.move_id.mapped('line_ids') + self.assertTrue(invoice_mls) + + count_balance_sheet = 0 + for invoice_ml in invoice_mls: + if invoice_ml.account_id == balance_sheet: + count_balance_sheet += 1 + self.assertEqual(count_balance_sheet, 1) + + self.spread.line_ids.create_and_reconcile_moves() + + spread_mls = self.spread.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertFalse(spread_ml.full_reconcile_id) + if spread_ml.credit: + self.assertTrue(spread_ml.full_reconcile_id) + + action_reconcile_view = self.spread2.open_reconcile_view() + self.assertTrue(isinstance(action_reconcile_view, dict)) + self.assertFalse(action_reconcile_view.get('domain')[0][2]) + self.assertTrue(action_reconcile_view.get('context')) + + def test_11_link_vendor_bill_line_with_spread_sheet(self): + self.invoice_line.copy() + self.spread.write({ + 'estimated_amount': 1000.0, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07', + 'invoice_line_id': self.invoice_line.id, + 'move_line_auto_post': False, + }) + + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + expense_account = self.spread.debit_account_id + balance_sheet = self.spread.credit_account_id + self.assertTrue(balance_sheet.reconcile) + + spread_mls = self.spread.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertEqual(spread_ml.account_id, expense_account) + if spread_ml.credit: + self.assertEqual(spread_ml.account_id, balance_sheet) + + # Validate invoice + self.invoice.action_invoice_open() + + invoice_mls = self.invoice.move_id.mapped('line_ids') + self.assertTrue(invoice_mls) + + count_balance_sheet = 0 + for invoice_ml in invoice_mls: + if invoice_ml.account_id == balance_sheet: + count_balance_sheet += 1 + self.assertEqual(count_balance_sheet, 1) + + self.spread.line_ids.create_and_reconcile_moves() + + spread_mls = self.spread.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + self.assertFalse(spread_ml.full_reconcile_id) + + action_reconcile_view = self.spread.open_reconcile_view() + self.assertTrue(isinstance(action_reconcile_view, dict)) + self.assertTrue(action_reconcile_view.get('domain')[0][2]) + self.assertTrue(action_reconcile_view.get('context')) + + action_spread_details = self.invoice_line.spread_details() + self.assertTrue(isinstance(action_spread_details, dict)) + self.assertTrue(action_spread_details.get('res_id')) + + def test_12_link_invoice_line_with_spread_sheet_full_reconcile(self): + + self.spread2.write({ + 'estimated_amount': 1000.0, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07', + 'invoice_line_id': self.invoice_line_2.id, + 'move_line_auto_post': False, + }) + + spread_lines = self.spread2.line_ids + for line in spread_lines: + self.assertFalse(line.move_id) + + self.spread2.compute_spread_board() + spread_lines = self.spread2.line_ids + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + payable_account = self.spread.credit_account_id + balance_sheet = self.spread.debit_account_id + self.assertTrue(balance_sheet.reconcile) + + spread_mls = self.spread2.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertEqual(spread_ml.account_id, balance_sheet) + if spread_ml.credit: + self.assertEqual(spread_ml.account_id, payable_account) + + # Validate invoice + self.invoice_2.action_invoice_open() + + invoice_mls = self.invoice_2.move_id.mapped('line_ids') + self.assertTrue(invoice_mls) + for invoice_ml in invoice_mls: + if invoice_ml.credit: + self.assertEqual(invoice_ml.account_id, balance_sheet) + + self.spread2.line_ids.create_and_reconcile_moves() + + spread_mls = self.spread2.line_ids.mapped('move_id.line_ids') + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertTrue(spread_ml.full_reconcile_id) + if spread_ml.credit: + self.assertFalse(spread_ml.full_reconcile_id) + + action_reconcile_view = self.spread2.open_reconcile_view() + self.assertTrue(isinstance(action_reconcile_view, dict)) + self.assertTrue(action_reconcile_view.get('domain')[0][2]) + self.assertFalse(action_reconcile_view.get('res_id')) + self.assertTrue(action_reconcile_view.get('context')) + + action_spread_details = self.invoice_line_2.spread_details() + self.assertTrue(isinstance(action_spread_details, dict)) + self.assertTrue(action_spread_details.get('res_id')) + + def test_13_link_invoice_line_with_spread_sheet_partial_reconcile(self): + + self.spread2.write({ + 'estimated_amount': 1000.0, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07', + }) + + self.spread2.compute_spread_board() + spread_lines = self.spread2.line_ids + self.assertEqual(len(spread_lines), 13) + + for line in spread_lines: + self.assertFalse(line.move_id) + + spread_lines[0]._create_moves().post() + spread_lines[1]._create_moves().post() + spread_lines[2]._create_moves().post() + spread_lines[3]._create_moves().post() + + self.assertEqual(spread_lines[0].move_id.state, 'posted') + self.assertEqual(spread_lines[1].move_id.state, 'posted') + self.assertEqual(spread_lines[2].move_id.state, 'posted') + self.assertEqual(spread_lines[3].move_id.state, 'posted') + + spread_mls = spread_lines[0].move_id.line_ids + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertFalse(spread_ml.matched_debit_ids) + self.assertFalse(spread_ml.matched_credit_ids) + self.assertFalse(spread_ml.full_reconcile_id) + if spread_ml.credit: + self.assertFalse(spread_ml.matched_debit_ids) + self.assertFalse(spread_ml.matched_credit_ids) + self.assertFalse(spread_ml.full_reconcile_id) + + balance_sheet = self.spread.debit_account_id + self.assertTrue(balance_sheet.reconcile) + + self.spread2.write({ + 'invoice_line_id': self.invoice_line_2.id, + }) + + # Validate invoice + self.invoice_2.action_invoice_open() + + invoice_mls = self.invoice_2.move_id.mapped('line_ids') + self.assertTrue(invoice_mls) + for invoice_ml in invoice_mls: + if invoice_ml.credit: + self.assertEqual(invoice_ml.account_id, balance_sheet) + + spread_mls = spread_lines[0].move_id.line_ids + self.assertTrue(spread_mls) + for spread_ml in spread_mls: + if spread_ml.debit: + self.assertFalse(spread_ml.matched_debit_ids) + self.assertTrue(spread_ml.matched_credit_ids) + self.assertFalse(spread_ml.full_reconcile_id) + if spread_ml.credit: + self.assertFalse(spread_ml.matched_debit_ids) + self.assertFalse(spread_ml.matched_credit_ids) + self.assertFalse(spread_ml.full_reconcile_id) + + other_journal = self.env['account.journal'].search([ + ('id', '!=', self.invoice_2.journal_id.id), + ], limit=1) + self.assertTrue(other_journal) + with self.assertRaises(ValidationError): + self.spread2.journal_id = other_journal diff --git a/account_spread_cost_revenue/tests/test_account_spread_cost_revenue.py b/account_spread_cost_revenue/tests/test_account_spread_cost_revenue.py new file mode 100644 index 00000000..bdd641f8 --- /dev/null +++ b/account_spread_cost_revenue/tests/test_account_spread_cost_revenue.py @@ -0,0 +1,351 @@ +# Copyright 2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import time + +from psycopg2 import IntegrityError + +from odoo.tools import convert_file, mute_logger +from odoo.modules.module import get_module_resource +from odoo.exceptions import ValidationError +from odoo.addons.account.tests.account_test_classes import AccountingTestCase + + +class TestAccountSpreadCostRevenue(AccountingTestCase): + + def _load(self, module, *args): + convert_file( + self.cr, + 'account_spread_cost_revenue', + get_module_resource(module, *args), + {}, 'init', False, 'test', self.registry._assertion_report) + + def setUp(self): + super().setUp() + self._load('account', 'test', 'account_minimal_test.xml') + + def get_account(obj): + return self.env['account.account'].search([ + ('user_type_id', '=', obj.id) + ], limit=1) + + type_receivable = self.env.ref('account.data_account_type_receivable') + type_expenses = self.env.ref('account.data_account_type_expenses') + + self.credit_account = get_account(type_receivable) + self.debit_account = get_account(type_expenses) + + def test_01_account_spread_defaults(self): + + spread = self.env['account.spread'].create({ + 'name': 'test', + 'invoice_type': 'out_invoice', + 'debit_account_id': self.debit_account.id, + 'credit_account_id': self.credit_account.id, + }) + my_company = self.env.user.company_id + + self.assertTrue(spread) + self.assertFalse(spread.line_ids) + self.assertFalse(spread.invoice_line_ids) + self.assertFalse(spread.invoice_line_id) + self.assertFalse(spread.invoice_id) + self.assertFalse(spread.account_analytic_id) + self.assertFalse(spread.analytic_tag_ids) + self.assertTrue(spread.move_line_auto_post) + self.assertEqual(spread.name, 'test') + self.assertEqual(spread.invoice_type, 'out_invoice') + self.assertEqual(spread.company_id, my_company) + self.assertEqual(spread.currency_id, my_company.currency_id) + self.assertEqual(spread.period_number, 12) + self.assertEqual(spread.period_type, 'month') + self.assertEqual(spread.debit_account_id, self.debit_account) + self.assertEqual(spread.credit_account_id, self.credit_account) + self.assertEqual(spread.unspread_amount, 0.) + self.assertEqual(spread.unposted_amount, 0.) + self.assertEqual(spread.total_amount, 0.) + self.assertEqual(spread.estimated_amount, 0.) + self.assertEqual(spread.spread_date, time.strftime('%Y-01-01')) + self.assertTrue(spread.journal_id) + self.assertEqual(spread.journal_id.type, 'general') + + def test_02_config_defaults(self): + my_company = self.env.user.company_id + self.assertFalse(my_company.default_spread_revenue_account_id) + self.assertFalse(my_company.default_spread_expense_account_id) + self.assertFalse(my_company.default_spread_revenue_journal_id) + self.assertFalse(my_company.default_spread_expense_journal_id) + + @mute_logger('odoo.sql_db') + def test_03_no_defaults(self): + with self.assertRaises(IntegrityError): + self.env['account.spread'].create({ + 'name': 'test', + }) + + @mute_logger('odoo.sql_db') + def test_04_no_defaults(self): + with self.assertRaises(IntegrityError): + self.env['account.spread'].create({ + 'name': 'test', + 'invoice_type': 'out_invoice', + }) + + def test_05_config_settings(self): + my_company = self.env.user.company_id + + account_revenue = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + account_payable = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_payable').id)], + limit=1) + exp_journal = self.ref('account_spread_cost_revenue.expenses_journal') + sales_journal = self.ref('account_spread_cost_revenue.sales_journal') + my_company.default_spread_revenue_account_id = account_revenue + my_company.default_spread_expense_account_id = account_payable + my_company.default_spread_revenue_journal_id = sales_journal + my_company.default_spread_expense_journal_id = exp_journal + + self.assertTrue(my_company.default_spread_revenue_account_id) + self.assertTrue(my_company.default_spread_expense_account_id) + self.assertTrue(my_company.default_spread_revenue_journal_id) + self.assertTrue(my_company.default_spread_expense_journal_id) + + spread = self.env['account.spread'].new({ + 'name': 'test', + }) + + self.assertTrue(spread) + self.assertFalse(spread.line_ids) + self.assertFalse(spread.invoice_line_ids) + self.assertFalse(spread.invoice_line_id) + self.assertFalse(spread.invoice_id) + self.assertFalse(spread.account_analytic_id) + self.assertFalse(spread.analytic_tag_ids) + self.assertFalse(spread.move_line_auto_post) + + defaults = (self.env['account.spread'].default_get([ + 'company_id', + 'currency_id', + ])) + + self.assertEqual(defaults['company_id'], my_company.id) + self.assertEqual(defaults['currency_id'], my_company.currency_id.id) + + spread.invoice_type = 'out_invoice' + spread.company_id = my_company + spread.onchange_invoice_type() + self.assertEqual(spread.debit_account_id, account_revenue) + self.assertFalse(spread.credit_account_id) + self.assertEqual(spread.journal_id.id, sales_journal) + self.assertEqual(spread.spread_type, 'sale') + + spread.invoice_type = 'in_invoice' + spread.onchange_invoice_type() + self.assertEqual(spread.credit_account_id, account_payable) + self.assertEqual(spread.journal_id.id, exp_journal) + self.assertEqual(spread.spread_type, 'purchase') + + def test_06_invoice_line_compute_spread_check(self): + invoice_account = self.env['account.account'].search([ + ('user_type_id', '=', self.env.ref( + 'account.data_account_type_receivable').id) + ], limit=1).id + invoice_line_account = self.env['account.account'].search([ + ('user_type_id', '=', self.env.ref( + 'account.data_account_type_expenses').id) + ], limit=1).id + invoice = self.env['account.invoice'].create({ + 'partner_id': self.env.ref('base.res_partner_2').id, + 'account_id': invoice_account, + 'type': 'in_invoice', + }) + invoice_line = self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_product_4').id, + 'quantity': 1.0, + 'price_unit': 100.0, + 'invoice_id': invoice.id, + 'name': 'product that cost 100', + 'account_id': invoice_line_account, + }) + invoice_line2 = invoice_line.copy() + + self.assertFalse(invoice_line.spread_id) + self.assertEqual(invoice_line.spread_check, 'unlinked') + + spread = self.env['account.spread'].create({ + 'name': 'test', + 'invoice_type': 'in_invoice', + 'debit_account_id': self.debit_account.id, + 'credit_account_id': self.credit_account.id, + }) + invoice_line.spread_id = spread + self.assertTrue(invoice_line.spread_id) + self.assertEqual(invoice_line.spread_check, 'linked') + self.assertFalse(invoice_line2.spread_id) + self.assertEqual(invoice_line2.spread_check, 'unlinked') + + invoice.action_invoice_open() + self.assertTrue(invoice_line.spread_id) + self.assertEqual(invoice_line.spread_check, 'linked') + self.assertFalse(invoice_line2.spread_id) + self.assertEqual(invoice_line2.spread_check, 'unavailable') + + def test_07_create_spread_template(self): + account_revenue = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + account_payable = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_payable').id)], + limit=1) + spread_template = self.env['account.spread.template'].create({ + 'name': 'test', + 'spread_type': 'sale', + 'spread_account_id': account_revenue.id, + }) + + my_company = self.env.user.company_id + self.assertEqual(spread_template.company_id, my_company) + self.assertTrue(spread_template.spread_journal_id) + + exp_journal = self.ref('account_spread_cost_revenue.expenses_journal') + sales_journal = self.ref('account_spread_cost_revenue.sales_journal') + my_company.default_spread_revenue_account_id = account_revenue + my_company.default_spread_expense_account_id = account_payable + my_company.default_spread_revenue_journal_id = sales_journal + my_company.default_spread_expense_journal_id = exp_journal + + spread_template.spread_type = 'purchase' + spread_template.onchange_spread_type() + self.assertTrue(spread_template.spread_journal_id) + self.assertTrue(spread_template.spread_account_id) + self.assertEqual(spread_template.spread_account_id, account_payable) + self.assertEqual(spread_template.spread_journal_id.id, exp_journal) + + spread_vals = spread_template._prepare_spread_from_template() + self.assertTrue(spread_vals['name']) + self.assertTrue(spread_vals['template_id']) + self.assertTrue(spread_vals['journal_id']) + self.assertTrue(spread_vals['company_id']) + self.assertTrue(spread_vals['invoice_type']) + self.assertTrue(spread_vals['credit_account_id']) + + spread_template.spread_type = 'sale' + spread_template.onchange_spread_type() + self.assertTrue(spread_template.spread_journal_id) + self.assertTrue(spread_template.spread_account_id) + self.assertEqual(spread_template.spread_account_id, account_revenue) + self.assertEqual(spread_template.spread_journal_id.id, sales_journal) + + spread_vals = spread_template._prepare_spread_from_template() + self.assertTrue(spread_vals['name']) + self.assertTrue(spread_vals['template_id']) + self.assertTrue(spread_vals['journal_id']) + self.assertTrue(spread_vals['company_id']) + self.assertTrue(spread_vals['invoice_type']) + self.assertTrue(spread_vals['debit_account_id']) + + def test_08_check_template_invoice_type(self): + account_revenue = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_revenue').id)], + limit=1) + account_payable = self.env['account.account'].search([( + 'user_type_id', + '=', + self.env.ref('account.data_account_type_payable').id)], + limit=1) + template_sale = self.env['account.spread.template'].create({ + 'name': 'test', + 'spread_type': 'sale', + 'spread_account_id': account_revenue.id, + }) + template_purchase = self.env['account.spread.template'].create({ + 'name': 'test', + 'spread_type': 'purchase', + 'spread_account_id': account_payable.id, + }) + spread = self.env['account.spread'].create({ + 'name': 'test', + 'invoice_type': 'out_invoice', + 'debit_account_id': self.debit_account.id, + 'credit_account_id': self.credit_account.id, + }) + spread.template_id = template_sale + self.assertEqual(spread.template_id, template_sale) + with self.assertRaises(ValidationError): + spread.template_id = template_purchase + self.assertEqual(spread.invoice_type, 'out_invoice') + spread.onchange_template() + self.assertEqual(spread.invoice_type, 'in_invoice') + + spread.template_id = False + spread.invoice_type = 'in_invoice' + spread.template_id = template_purchase + self.assertEqual(spread.template_id, template_purchase) + with self.assertRaises(ValidationError): + spread.template_id = template_sale + self.assertEqual(spread.invoice_type, 'in_invoice') + spread.onchange_template() + self.assertEqual(spread.invoice_type, 'out_invoice') + + spread.template_id = False + spread.invoice_type = 'out_invoice' + spread.template_id = template_sale + self.assertEqual(spread.template_id, template_sale) + with self.assertRaises(ValidationError): + spread.invoice_type = 'in_invoice' + self.assertEqual(spread.invoice_type, 'in_invoice') + spread.onchange_template() + self.assertEqual(spread.invoice_type, 'out_invoice') + + spread.template_id = False + spread.invoice_type = 'in_invoice' + spread.template_id = template_purchase + self.assertEqual(spread.template_id, template_purchase) + with self.assertRaises(ValidationError): + spread.invoice_type = 'out_invoice' + self.assertEqual(spread.invoice_type, 'out_invoice') + spread.onchange_template() + self.assertEqual(spread.invoice_type, 'in_invoice') + + def test_09_wrong_invoice_type(self): + invoice_account = self.env['account.account'].search([ + ('user_type_id', '=', self.env.ref( + 'account.data_account_type_receivable').id) + ], limit=1).id + invoice_line_account = self.env['account.account'].search([ + ('user_type_id', '=', self.env.ref( + 'account.data_account_type_expenses').id) + ], limit=1).id + invoice = self.env['account.invoice'].create({ + 'partner_id': self.env.ref('base.res_partner_2').id, + 'account_id': invoice_account, + 'type': 'in_invoice', + }) + invoice_line = self.env['account.invoice.line'].create({ + 'product_id': self.env.ref('product.product_product_4').id, + 'quantity': 1.0, + 'price_unit': 100.0, + 'invoice_id': invoice.id, + 'name': 'product that cost 100', + 'account_id': invoice_line_account, + }) + spread = self.env['account.spread'].create({ + 'name': 'test', + 'invoice_type': 'out_invoice', + 'debit_account_id': self.debit_account.id, + 'credit_account_id': self.credit_account.id, + }) + with self.assertRaises(ValidationError): + invoice_line.spread_id = spread diff --git a/account_spread_cost_revenue/tests/test_compute_spread_board.py b/account_spread_cost_revenue/tests/test_compute_spread_board.py new file mode 100644 index 00000000..763a4af1 --- /dev/null +++ b/account_spread_cost_revenue/tests/test_compute_spread_board.py @@ -0,0 +1,597 @@ +# Copyright 2017-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.addons.account.tests.account_test_classes import AccountingTestCase +from odoo.exceptions import UserError + + +class TestComputeSpreadBoard(AccountingTestCase): + + def setUp(self): + super().setUp() + type_receivable = self.env.ref('account.data_account_type_receivable') + type_expenses = self.env.ref('account.data_account_type_expenses') + + def get_account(obj): + return self.env['account.account'].search([ + ('user_type_id', '=', obj.id) + ], limit=1) + + journal = self.env['account.journal'].search([ + ('type', '=', 'general')], + limit=1) + + self.receivable_account = get_account(type_receivable) + self.expense_account = get_account(type_expenses) + + self.spread_account = self.env['account.account'].search([ + ('user_type_id', '=', type_expenses.id), + ('id', '!=', self.expense_account.id) + ], limit=1) + + self.spread = self.env['account.spread'].create({ + 'name': 'test', + 'debit_account_id': self.spread_account.id, + 'credit_account_id': self.expense_account.id, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01', + 'estimated_amount': 1000.0, + 'journal_id': journal.id, + 'invoice_type': 'in_invoice', + }) + + self.spread2 = self.env['account.spread'].create({ + 'name': 'test2', + 'debit_account_id': self.spread_account.id, + 'credit_account_id': self.expense_account.id, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01', + 'estimated_amount': 1000.0, + 'journal_id': journal.id, + 'invoice_type': 'out_invoice', + }) + + def test_01_supplier_invoice(self): + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 12) + + self.assertEqual(83.33, spread_lines[0].amount) + self.assertEqual(83.33, spread_lines[1].amount) + self.assertEqual(83.33, spread_lines[2].amount) + self.assertEqual(83.33, spread_lines[3].amount) + self.assertEqual(83.33, spread_lines[4].amount) + self.assertEqual(83.33, spread_lines[5].amount) + self.assertEqual(83.33, spread_lines[6].amount) + self.assertEqual(83.33, spread_lines[7].amount) + self.assertEqual(83.33, spread_lines[8].amount) + self.assertEqual(83.33, spread_lines[9].amount) + self.assertEqual(83.33, spread_lines[10].amount) + self.assertEqual(83.37, spread_lines[11].amount) + + self.assertEqual('2017-02-28', spread_lines[0].date) + self.assertEqual('2017-03-31', spread_lines[1].date) + self.assertEqual('2017-04-30', spread_lines[2].date) + self.assertEqual('2017-05-31', spread_lines[3].date) + self.assertEqual('2017-06-30', spread_lines[4].date) + self.assertEqual('2017-07-31', spread_lines[5].date) + self.assertEqual('2017-08-31', spread_lines[6].date) + self.assertEqual('2017-09-30', spread_lines[7].date) + self.assertEqual('2017-10-31', spread_lines[8].date) + self.assertEqual('2017-11-30', spread_lines[9].date) + self.assertEqual('2017-12-31', spread_lines[10].date) + self.assertEqual('2018-01-31', spread_lines[11].date) + + for line in spread_lines: + self.assertFalse(line.move_id) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + for line in spread_lines: + line.create_move() + self.assertTrue(line.move_id) + + self.spread.journal_id.update_posted = True + self.spread.action_recalculate_spread() + spread_lines = self.spread.line_ids + for line in spread_lines: + self.assertTrue(line.move_id) + + def test_02_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07' + }) + self.spread_account.reconcile = True + self.assertTrue(self.spread_account.reconcile) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 13) + + self.assertEqual(67.20, spread_lines[0].amount) + self.assertEqual(83.33, spread_lines[1].amount) + self.assertEqual(83.33, spread_lines[2].amount) + self.assertEqual(83.33, spread_lines[3].amount) + self.assertEqual(83.33, spread_lines[4].amount) + self.assertEqual(83.33, spread_lines[5].amount) + self.assertEqual(83.33, spread_lines[6].amount) + self.assertEqual(83.33, spread_lines[7].amount) + self.assertEqual(83.33, spread_lines[8].amount) + self.assertEqual(83.33, spread_lines[9].amount) + self.assertEqual(83.33, spread_lines[10].amount) + self.assertEqual(83.33, spread_lines[11].amount) + self.assertEqual(16.17, spread_lines[12].amount) + + self.assertEqual('2017-01-31', spread_lines[0].date) + self.assertEqual('2017-02-28', spread_lines[1].date) + self.assertEqual('2017-03-31', spread_lines[2].date) + self.assertEqual('2017-04-30', spread_lines[3].date) + self.assertEqual('2017-05-31', spread_lines[4].date) + self.assertEqual('2017-06-30', spread_lines[5].date) + self.assertEqual('2017-07-31', spread_lines[6].date) + self.assertEqual('2017-08-31', spread_lines[7].date) + self.assertEqual('2017-09-30', spread_lines[8].date) + self.assertEqual('2017-10-31', spread_lines[9].date) + self.assertEqual('2017-11-30', spread_lines[10].date) + self.assertEqual('2017-12-31', spread_lines[11].date) + self.assertEqual('2018-01-31', spread_lines[12].date) + + for line in spread_lines: + self.assertFalse(line.move_id) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + self.spread.line_ids.create_and_reconcile_moves() + for line in self.spread.line_ids: + self.assertTrue(line.move_id) + + def test_03_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-31', + 'move_line_auto_post': False + }) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 13) + self.assertEqual(2.69, spread_lines[0].amount) + self.assertEqual(83.33, spread_lines[1].amount) + self.assertEqual(83.33, spread_lines[2].amount) + self.assertEqual(83.33, spread_lines[3].amount) + self.assertEqual(83.33, spread_lines[4].amount) + self.assertEqual(83.33, spread_lines[5].amount) + self.assertEqual(83.33, spread_lines[6].amount) + self.assertEqual(83.33, spread_lines[7].amount) + self.assertEqual(83.33, spread_lines[8].amount) + self.assertEqual(83.33, spread_lines[9].amount) + self.assertEqual(83.33, spread_lines[10].amount) + self.assertEqual(83.33, spread_lines[11].amount) + self.assertEqual(80.68, spread_lines[12].amount) + + self.assertEqual('2017-01-31', spread_lines[0].date) + self.assertEqual('2017-02-28', spread_lines[1].date) + self.assertEqual('2017-03-31', spread_lines[2].date) + self.assertEqual('2017-04-30', spread_lines[3].date) + self.assertEqual('2017-05-31', spread_lines[4].date) + self.assertEqual('2017-06-30', spread_lines[5].date) + self.assertEqual('2017-07-31', spread_lines[6].date) + self.assertEqual('2017-08-31', spread_lines[7].date) + self.assertEqual('2017-09-30', spread_lines[8].date) + self.assertEqual('2017-10-31', spread_lines[9].date) + self.assertEqual('2017-11-30', spread_lines[10].date) + self.assertEqual('2017-12-31', spread_lines[11].date) + self.assertEqual('2018-01-31', spread_lines[12].date) + + for line in spread_lines: + self.assertFalse(line.move_id) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + spread_lines[0].create_move() + spread_lines[1].create_move() + spread_lines[2].create_move() + self.assertTrue(any(line.move_id for line in spread_lines)) + self.assertTrue(any(not line.move_id for line in spread_lines)) + + self.spread._compute_amounts() + self.assertEqual(self.spread.unspread_amount, 830.65) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 13) + self.assertEqual(2.69, spread_lines[0].amount) + self.assertEqual(83.33, spread_lines[1].amount) + self.assertEqual(83.33, spread_lines[2].amount) + self.assertEqual(83.33, spread_lines[3].amount) + self.assertEqual(83.33, spread_lines[4].amount) + self.assertEqual(83.33, spread_lines[5].amount) + self.assertEqual(83.33, spread_lines[6].amount) + self.assertEqual(83.33, spread_lines[7].amount) + self.assertEqual(83.33, spread_lines[8].amount) + self.assertEqual(83.33, spread_lines[9].amount) + self.assertEqual(83.33, spread_lines[10].amount) + self.assertEqual(83.33, spread_lines[11].amount) + self.assertEqual(80.68, spread_lines[12].amount) + + self.assertEqual('2017-01-31', spread_lines[0].date) + self.assertEqual('2017-02-28', spread_lines[1].date) + self.assertEqual('2017-03-31', spread_lines[2].date) + self.assertEqual('2017-04-30', spread_lines[3].date) + self.assertEqual('2017-05-31', spread_lines[4].date) + self.assertEqual('2017-06-30', spread_lines[5].date) + self.assertEqual('2017-07-31', spread_lines[6].date) + self.assertEqual('2017-08-31', spread_lines[7].date) + self.assertEqual('2017-09-30', spread_lines[8].date) + self.assertEqual('2017-10-31', spread_lines[9].date) + self.assertEqual('2017-11-30', spread_lines[10].date) + self.assertEqual('2017-12-31', spread_lines[11].date) + self.assertEqual('2018-01-31', spread_lines[12].date) + + def test_04_supplier_invoice(self): + self.spread.write({ + 'credit_account_id': self.expense_account.id, + 'debit_account_id': self.spread_account.id, + 'period_number': 3, + 'period_type': 'year', + 'spread_date': '2018-10-24' + }) + + # change the state of invoice to open by clicking Validate button + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 4) + self.assertEqual(333.33, spread_lines[1].amount) + self.assertEqual(333.33, spread_lines[2].amount) + first_amount = spread_lines[0].amount + last_amount = spread_lines[3].amount + remaining_amount = first_amount + last_amount + self.assertAlmostEqual(remaining_amount, 333.34, places=2) + total_line_amount = 0.0 + for line in spread_lines: + total_line_amount += line.amount + self.assertAlmostEqual(total_line_amount, 1000.0, places=2) + + for line in spread_lines: + self.assertFalse(line.move_id) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_05_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01' + }) + + self.spread.compute_spread_board() + + # create moves for all the spread lines and open them + self.spread.line_ids.create_and_reconcile_moves() + for spread_line in self.spread.line_ids: + attrs = spread_line.open_move() + self.assertTrue(isinstance(attrs, dict)) + + # post and then unlink all created moves + self.spread.journal_id.write({'update_posted': True}) + for line in self.spread.line_ids: + line.move_id.post() + self.spread.line_ids.unlink_move() + for spread_line in self.spread.line_ids: + self.assertFalse(spread_line.move_id) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_06_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 3, + 'period_type': 'quarter', + 'move_line_auto_post': False + }) + + self.spread.compute_spread_board() + + # create moves for all the spread lines and open them + self.spread.line_ids.create_and_reconcile_moves() + + # check move lines + for spread_line in self.spread.line_ids: + for move_line in spread_line.move_id.line_ids: + spread_account = self.spread.debit_account_id + if move_line.account_id == spread_account: + debit = move_line.debit + self.assertAlmostEqual(debit, spread_line.amount) + + for line in self.spread.line_ids: + self.assertTrue(line.move_id) + self.assertFalse(line.move_id.state == 'posted') + + self.assertEqual(self.spread.unspread_amount, 0.) + self.assertEqual(self.spread.unposted_amount, 1000.) + + # try to create move lines again: an error is raised + for line in self.spread.line_ids: + with self.assertRaises(UserError): + line.create_move() + + self.spread.write({ + 'move_line_auto_post': True, + }) + self.spread.action_recalculate_spread() + + for line in self.spread.line_ids: + self.assertTrue(line.move_id) + self.assertTrue(line.move_id.state == 'posted') + + self.assertEqual(self.spread.unspread_amount, 0.) + self.assertEqual(self.spread.unposted_amount, 0.) + + def test_07_supplier_invoice(self): + self.spread.write({ + 'period_number': 3, + 'period_type': 'month', + 'spread_date': '2017-01-01', + 'estimated_amount': 345.96, + }) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 3) + self.assertEqual(115.32, spread_lines[0].amount) + self.assertEqual(115.32, spread_lines[1].amount) + self.assertEqual(115.32, spread_lines[2].amount) + self.assertEqual('2017-01-31', spread_lines[0].date) + self.assertEqual('2017-02-28', spread_lines[1].date) + self.assertEqual('2017-03-31', spread_lines[2].date) + + for line in spread_lines: + self.assertFalse(line.move_id) + + self.assertEqual(self.spread.unspread_amount, 345.96) + self.assertEqual(self.spread.unposted_amount, 345.96) + + def test_08_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01' + }) + + self.spread.compute_spread_board() + self.assertTrue(self.spread.line_ids) + self.spread.action_undo_spread() + self.assertFalse(self.spread.line_ids) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_09_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-02-01' + }) + + self.spread.compute_spread_board() + for line in self.spread.line_ids: + line.create_move() + self.assertTrue(line.move_id) + action = line.open_move() + self.assertTrue(action) + + self.spread.journal_id.update_posted = True + self.spread.line_ids.unlink_move() + for line in self.spread.line_ids: + self.assertFalse(line.move_id) + self.assertTrue(self.spread.line_ids) + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_10_create_entries(self): + self.env['account.spread.line']._create_entries() + self.assertFalse(self.spread.line_ids) + + self.spread.compute_spread_board() + self.env['account.spread.line']._create_entries() + self.assertTrue(self.spread.line_ids) + for line in self.spread.line_ids: + self.assertTrue(line.move_id) + + def test_11_create_move_sale_invoice(self): + self.spread2.move_line_auto_post = False + self.spread2.compute_spread_board() + for line in self.spread2.line_ids: + self.assertFalse(line.move_id) + line.create_move() + self.assertTrue(line.move_id) + self.assertFalse(line.move_id.state == 'posted') + + self.spread2.action_undo_spread() + for line in self.spread2.line_ids: + self.assertFalse(line.move_id) + + self.spread2.action_recalculate_spread() + for line in self.spread2.line_ids: + self.assertTrue(line.move_id) + self.assertTrue(line.move_id) + self.assertFalse(line.move_id.state == 'posted') + # try to create move lines again: an error is raised + with self.assertRaises(UserError): + line.create_move() + + def test_12_supplier_invoice_auto_post(self): + # spread date set + self.spread.write({ + 'period_number': 8, + 'period_type': 'month', + 'move_line_auto_post': True, + }) + + self.spread.compute_spread_board() + + # create moves for all the spread lines and open them + self.spread.line_ids.create_and_reconcile_moves() + + # check move lines + for spread_line in self.spread.line_ids: + for move_line in spread_line.move_id.line_ids: + spread_account = self.spread.debit_account_id + if move_line.account_id == spread_account: + debit = move_line.debit + self.assertAlmostEqual(debit, spread_line.amount) + + self.assertTrue(self.spread.move_line_auto_post) + for line in self.spread.line_ids: + self.assertTrue(line.move_id) + self.assertTrue(line.move_id.state == 'posted') + + self.assertEqual(self.spread.unspread_amount, 0.) + self.assertEqual(self.spread.unposted_amount, 0.) + + def test_13_create_move_in_invoice_auto_post(self): + self.spread2.write({ + 'period_number': 4, + 'move_line_auto_post': True, + }) + self.spread_account.reconcile = True + self.assertTrue(self.spread_account.reconcile) + + self.spread2.compute_spread_board() + for line in self.spread2.line_ids: + self.assertFalse(line.move_id) + line.create_move() + self.assertTrue(line.move_id) + self.assertTrue(line.move_id.state == 'posted') + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_14_negative_amount(self): + # spread date set + self.spread.write({ + 'estimated_amount': -1000.0, + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07' + }) + with self.assertRaises(UserError): + self.spread.compute_spread_board() + + spread_lines = self.spread.line_ids + self.assertFalse(spread_lines) + + def test_15_compute_spread_board_line_account_deprecated(self): + self.spread.debit_account_id.deprecated = True + self.assertTrue(self.spread.debit_account_id.deprecated) + + self.assertTrue(self.spread.is_debit_account_deprecated) + self.spread.compute_spread_board() + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_16_compute_spread_board_line_account_deprecated(self): + self.spread.credit_account_id.deprecated = True + self.assertTrue(self.spread.credit_account_id.deprecated) + + self.assertTrue(self.spread.is_credit_account_deprecated) + self.spread.compute_spread_board() + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_17_compute_spread_board_line_account_deprecated(self): + self.spread.compute_spread_board() + self.spread.debit_account_id.deprecated = True + self.assertTrue(self.spread.debit_account_id.deprecated) + + for line in self.spread.line_ids: + self.assertFalse(line.move_id) + with self.assertRaises(UserError): + line.create_move() + + self.assertEqual(self.spread.unspread_amount, 1000.0) + self.assertEqual(self.spread.unposted_amount, 1000.0) + + def test_18_supplier_invoice(self): + # spread date set + self.spread.write({ + 'period_number': 12, + 'period_type': 'month', + 'spread_date': '2017-01-07' + }) + self.spread_account.reconcile = True + self.assertTrue(self.spread_account.reconcile) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 13) + + for line in spread_lines: + self.assertFalse(line.move_id) + + spread_lines[0]._create_moves().post() + spread_lines[1]._create_moves().post() + spread_lines[2]._create_moves().post() + spread_lines[3]._create_moves().post() + + self.assertEqual(spread_lines[0].move_id.state, 'posted') + self.assertEqual(spread_lines[1].move_id.state, 'posted') + self.assertEqual(spread_lines[2].move_id.state, 'posted') + self.assertEqual(spread_lines[3].move_id.state, 'posted') + + self.assertAlmostEqual(self.spread.unspread_amount, 682.81) + self.assertAlmostEqual(self.spread.unposted_amount, 682.81) + + self.spread.compute_spread_board() + spread_lines = self.spread.line_ids + self.assertEqual(len(spread_lines), 13) + + self.assertEqual(67.20, spread_lines[0].amount) + self.assertEqual(83.33, spread_lines[1].amount) + self.assertEqual(83.33, spread_lines[2].amount) + self.assertEqual(83.33, spread_lines[3].amount) + self.assertEqual(83.33, spread_lines[4].amount) + self.assertEqual(83.33, spread_lines[5].amount) + self.assertEqual(83.33, spread_lines[6].amount) + self.assertEqual(83.33, spread_lines[7].amount) + self.assertEqual(83.33, spread_lines[8].amount) + self.assertEqual(83.33, spread_lines[9].amount) + self.assertEqual(83.33, spread_lines[10].amount) + self.assertEqual(83.33, spread_lines[11].amount) + self.assertEqual(16.17, spread_lines[12].amount) + + self.assertEqual('2017-01-31', spread_lines[0].date) + self.assertEqual('2017-02-28', spread_lines[1].date) + self.assertEqual('2017-03-31', spread_lines[2].date) + self.assertEqual('2017-04-30', spread_lines[3].date) + self.assertEqual('2017-05-31', spread_lines[4].date) + self.assertEqual('2017-06-30', spread_lines[5].date) + self.assertEqual('2017-07-31', spread_lines[6].date) + self.assertEqual('2017-08-31', spread_lines[7].date) + self.assertEqual('2017-09-30', spread_lines[8].date) + self.assertEqual('2017-10-31', spread_lines[9].date) + self.assertEqual('2017-11-30', spread_lines[10].date) + self.assertEqual('2017-12-31', spread_lines[11].date) + self.assertEqual('2018-01-31', spread_lines[12].date) + + self.assertAlmostEqual(self.spread.unspread_amount, 682.81) + self.assertAlmostEqual(self.spread.unposted_amount, 682.81) diff --git a/account_spread_cost_revenue/views/account_invoice.xml b/account_spread_cost_revenue/views/account_invoice.xml new file mode 100644 index 00000000..9a86f04a --- /dev/null +++ b/account_spread_cost_revenue/views/account_invoice.xml @@ -0,0 +1,24 @@ + + + + + account.invoice + + + + + + + + + + account.invoice + + + + + + + + + diff --git a/account_spread_cost_revenue/views/account_spread.xml b/account_spread_cost_revenue/views/account_spread.xml new file mode 100644 index 00000000..f40e65c9 --- /dev/null +++ b/account_spread_cost_revenue/views/account_spread.xml @@ -0,0 +1,178 @@ + + + + + account.spread + +

+
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Cost-Revenue Spread

+ + +

Beta License: AGPL-3 OCA/account-financial-tools Translate me on Weblate Try me on Runbot

+

Allows to spread costs or revenues over a customizable periods, to even out cost or invoice spikes.

+

Table of contents

+ +
+

Configuration

+

To be able to access the full spreading features, the user must belong to Show Full Accounting Features group.

+

On the form view of the company, in the Account Spread tab, you can configure +the journals in which the spread journal items will be generated by default:

+
    +
  • the Default Spread Journal for Revenues,
  • +
  • the Default Spread Journal for Expenses.
  • +
+

In the same Account Spread tab, you can also configure the Spread Balance Sheet Accounts used by default:

+
    +
  • the Default Spread Account for Revenues,
  • +
  • the Default Spread Account for Expenses.
  • +
+
+
+

Usage

+

Under Invoicing -> Adviser -> Accounting Entries -> Spread Costs/Revenues, create a new spread board.

+

Complete the definition of the spreading criteria, by setting the the fields:

+
    +
  • Debit Account
  • +
  • Credit Account
  • +
  • Estimated Amount (The total amount to spread)
  • +
  • Number of Repetitions
  • +
  • Period Type (Duration of each period)
  • +
  • Start date
  • +
  • Journal
  • +
+
+Create a new spread board +
+

Click on the button on the top-left to calculate the spread lines.

+
+The spreading board is defined +
+

A cron job will automatically create the accounting moves for all the lines having date previous that the current day (today).

+
+The spreading board is updated by the cron job +
+

By default, the status of the created accounting moves is unposted, so you should post them manually one by one. +To allow the automatic posting of the accounting moves, set the flag Auto-post lines to True.

+

Create an invoice or vendor bill in draft. On its lines, the spreading right-arrow icon are displayed in dark-grey color.

+
+On the invoice line the spreading icon is displayed +
+

Click on the spreading right-arrow icon. A wizard prompts to enter a Spread Action Type:

+
    +
  • Link to existing spread board
  • +
  • Create from spread template
  • +
  • Create new spread board
  • +
+

Select Link to existing spread board and enter the previously generated Spread Board. Click on Confirm button: +the selected Spread Board will be automatically displayed.

+

Go back to the draft invoice/bill. The spreading functionality is now enabled on the invoice line: +the spreading right-arrow icon is now displayed in green color.

+
+On the invoice line the spreading icon is displayed in green color +
+

Validate the invoice/bill. Click on the spreading (green) right-arrow icon to open the spread board, then click +on the smart button Reconciled entries: the moves of the spread lines are reconciled with the move of the invoice line.

+

In case the Subtotal Price of the invoice line is different than the Estimated Amount of the spread board, the spread +lines (not yet posted) will be recalculated when validating the invoice/bill.

+

Click on button Recalculate entire spread button in the spread board to force the recalculation of the spread lines: +this will also reset all the journal entries previously created.

+
+
+

Known issues / Roadmap

+
    +
  • Verify last day of month
  • +
  • Not yet compatible with cutoff module: create module for adaptation?
  • +
+
+
+

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

+
    +
  • Onestein
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

Part of the code in this module (in particular the computation of the spread lines) +is highly inspired by the Assets Management module from the standard +Odoo 11.0 Community developed by Odoo SA.

+
+
+

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.

+

Current maintainer:

+

astirpe

+

This module is part of the OCA/account-financial-tools project on GitHub.

+

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

+
+
+