diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index b05bb73224b3..d1d968d758ca 100644 --- a/l10n_it_riba/README.rst +++ b/l10n_it_riba/README.rst @@ -46,9 +46,10 @@ Nella configurazione delle RiBa è possibile specificare se si tratti di 'Salvo buon fine' o 'Al dopo incasso', che hanno un flusso completamente diverso. -- Al dopo incasso: nessuna registrazione verrà effettuata - automaticamente e le fatture risulteranno pagate solo al momento - dell'effettivo incasso. +- Al dopo incasso: le fatture risulteranno pagate all'accettazione; + l'incasso potrà essere registrato con una normale riconciliazione + bancaria, che andrà a chiudere gli "effetti attivi" aperti + all'accettazione. - Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel documento http://goo.gl/jpRhJp @@ -137,6 +138,10 @@ Contributors - Simone Rubino +- `TAKOBI `__: + + - Simone Rubino + Maintainers ----------- diff --git a/l10n_it_riba/models/riba.py b/l10n_it_riba/models/riba.py index 3b0f529ec62b..bd8c45c94351 100644 --- a/l10n_it_riba/models/riba.py +++ b/l10n_it_riba/models/riba.py @@ -229,21 +229,15 @@ def _compute_line_values(self): line.invoice_number = "" for move_line in line.move_line_ids: line.amount += move_line.amount - if not line.invoice_date: - line.invoice_date = str( - fields.Date.from_string( - move_line.move_line_id.move_id.invoice_date - ).strftime("%d/%m/%Y") + move_date = move_line.move_line_id.move_id.invoice_date + if move_date: + move_date = str( + fields.Date.from_string(move_date).strftime("%d/%m/%Y") ) + if not line.invoice_date: + line.invoice_date = move_date else: - line.invoice_date = "{}, {}".format( - line.invoice_date, - str( - fields.Date.from_string( - move_line.move_line_id.move_id.invoice_date - ).strftime("%d/%m/%Y") - ), - ) + line.invoice_date = f"{line.invoice_date}, {move_date}" if not line.invoice_number: line.invoice_number = str( move_line.move_line_id.move_id.name diff --git a/l10n_it_riba/readme/CONFIGURE.md b/l10n_it_riba/readme/CONFIGURE.md index 6351bf395a5c..9f66b04bd998 100644 --- a/l10n_it_riba/readme/CONFIGURE.md +++ b/l10n_it_riba/readme/CONFIGURE.md @@ -4,9 +4,9 @@ Nella configurazione delle RiBa è possibile specificare se si tratti di 'Salvo buon fine' o 'Al dopo incasso', che hanno un flusso completamente diverso. -- Al dopo incasso: nessuna registrazione verrà effettuata - automaticamente e le fatture risulteranno pagate solo al momento - dell'effettivo incasso. +- Al dopo incasso: le fatture risulteranno pagate all'accettazione; + l'incasso potrà essere registrato con una normale riconciliazione bancaria, + che andrà a chiudere gli "effetti attivi" aperti all'accettazione. - Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel documento diff --git a/l10n_it_riba/readme/CONTRIBUTORS.md b/l10n_it_riba/readme/CONTRIBUTORS.md index 58030179509e..3df181814a65 100644 --- a/l10n_it_riba/readme/CONTRIBUTORS.md +++ b/l10n_it_riba/readme/CONTRIBUTORS.md @@ -12,3 +12,5 @@ - Giovanni Serra \<\> - [Aion Tech](https://aiontech.company/): - Simone Rubino \<\> +- [TAKOBI](https://takobi.online): + - Simone Rubino \<\> diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index bd0be7b41be9..364e4fba11ea 100644 --- a/l10n_it_riba/static/description/index.html +++ b/l10n_it_riba/static/description/index.html @@ -392,9 +392,10 @@

Configuration

‘Salvo buon fine’ o ‘Al dopo incasso’, che hanno un flusso completamente diverso.

    -
  • Al dopo incasso: nessuna registrazione verrà effettuata -automaticamente e le fatture risulteranno pagate solo al momento -dell’effettivo incasso.
  • +
  • Al dopo incasso: le fatture risulteranno pagate all’accettazione; +l’incasso potrà essere registrato con una normale riconciliazione +bancaria, che andrà a chiudere gli “effetti attivi” aperti +all’accettazione.
  • Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel documento http://goo.gl/jpRhJp
@@ -470,6 +471,10 @@

