diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index b4423dc66814..2acd834b0288 100644 --- a/l10n_it_riba/README.rst +++ b/l10n_it_riba/README.rst @@ -7,7 +7,7 @@ ITA - Ricevute bancarie !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:f183b89e0ff9f4553d6c9b7bf67496a1763367fdd85b99ce7fc0c3151ec78822 + !! source digest: sha256:6571e91cba2411e3d9f9e72c7212131fd86c377b225ee6d94a6f637b36512391 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -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 @@ -97,6 +98,10 @@ presente sia sulla distinta che sulle sue righe. La voce di menù 'Presentazione Riba' permette estrarre le riba fino al raggiungimento dell'importo massimo inserito dall'utente. +Nella lista delle fatture è presente una colonna per monitorare l' +esposizione, cioè l'importo dovuto dal cliente a fronte dell'emissione +della RiBa non ancora scaduta. + Known issues / Roadmap ====================== @@ -137,6 +142,12 @@ Contributors - Simone Rubino +- `TAKOBI `__: + + - Simone Rubino + +- Nextev Srl + Maintainers ----------- diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py index ab3e2564edc5..69e27b281a11 100644 --- a/l10n_it_riba/__manifest__.py +++ b/l10n_it_riba/__manifest__.py @@ -10,7 +10,7 @@ { "name": "ITA - Ricevute bancarie", - "version": "16.0.1.2.3", + "version": "16.0.1.5.0", "development_status": "Beta", "author": "Odoo Community Association (OCA)", "category": "Localization/Italy", @@ -42,6 +42,7 @@ "views/slip_report.xml", "views/riba_detail_view.xml", "views/wizard_presentation.xml", + "views/wizard_due_date_settlement.xml", ], "demo": ["demo/riba_demo.xml"], "installable": True, diff --git a/l10n_it_riba/i18n/it.po b/l10n_it_riba/i18n/it.po index 56dc7e372e75..adc99e47d3c0 100644 --- a/l10n_it_riba/i18n/it.po +++ b/l10n_it_riba/i18n/it.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-28 10:26+0000\n" -"PO-Revision-Date: 2024-01-22 10:39+0000\n" +"PO-Revision-Date: 2024-06-24 12:14+0000\n" "Last-Translator: mymage \n" "Language-Team: \n" "Language: it\n" @@ -200,6 +200,11 @@ msgstr "Conto effetti" msgid "Bills Amount" msgstr "Importo effetti" +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.action_wizard_riba_due_date_settlement +msgid "C/O Due Date Settlement" +msgstr "Registrazione Riba a data di scadenza" + #. module: l10n_it_riba #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cig msgid "CIG" @@ -212,6 +217,7 @@ msgstr "CUP" #. module: l10n_it_riba #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due #: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form @@ -273,6 +279,11 @@ msgstr "Configurazione" msgid "Configuration parameters for RiBa" msgstr "Parametri di configurazione Riba" +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement +msgid "Confirm" +msgstr "Conferma" + #. module: l10n_it_riba #: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__confirmed #: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter @@ -296,6 +307,7 @@ msgstr "Crea" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__create_uid @@ -309,6 +321,7 @@ msgstr "Creato da" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__create_date @@ -433,6 +446,7 @@ msgstr "Dettaglio" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__display_name @@ -451,6 +465,7 @@ msgid "Draft" msgstr "Bozza" #. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__due_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__due_date #: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb msgid "Due Date" @@ -552,6 +567,7 @@ msgstr "IBAN" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__id @@ -683,6 +699,7 @@ msgstr "Lasciare vuoto per utilizzare la data corrente." #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due____last_update @@ -696,6 +713,7 @@ msgstr "Ultima modifica il" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__write_uid @@ -709,6 +727,7 @@ msgstr "Ultimo aggiornamento di" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__write_date @@ -820,6 +839,7 @@ msgstr "Nessuna partita IVA o codice fiscale specificato per %(partner)s" #. module: l10n_it_riba #. odoo-python #: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_due_date_settlement.py:0 #: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 #, python-format msgid "No active ID found." @@ -1198,6 +1218,11 @@ msgstr "RiBa da emettere" msgid "RiBa configuration to be used." msgstr "Configurazione RiBa da utilizzare." +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_due_date_settlement +msgid "Riba Due Date Settlement" +msgstr "Registrazione Riba a data di scadenza" + #. module: l10n_it_riba #: model:ir.model.fields,field_description:l10n_it_riba.field_account_setup_bank_manual_config__codice_sia #: model:ir.model.fields,field_description:l10n_it_riba.field_res_partner_bank__codice_sia @@ -1302,6 +1327,13 @@ msgstr "" "Questa procedura genera la registrazione contabile relativa all'accredito " "ricevuto dalla banca" +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement +msgid "This wizard will set 'Paid' all C/O details selected by due date" +msgstr "" +"Questa procedura guidata imposterà come \"Pagate\" tutte le righe dettaglio " +"RiBa selezionate per data di scadenza" + #. module: l10n_it_riba #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter msgid "To Reconcile" diff --git a/l10n_it_riba/i18n/l10n_it_riba.pot b/l10n_it_riba/i18n/l10n_it_riba.pot index b935797e0151..76eee19015eb 100644 --- a/l10n_it_riba/i18n/l10n_it_riba.pot +++ b/l10n_it_riba/i18n/l10n_it_riba.pot @@ -186,6 +186,11 @@ msgstr "" msgid "Bills Amount" msgstr "" +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.action_wizard_riba_due_date_settlement +msgid "C/O Due Date Settlement" +msgstr "" + #. module: l10n_it_riba #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cig msgid "CIG" @@ -198,6 +203,7 @@ msgstr "" #. module: l10n_it_riba #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due #: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form @@ -257,6 +263,11 @@ msgstr "" msgid "Configuration parameters for RiBa" msgstr "" +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement +msgid "Confirm" +msgstr "" + #. module: l10n_it_riba #: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__confirmed #: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter @@ -280,6 +291,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__create_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__create_uid @@ -293,6 +305,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__create_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__create_date @@ -416,6 +429,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__display_name #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__display_name @@ -434,6 +448,7 @@ msgid "Draft" msgstr "" #. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__due_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__due_date #: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb msgid "Due Date" @@ -535,6 +550,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__id #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__id @@ -665,6 +681,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue____last_update #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due____last_update @@ -678,6 +695,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__write_uid #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__write_uid @@ -691,6 +709,7 @@ msgstr "" #: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_due_date_settlement__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__write_date #: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__write_date @@ -803,6 +822,7 @@ msgstr "" #. odoo-python #: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 #: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_due_date_settlement.py:0 #: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 #: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 #, python-format @@ -1182,6 +1202,11 @@ msgstr "" msgid "RiBa configuration to be used." msgstr "" +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_due_date_settlement +msgid "Riba Due Date Settlement" +msgstr "" + #. module: l10n_it_riba #: model:ir.model.fields,field_description:l10n_it_riba.field_account_setup_bank_manual_config__codice_sia #: model:ir.model.fields,field_description:l10n_it_riba.field_res_partner_bank__codice_sia @@ -1279,6 +1304,11 @@ msgid "" "the bank" msgstr "" +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_due_date_settlement +msgid "This wizard will set 'Paid' all C/O details selected by due date" +msgstr "" + #. module: l10n_it_riba #: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter msgid "To Reconcile" diff --git a/l10n_it_riba/models/account.py b/l10n_it_riba/models/account.py index 78640973d30e..4aeea8e1367c 100644 --- a/l10n_it_riba/models/account.py +++ b/l10n_it_riba/models/account.py @@ -5,6 +5,7 @@ # (). # Copyright (C) 2012-2018 Lorenzo Battistini - Agile Business Group # Copyright 2023 Simone Rubino - Aion Tech +# Copyright 2024 Nextev Srl # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import _, api, fields, models @@ -58,9 +59,30 @@ def _compute_is_past_due(self): if len(invoice.past_due_move_line_ids) != reconciled_past_due: invoice.is_past_due = True + def _compute_open_amount(self): + for invoice in self: + if invoice.is_riba_payment: + today = fields.Date.today() + open_amount_line_ids = invoice.line_ids.filtered( + lambda line, today=today: line.riba + and line.display_type == "payment_term" + and line.date_maturity > today + ) + invoice.open_amount = sum(open_amount_line_ids.mapped("balance")) + else: + invoice.open_amount = 0.0 + riba_credited_ids = fields.One2many( "riba.slip", "credit_move_id", "Credited RiBa Slips", readonly=True ) + + open_amount = fields.Float( + digits="Account", + compute="_compute_open_amount", + default=0.0, + help="Amount currently only supposed to be paid, but has actually not happened", + ) + riba_past_due_ids = fields.One2many( "riba.slip.line", "past_due_move_id", "Past Due RiBa Slips", readonly=True ) diff --git a/l10n_it_riba/models/riba.py b/l10n_it_riba/models/riba.py index c4928c7efe56..a6401dc4c92c 100644 --- a/l10n_it_riba/models/riba.py +++ b/l10n_it_riba/models/riba.py @@ -5,6 +5,7 @@ # (). # Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group # Copyright 2023 Simone Rubino - Aion Tech +# Copyright 2024 Nextev Srl # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from datetime import date @@ -35,6 +36,12 @@ def _compute_payment_ids(self): move_lines |= line.payment_ids riba.payment_ids = move_lines + def _compute_total_values(self): + for riba in self: + riba.total_amount = 0.0 + for line in riba.line_ids: + riba.total_amount += line.amount + _name = "riba.slip" _description = "RiBa Slip" _inherit = ["mail.thread"] @@ -123,6 +130,10 @@ def _compute_payment_ids(self): default=lambda self: fields.Date.context_today(self), help="Keep empty to use the current date.", ) + total_amount = fields.Float( + string="Amount", + compute="_compute_total_values", + ) def action_riba_export(self): return { @@ -134,6 +145,16 @@ def action_riba_export(self): "context": self.env.context, } + def action_riba_due_date_settlement(self): + return { + "type": "ir.actions.act_window", + "name": "C/O Due Date Settlement", + "res_model": "riba.due.date.settlement", + "view_mode": "form", + "target": "new", + "context": self.env.context, + } + @api.ondelete(at_uninstall=False) def _unlink_if_not_confirmed(self): for riba_list in self: @@ -205,6 +226,11 @@ def action_cancel_draft(self): for line in riba_list.line_ids: line.state = "draft" + def action_open_lines(self): + action = self.env.ref("l10n_it_riba.detail_riba_action").read()[0] + action["domain"] = [("slip_id", "=", self.id)] + return action + class RibaListLine(models.Model): _name = "riba.slip.line" @@ -219,21 +245,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 @@ -372,7 +392,7 @@ def confirm(self): line.invoice_number, line.slip_id.name, line.sequence ), "journal_id": journal.id, - "date": line.slip_id.registration_date, + "date": line.due_date, } ) to_be_reconciled = self.env["account.move.line"] @@ -513,6 +533,11 @@ def riba_line_settlement(self): to_be_settled.reconcile() + def settle_riba_line(self): + for line in self: + if line.state == "credited": + line.riba_line_settlement() + class RibaListMoveLine(models.Model): _name = "riba.slip.move.line" diff --git a/l10n_it_riba/models/riba_config.py b/l10n_it_riba/models/riba_config.py index 7dbfae2ade15..c58b30ede459 100644 --- a/l10n_it_riba/models/riba_config.py +++ b/l10n_it_riba/models/riba_config.py @@ -13,6 +13,7 @@ class RibaConfiguration(models.Model): _name = "riba.configuration" _description = "Configuration parameters for RiBa" + _check_company_auto = True name = fields.Char("Description", size=64, required=True) type = fields.Selection( @@ -24,17 +25,20 @@ class RibaConfiguration(models.Model): "res.partner.bank", "Bank Account", required=True, + check_company=True, help="Bank account used for RiBa issuing.", ) acceptance_journal_id = fields.Many2one( "account.journal", "Acceptance Journal", - domain=[("type", "=", "bank")], + check_company=True, + domain="[('company_id', '=', company_id), ('type', '=', 'bank')]", help="Journal used when RiBa is accepted by the bank.", ) acceptance_account_id = fields.Many2one( "account.account", "Acceptance Account", + check_company=True, help="Account used when RiBa is accepted by the bank.", ) company_id = fields.Many2one( @@ -46,36 +50,47 @@ class RibaConfiguration(models.Model): credit_journal_id = fields.Many2one( "account.journal", "Credit Journal", - domain=[("type", "=", "bank")], + check_company=True, + domain="[('company_id', '=', company_id), ('type', '=', 'bank')]", help="Journal used when RiBa amount is credited by the bank.", ) credit_account_id = fields.Many2one( "account.account", "RiBa Account", + check_company=True, help="Account used when RiBa amount is credited by the bank.", - domain=[("account_type", "!=", "liability_credit_card")], + domain="[" + "('company_id', '=', company_id), " + "('account_type', '!=', 'liability_credit_card'), " + "]", ) bank_account_id = fields.Many2one( "account.account", "A/C Bank Account", + check_company=True, ) bank_expense_account_id = fields.Many2one("account.account", "Bank Fees Account") past_due_journal_id = fields.Many2one( "account.journal", "Past Due Journal", - domain=[("type", "=", "bank")], + check_company=True, + domain="[('company_id', '=', company_id), ('type', '=', 'bank')]", help="Journal used when RiBa is past due.", ) overdue_effects_account_id = fields.Many2one( "account.account", "Past Due Bills Account", + check_company=True, ) protest_charge_account_id = fields.Many2one( - "account.account", "Protest Fee Account" + "account.account", + "Protest Fee Account", + check_company=True, ) settlement_journal_id = fields.Many2one( "account.journal", "Settlement Journal", + check_company=True, help="Journal used when customers finally pay the invoice to bank.", ) 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..812954ff69de 100644 --- a/l10n_it_riba/readme/CONTRIBUTORS.md +++ b/l10n_it_riba/readme/CONTRIBUTORS.md @@ -12,3 +12,6 @@ - Giovanni Serra \<\> - [Aion Tech](https://aiontech.company/): - Simone Rubino \<\> +- [TAKOBI](https://takobi.online): + - Simone Rubino \<\> +- Nextev Srl \<\> diff --git a/l10n_it_riba/readme/USAGE.md b/l10n_it_riba/readme/USAGE.md index 043d5c3ef26c..45c816945b6a 100644 --- a/l10n_it_riba/readme/USAGE.md +++ b/l10n_it_riba/readme/USAGE.md @@ -17,3 +17,7 @@ presente sia sulla distinta che sulle sue righe. La voce di menù 'Presentazione Riba' permette estrarre le riba fino al raggiungimento dell'importo massimo inserito dall'utente. + +Nella lista delle fatture è presente una colonna per monitorare l' +esposizione, cioè l'importo dovuto dal cliente a fronte dell'emissione +della RiBa non ancora scaduta. diff --git a/l10n_it_riba/security/ir.model.access.csv b/l10n_it_riba/security/ir.model.access.csv index 4c7c9d9f10b1..a7c4473be717 100644 --- a/l10n_it_riba/security/ir.model.access.csv +++ b/l10n_it_riba/security/ir.model.access.csv @@ -18,3 +18,4 @@ access_riba_past_due,riba_past_due,model_riba_past_due,account.group_account_inv access_riba_credit,riba_credit,model_riba_credit,account.group_account_invoice,1,1,1,1 access_riba_file_export,riba_file_export,model_riba_file_export,account.group_account_invoice,1,1,1,1 access_presentation_riba_issue,access_presentation_riba_issue,model_presentation_riba_issue,account.group_account_invoice,1,1,1,1 +access_riba_due_date_settlement,riba_due_date_settlement,model_riba_due_date_settlement,account.group_account_invoice,1,1,1,1 diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index 365d63a1dd30..1f0208849b3e 100644 --- a/l10n_it_riba/static/description/index.html +++ b/l10n_it_riba/static/description/index.html @@ -366,7 +366,7 @@