Contributors

  • Simone Rubino <simone.rubino@aion-tech.it>
  • +
  • TAKOBI: +
  • diff --git a/l10n_it_riba/tests/riba_common.py b/l10n_it_riba/tests/riba_common.py index 522a17bfc4e8..705a851a37c7 100644 --- a/l10n_it_riba/tests/riba_common.py +++ b/l10n_it_riba/tests/riba_common.py @@ -157,6 +157,7 @@ def setUp(self): } ) self.riba_config = self.create_config() + self.riba_config_incasso = self.create_config_incasso() self.account_payment_term_riba = self.env.ref( "l10n_it_riba.account_payment_term_riba" ) @@ -282,3 +283,14 @@ def create_config(self): "protest_charge_account_id": self.expenses_account.id, } ) + + def create_config_incasso(self): + return self.env["riba.configuration"].create( + { + "name": "After Collection", + "type": "incasso", + "bank_id": self.company_bank.id, + "acceptance_journal_id": self.bank_journal.id, + "acceptance_account_id": self.sbf_effects.id, + } + ) diff --git a/l10n_it_riba/tests/test_riba.py b/l10n_it_riba/tests/test_riba.py index 891ceeed608b..608b864c85e1 100644 --- a/l10n_it_riba/tests/test_riba.py +++ b/l10n_it_riba/tests/test_riba.py @@ -8,7 +8,8 @@ import os from odoo.exceptions import UserError -from odoo.tools import config +from odoo.tests import Form +from odoo.tools import config, safe_eval from . import riba_common @@ -238,6 +239,40 @@ def test_riba_flow(self): self.assertEqual(riba_list.state, "credited") self.assertEqual(riba_list.line_ids[0].state, "credited") + def test_riba_incasso_flow(self): + """ + RiBa of type 'After Collection' pays invoice when accepted. + """ + self.invoice.company_id.due_cost_service_id = self.service_due_cost + self.invoice.action_post() + self.assertEqual(self.invoice.state, "posted") + + to_issue_action = self.env.ref("l10n_it_riba.action_riba_to_issue") + to_issue_model = self.env[to_issue_action.res_model] + to_issue_domain = safe_eval.safe_eval(to_issue_action.domain) + to_issue_records = ( + to_issue_model.search(to_issue_domain) & self.invoice.line_ids + ) + self.assertTrue(to_issue_records) + + issue_wizard_context = { + "active_model": to_issue_records._name, + "active_ids": to_issue_records.ids, + } + issue_wizard_model = self.env["riba.issue"].with_context(**issue_wizard_context) + issue_wizard_form = Form(issue_wizard_model) + issue_wizard_form.configuration_id = self.riba_config_incasso + issue_wizard = issue_wizard_form.save() + issue_result = issue_wizard.create_list() + + riba_list_id = issue_result["res_id"] + riba_list_model = issue_result["res_model"] + riba_list = self.env[riba_list_model].browse(riba_list_id) + riba_list.confirm() + + self.assertEqual(riba_list.state, "accepted") + self.assertEqual(self.invoice.payment_state, "paid") + def test_past_due_riba(self): # create another invoice to test past due RiBa self.partner.property_account_receivable_id = self.account_rec1_id.id @@ -580,3 +615,43 @@ def test_riba_bank_multicompany(self): exc_message = ue.exception.args[0] self.assertIn(current_company.name, exc_message) self.assertIn(partner_bank.display_name, exc_message) + + def test_riba_line_date_no_move(self): + """ + The RiBa line can compute the date when the linked move has been deleted. + """ + # Arrange: Create RiBa for an invoice + self.invoice.company_id.due_cost_service_id = self.service_due_cost + self.invoice.action_post() + self.assertEqual(self.invoice.state, "posted") + + to_issue_action = self.env.ref("l10n_it_riba.action_riba_to_issue") + to_issue_model = self.env[to_issue_action.res_model] + to_issue_domain = safe_eval.safe_eval(to_issue_action.domain) + to_issue_records = ( + to_issue_model.search(to_issue_domain) & self.invoice.line_ids + ) + self.assertTrue(to_issue_records) + + issue_wizard_context = { + "active_model": to_issue_records._name, + "active_ids": to_issue_records.ids, + } + issue_wizard_model = self.env["riba.issue"].with_context(**issue_wizard_context) + issue_wizard_form = Form(issue_wizard_model) + issue_wizard_form.configuration_id = self.riba_config_incasso + issue_wizard = issue_wizard_form.save() + issue_result = issue_wizard.create_list() + + # Act: Delete the invoice + self.invoice.button_draft() + self.invoice.unlink() + + # Assert: The dates on RiBa lines are empty + riba_list_id = issue_result["res_id"] + riba_list_model = issue_result["res_model"] + riba_list = self.env[riba_list_model].browse(riba_list_id) + self.assertEqual( + riba_list.line_ids.mapped("invoice_date"), + [False] * 2, + ) diff --git a/l10n_it_riba/views/configuration_view.xml b/l10n_it_riba/views/configuration_view.xml index 39dda570b322..fef7a97e5234 100644 --- a/l10n_it_riba/views/configuration_view.xml +++ b/l10n_it_riba/views/configuration_view.xml @@ -61,7 +61,13 @@ - + + + + diff --git a/l10n_it_riba/views/riba_view.xml b/l10n_it_riba/views/riba_view.xml index e97ea6944851..08346047f847 100644 --- a/l10n_it_riba/views/riba_view.xml +++ b/l10n_it_riba/views/riba_view.xml @@ -141,7 +141,7 @@ type='object' string="Mark as Accepted" class="oe_highlight" - attrs="{'invisible':['|',('state','!=','draft'),('type','=','incasso')]}" + attrs="{'invisible':['|',('state','!=','draft'),('type','not in',('incasso', 'sbf'))]}" />