ITA - Ricevute bancarie

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:f183b89e0ff9f4553d6c9b7bf67496a1763367fdd85b99ce7fc0c3151ec78822 +!! source digest: sha256:6571e91cba2411e3d9f9e72c7212131fd86c377b225ee6d94a6f637b36512391 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/l10n-italy Translate me on Weblate Try me on Runboat

Italiano

@@ -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
@@ -434,6 +435,9 @@

Usage

presente sia sulla distinta che sulle sue righe.

La voce di menù ‘Presentazione Riba’ permette estrarre le riba fino al raggiungimento dell’importo massimo inserito dall’utente.

+

Nella lista delle fatture è presente una colonna per monitorare l’ +esposizione, cioè l’importo dovuto dal cliente a fronte dell’emissione +della RiBa non ancora scaduta.

Known issues / Roadmap

@@ -470,6 +474,11 @@

Contributors

  • Simone Rubino <simone.rubino@aion-tech.it>
  • +
  • TAKOBI: +
  • +
  • Nextev Srl <odoo@nextev.it>
  • diff --git a/l10n_it_riba/tests/riba_common.py b/l10n_it_riba/tests/riba_common.py index a7f39c7152e1..705a851a37c7 100644 --- a/l10n_it_riba/tests/riba_common.py +++ b/l10n_it_riba/tests/riba_common.py @@ -64,6 +64,11 @@ def setUp(self): ], } ) + self.company2 = self.env["res.company"].create( + { + "name": "company 2", + } + ) self.service_due_cost = self._create_service_due_cost() self.account_model = self.env["account.account"] self.move_line_model = self.env["account.move.line"] @@ -144,7 +149,15 @@ def setUp(self): } ) self.company_bank = self.env.ref("l10n_it_riba.company_bank") + self.company2_bank = self.env["res.partner.bank"].create( + { + "acc_number": "IT000000000000000000", + "partner_id": self.company2.partner_id.id, + "company_id": self.company2.id, + } + ) 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" ) @@ -270,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 583fcaa86b12..ecda65f44f18 100644 --- a/l10n_it_riba/tests/test_riba.py +++ b/l10n_it_riba/tests/test_riba.py @@ -7,7 +7,9 @@ import base64 import os -from odoo.tools import config +from odoo.exceptions import UserError +from odoo.tests import Form +from odoo.tools import config, safe_eval from . import riba_common @@ -249,6 +251,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 @@ -381,11 +417,6 @@ def test_past_due_riba(self): # self.assertTrue( # bank_past_due_line.id in [l.id for l in move_lines_for_rec]) - riba_list.line_ids[0].past_due_move_id.line_ids.remove_move_reconcile() - self.assertEqual(riba_list.state, "credited") - self.assertEqual(len(riba_list.line_ids), 1) - self.assertEqual(riba_list.line_ids[0].state, "credited") - def test_riba_fatturapa(self): self.partner.property_account_receivable_id = self.account_rec1_id.id recent_date = ( @@ -565,3 +596,69 @@ def test_riba_presentation(self): self.env["account.move.line"].search(domain).mapped("amount_residual") ) self.assertTrue(total_amount - total_issue_amount >= 0) + + def test_riba_bank_multicompany(self): + """Configuration parameters for RiBa + can only be created with data of current company.""" + current_company = self.env.company + company_2 = self.company2 + partner_bank = self.company2_bank + partner_bank.company_id = company_2 + # pre-condition + self.assertEqual(partner_bank.company_id, company_2) + self.assertNotEqual(current_company, company_2) + + # Act + with self.assertRaises(UserError) as ue: + self.env["riba.configuration"].create( + { + "name": "Subject To Collection", + "type": "incasso", + "bank_id": partner_bank.id, + } + ) + + # Assert + 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/account_view.xml b/l10n_it_riba/views/account_view.xml index 00e0e055b85d..ee896ca06660 100644 --- a/l10n_it_riba/views/account_view.xml +++ b/l10n_it_riba/views/account_view.xml @@ -163,6 +163,7 @@ + diff --git a/l10n_it_riba/views/configuration_view.xml b/l10n_it_riba/views/configuration_view.xml index f86e3ee857cc..fef7a97e5234 100644 --- a/l10n_it_riba/views/configuration_view.xml +++ b/l10n_it_riba/views/configuration_view.xml @@ -26,6 +26,11 @@ groups="base.group_multi_company" readonly="1" /> + @@ -56,11 +61,31 @@ - + + + + + + + + + riba.configuration.tree + riba.configuration + + + + + + + + diff --git a/l10n_it_riba/views/riba_detail_view.xml b/l10n_it_riba/views/riba_detail_view.xml index eba2d824bc78..4a3857706cec 100644 --- a/l10n_it_riba/views/riba_detail_view.xml +++ b/l10n_it_riba/views/riba_detail_view.xml @@ -43,6 +43,12 @@ + diff --git a/l10n_it_riba/views/riba_view.xml b/l10n_it_riba/views/riba_view.xml index e97ea6944851..f614c83babaa 100644 --- a/l10n_it_riba/views/riba_view.xml +++ b/l10n_it_riba/views/riba_view.xml @@ -55,6 +55,7 @@ + @@ -67,61 +68,63 @@ riba.slip.line
    - - - + + + - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + - + + - -
    - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + +
    + +
    @@ -141,7 +144,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'))]}" />
    + + + + + + + + + + + + + + + + + +