From 3b71d063eaefdcfb6edada4f17a51f1e96f7c09a Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Fri, 13 Jan 2023 10:48:49 +0100 Subject: [PATCH 01/50] [MIG] l10n_it_ricevute_bancarie: Migration to 16.0 Migration scripts not tested because `account` module cannot be migrated yet with OpenUpgrade Co-authored-by: Tony Masci <45100916+TonyMasciI@users.noreply.github.com> --- l10n_it_riba/README.rst | 152 ++ l10n_it_riba/__init__.py | 8 + l10n_it_riba/__manifest__.py | 48 + l10n_it_riba/data/riba_sequence.xml | 16 + l10n_it_riba/demo/riba_demo.xml | 41 + l10n_it_riba/i18n/it.po | 1358 ++++++++++++++++ l10n_it_riba/i18n/l10n_it_riba.pot | 1373 +++++++++++++++++ .../migrations/16.0.1.0.0/data/noupdate.xml | 22 + .../migrations/16.0.1.0.0/post-migrate.py | 16 + .../migrations/16.0.1.0.0/pre-migrate.py | 284 ++++ l10n_it_riba/models/__init__.py | 15 + l10n_it_riba/models/account.py | 401 +++++ l10n_it_riba/models/account_config.py | 37 + l10n_it_riba/models/bank_statement.py | 84 + l10n_it_riba/models/ir_ui_menu.py | 27 + l10n_it_riba/models/partner.py | 18 + l10n_it_riba/models/riba.py | 522 +++++++ l10n_it_riba/models/riba_config.py | 104 ++ l10n_it_riba/readme/CONFIGURE.rst | 30 + l10n_it_riba/readme/CONTRIBUTORS.rst | 15 + l10n_it_riba/readme/DESCRIPTION.rst | 3 + l10n_it_riba/readme/ROADMAP.rst | 4 + l10n_it_riba/readme/USAGE.rst | 19 + l10n_it_riba/report/__init__.py | 4 + l10n_it_riba/report/report.xml | 16 + l10n_it_riba/report/slip_qweb.py | 19 + l10n_it_riba/security/ir.model.access.csv | 20 + l10n_it_riba/security/riba_security.xml | 36 + l10n_it_riba/static/description/icon.png | Bin 0 -> 17433 bytes l10n_it_riba/static/description/index.html | 486 ++++++ l10n_it_riba/tests/__init__.py | 9 + l10n_it_riba/tests/riba_common.py | 272 ++++ l10n_it_riba/tests/test_menu.py | 51 + l10n_it_riba/tests/test_riba.py | 538 +++++++ l10n_it_riba/views/account_config_view.xml | 46 + l10n_it_riba/views/account_view.xml | 204 +++ l10n_it_riba/views/configuration_view.xml | 83 + l10n_it_riba/views/partner_view.xml | 24 + l10n_it_riba/views/riba_detail_view.xml | 92 ++ l10n_it_riba/views/riba_view.xml | 273 ++++ l10n_it_riba/views/slip_report.xml | 143 ++ l10n_it_riba/views/wizard_credit.xml | 55 + l10n_it_riba/views/wizard_past_due.xml | 60 + l10n_it_riba/views/wizard_presentation.xml | 50 + .../views/wizard_riba_file_export.xml | 33 + l10n_it_riba/views/wizard_riba_issue.xml | 46 + l10n_it_riba/wizard/__init__.py | 13 + l10n_it_riba/wizard/wizard_credit.py | 156 ++ l10n_it_riba/wizard/wizard_past_due.py | 237 +++ .../wizard/wizard_presentation_riba.py | 47 + .../wizard/wizard_riba_file_export.py | 423 +++++ l10n_it_riba/wizard/wizard_riba_issue.py | 144 ++ 52 files changed, 8177 insertions(+) create mode 100644 l10n_it_riba/README.rst create mode 100644 l10n_it_riba/__init__.py create mode 100644 l10n_it_riba/__manifest__.py create mode 100644 l10n_it_riba/data/riba_sequence.xml create mode 100644 l10n_it_riba/demo/riba_demo.xml create mode 100644 l10n_it_riba/i18n/it.po create mode 100644 l10n_it_riba/i18n/l10n_it_riba.pot create mode 100644 l10n_it_riba/migrations/16.0.1.0.0/data/noupdate.xml create mode 100644 l10n_it_riba/migrations/16.0.1.0.0/post-migrate.py create mode 100644 l10n_it_riba/migrations/16.0.1.0.0/pre-migrate.py create mode 100644 l10n_it_riba/models/__init__.py create mode 100644 l10n_it_riba/models/account.py create mode 100644 l10n_it_riba/models/account_config.py create mode 100644 l10n_it_riba/models/bank_statement.py create mode 100644 l10n_it_riba/models/ir_ui_menu.py create mode 100644 l10n_it_riba/models/partner.py create mode 100644 l10n_it_riba/models/riba.py create mode 100644 l10n_it_riba/models/riba_config.py create mode 100644 l10n_it_riba/readme/CONFIGURE.rst create mode 100644 l10n_it_riba/readme/CONTRIBUTORS.rst create mode 100644 l10n_it_riba/readme/DESCRIPTION.rst create mode 100644 l10n_it_riba/readme/ROADMAP.rst create mode 100644 l10n_it_riba/readme/USAGE.rst create mode 100644 l10n_it_riba/report/__init__.py create mode 100644 l10n_it_riba/report/report.xml create mode 100644 l10n_it_riba/report/slip_qweb.py create mode 100644 l10n_it_riba/security/ir.model.access.csv create mode 100644 l10n_it_riba/security/riba_security.xml create mode 100644 l10n_it_riba/static/description/icon.png create mode 100644 l10n_it_riba/static/description/index.html create mode 100644 l10n_it_riba/tests/__init__.py create mode 100644 l10n_it_riba/tests/riba_common.py create mode 100644 l10n_it_riba/tests/test_menu.py create mode 100644 l10n_it_riba/tests/test_riba.py create mode 100644 l10n_it_riba/views/account_config_view.xml create mode 100644 l10n_it_riba/views/account_view.xml create mode 100644 l10n_it_riba/views/configuration_view.xml create mode 100644 l10n_it_riba/views/partner_view.xml create mode 100644 l10n_it_riba/views/riba_detail_view.xml create mode 100644 l10n_it_riba/views/riba_view.xml create mode 100644 l10n_it_riba/views/slip_report.xml create mode 100644 l10n_it_riba/views/wizard_credit.xml create mode 100644 l10n_it_riba/views/wizard_past_due.xml create mode 100644 l10n_it_riba/views/wizard_presentation.xml create mode 100644 l10n_it_riba/views/wizard_riba_file_export.xml create mode 100644 l10n_it_riba/views/wizard_riba_issue.xml create mode 100644 l10n_it_riba/wizard/__init__.py create mode 100644 l10n_it_riba/wizard/wizard_credit.py create mode 100644 l10n_it_riba/wizard/wizard_past_due.py create mode 100644 l10n_it_riba/wizard/wizard_presentation_riba.py create mode 100644 l10n_it_riba/wizard/wizard_riba_file_export.py create mode 100644 l10n_it_riba/wizard/wizard_riba_issue.py diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst new file mode 100644 index 000000000000..55bf2af0015d --- /dev/null +++ b/l10n_it_riba/README.rst @@ -0,0 +1,152 @@ +======================= +ITA - Ricevute bancarie +======================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:5cfa30ffb10e8e3d58a504c71ce80a7b9e88e928946187b4771d838b1947c92a + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fl10n--italy-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-italy/tree/16.0/l10n_it_riba + :alt: OCA/l10n-italy +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-italy-16-0/l10n-italy-16-0-l10n_it_riba + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-italy&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +**Italiano** + +Modulo per gestire le ricevute bancarie. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +**Italiano** + +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. +- Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel + documento http://goo.gl/jpRhJp + +È possibile specificare diverse configurazioni (dal menù +*Configurazione → Pagamenti → Configurazione RiBa*). Per ognuna, in caso di +'Salvo buon fine', è necessario specificare almeno il registro e il conto da +utilizzare al momento dell'accettazione della distinta da parte della banca. +Tale conto deve essere di tipo 'Crediti' (ad esempio "RiBa all'incasso", +eventualmente da creare). + +La configurazione relativa alla fase di accredito, verrà usata nel momento in +cui la banca accredita l'importo della distinta. +È possibile utilizzare un registro creato appositamente, ad esempio "Accredito RiBa", +e un conto chiamato ad esempio "Banche c/RiBa all'incasso", che non deve essere di tipo +'Banca e cassa'. + +La configurazione relativa all'insoluto verrà utilizzata in caso di mancato pagamento +da parte del cliente. +Il conto può chiamarsi ad esempio "Crediti insoluti". + +Nel caso si vogliano gestire anche le spese per ogni scadenza con ricevuta bancaria, +si deve configurare un prodotto di tipo servizio e collegarlo in +*Configurazione → Impostazioni → Contabilità → Imposte → Spese di incasso RiBa*. + +Usage +===== + +**Italiano** + +Per utilizzare il meccanismo delle RiBa è necessario configurare un termine +di pagamento di tipo 'RiBa'. + +Per emettere una distinta è necessario andare su *RiBa → Emetti RiBa* e +selezionare i pagamenti per i quali emettere la distinta. +Se per il cliente è stato abilitato il raggruppamento, i pagamenti dello stesso +cliente e con la stessa data di scadenza andranno a costituire un solo elemento +della distinta. + +I possibili stati della distinta sono: *Bozza*, *Accettata*, *Accreditata*, +*Pagata*, *Insoluta* e *Annullata*. +Ad ogni passaggio di stato sarà possibile generare le relative registrazioni +contabili, le quali verranno riepilogate nella scheda «Contabilità». +Questa scheda è 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. + +Known issues / Roadmap +====================== + +**Italiano** + +Attenzione! +Il modulo è stato migrato, ma gli script di migrazione non sono stati provati. + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Contributors +~~~~~~~~~~~~ + +* Lorenzo Battistini +* Andrea Cometa +* Andrea Gallina +* Davide Corio +* Giacomo Grasso +* Gabriele Baldessari +* Alex Comba +* Marco Calcagni +* Sergio Zanchetta +* Simone Vanin +* Sergio Corato +* Giovanni Serra +* `Aion Tech `_: + + * Simone Rubino + +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. + +This module is part of the `OCA/l10n-italy `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_it_riba/__init__.py b/l10n_it_riba/__init__.py new file mode 100644 index 000000000000..9dd2c17785be --- /dev/null +++ b/l10n_it_riba/__init__.py @@ -0,0 +1,8 @@ +# © 2019 Marco Calcagni() +# © 2016 Andrea Cometa () +# © 2012 Agile Business Group sagl () +# © 2012 Domsense srl () +# © 2012 Associazione Odoo Italia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models, wizard, report diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py new file mode 100644 index 000000000000..ffcd52bcfe1d --- /dev/null +++ b/l10n_it_riba/__manifest__.py @@ -0,0 +1,48 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# Copyright (C) 2019 Sergio Zanchetta - Associazione PNLUG +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "ITA - Ricevute bancarie", + "version": "16.0.1.0.0", + "development_status": "Beta", + "author": "Odoo Community Association (OCA)", + "category": "Localization/Italy", + "summary": "Ricevute bancarie", + "website": "https://github.com/OCA/l10n-italy", + "license": "AGPL-3", + "depends": [ + "account", + "account_due_list", + "l10n_it_fatturapa_out", + "l10n_it_fiscalcode", + "base_iban", + "l10n_it_abicab", + ], + "data": [ + "data/riba_sequence.xml", + "report/report.xml", + "security/ir.model.access.csv", + "security/riba_security.xml", + "views/wizard_credit.xml", + "views/wizard_past_due.xml", + "views/riba_view.xml", + "views/account_view.xml", + "views/configuration_view.xml", + "views/partner_view.xml", + "views/wizard_riba_issue.xml", + "views/wizard_riba_file_export.xml", + "views/account_config_view.xml", + "views/slip_report.xml", + "views/riba_detail_view.xml", + "views/wizard_presentation.xml", + ], + "demo": ["demo/riba_demo.xml"], + "installable": True, +} diff --git a/l10n_it_riba/data/riba_sequence.xml b/l10n_it_riba/data/riba_sequence.xml new file mode 100644 index 000000000000..24a7b99b01b4 --- /dev/null +++ b/l10n_it_riba/data/riba_sequence.xml @@ -0,0 +1,16 @@ + + + + + + RiBa Slip + seq.riba.slip + %(y)s/ + 3 + + + + diff --git a/l10n_it_riba/demo/riba_demo.xml b/l10n_it_riba/demo/riba_demo.xml new file mode 100644 index 000000000000..50418af5b3b7 --- /dev/null +++ b/l10n_it_riba/demo/riba_demo.xml @@ -0,0 +1,41 @@ + + + + + + + RiBa 30 Days End of Month + RiBa 30 Days End of Month + + + + + + + Bank + CPHBBE75 + + + + BE74126201326907 + + CPHBBE75 + + + + + IT86Y0200809440000005235152 + + CPHBBE75 + + + + diff --git a/l10n_it_riba/i18n/it.po b/l10n_it_riba/i18n/it.po new file mode 100644 index 000000000000..cf546798e70b --- /dev/null +++ b/l10n_it_riba/i18n/it.po @@ -0,0 +1,1358 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_riba +# +msgid "" +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: 2023-09-28 10:26+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "" +"RiBa Collection Fees\n" +" " +msgstr "" +"Spese di incasso RiBa\n" +" " + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Total" +msgstr "Totale" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "A/C Bank" +msgstr "Banca C/C" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_account_id +msgid "A/C Bank Account" +msgstr "Conto banca C/C" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Acceptance" +msgstr "Accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__acceptance_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__acceptance_account_id +msgid "Acceptance Account" +msgstr "Conto accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_accepted +msgid "Acceptance Date" +msgstr "Data accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__acceptance_move_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Acceptance Entries" +msgstr "Registrazioni accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__acceptance_move_id +msgid "Acceptance Entry" +msgstr "Registrazione accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__acceptance_journal_id +msgid "Acceptance Journal" +msgstr "Registro accettazione" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__accepted +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +msgid "Accepted" +msgstr "Accettata" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__credit_account_id +msgid "Account used when RiBa amount is credited by the bank." +msgstr "Conto usato quando l'importo RiBa viene accreditato dalla banca." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__acceptance_account_id +msgid "Account used when RiBa is accepted by the bank." +msgstr "Conto usato quando la RiBa viene accettata dalla banca." + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Accounting" +msgstr "Contabilità" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_needaction +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_configuration__type__incasso +msgid "After Collection" +msgstr "Al dopo incasso" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__amount +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__amount +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Amount" +msgstr "Importo" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_attachment_count +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_attachment_count +msgid "Attachment Count" +msgstr "Numero allegati" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_bank +msgid "Bank" +msgstr "Banca" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_id +msgid "Bank Account" +msgstr "Conto bancario" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_bank_statement_line__riba_partner_bank_id +#: model:ir.model.fields,help:l10n_it_riba.field_account_move__riba_partner_bank_id +#: model:ir.model.fields,help:l10n_it_riba.field_account_payment__riba_partner_bank_id +msgid "" +"Bank Account Number to which the RiBa will be debited. If not set, first " +"bank in partner will be used." +msgstr "" +"Numero di conto bancario al quale verrà addebitata la Riba. Se non " +"impostato, viene utilizzata la prima banca del partner." + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_partner_bank +msgid "Bank Accounts" +msgstr "Conti bancari" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_credit +msgid "Bank Credit" +msgstr "Accredito banca" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Bank Fee" +msgstr "Spese bancarie" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_expense_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_expense_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_expense_account_id +msgid "Bank Fees Account" +msgstr "Conto spese bancarie" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "Riga estratto conto bancario" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__bank_id +msgid "Bank account used for RiBa issuing." +msgstr "Conto bancario usato per l'emissione RiBa." + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Bills" +msgstr "Effetti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__effects_account_id +msgid "Bills Account" +msgstr "Conto effetti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__effects_amount +msgid "Bills Amount" +msgstr "Importo effetti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cig +msgid "CIG" +msgstr "CIG" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cup +msgid "CUP" +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_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 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_presentation_riba +msgid "Cancel" +msgstr "Annulla" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__cancel +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__cancel +msgid "Canceled" +msgstr "Annullato" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Close" +msgstr "Chiudi" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_company__due_cost_service_id +msgid "Collection Fees Service" +msgstr "Servizio spese di incasso" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_payment_term__riba_payment_cost +msgid "" +"Collection fees amount. If different from 0, for each payment deadline an " +"invoice line will be added to invoice, with this amount." +msgstr "" +"Importo spese di incasso. Se diverso da 0, ad ogni scadenza di pagamento " +"viene aggiunta alla fattura una riga pari all'importo." + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__company_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__company_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__company_id +msgid "Company" +msgstr "Azienda" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__configuration_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__config_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__config_id +msgid "Configuration" +msgstr "Configurazione" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_configuration +msgid "Configuration parameters for RiBa" +msgstr "Parametri di configurazione Riba" + +#. 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 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Confirmed" +msgstr "Confermata" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. 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_issue_view +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Create" +msgstr "Crea" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_created +msgid "Creation Date" +msgstr "Data creazione" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +#, python-format +msgid "Credit" +msgstr "Accredito" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_amount +msgid "Credit Amount" +msgstr "Importo accredito" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_credited +msgid "Credit Date" +msgstr "Data accredito" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__credit_move_id +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#, python-format +msgid "Credit Entry" +msgstr "Registrazione accredito" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__credit_journal_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_journal_id +msgid "Credit Journal" +msgstr "Registro accrediti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__move_line_id +msgid "Credit Move Line" +msgstr "Riga movimento di accredito" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__move_line_ids +msgid "Credit Move Lines" +msgstr "Righe movimento di accredito" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "Credit date must be greater or equal to acceptance date." +msgstr "" +"La data di accredito deve essere maggiore o pari alla data di accettazione." + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__credited +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__credited +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +msgid "Credited" +msgstr "Accreditata" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_credited_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_credited_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_credited_ids +msgid "Credited RiBa Slips" +msgstr "Distinte RiBa accreditate" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__currency_id +msgid "Currency" +msgstr "Valuta" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__partner_id +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Customer" +msgstr "Cliente" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_to_issue_tree +msgid "Debit Total" +msgstr "Totale addebito" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__bank_id +msgid "Debtor Bank" +msgstr "Banca debitore" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_config_settings__due_cost_service_id +msgid "Default Collection Fees Service" +msgstr "Servizio spese di incasso predefinito" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_config_settings__due_cost_service_id +msgid "Default Service for RiBa Collection Fees on invoice." +msgstr "Servizio predefinito per le spese di incasso RiBa nella fattura." + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__name +msgid "Description" +msgstr "Descrizione" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Detail" +msgstr "Dettaglio" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__draft +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__draft +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Draft" +msgstr "Bozza" + +#. module: l10n_it_riba +#: 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" +msgstr "Scadenza" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Every account is mandatory." +msgstr "I conti sono tutti obbligatori." + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Export" +msgstr "Esporta" + +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.action_wizard_riba_file_export +msgid "Export RiBa" +msgstr "Esporta RiBa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Export RiBa file" +msgstr "Esporta file RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__expense_amount +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__expense_amount +msgid "Fees Amount" +msgstr "Importo spese" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__riba_txt +msgid "File" +msgstr "File" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__file_name +msgid "File Name" +msgstr "Nome file" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_follower_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_partner_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_bank__banca_estera +msgid "Foreign Bank" +msgstr "Banca estera" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_full_reconcile +msgid "Full Reconcile" +msgstr "Riconciliazione completa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "General" +msgstr "Generale" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_partner__group_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_users__group_riba +msgid "Group RiBa" +msgstr "Raggruppa per cliente" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_partner__group_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_users__group_riba +msgid "Group RiBa by customer while issuing." +msgstr "All'emissione, raggruppa le RiBa per cliente." + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__has_message +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__has_message +msgid "Has Message" +msgstr "Contiene messaggio" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__iban +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__iban +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "IBAN" +msgstr "IBAN" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__id +msgid "ID" +msgstr "ID" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_setup_bank_manual_config__codice_sia +#: model:ir.model.fields,help:l10n_it_riba.field_res_partner_bank__codice_sia +msgid "Identification Code of the Company in the Interbank System." +msgstr "Codice identificativo dell'azienda nel sistema interbancario." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_needaction +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_sms_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi presentano un errore di consegna." + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__invoice_date +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Invoice Date" +msgstr "Data fattura" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Invoice Entries" +msgstr "Registrazioni fattura" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__invoice_number +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Invoice Number" +msgstr "Numero fattura" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "Invoice is linked to RiBa slip No. {riba}" +msgstr "La fattura è collegata alla distinta RiBa n. {riba}" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_is_follower +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_is_follower +msgid "Is Follower" +msgstr "Sta seguendo" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__is_riba_payment +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__is_riba_payment +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__is_riba_payment +msgid "Is RiBa Payment" +msgstr "È un pagamento RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__is_past_due +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__is_past_due +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__is_past_due +msgid "Is a past due invoice" +msgstr "È una fattura insoluta" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_to_issue +msgid "Issue" +msgstr "Emissione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__type +msgid "Issue Mode" +msgstr "Modalità emissione" + +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.riba_issue_action_server +msgid "Issue RiBa" +msgstr "Emetti RiBa" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_move +msgid "Journal Entry" +msgstr "Registrazione contabile" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_move_line +msgid "Journal Item" +msgstr "Movimento contabile" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__credit_journal_id +msgid "Journal used when RiBa amount is credited by the bank." +msgstr "" +"Registro utilizzato quando l'importo RiBa viene accreditato dalla banca." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__acceptance_journal_id +msgid "Journal used when RiBa is accepted by the bank." +msgstr "Registro utilizzato quanto la RiBa viene accettata dalla banca." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__past_due_journal_id +msgid "Journal used when RiBa is past due." +msgstr "Registro utilizzato quando la RiBa è insoluta." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__settlement_journal_id +msgid "Journal used when customers finally pay the invoice to bank." +msgstr "Registro usato quando i clienti pagano infine la fattura alla banca." + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__registration_date +msgid "Keep empty to use the current date." +msgstr "Lasciare vuoto per utilizzare la data corrente." + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_layout +msgid "Logo" +msgstr "Logo" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_main_attachment_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_past_due +msgid "Manage Past Due RiBas" +msgstr "Gestione RiBa insolute" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark All as Settled" +msgstr "Segna tutte come pagate" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Accepted" +msgstr "Segna come accettata" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Credited" +msgstr "Segna come accreditata" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Past Due" +msgstr "Segna come insoluta" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Settled" +msgstr "Segna come pagata" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_ir_ui_menu +msgid "Menu" +msgstr "Menù" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_error +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Move Line" +msgstr "Riga movimento" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No IBAN or ABI/CAB specified for " +msgstr "Nessun IBAN o ABI/CAB specificato per " + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No IBAN specified." +msgstr "Nessun IBAN specificato." + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No SIA Code specified for " +msgstr "Nessun codice SIA specificato per " + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No VAT or Fiscal Code specified for " +msgstr "Nessuna partita IVA o codice fiscale specificato per " + +#. module: l10n_it_riba +#. 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_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "No active ID found." +msgstr "Nessun ID attivo trovato." + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_riba_issue.py:0 +#, python-format +msgid "No bank has been specified for invoice %s" +msgstr "Nessuna banca specificata per la fattura %s" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__sequence +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Number" +msgstr "Numero" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_needaction_counter +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_error_counter +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_needaction_counter +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error_counter +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Other Info" +msgstr "Altre informazioni" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__paid +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__paid +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Paid" +msgstr "Pagata" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_amount +msgid "Paid Amount" +msgstr "Importo pagato" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_partial_reconcile +msgid "Partial Reconcile" +msgstr "Riconciliazione parziale" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__past_due +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__past_due +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.invoice_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.invoice_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Past Due" +msgstr "Insoluta" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Past Due Bills" +msgstr "Effetti insoluti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__overdue_effects_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__overdue_effects_account_id +msgid "Past Due Bills Account" +msgstr "Conto effetti insoluti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__overdue_effects_amount +msgid "Past Due Bills Amount" +msgstr "Importo effetti insoluti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_past_due +msgid "Past Due Date" +msgstr "Data insoluto" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__past_due_move_ids +msgid "Past Due Entries" +msgstr "Registrazioni insoluto" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__past_due_move_id +#, python-format +msgid "Past Due Entry" +msgstr "Registrazione insoluto" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_invoice_tree1 +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__past_due_invoice_ids +#: model:ir.ui.menu,name:l10n_it_riba.menu_invoices +msgid "Past Due Invoices" +msgstr "Fatture insolute" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__past_due_journal_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__past_due_journal_id +msgid "Past Due Journal" +msgstr "Registro insoluti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__past_due_move_line_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__past_due_move_line_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__past_due_move_line_ids +msgid "Past Due Journal Items" +msgstr "Movimenti contabili insoluto" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Past Due RiBa %(name)s - Line %(sequence)s" +msgstr "RiBa insoluta %(name)s - Riga %(sequence)s" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_past_due_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_past_due_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_past_due_ids +msgid "Past Due RiBa Slips" +msgstr "Distinte RiBa insolute" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_past_due_action +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Past Due RiBas" +msgstr "RiBa insolute" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Past Dues" +msgstr "Insoluti" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_paid +msgid "Payment Date" +msgstr "Data pagamento" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_payment_term +msgid "Payment Terms" +msgstr "Termini di pagamento" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__payment_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__payment_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Payments" +msgstr "Pagamenti" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "Please define a Settlement Journal." +msgstr "Definire un registro pagamenti." + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__presentation_amount +msgid "Presentation Amount" +msgstr "Importo presentazione" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_presentation_action +#: model:ir.ui.menu,name:l10n_it_riba.menu_presentation_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_presentation_riba +msgid "Presentation Riba" +msgstr "Presentazione RiBa" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_presentation_riba_issue +msgid "Presentation Riba Issue" +msgstr "Emissione presentazione RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.report,name:l10n_it_riba.print_slip_qweb +msgid "Print Slip" +msgstr "Stampa distinta" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "Product" +msgstr "Prodotto" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "Product used as Service for RiBa Collection Fees" +msgstr "Prodotto usato come servizio per le spese di incasso RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__protest_charge_account_id +msgid "Protest Fee Account" +msgstr "Conto spese di protesto" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "Reconciled" +msgstr "Riconciliata" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__name +msgid "Reference" +msgstr "Riferimento" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__registration_date +msgid "Registration Date" +msgstr "Data registrazione" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Reset to Draft" +msgstr "Reimposta a bozza" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment_term__riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba +#, python-format +msgid "RiBa" +msgstr "RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_riba_configuration +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "RiBa - Configuration" +msgstr "RiBa - Configurazione" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__credit_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__riba_bank_account_id +msgid "RiBa Account" +msgstr "Conto RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__riba_bank_amount +msgid "RiBa Amount" +msgstr "Importo RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_partner_bank_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_partner_bank_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_partner_bank_id +msgid "RiBa Bank Account" +msgstr "Conto bancario RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment_term__riba_payment_cost +msgid "RiBa Collection Fees" +msgstr "Spese di incasso RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__due_cost_line +msgid "RiBa Collection Fees Line" +msgstr "Riga spese di incasso RiBa" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_configuration +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "RiBa Configuration" +msgstr "Configurazione RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_credit_action +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "RiBa Credit" +msgstr "Accredito banca" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#, python-format +msgid "RiBa Credit %s" +msgstr "Accredito RiBa %s" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__slip_line_ids +msgid "RiBa Detail" +msgstr "Dettaglio RiBa" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_slip_line +#: model:ir.model,name:l10n_it_riba.model_riba_slip_move_line +msgid "RiBa Details" +msgstr "Dettagli RiBa" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__line_ids +msgid "RiBa Due Dates" +msgstr "Scadenze RiBa" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_file_export +msgid "RiBa File Export Wizard" +msgstr "Procedura esportazione file RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_riba_to_issue +#: model:ir.model,name:l10n_it_riba.model_riba_issue +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view +msgid "RiBa Issue" +msgstr "Emissione RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.slip_riba_action +#: model:ir.model,name:l10n_it_riba.model_riba_slip +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "RiBa Slip" +msgstr "Distinta RiBa" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.detail_riba_action +msgid "RiBa Slip Detail" +msgstr "Dettaglio distinta RiBa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "RiBa Slip No." +msgstr "Distinta RiBa n°" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_report_l10n_it_riba_slip_qweb +msgid "RiBa Slip Report" +msgstr "Rendiconto distinta RiBa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "RiBa Slips" +msgstr "Distinte RiBa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "RiBa To Issue" +msgstr "RiBa da emettere" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__config_id +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__config_id +msgid "RiBa configuration to be used." +msgstr "Configurazione RiBa da utilizzare." + +#. 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 +msgid "SIA Code" +msgstr "Codice SIA" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_sms_error +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_sms_error +msgid "SMS Delivery error" +msgstr "Errore consegna SMS" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "Set a Service for Collection Fees in Company Config." +msgstr "" +"Impostare un servizio per le spese di incasso nella configurazione " +"dell'azienda." + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Settlement" +msgstr "Pagamento" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__settlement_journal_id +msgid "Settlement Journal" +msgstr "Registro pagamenti" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "Skip and Confirm Credit" +msgstr "Salta e conferma accredito" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Skip and Confirm Past Due" +msgstr "Salta e conferma insoluto" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__slip_id +msgid "Slip" +msgstr "Distinta" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "" +"Slip %(name)s is in state '%(state)s'. You can only delete documents in " +"state 'Draft' or 'Canceled'." +msgstr "" +"La distinta %(name)s si trova nello stato «%(state)s». È possibile eliminare " +"solo documenti in stato «Bozza» o «Annullata»." + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__riba_line_id +msgid "Slip Line" +msgstr "Riga distinta" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_distinte +msgid "Slips" +msgstr "Distinte" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_detail +msgid "Slips Detail" +msgstr "Dettaglio distinte" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__state +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__state +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__state +msgid "State" +msgstr "Stato" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_configuration__type__sbf +msgid "Subject To Collection" +msgstr "Salvo buon fine" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_layout +msgid "Tel:" +msgstr "Tel:" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view +msgid "This wizard will generate the RiBa slip" +msgstr "Questa procedura genera la distinta RiBa" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "" +"This wizard will generate the journal entry related to an past due RiBa" +msgstr "" +"Questa procedura genera la registrazione contabile relativa a una RiBa " +"insoluta" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "" +"This wizard will generate the journal entry related to credit received from " +"the bank" +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_filter +msgid "To Reconcile" +msgstr "Da riconciliare" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_to_issue_tree +msgid "Total Amount" +msgstr "Importo totale" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__type +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__type +msgid "Type" +msgstr "Tipo" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__user_id +msgid "User" +msgstr "Utente" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__website_message_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__website_message_ids +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_amount +msgid "Withdrawn Amount" +msgstr "Importo prelevato" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "" +"You can also skip this step and set the line status to 'Past Due' anyway" +msgstr "" +"È anche possibile saltare questo passo e impostare ugualmente lo stato a " +"«Insoluta»" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "" +"You can also skip this step and set the slip status to 'Credited' anyway" +msgstr "" +"È anche possibile saltare questo passo e impostare ugualmente lo stato ad " +"«Accreditata»" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "of" +msgstr "del" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "{line_name} for {month}-{year}" +msgstr "{line_name} per {month}-{year}" diff --git a/l10n_it_riba/i18n/l10n_it_riba.pot b/l10n_it_riba/i18n/l10n_it_riba.pot new file mode 100644 index 000000000000..878c3ce83642 --- /dev/null +++ b/l10n_it_riba/i18n/l10n_it_riba.pot @@ -0,0 +1,1373 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_riba +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-28 10:27+0000\n" +"PO-Revision-Date: 2023-09-28 10:27+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "" +"RiBa Collection Fees\n" +" " +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Total" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "A/C Bank" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_account_id +msgid "A/C Bank Account" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Acceptance" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__acceptance_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__acceptance_account_id +msgid "Acceptance Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_accepted +msgid "Acceptance Date" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__acceptance_move_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Acceptance Entries" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__acceptance_move_id +msgid "Acceptance Entry" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__acceptance_journal_id +msgid "Acceptance Journal" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__accepted +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +msgid "Accepted" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__credit_account_id +msgid "Account used when RiBa amount is credited by the bank." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__acceptance_account_id +msgid "Account used when RiBa is accepted by the bank." +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Accounting" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_needaction +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_configuration__type__incasso +msgid "After Collection" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__amount +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__amount +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_attachment_count +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_bank +msgid "Bank" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_id +msgid "Bank Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_bank_statement_line__riba_partner_bank_id +#: model:ir.model.fields,help:l10n_it_riba.field_account_move__riba_partner_bank_id +#: model:ir.model.fields,help:l10n_it_riba.field_account_payment__riba_partner_bank_id +msgid "" +"Bank Account Number to which the RiBa will be debited. If not set, first " +"bank in partner will be used." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_partner_bank +msgid "Bank Accounts" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_credit +msgid "Bank Credit" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Bank Fee" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__bank_expense_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_expense_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_expense_account_id +msgid "Bank Fees Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_bank_statement_line +msgid "Bank Statement Line" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__bank_id +msgid "Bank account used for RiBa issuing." +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Bills" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__effects_account_id +msgid "Bills Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__effects_amount +msgid "Bills Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cig +msgid "CIG" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__cup +msgid "CUP" +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_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 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_presentation_riba +msgid "Cancel" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__cancel +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__cancel +msgid "Canceled" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Close" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_company__due_cost_service_id +msgid "Collection Fees Service" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_payment_term__riba_payment_cost +msgid "" +"Collection fees amount. If different from 0, for each payment deadline an " +"invoice line will be added to invoice, with this amount." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__company_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__company_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__company_id +msgid "Company" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_issue__configuration_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__config_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__config_id +msgid "Configuration" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_configuration +msgid "Configuration parameters for RiBa" +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 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Confirmed" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_res_partner +msgid "Contact" +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_issue_view +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Create" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__create_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_created +msgid "Creation Date" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +#, python-format +msgid "Credit" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_amount +msgid "Credit Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_credited +msgid "Credit Date" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__credit_move_id +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#, python-format +msgid "Credit Entry" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__credit_journal_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_journal_id +msgid "Credit Journal" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__move_line_id +msgid "Credit Move Line" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__move_line_ids +msgid "Credit Move Lines" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/riba.py:0 +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "Credit date must be greater or equal to acceptance date." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__credited +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__credited +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +msgid "Credited" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_credited_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_credited_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_credited_ids +msgid "Credited RiBa Slips" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__currency_id +msgid "Currency" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__partner_id +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Customer" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_to_issue_tree +msgid "Debit Total" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__bank_id +msgid "Debtor Bank" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_config_settings__due_cost_service_id +msgid "Default Collection Fees Service" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_config_settings__due_cost_service_id +msgid "Default Service for RiBa Collection Fees on invoice." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__name +msgid "Description" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Detail" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__display_name +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__draft +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__draft +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Draft" +msgstr "" + +#. module: l10n_it_riba +#: 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" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Every account is mandatory." +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Export" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.action_wizard_riba_file_export +msgid "Export RiBa" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_riba_file_export +msgid "Export RiBa file" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__expense_amount +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__expense_amount +msgid "Fees Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__riba_txt +msgid "File" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__file_name +msgid "File Name" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_follower_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_partner_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_bank__banca_estera +msgid "Foreign Bank" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_full_reconcile +msgid "Full Reconcile" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "General" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_partner__group_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_res_users__group_riba +msgid "Group RiBa" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_partner__group_riba +#: model:ir.model.fields,help:l10n_it_riba.field_res_users__group_riba +msgid "Group RiBa by customer while issuing." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__has_message +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__has_message +msgid "Has Message" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__iban +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__iban +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "IBAN" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__id +msgid "ID" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_account_setup_bank_manual_config__codice_sia +#: model:ir.model.fields,help:l10n_it_riba.field_res_partner_bank__codice_sia +msgid "Identification Code of the Company in the Interbank System." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_needaction +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_sms_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__invoice_date +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Invoice Date" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Invoice Entries" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__invoice_number +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Invoice Number" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/account.py:0 +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "Invoice is linked to RiBa slip No. {riba}" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_is_follower +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__is_riba_payment +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__is_riba_payment +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__is_riba_payment +msgid "Is RiBa Payment" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__is_past_due +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__is_past_due +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__is_past_due +msgid "Is a past due invoice" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_to_issue +msgid "Issue" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__type +msgid "Issue Mode" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.server,name:l10n_it_riba.riba_issue_action_server +msgid "Issue RiBa" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__credit_journal_id +msgid "Journal used when RiBa amount is credited by the bank." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__acceptance_journal_id +msgid "Journal used when RiBa is accepted by the bank." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__past_due_journal_id +msgid "Journal used when RiBa is past due." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_configuration__settlement_journal_id +msgid "Journal used when customers finally pay the invoice to bank." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__registration_date +msgid "Keep empty to use the current date." +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line____last_update +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_it_riba +#: 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_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 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__write_date +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_layout +msgid "Logo" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_main_attachment_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_past_due +msgid "Manage Past Due RiBas" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark All as Settled" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Accepted" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Credited" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Past Due" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Mark as Settled" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_ir_ui_menu +msgid "Menu" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_error +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_ids +msgid "Messages" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Move Line" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No IBAN or ABI/CAB specified for " +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No IBAN specified." +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No SIA Code specified for " +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_file_export.py:0 +#, python-format +msgid "No VAT or Fiscal Code specified for " +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: 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_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "No active ID found." +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_riba_issue.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_riba_issue.py:0 +#, python-format +msgid "No bank has been specified for invoice %s" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__sequence +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "Number" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_needaction_counter +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_error_counter +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_needaction_counter +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error_counter +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Other Info" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__paid +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__paid +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "Paid" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__bank_amount +msgid "Paid Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_partial_reconcile +msgid "Partial Reconcile" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip__state__past_due +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__past_due +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.invoice_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.invoice_tree +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Past Due" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Past Due Bills" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__overdue_effects_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__overdue_effects_account_id +msgid "Past Due Bills Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__overdue_effects_amount +msgid "Past Due Bills Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_past_due +msgid "Past Due Date" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__past_due_move_ids +msgid "Past Due Entries" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__past_due_move_id +#, python-format +msgid "Past Due Entry" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_invoice_tree1 +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__past_due_invoice_ids +#: model:ir.ui.menu,name:l10n_it_riba.menu_invoices +msgid "Past Due Invoices" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__past_due_journal_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__past_due_journal_id +msgid "Past Due Journal" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__past_due_move_line_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__past_due_move_line_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__past_due_move_line_ids +msgid "Past Due Journal Items" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#, python-format +msgid "Past Due RiBa %(name)s - Line %(sequence)s" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_past_due_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_past_due_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_past_due_ids +msgid "Past Due RiBa Slips" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_past_due_action +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Past Due RiBas" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Past Dues" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__date_paid +msgid "Payment Date" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_account_payment_term +msgid "Payment Terms" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__payment_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__payment_ids +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_line_form +msgid "Payments" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/riba.py:0 +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "Please define a Settlement Journal." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_presentation_riba_issue__presentation_amount +msgid "Presentation Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_presentation_action +#: model:ir.ui.menu,name:l10n_it_riba.menu_presentation_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.wizard_presentation_riba +msgid "Presentation Riba" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_presentation_riba_issue +msgid "Presentation Riba Issue" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.report,name:l10n_it_riba.print_slip_qweb +msgid "Print Slip" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "Product" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "Product used as Service for RiBa Collection Fees" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__protest_charge_account_id +msgid "Protest Fee Account" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "RIBA Issued RiBas" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "Reconciled" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__name +msgid "Reference" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__registration_date +msgid "Registration Date" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "Reset to Draft" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_past_due.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_past_due.py:0 +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment_term__riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba +#, python-format +msgid "RiBa" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_riba_configuration +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "RiBa - Configuration" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__credit_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_credit__credit_account_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__riba_bank_account_id +msgid "RiBa Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__riba_bank_amount +msgid "RiBa Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_bank_statement_line__riba_partner_bank_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move__riba_partner_bank_id +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment__riba_partner_bank_id +msgid "RiBa Bank Account" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_payment_term__riba_payment_cost +msgid "RiBa Collection Fees" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__due_cost_line +msgid "RiBa Collection Fees Line" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_configuration +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_account_config_settings_riba +msgid "RiBa Configuration" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.riba_credit_action +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "RiBa Credit" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/wizard/wizard_credit.py:0 +#: code:addons/l10n_it_riba/wizard/wizard_credit.py:0 +#, python-format +msgid "RiBa Credit %s" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_account_move_line__slip_line_ids +msgid "RiBa Detail" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_slip_line +#: model:ir.model,name:l10n_it_riba.model_riba_slip_move_line +msgid "RiBa Details" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__line_ids +msgid "RiBa Due Dates" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_riba_file_export +msgid "RiBa File Export Wizard" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.action_riba_to_issue +#: model:ir.model,name:l10n_it_riba.model_riba_issue +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view +msgid "RiBa Issue" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.slip_riba_action +#: model:ir.model,name:l10n_it_riba.model_riba_slip +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_slip_form +msgid "RiBa Slip" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.actions.act_window,name:l10n_it_riba.detail_riba_action +msgid "RiBa Slip Detail" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "RiBa Slip No." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model,name:l10n_it_riba.model_report_l10n_it_riba_slip_qweb +msgid "RiBa Slip Report" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_detail_riba_filter +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_slip_riba_filter +msgid "RiBa Slips" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "RiBa To Issue" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__config_id +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__config_id +msgid "RiBa configuration to be used." +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 +msgid "SIA Code" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_sms_error +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/account.py:0 +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "Set a Service for Collection Fees in Company Config." +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_configuration_form +msgid "Settlement" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_configuration__settlement_journal_id +msgid "Settlement Journal" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "Skip and Confirm Credit" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "Skip and Confirm Past Due" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__slip_id +msgid "Slip" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/riba.py:0 +#: code:addons/l10n_it_riba/models/riba.py:0 +#, python-format +msgid "" +"Slip %(name)s is in state '%(state)s'. You can only delete documents in " +"state 'Draft' or 'Canceled'." +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_move_line__riba_line_id +msgid "Slip Line" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_distinte +msgid "Slips" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.ui.menu,name:l10n_it_riba.menu_riba_detail +msgid "Slips Detail" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_file_export__state +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__state +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__state +msgid "State" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_configuration__type__sbf +msgid "Subject To Collection" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_layout +msgid "Tel:" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_issue_view +msgid "This wizard will generate the RiBa slip" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "" +"This wizard will generate the journal entry related to an past due RiBa" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "" +"This wizard will generate the journal entry related to credit received from " +"the bank" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_filter +msgid "To Reconcile" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.view_riba_to_issue_tree +msgid "Total Amount" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__type +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__type +msgid "Type" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__user_id +msgid "User" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__website_message_ids +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__website_message_ids +#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: l10n_it_riba +#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_past_due__bank_amount +msgid "Withdrawn Amount" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_past_due +msgid "" +"You can also skip this step and set the line status to 'Past Due' anyway" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.riba_credit +msgid "" +"You can also skip this step and set the slip status to 'Credited' anyway" +msgstr "" + +#. module: l10n_it_riba +#: model_terms:ir.ui.view,arch_db:l10n_it_riba.slip_qweb +msgid "of" +msgstr "" + +#. module: l10n_it_riba +#. odoo-python +#: code:addons/l10n-italy/l10n_it_riba/models/account.py:0 +#: code:addons/l10n_it_riba/models/account.py:0 +#, python-format +msgid "{line_name} for {month}-{year}" +msgstr "" \ No newline at end of file diff --git a/l10n_it_riba/migrations/16.0.1.0.0/data/noupdate.xml b/l10n_it_riba/migrations/16.0.1.0.0/data/noupdate.xml new file mode 100644 index 000000000000..da94ab15de5b --- /dev/null +++ b/l10n_it_riba/migrations/16.0.1.0.0/data/noupdate.xml @@ -0,0 +1,22 @@ + + + + + seq.riba.slip + + + + + + + + + + + + + + diff --git a/l10n_it_riba/migrations/16.0.1.0.0/post-migrate.py b/l10n_it_riba/migrations/16.0.1.0.0/post-migrate.py new file mode 100644 index 000000000000..5358d910b9ab --- /dev/null +++ b/l10n_it_riba/migrations/16.0.1.0.0/post-migrate.py @@ -0,0 +1,16 @@ +# Copyright 2023 Simone Rubino - AionTech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +NEW_MODULE_NAME = "l10n_it_riba" + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data( + env.cr, + NEW_MODULE_NAME, + "migrations/16.0.1.0.0/data/noupdate.xml", + ) + # TODO selection keys of riba.distinta[.line].state have changed diff --git a/l10n_it_riba/migrations/16.0.1.0.0/pre-migrate.py b/l10n_it_riba/migrations/16.0.1.0.0/pre-migrate.py new file mode 100644 index 000000000000..255887b1b364 --- /dev/null +++ b/l10n_it_riba/migrations/16.0.1.0.0/pre-migrate.py @@ -0,0 +1,284 @@ +# Copyright 2023 Simone Rubino - AionTech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +OLD_MODULE_NAME = "l10n_it_ricevute_bancarie" +NEW_MODULE_NAME = "l10n_it_riba" +RENAMED_MODELS = [ + ("riba.distinta", "riba.slip"), + ("riba.distinta.line", "riba.slip.line"), + ("riba.distinta.move.line", "riba.slip.move.line"), + ( + "report.l10n_it_ricevute_bancarie.distinta_qweb", + "report.l10n_it_riba.slip_qweb", + ), # abstract + ("riba.accreditation", "riba.credit"), + ("riba.unsolved", "riba.past_due"), +] +RENAMED_FIELDS = [ + [ + ( + "account.move", + "riba_credited_ids", + ), + ( + "account.move", + "riba_accredited_ids", + ), + ], + [ + ( + "account.move", + "riba_unsolved_ids", + ), + ( + "account.move", + "riba_past_due_ids", + ), + ], + [ + ( + "account.move", + "unsolved_move_line_ids", # is m2m, with table invoice_unsolved_line_rel + ), + ( + "account.move", + "past_due_move_line_ids", # is m2m, with table invoice_past_due_line_rel + ), + ], + [ + ( + "account.move", + "is_unsolved", + ), + ( + "account.move", + "is_past_due", + ), + ], + [ + ( + "account.move.line", + "distinta_line_ids", + ), + ( + "account.move.line", + "slip_line_ids", + ), + ], + [ + ( + "account.move.line", + "unsolved_invoice_ids", # is m2m with table invoice_unsolved_line_rel + ), + ( + "account.move.line", + "past_due_invoice_ids", # is m2m with table invoice_past_due_line_rel + ), + ], + [ + ( + "riba.distinta", + "date_accreditation", + ), + ( + "riba.slip", + "date_credited", + ), + ], + [ + ( + "riba.distinta", + "date_unsolved", + ), + ( + "riba.slip", + "date_past_due", + ), + ], + [ + ( + "riba.distinta", + "accreditation_move_id", + ), + ( + "riba.slip", + "credit_move_id", + ), + ], + [ + ( + "riba.distinta", + "unsolved_move_ids", # is m2m table name computed + ), + ( + "riba.slip", + "past_due_move_ids", # is m2m table name computed + ), + ], + [ + ( + "riba.distinta.line", + "unsolved_move_id", + ), + ( + "riba.slip.line", + "past_due_move_id", + ), + ], + [ + ( + "riba.distinta.line", + "distinta_id", + ), + ( + "riba.slip.line", + "slip_id", + ), + ], + [ + ( + "riba.configuration", + "accreditation_journal_id", + ), + ( + "riba.configuration", + "credit_journal_id", + ), + ], + [ + ( + "riba.configuration", + "accreditation_account_id", + ), + ( + "riba.configuration", + "credit_account_id", + ), + ], + [ + ( + "riba.configuration", + "unsolved_journal_id", + ), + ( + "riba.configuration", + "past_due_journal_id", + ), + ], + [ + ( + "riba.accreditation", + "accreditation_journal_id", + ), + ( + "riba.credit", + "credit_journal_id", + ), + ], + [ + ( + "riba.accreditation", + "accreditation_account_id", + ), + ( + "riba.credit", + "credit_account_id", + ), + ], + [ + ( + "riba.accreditation", + "accreditation_amount", + ), + ( + "riba.credit", + "credit_amount", + ), + ], + [ + ( + "riba.unsolved", + "unsolved_journal_id", + ), + ( + "riba.past_due", + "past_due_journal_id", + ), + ], +] +RENAMED_XMLIDS = [ + ("seq_riba_distinta", "seq_riba_slip"), + ("print_distinta_qweb", "print_slip_qweb"), + ("access_riba_distinta_uinvoice", "access_riba_slip_uinvoice"), + ("access_riba_distinta_group_invoice", "access_riba_slip_group_invoice"), + ("access_riba_distinta_user", "access_riba_slip_user"), + ("access_riba_distinta_accountant", "access_riba_slip_accountant"), + ("access_riba_distinta_line_uinvoice", "access_riba_slip_line_uinvoice"), + ("access_riba_distinta_line_group_invoice", "access_riba_slip_line_group_invoice"), + ("access_riba_distinta_line_user", "access_riba_slip_line_user"), + ("access_riba_distinta_line_accountant", "access_riba_slip_line_accountant"), + ("access_riba_distinta_move_line_uinvoice", "access_riba_slip_move_line_uinvoice"), + ( + "access_riba_distinta_move_line_group_invoice", + "access_riba_slip_move_line_group_invoice", + ), + ("access_riba_distinta_move_line_user", "access_riba_slip_move_line_user"), + ( + "access_riba_distinta_move_line_accountant", + "access_riba_slip_move_line_accountant", + ), + ("access_riba_unsolved", "access_riba_past_due"), + ("access_riba_accreditation", "access_riba_credit"), + ("riba_distinta_company_rule", "riba_slip_company_rule"), + ("riba_distinta_line_company_rule", "riba_slip_line_company_rule"), + ("view_riba_da_emettere_tree", "view_riba_to_issue_tree"), + ("action_riba_da_emettere", "action_riba_to_issue"), + ("menu_riba_da_emettere", "menu_riba_to_issue"), + ("view_distinta_riba_filtri", "view_slip_riba_filter"), + ("view_distinta_riba_tree", "view_slip_riba_tree"), + ("view_riba_distinta_line_form", "view_riba_slip_line_form"), + ("distinta_riba_action", "slip_riba_action"), + ("distinta_layout", "slip_layout"), + ("distinta_qweb", "slip_qweb"), + ("riba_accreditation", "riba_credit"), + ("riba_accreditation_action", "riba_credit_action"), + ("riba_unsolved", "riba_past_due"), + ("riba_unsolved_action", "riba_past_due_action"), +] + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.rename_models( + env.cr, + RENAMED_MODELS, + ) + + field_spec = [] + for renamed_field in RENAMED_FIELDS: + (old_model, old_field), (new_model, new_field) = renamed_field + field_spec.append( + ( + old_model, + old_model.replace(".", "_"), + old_field, + new_field, + ) + ) + openupgrade.rename_fields( + env, + field_spec, + ) + + openupgrade.rename_xmlids( + env.cr, + [ + ( + ".".join((OLD_MODULE_NAME, old_xml_id)), + ".".join((NEW_MODULE_NAME, new_xml_id)), + ) + for old_xml_id, new_xml_id in RENAMED_XMLIDS + ], + ) diff --git a/l10n_it_riba/models/__init__.py b/l10n_it_riba/models/__init__.py new file mode 100644 index 000000000000..d39f3aa987be --- /dev/null +++ b/l10n_it_riba/models/__init__.py @@ -0,0 +1,15 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account +from . import account_config +from . import bank_statement +from . import ir_ui_menu +from . import partner +from . import riba +from . import riba_config diff --git a/l10n_it_riba/models/account.py b/l10n_it_riba/models/account.py new file mode 100644 index 000000000000..b4e191513412 --- /dev/null +++ b/l10n_it_riba/models/account.py @@ -0,0 +1,401 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2018 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import Warning as UserError + + +class AccountPaymentTerm(models.Model): + # flag riba utile a distinguere la modalità di pagamento + _inherit = "account.payment.term" + + riba = fields.Boolean("RiBa", default=False) + riba_payment_cost = fields.Float( + "RiBa Collection Fees", + digits="Account", + help="Collection fees amount. If different from 0, " + "for each payment deadline an invoice line will be added " + "to invoice, with this amount.", + ) + + +class ResBankAddField(models.Model): + _inherit = "res.bank" + banca_estera = fields.Boolean("Foreign Bank") + + +class ResPartnerBankAdd(models.Model): + _inherit = "res.partner.bank" + codice_sia = fields.Char( + "SIA Code", + size=5, + help="Identification Code of the Company in the Interbank System.", + ) + + +class AccountMove(models.Model): + _inherit = "account.move" + + @api.depends( + "past_due_move_line_ids.past_due_invoice_ids", + "past_due_move_line_ids.full_reconcile_id", + "past_due_move_line_ids.matched_debit_ids", + "past_due_move_line_ids.matched_credit_ids", + ) + def _compute_is_past_due(self): + for invoice in self: + invoice.is_past_due = False + reconciled_past_due = 0 + for past_due_move_line in invoice.past_due_move_line_ids: + if past_due_move_line.reconciled: + reconciled_past_due += 1 + if len(invoice.past_due_move_line_ids) != reconciled_past_due: + invoice.is_past_due = True + + riba_credited_ids = fields.One2many( + "riba.slip", "credit_move_id", "Credited RiBa Slips", readonly=True + ) + riba_past_due_ids = fields.One2many( + "riba.slip.line", "past_due_move_id", "Past Due RiBa Slips", readonly=True + ) + + past_due_move_line_ids = fields.Many2many( + "account.move.line", + "invoice_past_due_line_rel", + "move_id", + "line_id", + "Past Due Journal Items", + ) + + is_past_due = fields.Boolean( + "Is a past due invoice", compute="_compute_is_past_due", store=True + ) + is_riba_payment = fields.Boolean( + "Is RiBa Payment", related="invoice_payment_term_id.riba" + ) + + riba_partner_bank_id = fields.Many2one( + "res.partner.bank", + string="RiBa Bank Account", + help="Bank Account Number to which the RiBa will be debited. " + "If not set, first bank in partner will be used.", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + + @api.model_create_multi + def create(self, vals): + invoices = super().create(vals) + for invoice in invoices: + if not invoice.riba_partner_bank_id: + invoice._onchange_riba_partner_bank_id() + return invoices + + @api.onchange("partner_id", "invoice_payment_term_id", "move_type") + def _onchange_riba_partner_bank_id(self): + if ( + not self.riba_partner_bank_id + or self.riba_partner_bank_id not in self.partner_id.bank_ids + ): + bank_ids = self.env["res.partner.bank"] + if ( + self.partner_id + and self.invoice_payment_term_id.riba + and self.move_type in ["out_invoice", "out_refund"] + ): + bank_ids = self.partner_id.bank_ids + self.riba_partner_bank_id = bank_ids[0] if bank_ids else None + + def month_check(self, invoice_date_due, all_date_due): + """ + :param invoice_date_due: first due date of invoice + :param all_date_due: list of due dates for partner + :return: True if month of invoice_date_due is in a list of all_date_due + """ + for d in all_date_due: + if invoice_date_due.month == d.month and invoice_date_due.year == d.year: + return True + return False + + def action_post(self): + for invoice in self: + # ---- Add a line with collection fees for each due date only for first due + # ---- date of the month + if ( + invoice.move_type != "out_invoice" + or not invoice.invoice_payment_term_id + or not invoice.invoice_payment_term_id.riba + or invoice.invoice_payment_term_id.riba_payment_cost == 0.0 + ): + continue + if not invoice.company_id.due_cost_service_id: + raise UserError( + _("Set a Service for Collection Fees in Company Config.") + ) + # ---- Apply Collection Fees on invoice only on first due date of the month + # ---- Get Date of first due date + move_line = self.env["account.move.line"].search( + [("partner_id", "=", invoice.partner_id.id)] + ) + if not any(line.due_cost_line for line in move_line): + move_line = self.env["account.move.line"] + # ---- Filtered recordset with date_maturity + move_line = move_line.filtered(lambda l: l.date_maturity is not False) + # ---- Sorted + move_line = move_line.sorted(key=lambda r: r.date_maturity) + # ---- Get date + previous_date_due = move_line.mapped("date_maturity") + pterm = self.env["account.payment.term"].browse( + self.invoice_payment_term_id.id + ) + pterm_list = pterm._compute_terms( + date_ref=self.invoice_date, + currency=self.currency_id, + company=self.company_id, + tax_amount=1, + tax_amount_currency=1, + untaxed_amount=0, + untaxed_amount_currency=0, + sign=1, + ) + + for pay_date in pterm_list: + if not self.month_check(pay_date["date"], previous_date_due): + # ---- Get Line values for service product + service_prod = invoice.company_id.due_cost_service_id + account = service_prod.product_tmpl_id.get_product_accounts( + invoice.fiscal_position_id + )["income"] + line_vals = { + "partner_id": invoice.partner_id.id, + "product_id": service_prod.id, + "move_id": invoice.id, + "price_unit": ( + invoice.invoice_payment_term_id.riba_payment_cost + ), + "due_cost_line": True, + "name": _("{line_name} for {month}-{year}").format( + line_name=service_prod.name, + month=pay_date["date"].month, + year=pay_date["date"].year, + ), + "account_id": account.id, + "sequence": 9999, + } + # ---- Update Line Value with tax if is set on product + if invoice.company_id.due_cost_service_id.taxes_id: + tax = invoice.fiscal_position_id.map_tax(service_prod.taxes_id) + line_vals.update({"tax_ids": [(4, tax.id)]}) + invoice.write({"invoice_line_ids": [(0, 0, line_vals)]}) + # ---- recompute invoice taxes + invoice._sync_dynamic_lines( + container={"records": invoice, "self": invoice} + ) + return super().action_post() + + def button_draft(self): + # ---- Delete Collection Fees Line of invoice when set Back to Draft + # ---- line was added on new validate + res = super(AccountMove, self).button_draft() + for invoice in self: + due_cost_line_ids = invoice.get_due_cost_line_ids() + if due_cost_line_ids: + invoice.write( + {"invoice_line_ids": [(2, id, 0) for id in due_cost_line_ids]} + ) + invoice._sync_dynamic_lines( + container={"records": invoice, "self": invoice} + ) + return res + + def button_cancel(self): + for invoice in self: + # we get move_lines with date_maturity and check if they are + # present in some riba_slip_line + move_line_model = self.env["account.move.line"] + rdml_model = self.env["riba.slip.move.line"] + move_line_ids = move_line_model.search( + [("move_id", "=", invoice.id), ("date_maturity", "!=", False)] + ) + if move_line_ids: + riba_line_ids = rdml_model.search( + [("move_line_id", "in", [m.id for m in move_line_ids])] + ) + if riba_line_ids: + if len(riba_line_ids) > 1: + riba_line_ids = riba_line_ids[0] + raise UserError( + _("Invoice is linked to RiBa slip No. {riba}").format( + riba=riba_line_ids.riba_line_id.slip_id.name + ) + ) + return super(AccountMove, self).button_cancel() + + def copy(self, default=None): + self.ensure_one() + # Delete Collection Fees Line of invoice when copying + invoice = super(AccountMove, self).copy(default) + if invoice: + due_cost_line_ids = invoice.get_due_cost_line_ids() + if due_cost_line_ids: + invoice.write( + {"invoice_line_ids": [(2, id, 0) for id in due_cost_line_ids]} + ) + invoice._sync_dynamic_lines( + container={"records": invoice, "self": invoice} + ) + return invoice + + def get_due_cost_line_ids(self): + return self.invoice_line_ids.filtered(lambda l: l.due_cost_line).ids + + +# se slip_line_ids == None allora non è stata emessa +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + slip_line_ids = fields.One2many( + "riba.slip.move.line", "move_line_id", "RiBa Detail" + ) + riba = fields.Boolean( + related="move_id.invoice_payment_term_id.riba", string="RiBa", store=False + ) + past_due_invoice_ids = fields.Many2many( + "account.move", + "invoice_past_due_line_rel", + "line_id", + "move_id", + "Past Due Invoices", + ) + iban = fields.Char( + related="move_id.riba_partner_bank_id.acc_number", string="IBAN", store=False + ) + due_cost_line = fields.Boolean("RiBa Collection Fees Line") + + @api.model + def fields_view_get( + self, view_id=None, view_type="form", toolbar=False, submenu=False + ): + model_data_obj = self.env["ir.model.data"] + ids = model_data_obj.search( + [ + ("module", "=", "l10n_it_riba"), + ("name", "=", "view_riba_to_issue_tree"), + ] + ) + if ids: + view_payments_tree_id = model_data_obj.get_object_reference( + "l10n_it_riba", "view_riba_to_issue_tree" + ) + if ids and view_id == view_payments_tree_id[1]: + # Use RiBa slip + result = super(models.Model, self).fields_view_get( + view_id, view_type, toolbar=toolbar, submenu=submenu + ) + else: + # Use special views for account.move.line object + # (for ex. tree view contains user defined fields) + result = super(AccountMoveLine, self).fields_view_get( + view_id, view_type, toolbar=toolbar, submenu=submenu + ) + return result + + def get_riba_lines(self): + riba_lines = self.env["riba.slip.line"] + return riba_lines.search([("acceptance_move_id", "=", self.move_id.id)]) + + def update_paid_riba_lines(self): + # set paid only if not past_due + if not self.env.context.get("past_due_reconciliation"): + riba_lines = self.get_riba_lines() + for riba_line in riba_lines: + # allowed transitions: + # credited_to_paid and accepted_to_paid. See workflow + if riba_line.state in ["confirmed", "credited"]: + if riba_line.test_reconciled(): + riba_line.state = "paid" + riba_line.slip_id.state = "paid" + + def reconcile(self): + res = super(AccountMoveLine, self).reconcile() + for line in self: + line.update_paid_riba_lines() + return res + + def action_riba_issue(self): + ctx = dict(self.env.context) + ctx.pop("active_id", None) + ctx["active_ids"] = self.ids + ctx["active_model"] = "account.move.line" + + return { + "type": "ir.actions.act_window", + "name": "Issue RiBa", + "res_model": "riba.issue", + "view_mode": "form", + "target": "new", + "context": ctx, + } + + +class AccountFullReconcile(models.Model): + _inherit = "account.full.reconcile" + + def get_riba_lines(self): + riba_lines = self.env["riba.slip.line"] + for move_line in self.reconciled_line_ids: + riba_lines |= riba_lines.search( + [("acceptance_move_id", "=", move_line.move_id.id)] + ) + return riba_lines + + def unreconcile_riba_lines(self, riba_lines): + for riba_line in riba_lines: + # allowed transitions: + # paid_to_cancel and past_due_to_cancel. See workflow + if riba_line.state in ["paid", "past_due"]: + if not riba_line.test_reconciled(): + if riba_line.slip_id.credit_move_id: + riba_line.state = "credited" + riba_line.slip_id.state = "credited" + else: + riba_line.state = "confirmed" + riba_line.slip_id.state = "accepted" + + def unlink(self): + riba_lines = None + for rec in self: + riba_lines = rec.get_riba_lines() + res = super(AccountFullReconcile, self).unlink() + if riba_lines: + self.unreconcile_riba_lines(riba_lines) + return res + + +class AccountPartialReconcile(models.Model): + _inherit = "account.partial.reconcile" + + def unlink(self): + riba_lines = None + for rec in self: + riba_lines = rec.get_riba_lines() + res = super(AccountPartialReconcile, self).unlink() + if riba_lines: + self.env["account.full.reconcile"].unreconcile_riba_lines(riba_lines) + return res + + def get_riba_lines(self): + riba_lines = self.env["riba.slip.line"] + riba_lines |= riba_lines.search( + [("acceptance_move_id", "=", self.debit_move_id.move_id.id)] + ) + riba_lines |= riba_lines.search( + [("acceptance_move_id", "=", self.credit_move_id.move_id.id)] + ) + return riba_lines diff --git a/l10n_it_riba/models/account_config.py b/l10n_it_riba/models/account_config.py new file mode 100644 index 000000000000..01e3849d12a7 --- /dev/null +++ b/l10n_it_riba/models/account_config.py @@ -0,0 +1,37 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = "res.config.settings" + + due_cost_service_id = fields.Many2one( + string="Default Collection Fees Service", + related="company_id.due_cost_service_id", + help="Default Service for RiBa Collection Fees on invoice.", + domain=[("type", "=", "service")], + readonly=False, + ) + + @api.model + def default_get(self, fields): + res = super(ResConfigSettings, self).default_get(fields) + if res: + res["due_cost_service_id"] = self.env.user.company_id.due_cost_service_id.id + return res + + +class ResCompany(models.Model): + + _inherit = "res.company" + + due_cost_service_id = fields.Many2one("product.product", "Collection Fees Service") diff --git a/l10n_it_riba/models/bank_statement.py b/l10n_it_riba/models/bank_statement.py new file mode 100644 index 000000000000..89eb5693e2e3 --- /dev/null +++ b/l10n_it_riba/models/bank_statement.py @@ -0,0 +1,84 @@ +# Copyright 2018 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models +from odoo.osv import expression + + +class AccountBankStatementLine(models.Model): + _inherit = "account.bank.statement.line" + + def get_move_lines_for_reconciliation( + self, + excluded_ids=None, + string=False, + offset=0, + limit=None, + additional_domain=None, + overlook_partner=False, + partner_id=None, + ): + res = super(AccountBankStatementLine, self).get_move_lines_for_reconciliation( + excluded_ids=excluded_ids, + string=string, + offset=offset, + limit=limit, + additional_domain=additional_domain, + overlook_partner=overlook_partner, + ) + + reconciliation_aml_accounts = [ + self.journal_id.default_credit_account_id.id, + self.journal_id.default_debit_account_id.id, + ] + ctx = dict(self._context or {}) + ctx["bank_statement_line"] = self + generic_domain = ( + self.env["account.move.line"] + .with_context(**ctx) + .domain_move_lines_for_reconciliation(str=str) + ) + + # Include move lines without payment_id but linked to a RiBa slip + # in order to allow closing bank statement lines with credited + # journal items + credited_domain = [ + "&", + "&", + "&", + ("move_id.riba_credited_ids", "!=", False), + ("payment_id", "=", False), + ("statement_id", "=", False), + ("account_id", "in", reconciliation_aml_accounts), + ] + credited_domain = expression.AND([credited_domain, generic_domain]) + credited_res = self.env["account.move.line"].search( + credited_domain, + offset=offset, + limit=limit, + order="date_maturity asc, id asc", + ) + + # Include move lines without payment_id but linked to a RiBa slip + # in order to allow closing bank statement lines with past due + # journal items + past_due_domain = [ + "&", + "&", + "&", + ("move_id.riba_past_due_ids", "!=", False), + ("payment_id", "=", False), + ("statement_id", "=", False), + ("account_id", "in", reconciliation_aml_accounts), + ] + past_due_domain = expression.AND([past_due_domain, generic_domain]) + past_due_res = self.env["account.move.line"].search( + past_due_domain, + offset=offset, + limit=limit, + order="date_maturity asc, id asc", + ) + + res = credited_res | past_due_res | res + return res diff --git a/l10n_it_riba/models/ir_ui_menu.py b/l10n_it_riba/models/ir_ui_menu.py new file mode 100644 index 000000000000..bc0c95b11642 --- /dev/null +++ b/l10n_it_riba/models/ir_ui_menu.py @@ -0,0 +1,27 @@ +# Copyright 2022 Simone Rubino - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models + + +class IrUiMenu(models.Model): + _inherit = "ir.ui.menu" + + def write(self, vals): + old_parent = self.parent_id + new_parent_id = vals.get("parent_id") + + res = super().write(vals) + + if new_parent_id: + # Move the RiBa menu if any of + # its siblings (menu having same parent before write) + # is moved (parent changes). + # This happens when account_accountant (enterprise) + # is installed or uninstalled. + root_riba_menu = self.env.ref("l10n_it_riba.menu_riba") + parent_riba_menu = root_riba_menu.parent_id + if old_parent == parent_riba_menu and new_parent_id != old_parent.id: + root_riba_menu.parent_id = new_parent_id + return res diff --git a/l10n_it_riba/models/partner.py b/l10n_it_riba/models/partner.py new file mode 100644 index 000000000000..7da6ba1c7817 --- /dev/null +++ b/l10n_it_riba/models/partner.py @@ -0,0 +1,18 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + group_riba = fields.Boolean( + "Group RiBa", help="Group RiBa by customer while issuing." + ) diff --git a/l10n_it_riba/models/riba.py b/l10n_it_riba/models/riba.py new file mode 100644 index 000000000000..0488010a6dd7 --- /dev/null +++ b/l10n_it_riba/models/riba.py @@ -0,0 +1,522 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date + +from odoo import _, api, fields, models +from odoo.exceptions import Warning as UserError + + +class RibaList(models.Model): + def _compute_acceptance_move_ids(self): + for riba in self: + move_ids = self.env["account.move"] + for line in riba.line_ids: + move_ids |= line.acceptance_move_id + riba.acceptance_move_ids = move_ids + + def _compute_past_due_move_ids(self): + for riba in self: + move_ids = self.env["account.move"] + for line in riba.line_ids: + move_ids |= line.past_due_move_id + riba.past_due_move_ids = move_ids + + def _compute_payment_ids(self): + for riba in self: + move_lines = self.env["account.move.line"] + for line in riba.line_ids: + move_lines |= line.payment_ids + riba.payment_ids = move_lines + + _name = "riba.slip" + _description = "RiBa Slip" + _inherit = ["mail.thread"] + _order = "date_created desc" + + name = fields.Char( + "Reference", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + default=(lambda self: self.env["ir.sequence"].next_by_code("riba.slip")), + ) + config_id = fields.Many2one( + "riba.configuration", + string="Configuration", + index=True, + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + help="RiBa configuration to be used.", + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("accepted", "Accepted"), + ("credited", "Credited"), + ("paid", "Paid"), + ("past_due", "Past Due"), + ("cancel", "Canceled"), + ], + readonly=True, + default="draft", + ) + line_ids = fields.One2many( + "riba.slip.line", + "slip_id", + "RiBa Due Dates", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + user_id = fields.Many2one( + "res.users", + "User", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + default=lambda self: self.env.user, + ) + date_created = fields.Date( + "Creation Date", + readonly=True, + default=lambda self: fields.Date.context_today(self), + ) + date_accepted = fields.Date("Acceptance Date") + date_credited = fields.Date("Credit Date") + date_paid = fields.Date("Payment Date", readonly=True) + date_past_due = fields.Date("Past Due Date", readonly=True) + company_id = fields.Many2one( + "res.company", + "Company", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + default=lambda self: self.env.company, + ) + acceptance_move_ids = fields.Many2many( + "account.move", + compute="_compute_acceptance_move_ids", + string="Acceptance Entries", + ) + credit_move_id = fields.Many2one("account.move", "Credit Entry", readonly=True) + payment_ids = fields.Many2many( + "account.move.line", compute="_compute_payment_ids", string="Payments" + ) + past_due_move_ids = fields.Many2many( + "account.move", compute="_compute_past_due_move_ids", string="Past Due Entries" + ) + type = fields.Selection(string="Type", related="config_id.type", readonly=True) + registration_date = fields.Date( + states={ + "draft": [("readonly", False)], + "cancel": [("readonly", False)], + }, + readonly=True, + required=True, + default=lambda self: fields.Date.context_today(self), + help="Keep empty to use the current date.", + ) + + def action_riba_export(self): + return { + "type": "ir.actions.act_window", + "name": "Issue RiBa", + "res_model": "riba.file.export", + "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: + if riba_list.state not in ("draft", "cancel"): + raise UserError( + _( + "Slip %(name)s is in state '%(state)s'. You can only delete documents" + " in state 'Draft' or 'Canceled'." + ) + % {"name": riba_list.name, "state": riba_list.state} + ) + + def confirm(self): + for slip in self: + for line in slip.line_ids: + line.confirm() + + def riba_cancel(self): + for slip in self: + for line in slip.line_ids: + line.state = "cancel" + if line.acceptance_move_id: + line.acceptance_move_id.unlink() + if line.past_due_move_id: + line.past_due_move_id.unlink() + if slip.credit_move_id: + slip.credit_move_id.unlink() + slip.state = "cancel" + + def settle_all_line(self): + for riba_list in self: + for line in riba_list.line_ids: + if line.state == "credited": + line.riba_line_settlement() + + @api.onchange("date_accepted", "date_credited") + def _onchange_date(self): + if self.date_accepted and self.date_credited: + if self.date_accepted > self.date_credited: + raise UserError( + _("Credit date must be greater or equal to" " acceptance date.") + ) + + def riba_past_due(self): + self.state = "past_due" + self.date_past_due = fields.Date.context_today(self) + + def test_state(self, state): + for riba_list in self: + for line in riba_list.line_ids: + if line.state != state: + return False + return True + + def test_accepted(self): + return self.test_state("confirmed") + + def test_past_due(self): + return self.test_state("past_due") + + def test_paid(self): + return self.test_state("paid") + + def action_cancel_draft(self): + for riba_list in self: + riba_list.state = "draft" + for line in riba_list.line_ids: + line.state = "draft" + + +class RibaListLine(models.Model): + _name = "riba.slip.line" + _inherit = "mail.thread" + _description = "RiBa Details" + _rec_name = "sequence" + + def _compute_line_values(self): + for line in self: + line.amount = 0.0 + line.invoice_date = "" + 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") + ) + 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") + ), + ) + if not line.invoice_number: + line.invoice_number = str( + move_line.move_line_id.move_id.move_id.name + if move_line.move_line_id.move_id.display_name == "/" + else move_line.move_line_id.move_id.display_name + ) + else: + line.invoice_number = "{}, {}".format( + line.invoice_number, + str( + move_line.move_line_id.move_id.move_id.name + if move_line.move_line_id.move_id.display_name == "/" + else move_line.move_line_id.move_id.display_name + ), + ) + + amount = fields.Float(compute="_compute_line_values") + invoice_date = fields.Char(compute="_compute_line_values", size=256) + invoice_number = fields.Char(compute="_compute_line_values", size=256) + cig = fields.Char(compute="_compute_cig_cup_values", string="CIG", size=256) + cup = fields.Char(compute="_compute_cig_cup_values", string="CUP", size=256) + + def _compute_cig_cup_values(self): + for line in self: + line.cig = "" + line.cup = "" + for move_line in line.move_line_ids: + for ( + related_document + ) in move_line.move_line_id.move_id.related_documents: + if related_document.cup: + line.cup = str(related_document.cup) + if related_document.cig: + line.cig = str(related_document.cig) + + def move_line_id_payment_get(self): + # return the move line ids with the same account as the slip line + if not self.id: + return [] + query = """ SELECT l.id + FROM account_move_line l, riba_slip_line rdl + WHERE rdl.id = %s AND l.move_id = rdl.acceptance_move_id + AND l.account_id = rdl.acceptance_account_id + """ + self._cr.execute(query, (self.id,)) + return [row[0] for row in self._cr.fetchall()] + + def test_reconciled(self): + # check whether all corresponding account move lines are reconciled + line_ids = self.move_line_id_payment_get() + if not line_ids: + return False + move_lines = self.env["account.move.line"].browse(line_ids) + reconcilied = all(line.reconciled for line in move_lines) + return reconcilied + + def _compute_lines(self): + for riba_line in self: + payment_lines = [] + if riba_line.acceptance_move_id and not riba_line.state == "past_due": + for line in riba_line.acceptance_move_id.line_ids: + payment_lines.extend( + [ + _f + for _f in [ + rp.credit_move_id.id for rp in line.matched_credit_ids + ] + if _f + ] + ) + riba_line.payment_ids = self.env["account.move.line"].browse( + list(set(payment_lines)) + ) + + sequence = fields.Integer("Number") + move_line_ids = fields.One2many( + "riba.slip.move.line", "riba_line_id", string="Credit Move Lines" + ) + acceptance_move_id = fields.Many2one( + "account.move", string="Acceptance Entry", readonly=True + ) + past_due_move_id = fields.Many2one( + "account.move", string="Past Due Entry", readonly=True + ) + acceptance_account_id = fields.Many2one( + "account.account", string="Acceptance Account" + ) + bank_id = fields.Many2one("res.partner.bank", string="Debtor Bank") + iban = fields.Char( + related="bank_id.acc_number", string="IBAN", store=False, readonly=True + ) + slip_id = fields.Many2one( + "riba.slip", string="Slip", required=True, ondelete="cascade" + ) + partner_id = fields.Many2one("res.partner", string="Customer", readonly=True) + due_date = fields.Date(readonly=True) + state = fields.Selection( + [ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("credited", "Credited"), + ("paid", "Paid"), + ("past_due", "Past Due"), + ("cancel", "Canceled"), + ], + readonly=True, + tracking=True, + ) + payment_ids = fields.Many2many( + "account.move.line", compute="_compute_lines", string="Payments" + ) + type = fields.Selection( + string="Type", related="slip_id.config_id.type", readonly=True + ) + config_id = fields.Many2one( + string="Configuration", related="slip_id.config_id", readonly=True + ) + company_id = fields.Many2one( + "res.company", + string="Company", + related="slip_id.company_id", + store=True, + readonly=True, + related_sudo=False, + ) + + def confirm(self): + move_model = self.env["account.move"] + move_line_model = self.env["account.move.line"] + for line in self: + journal = line.slip_id.config_id.acceptance_journal_id + total_credit = 0.0 + move = move_model.create( + { + "ref": "RiBa {} - Line {}".format(line.slip_id.name, line.sequence), + "journal_id": journal.id, + "date": line.slip_id.registration_date, + } + ) + to_be_reconciled = self.env["account.move.line"] + riba_move_line_name = "" + for riba_move_line in line.move_line_ids: + total_credit += riba_move_line.amount + if ( + str(riba_move_line.move_line_id.move_id.sequence_number) + and str(riba_move_line.move_line_id.move_id.sequence_number) + not in riba_move_line_name + ): + riba_move_line_name = " ".join( + [ + riba_move_line_name, + str(riba_move_line.move_line_id.move_id.sequence_number), + ] + ).lstrip() + elif ( + riba_move_line.move_line_id.name + and riba_move_line.move_line_id.name not in riba_move_line_name + ): + riba_move_line_name = " ".join( + [riba_move_line_name, riba_move_line.move_line_id.name] + ).lstrip() + move_line = move_line_model.with_context( + check_move_validity=False + ).create( + { + "name": ( + riba_move_line.move_line_id.move_id + and riba_move_line.move_line_id.move_id.sequence_number + or riba_move_line.move_line_id.name + ), + "partner_id": line.partner_id.id, + "account_id": riba_move_line.move_line_id.account_id.id, + "credit": riba_move_line.amount, + "debit": 0.0, + "move_id": move.id, + } + ) + to_be_reconciled |= move_line + to_be_reconciled |= riba_move_line.move_line_id + move_line_model.with_context(check_move_validity=False).create( + { + "name": "RiBa %s-%s Ref. %s - %s" + % ( + line.slip_id.name, + line.sequence, + riba_move_line_name, + line.partner_id.name, + ), + "account_id": ( + line.acceptance_account_id.id + or line.slip_id.config_id.acceptance_account_id.id + # in questo modo se la riga non ha conto accettazione + # viene prelevato il conto in configuration riba + ), + "partner_id": line.partner_id.id, + "date_maturity": line.due_date, + "credit": 0.0, + "debit": total_credit, + "move_id": move.id, + } + ) + move.action_post() + to_be_reconciled.reconcile() + line.write( + { + "acceptance_move_id": move.id, + "state": "confirmed", + } + ) + line.slip_id.state = "accepted" + if not line.slip_id.date_accepted: + line.slip_id.date_accepted = fields.Date.context_today(self) + + def riba_line_settlement(self): + for riba_line in self: + if not riba_line.slip_id.config_id.settlement_journal_id: + raise UserError(_("Please define a Settlement Journal.")) + + # trovare le move line delle scritture da chiudere + move_model = self.env["account.move"] + move_line_model = self.env["account.move.line"] + + settlement_move_line = move_line_model.search( + [ + ("account_id", "=", riba_line.acceptance_account_id.id), + ("move_id", "=", riba_line.acceptance_move_id.id), + ("debit", "!=", 0), + ] + ) + + settlement_move_amount = settlement_move_line.debit + + move_ref = "Settlement RiBa {} - {}".format( + riba_line.slip_id.name, + riba_line.partner_id.name, + ) + settlement_move = move_model.create( + { + "journal_id": ( + riba_line.slip_id.config_id.settlement_journal_id.id + ), + "date": date.today().strftime("%Y-%m-%d"), + "ref": move_ref, + } + ) + + move_line_credit = move_line_model.with_context( + check_move_validity=False + ).create( + { + "name": move_ref, + "partner_id": riba_line.partner_id.id, + "account_id": riba_line.acceptance_account_id.id, + "credit": settlement_move_amount, + "debit": 0.0, + "move_id": settlement_move.id, + } + ) + + credit_account = riba_line.slip_id.config_id.credit_account_id + move_line_model.with_context(check_move_validity=False).create( + { + "name": move_ref, + "account_id": credit_account.id, + "credit": 0.0, + "debit": settlement_move_amount, + "move_id": settlement_move.id, + } + ) + + move_line_credit.move_id.action_post() + to_be_settled = self.env["account.move.line"] + to_be_settled |= move_line_credit + to_be_settled |= settlement_move_line + + to_be_settled.reconcile() + + +class RibaListMoveLine(models.Model): + _name = "riba.slip.move.line" + _description = "RiBa Details" + _rec_name = "amount" + + amount = fields.Float(digits="Account") + move_line_id = fields.Many2one("account.move.line", string="Credit Move Line") + riba_line_id = fields.Many2one( + "riba.slip.line", string="Slip Line", ondelete="cascade" + ) diff --git a/l10n_it_riba/models/riba_config.py b/l10n_it_riba/models/riba_config.py new file mode 100644 index 000000000000..989148962c5b --- /dev/null +++ b/l10n_it_riba/models/riba_config.py @@ -0,0 +1,104 @@ +# Copyright (C) 2012 Andrea Cometa. +# Email: info@andreacometa.it +# Web site: http://www.andreacometa.it +# Copyright (C) 2012 Associazione OpenERP Italia +# (). +# Copyright (C) 2012-2017 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class RibaConfiguration(models.Model): + + _name = "riba.configuration" + _description = "Configuration parameters for RiBa" + + name = fields.Char("Description", size=64, required=True) + type = fields.Selection( + [("sbf", "Subject To Collection"), ("incasso", "After Collection")], + "Issue Mode", + required=True, + ) + bank_id = fields.Many2one( + "res.partner.bank", + "Bank Account", + required=True, + help="Bank account used for RiBa issuing.", + ) + acceptance_journal_id = fields.Many2one( + "account.journal", + "Acceptance Journal", + domain=[("type", "=", "bank")], + help="Journal used when RiBa is accepted by the bank.", + ) + acceptance_account_id = fields.Many2one( + "account.account", + "Acceptance Account", + help="Account used when RiBa is accepted by the bank.", + ) + company_id = fields.Many2one( + "res.company", + "Company", + required=True, + default=lambda self: self.env.company, + ) + credit_journal_id = fields.Many2one( + "account.journal", + "Credit Journal", + domain=[("type", "=", "bank")], + help="Journal used when RiBa amount is credited by the bank.", + ) + credit_account_id = fields.Many2one( + "account.account", + "RiBa Account", + help="Account used when RiBa amount is credited by the bank.", + domain=[("account_type", "!=", "liability_credit_card")], + ) + bank_account_id = fields.Many2one( + "account.account", + "A/C Bank Account", + domain=[("account_type", "=", "asset_cash")], + ) + 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")], + help="Journal used when RiBa is past due.", + ) + overdue_effects_account_id = fields.Many2one( + "account.account", + "Past Due Bills Account", + domain=[("account_type", "=", "asset_receivable")], + ) + protest_charge_account_id = fields.Many2one( + "account.account", "Protest Fee Account" + ) + settlement_journal_id = fields.Many2one( + "account.journal", + "Settlement Journal", + help="Journal used when customers finally pay the invoice to bank.", + ) + + def get_default_value_by_list(self, field_name): + if not self.env.context.get("active_id", False): + return False + ribalist_model = self.env["riba.slip"] + ribalist = ribalist_model.browse(self.env.context["active_id"]) + return ( + ribalist.config_id[field_name] + and ribalist.config_id[field_name].id + or False + ) + + def get_default_value_by_list_line(self, field_name): + if not self.env.context.get("active_id", False): + return False + ribalist_line = self.env["riba.slip.line"].browse(self.env.context["active_id"]) + return ( + ribalist_line.slip_id.config_id[field_name] + and ribalist_line.slip_id.config_id[field_name].id + or False + ) diff --git a/l10n_it_riba/readme/CONFIGURE.rst b/l10n_it_riba/readme/CONFIGURE.rst new file mode 100644 index 000000000000..8ca7e477f7af --- /dev/null +++ b/l10n_it_riba/readme/CONFIGURE.rst @@ -0,0 +1,30 @@ +**Italiano** + +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. +- Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel + documento http://goo.gl/jpRhJp + +È possibile specificare diverse configurazioni (dal menù +*Configurazione → Pagamenti → Configurazione RiBa*). Per ognuna, in caso di +'Salvo buon fine', è necessario specificare almeno il registro e il conto da +utilizzare al momento dell'accettazione della distinta da parte della banca. +Tale conto deve essere di tipo 'Crediti' (ad esempio "RiBa all'incasso", +eventualmente da creare). + +La configurazione relativa alla fase di accredito, verrà usata nel momento in +cui la banca accredita l'importo della distinta. +È possibile utilizzare un registro creato appositamente, ad esempio "Accredito RiBa", +e un conto chiamato ad esempio "Banche c/RiBa all'incasso", che non deve essere di tipo +'Banca e cassa'. + +La configurazione relativa all'insoluto verrà utilizzata in caso di mancato pagamento +da parte del cliente. +Il conto può chiamarsi ad esempio "Crediti insoluti". + +Nel caso si vogliano gestire anche le spese per ogni scadenza con ricevuta bancaria, +si deve configurare un prodotto di tipo servizio e collegarlo in +*Configurazione → Impostazioni → Contabilità → Imposte → Spese di incasso RiBa*. diff --git a/l10n_it_riba/readme/CONTRIBUTORS.rst b/l10n_it_riba/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..9c4683bbfedf --- /dev/null +++ b/l10n_it_riba/readme/CONTRIBUTORS.rst @@ -0,0 +1,15 @@ +* Lorenzo Battistini +* Andrea Cometa +* Andrea Gallina +* Davide Corio +* Giacomo Grasso +* Gabriele Baldessari +* Alex Comba +* Marco Calcagni +* Sergio Zanchetta +* Simone Vanin +* Sergio Corato +* Giovanni Serra +* `Aion Tech `_: + + * Simone Rubino diff --git a/l10n_it_riba/readme/DESCRIPTION.rst b/l10n_it_riba/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..72367ba21ae6 --- /dev/null +++ b/l10n_it_riba/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +**Italiano** + +Modulo per gestire le ricevute bancarie. diff --git a/l10n_it_riba/readme/ROADMAP.rst b/l10n_it_riba/readme/ROADMAP.rst new file mode 100644 index 000000000000..c9ff0feb7dd3 --- /dev/null +++ b/l10n_it_riba/readme/ROADMAP.rst @@ -0,0 +1,4 @@ +**Italiano** + +Attenzione! +Il modulo è stato migrato, ma gli script di migrazione non sono stati provati. diff --git a/l10n_it_riba/readme/USAGE.rst b/l10n_it_riba/readme/USAGE.rst new file mode 100644 index 000000000000..448fc16c8fc7 --- /dev/null +++ b/l10n_it_riba/readme/USAGE.rst @@ -0,0 +1,19 @@ +**Italiano** + +Per utilizzare il meccanismo delle RiBa è necessario configurare un termine +di pagamento di tipo 'RiBa'. + +Per emettere una distinta è necessario andare su *RiBa → Emetti RiBa* e +selezionare i pagamenti per i quali emettere la distinta. +Se per il cliente è stato abilitato il raggruppamento, i pagamenti dello stesso +cliente e con la stessa data di scadenza andranno a costituire un solo elemento +della distinta. + +I possibili stati della distinta sono: *Bozza*, *Accettata*, *Accreditata*, +*Pagata*, *Insoluta* e *Annullata*. +Ad ogni passaggio di stato sarà possibile generare le relative registrazioni +contabili, le quali verranno riepilogate nella scheda «Contabilità». +Questa scheda è 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. diff --git a/l10n_it_riba/report/__init__.py b/l10n_it_riba/report/__init__.py new file mode 100644 index 000000000000..e280c23f9cfe --- /dev/null +++ b/l10n_it_riba/report/__init__.py @@ -0,0 +1,4 @@ +# © 2016 Andrea Cometa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import slip_qweb diff --git a/l10n_it_riba/report/report.xml b/l10n_it_riba/report/report.xml new file mode 100644 index 000000000000..25f4ba1a2812 --- /dev/null +++ b/l10n_it_riba/report/report.xml @@ -0,0 +1,16 @@ + + + + + Print Slip + riba.slip + qweb-pdf + l10n_it_riba.slip_qweb + l10n_it_riba.slip_qweb + + report + + diff --git a/l10n_it_riba/report/slip_qweb.py b/l10n_it_riba/report/slip_qweb.py new file mode 100644 index 000000000000..d85521371d89 --- /dev/null +++ b/l10n_it_riba/report/slip_qweb.py @@ -0,0 +1,19 @@ +# © 2016 Andrea Cometa +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class SlipReportQweb(models.AbstractModel): + + _name = "report.l10n_it_riba.slip_qweb" + _description = "RiBa Slip Report" + + def _get_report_values(self, docids, data=None): + return { + "doc_ids": docids, + "doc_model": "riba.slip", + "docs": self.env["riba.slip"].browse(docids), + "data": data, + } diff --git a/l10n_it_riba/security/ir.model.access.csv b/l10n_it_riba/security/ir.model.access.csv new file mode 100644 index 000000000000..4c7c9d9f10b1 --- /dev/null +++ b/l10n_it_riba/security/ir.model.access.csv @@ -0,0 +1,20 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_riba_slip_uinvoice,riba_slip,model_riba_slip,account.group_account_invoice,1,1,1,1 +access_riba_slip_group_invoice,riba_slip group invoice,model_riba_slip,account.group_account_invoice,1,1,1,1 +access_riba_slip_user,riba_slip user,model_riba_slip,base.group_user,1,0,0,0 +access_riba_slip_accountant,riba_slip accountant,model_riba_slip,account.group_account_user,1,0,0,0 +access_riba_slip_line_uinvoice,riba_slip_line,model_riba_slip_line,account.group_account_invoice,1,1,1,1 +access_riba_slip_line_group_invoice,riba_slip_line group invoice,model_riba_slip_line,account.group_account_invoice,1,1,1,1 +access_riba_slip_line_user,riba_slip_line user,model_riba_slip_line,base.group_user,1,0,0,0 +access_riba_slip_line_accountant,riba_slip_line accountant,model_riba_slip_line,account.group_account_user,1,0,0,0 +access_riba_slip_move_line_uinvoice,riba_slip_move_line,model_riba_slip_move_line,account.group_account_invoice,1,1,1,1 +access_riba_slip_move_line_group_invoice,riba_slip_move_line group invoice,model_riba_slip_move_line,account.group_account_invoice,1,1,1,1 +access_riba_slip_move_line_user,riba_slip_move_line user,model_riba_slip_move_line,base.group_user,1,0,0,0 +access_riba_slip_move_line_accountant,riba_slip_move_line accountant,model_riba_slip_move_line,account.group_account_user,1,0,0,0 +access_riba_configuration_manager,riba_configuration,model_riba_configuration,account.group_account_manager,1,1,1,1 +access_riba_configuration_invoice,riba_configuration invoice,model_riba_configuration,account.group_account_invoice,1,0,0,0 +access_riba_issue,riba_issue,model_riba_issue,account.group_account_invoice,1,1,1,1 +access_riba_past_due,riba_past_due,model_riba_past_due,account.group_account_invoice,1,1,1,1 +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 diff --git a/l10n_it_riba/security/riba_security.xml b/l10n_it_riba/security/riba_security.xml new file mode 100644 index 000000000000..2b49e3d717a2 --- /dev/null +++ b/l10n_it_riba/security/riba_security.xml @@ -0,0 +1,36 @@ + + + + + + + RiBa slip multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + RiBa slip line multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + Ri.Ba. configuration multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + diff --git a/l10n_it_riba/static/description/icon.png b/l10n_it_riba/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc89bcdc9f96348fb27ec0499d09d8ba8f8b81b3 GIT binary patch literal 17433 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 P00000NkvXXu0mjf10BLS literal 0 HcmV?d00001 diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html new file mode 100644 index 000000000000..cc72d1273d32 --- /dev/null +++ b/l10n_it_riba/static/description/index.html @@ -0,0 +1,486 @@ + + + + + + +ITA - Ricevute bancarie + + + +
+

ITA - Ricevute bancarie

+ + +

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

+

Italiano

+

Modulo per gestire le ricevute bancarie.

+

Table of contents

+ +
+

Configuration

+

Italiano

+

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.
  • +
  • Salvo buon fine: le registrazioni generate seguiranno la struttura descritta nel +documento http://goo.gl/jpRhJp
  • +
+

È possibile specificare diverse configurazioni (dal menù +Configurazione → Pagamenti → Configurazione RiBa). Per ognuna, in caso di +‘Salvo buon fine’, è necessario specificare almeno il registro e il conto da +utilizzare al momento dell’accettazione della distinta da parte della banca. +Tale conto deve essere di tipo ‘Crediti’ (ad esempio “RiBa all’incasso”, +eventualmente da creare).

+

La configurazione relativa alla fase di accredito, verrà usata nel momento in +cui la banca accredita l’importo della distinta. +È possibile utilizzare un registro creato appositamente, ad esempio “Accredito RiBa”, +e un conto chiamato ad esempio “Banche c/RiBa all’incasso”, che non deve essere di tipo +‘Banca e cassa’.

+

La configurazione relativa all’insoluto verrà utilizzata in caso di mancato pagamento +da parte del cliente. +Il conto può chiamarsi ad esempio “Crediti insoluti”.

+

Nel caso si vogliano gestire anche le spese per ogni scadenza con ricevuta bancaria, +si deve configurare un prodotto di tipo servizio e collegarlo in +Configurazione → Impostazioni → Contabilità → Imposte → Spese di incasso RiBa.

+
+
+

Usage

+

Italiano

+

Per utilizzare il meccanismo delle RiBa è necessario configurare un termine +di pagamento di tipo ‘RiBa’.

+

Per emettere una distinta è necessario andare su RiBa → Emetti RiBa e +selezionare i pagamenti per i quali emettere la distinta. +Se per il cliente è stato abilitato il raggruppamento, i pagamenti dello stesso +cliente e con la stessa data di scadenza andranno a costituire un solo elemento +della distinta.

+

I possibili stati della distinta sono: Bozza, Accettata, Accreditata, +Pagata, Insoluta e Annullata. +Ad ogni passaggio di stato sarà possibile generare le relative registrazioni +contabili, le quali verranno riepilogate nella scheda «Contabilità». +Questa scheda è 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.

+
+
+

Known issues / Roadmap

+

Italiano

+

Attenzione! +Il modulo è stato migrato, ma gli script di migrazione non sono stati provati.

+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Contributors

+ +
+
+

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.

+

This module is part of the OCA/l10n-italy project on GitHub.

+

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

+
+
+
+ + diff --git a/l10n_it_riba/tests/__init__.py b/l10n_it_riba/tests/__init__.py new file mode 100644 index 000000000000..68fd2dc7319b --- /dev/null +++ b/l10n_it_riba/tests/__init__.py @@ -0,0 +1,9 @@ +# +# Author: Andrea Gallina +# © 2015 Apulia Software srl +# +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_menu +from . import test_riba +from . import riba_common diff --git a/l10n_it_riba/tests/riba_common.py b/l10n_it_riba/tests/riba_common.py new file mode 100644 index 000000000000..f6beae5f508a --- /dev/null +++ b/l10n_it_riba/tests/riba_common.py @@ -0,0 +1,272 @@ +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields +from odoo.tests import common + + +class TestRibaCommon(common.TransactionCase): + def setUp(self): + super(TestRibaCommon, self).setUp() + tax_model = self.env["account.tax"] + self.account_tax = ( + self.env.ref("l10n_it.2601", raise_if_not_found=False) + or self.env.ref("l10n_generic_coa.tax_payable", raise_if_not_found=False) + or self.env["account.account"].search( + [("account_type", "=", "liability_current")], limit=1 + ) + ) + self.tax_22 = tax_model.create( + { + "name": "IVA 22 Sale", + "description": "22", + "amount": 22.00, + "type_tax_use": "sale", + "invoice_repartition_line_ids": [ + (5, 0, 0), + ( + 0, + 0, + { + "factor_percent": 100, + "repartition_type": "base", + }, + ), + ( + 0, + 0, + { + "factor_percent": 100, + "repartition_type": "tax", + "account_id": self.account_tax.id, + }, + ), + ], + "refund_repartition_line_ids": [ + (5, 0, 0), + ( + 0, + 0, + { + "factor_percent": 100, + "repartition_type": "base", + }, + ), + ( + 0, + 0, + { + "factor_percent": 100, + "repartition_type": "tax", + "account_id": self.account_tax.id, + }, + ), + ], + } + ) + 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"] + self.move_model = self.env["account.move"] + self.slip_model = self.env["riba.slip"] + self.partner = self.env.ref("base.res_partner_3") + self.partner.vat = "IT01234567890" + self.product1 = self.env.ref("product.product_product_5") + self.sale_journal = self.env["account.journal"].search([("type", "=", "sale")])[ + 0 + ] + self.bank_journal = self.env["account.journal"].search( + [("type", "=", "bank")], limit=1 + ) + self.payment_term1 = self._create_pterm() + self.payment_term2 = self._create_pterm2() + self.account_rec1_id = self.account_model.create( + dict( + code="custacc", + name="customer account", + account_type="asset_receivable", + reconcile=True, + ) + ) + self.sale_account = self.env["account.account"].search( + [ + ( + "account_type", + "=", + "income_other", + ) + ], + limit=1, + ) + self.expenses_account = self.env["account.account"].search( + [ + ( + "account_type", + "=", + "expense", + ) + ], + limit=1, + ) + self.bank_account = self.env["account.account"].search( + [ + ( + "account_type", + "=", + "asset_cash", + ) + ], + limit=1, + ) + self.invoice = self._create_invoice() + self.invoice2 = self._create_invoice() + self.sbf_effects = self.env["account.account"].create( + { + "code": "STC", + "name": "STC Bills (test)", + "reconcile": True, + "account_type": "asset_receivable", + } + ) + self.riba_account = self.env["account.account"].create( + { + "code": "RiBa", + "name": "RiBa Account (test)", + "account_type": "asset_fixed", + } + ) + self.past_due_account = self.env["account.account"].create( + { + "code": "PastDue", + "name": "Past Due Bills Account (test)", + "reconcile": True, + "account_type": "asset_receivable", + } + ) + self.company_bank = self.env.ref("l10n_it_riba.company_bank") + self.riba_config = self.create_config() + self.account_payment_term_riba = self.env.ref( + "l10n_it_riba.account_payment_term_riba" + ) + self.company_bank.codice_sia = "AA555" + + def _create_service_due_cost(self): + return self.env["product.product"].create( + { + "name": "Collection Fees", + "type": "service", + "taxes_id": [[6, 0, self.tax_22.ids]], + "property_account_income_id": self._account_expense(), + } + ) + + def _account_expense(self): + return self.env["account.account"].create( + { + "code": "demoduecost", + "name": "cashing fees", + "account_type": "expense", + } + ) + + def _create_invoice(self): + # ----- Set invoice date to recent date in the system + # ----- This solves problems with account_invoice_sequential_dates + self.partner.property_account_receivable_id = self.account_rec1_id.id + recent_date = ( + self.env["account.move"] + .search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1) + .invoice_date + ) + return self.env["account.move"].create( + { + "invoice_date": recent_date or fields.Date.today(), + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.payment_term1.id, + "riba_partner_bank_id": self.partner.bank_ids[0].id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": self.product1.name, + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 100.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, self.tax_22.ids]], + }, + ) + ], + } + ) + + def _create_pterm(self): + return self.env["account.payment.term"].create( + { + "name": "RiBa 30/60", + "riba": True, + "riba_payment_cost": 5.00, + "line_ids": [ + ( + 0, + 0, + { + "value": "percent", + "months": 0, + "days": 30, + "value_amount": 0.50, + }, + ), + ( + 0, + 0, + { + "value": "balance", + "months": 0, + "days": 60, + }, + ), + ], + } + ) + + def _create_pterm2(self): + return self.env["account.payment.term"].create( + { + "name": "RiBa 30", + "riba": True, + "riba_payment_cost": 5.00, + "line_ids": [ + ( + 0, + 0, + { + "value": "balance", + "months": 1, + "days": 1, + }, + ) + ], + } + ) + + def create_config(self): + return self.env["riba.configuration"].create( + { + "name": "Subject To Collection", + "type": "sbf", + "bank_id": self.company_bank.id, + "acceptance_journal_id": self.bank_journal.id, + "credit_journal_id": self.bank_journal.id, + "acceptance_account_id": self.sbf_effects.id, + "credit_account_id": self.riba_account.id, + "bank_account_id": self.bank_account.id, + "bank_expense_account_id": self.expenses_account.id, + "past_due_journal_id": self.bank_journal.id, + "overdue_effects_account_id": self.past_due_account.id, + "protest_charge_account_id": self.expenses_account.id, + } + ) diff --git a/l10n_it_riba/tests/test_menu.py b/l10n_it_riba/tests/test_menu.py new file mode 100644 index 000000000000..c2b734ed3c0c --- /dev/null +++ b/l10n_it_riba/tests/test_menu.py @@ -0,0 +1,51 @@ +# Copyright 2022 Simone Rubino - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests import common + + +class TestRiBaCommon(common.TransactionCase): + def setUp(self): + super().setUp() + self.menu_model = self.env["ir.ui.menu"] + self.root_riba_menu = self.browse_ref("l10n_it_riba.menu_riba") + self.new_parent = self.browse_ref("base.menu_custom") + + def test_sibling_moved(self): + """Check that RiBa menu is moved when a sibling changes parent.""" + root_riba_parent_menu = self.root_riba_menu.parent_id + sibling_menu = self.menu_model.search( + [ + ("parent_id", "=", root_riba_parent_menu.id), + ], + limit=1, + ) + # pre-condition: menus have same parent + self.assertEqual(root_riba_parent_menu, sibling_menu.parent_id) + + # Change sibling's parent + sibling_menu.parent_id = self.new_parent + + # Check that RiBa menu's parent has changed according to its sibling + self.assertEqual(self.root_riba_menu.parent_id, sibling_menu.parent_id) + self.assertNotEqual(self.root_riba_menu.parent_id, root_riba_parent_menu) + + def test_not_sibling_not_moved(self): + """Check that RiBa menu is not moved when a menu + that is not a sibling changes parent.""" + root_riba_parent_menu = self.root_riba_menu.parent_id + not_sibling_menu = self.menu_model.search( + [ + ("parent_id", "!=", root_riba_parent_menu.id), + ], + limit=1, + ) + # pre-condition: menus have different parent + self.assertNotEqual(root_riba_parent_menu, not_sibling_menu.parent_id) + + # Change not-sibling menu's parent + not_sibling_menu.parent_id = self.new_parent + + # Check RiBa menu's parent is not changed + self.assertEqual(self.root_riba_menu.parent_id, root_riba_parent_menu) diff --git a/l10n_it_riba/tests/test_riba.py b/l10n_it_riba/tests/test_riba.py new file mode 100644 index 000000000000..31d404c1a1d5 --- /dev/null +++ b/l10n_it_riba/tests/test_riba.py @@ -0,0 +1,538 @@ +# Author: Andrea Gallina +# © 2015 Apulia Software srl +# Copyright (C) 2017 Lorenzo Battistini - Agile Business Group +# Copyright 2023 Simone Rubino - Aion Tech +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import base64 +import os + +from odoo.tools import config + +from . import riba_common + + +class TestInvoiceDueCost(riba_common.TestRibaCommon): + def setUp(self): + super(TestInvoiceDueCost, self).setUp() + + def test_add_due_cost(self): + # ---- Set Service in Company Config + self.invoice.company_id.due_cost_service_id = self.service_due_cost.id + # ---- Validate Invoice + self.invoice.action_post() + # ---- Test Invoice has 2 line + self.assertEqual(len(self.invoice.invoice_line_ids), 3) + # ---- Test Invoice Line for service cost + self.assertEqual( + self.invoice.invoice_line_ids[1].product_id.id, self.service_due_cost.id + ) + # ---- Test Invoice Line for service cost + self.assertEqual( + self.invoice.invoice_line_ids[2].product_id.id, self.service_due_cost.id + ) + # ---- Test Cost line is equal to 10.00 + self.assertEqual( + ( + self.invoice.invoice_line_ids[1].price_unit + + self.invoice.invoice_line_ids[2].price_unit + ), + 10.00, + ) + new_inv = self.invoice.copy() + self.assertEqual(len(new_inv.invoice_line_ids), 1) + + def test_not_add_due_cost(self): + # create 2 invoice for partner in same month on the second one no + # collection fees line expected + # ---- Set Service in Company Config + self.invoice.company_id.due_cost_service_id = self.service_due_cost.id + # ---- Validate Invoice + self.invoice.action_post() + + self.invoice2.invoice_payment_term_id = self.payment_term2 + self.invoice2.action_post() + # ---- Test Invoice has 1 line, no collection fees added because it's added on + # ---- first due date for partner + self.assertEqual(len(self.invoice2.invoice_line_ids), 1) + + def test_delete_due_cost_line(self): + # ---- Set Service in Company Config + self.invoice.company_id.due_cost_service_id = self.service_due_cost.id + # ---- Validate Invoice + self.invoice.action_post() + # ---- Cancel Invoice + self.invoice.button_cancel() + self.invoice.button_draft() + # ---- Set to Draft + # Collection fees line has been unlink + self.assertEqual(len(self.invoice.invoice_line_ids), 1) + + def test_riba_flow(self): + self.partner.property_account_receivable_id = self.account_rec1_id.id + recent_date = ( + self.env["account.move"] + .search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1) + .invoice_date + ) + invoice = self.env["account.move"].create( + { + "invoice_date": recent_date, + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.account_payment_term_riba.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "product1", + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 450.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, []]], + }, + ) + ], + } + ) + invoice._onchange_riba_partner_bank_id() + invoice.action_post() + riba_move_line_id = False + for move_line in invoice.line_ids: + if move_line.account_id.id == self.account_rec1_id.id: + riba_move_line_id = move_line.id + line_ids = self.move_line_model.search( + [ + "&", + "|", + ("riba", "=", "True"), + ("past_due_invoice_ids", "!=", False), + ("account_type", "=", "asset_receivable"), + ("reconciled", "=", False), + ("slip_line_ids", "=", False), + ("move_id", "=", invoice.id), + ] + ) + self.assertEqual(len(line_ids), 1) + self.assertEqual(line_ids[0].id, move_line.id) + self.assertTrue(riba_move_line_id) + + # issue wizard + wizard_riba_issue = self.env["riba.issue"].create( + {"configuration_id": self.riba_config.id} + ) + action = wizard_riba_issue.with_context( + active_ids=[riba_move_line_id] + ).create_list() + riba_list_id = action and action["res_id"] or False + riba_list = self.slip_model.browse(riba_list_id) + riba_list.confirm() + self.assertEqual(riba_list.state, "accepted") + self.assertEqual(invoice.state, "posted") + + # Se la compute non viene invocata il test fallisce + riba_list._compute_acceptance_move_ids() + self.assertEqual(len(riba_list.acceptance_move_ids), 1) + self.assertEqual(len(riba_list.payment_ids), 0) + + # I print the RiBa slip report + docargs = { + "doc_ids": riba_list.ids, + "doc_model": "riba.slip", + "docs": self.env["riba.slip"].browse(riba_list.ids), + } + data = self.env["ir.qweb"]._render("l10n_it_riba.slip_qweb", docargs) + if config.get("test_report_directory"): + open( + os.path.join(config["test_report_directory"], "riba-list." + format), + "wb+", + ).write(data) + + # credit wizard + credit_wizard = ( + self.env["riba.credit"] + .with_context( + active_model="riba.slip", + active_ids=[riba_list_id], + active_id=riba_list_id, + ) + .create( + { + "bank_amount": 445, + "expense_amount": 5, + } + ) + ) + credit_wizard.create_move() + self.assertEqual(riba_list.state, "credited") + + bank_credit_line = False + for credit_line in riba_list.credit_move_id.line_ids: + if credit_line.account_id.id == self.bank_account.id: + bank_credit_line = credit_line + break + self.assertTrue(bank_credit_line) + + # register the bank statement with the bank credit + # st = self.env['account.bank.statement'].create({ + # 'journal_id': self.bank_journal.id, + # 'name': 'bank statement', + # 'line_ids': [(0, 0, { + # 'name': 'RiBa', + # 'amount': 445, + # })] + # }) + + # must be possible to close the bank statement line with the + # credit journal item generated by RiBa + # move_lines_for_rec=st.line_ids[0].get_move_lines_for_reconciliation() + # self.assertTrue( + # bank_credit_line.id in [l.id for l in move_lines_for_rec]) + # + # bank notifies cash in + bank_move = self.move_model.create( + { + "journal_id": self.bank_journal.id, + "line_ids": [ + ( + 0, + 0, + { + "partner_id": self.partner.id, + "account_id": self.sbf_effects.id, + "credit": 450, + "debit": 0, + "name": "sbf effects", + }, + ), + ( + 0, + 0, + { + "partner_id": self.partner.id, + "account_id": self.riba_account.id, + "credit": 0, + "debit": 450, + "name": "Banca conto ricevute bancarie", + }, + ), + ], + } + ) + bank_move.action_post() + to_reconcile = self.env["account.move.line"] + line_set = bank_move.line_ids | riba_list.acceptance_move_ids[0].line_ids + for line in line_set: + if line.account_id.id == self.sbf_effects.id: + to_reconcile |= line + self.assertEqual(len(to_reconcile), 2) + to_reconcile.reconcile() + # refresh otherwise riba_list.payment_ids is not recomputed + riba_list.env.invalidate_all() + self.assertEqual(riba_list.state, "paid") + self.assertEqual(len(riba_list.payment_ids), 1) + self.assertEqual(len(riba_list.line_ids), 1) + self.assertEqual(riba_list.line_ids[0].state, "paid") + to_reconcile.remove_move_reconcile() + self.assertEqual(riba_list.state, "credited") + self.assertEqual(riba_list.line_ids[0].state, "credited") + + 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 + recent_date = ( + self.env["account.move"] + .search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1) + .invoice_date + ) + invoice = self.env["account.move"].create( + { + "invoice_date": recent_date, + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.account_payment_term_riba.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "product1", + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 100.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, []]], + }, + ) + ], + } + ) + invoice._onchange_riba_partner_bank_id() + invoice.action_post() + for move_line in invoice.line_ids: + if move_line.account_id.id == self.account_rec1_id.id: + riba_move_line_id = move_line.id + # issue wizard + wizard_riba_issue = self.env["riba.issue"].create( + {"configuration_id": self.riba_config.id} + ) + action = wizard_riba_issue.with_context( + active_ids=[riba_move_line_id] + ).create_list() + riba_list_id = action and action["res_id"] or False + riba_list = self.slip_model.browse(riba_list_id) + riba_list.confirm() + self.assertEqual(riba_list.state, "accepted") + self.assertEqual(invoice.state, "posted") + # credit wizard + credit_wizard = ( + self.env["riba.credit"] + .with_context( + active_model="riba.slip", + active_ids=[riba_list_id], + active_id=riba_list_id, + ) + .create( + { + "bank_amount": 95, + "expense_amount": 5, + } + ) + ) + credit_wizard.create_move() + self.assertEqual(riba_list.state, "credited") + + # past due wizard + past_due_wizard = ( + self.env["riba.past_due"] + .with_context( + active_model="riba.slip.line", + active_ids=[riba_list.line_ids[0].id], + active_id=riba_list.line_ids[0].id, + ) + .create( + { + "bank_amount": 102, + "expense_amount": 2, + } + ) + ) + past_due_wizard.create_move() + self.assertEqual(riba_list.state, "past_due") + self.assertEqual(len(riba_list.line_ids), 1) + self.assertEqual(riba_list.line_ids[0].state, "past_due") + self.assertTrue(invoice.past_due_move_line_ids) + + # Se la compute non viene invocata il test fallisce + riba_list._compute_past_due_move_ids() + self.assertEqual(len(riba_list.past_due_move_ids), 1) + bank_past_due_line = False + for past_due_line in riba_list.past_due_move_ids[0].line_ids: + if past_due_line.account_id.id == self.bank_account.id: + bank_past_due_line = past_due_line + break + self.assertTrue(bank_past_due_line) + + # register the bank statement with the bank credit + # st = self.env['account.bank.statement'].create({ + # 'journal_id': self.bank_journal.id, + # 'name': 'bank statement', + # 'line_ids': [(0, 0, { + # 'name': 'RiBa', + # 'amount': -102, + # })] + # }) + # must be possible to close the bank statement line with the + # past due journal item generated by RiBa + # move_lines_for_rec=st.line_ids[0].get_move_lines_for_reconciliation() + # 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 = ( + self.env["account.move"] + .search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1) + .invoice_date + ) + invoice = self.env["account.move"].create( + { + "invoice_date": recent_date, + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.account_payment_term_riba.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "product1", + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 450.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, self.tax_22.ids]], + }, + ) + ], + "related_documents": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690124", + }, + ) + ], + } + ) + invoice._onchange_riba_partner_bank_id() + invoice.action_post() + # issue wizard + riba_move_line_id = invoice.line_ids.filtered( + lambda x: x.account_id == self.account_rec1_id + ) + wizard_riba_issue = self.env["riba.issue"].create( + {"configuration_id": self.riba_config.id} + ) + action = wizard_riba_issue.with_context( + active_ids=[riba_move_line_id.id] + ).create_list() + riba_list_id = action and action["res_id"] or False + riba_list = self.slip_model.browse(riba_list_id) + riba_list.confirm() + self.assertEqual(riba_list.line_ids[0].cig, "7987210EG5") + self.assertEqual(riba_list.line_ids[0].cup, "H71N17000690124") + wizard_riba_export = self.env["riba.file.export"].create({}) + wizard_riba_export.with_context(active_ids=[riba_list.id]).act_getfile() + riba_txt = base64.decodebytes(wizard_riba_export.riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690124" in riba_txt) + + def test_riba_fatturapa_group(self): + self.partner.group_riba = True + self.partner.property_account_receivable_id = self.account_rec1_id.id + recent_date = ( + self.env["account.move"] + .search([("invoice_date", "!=", False)], order="invoice_date desc", limit=1) + .invoice_date + ) + invoice = self.env["account.move"].create( + { + "invoice_date": recent_date, + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.account_payment_term_riba.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "product1", + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 450.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, self.tax_22.ids]], + }, + ) + ], + "related_documents": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690124", + }, + ) + ], + } + ) + invoice._onchange_riba_partner_bank_id() + invoice.action_post() + invoice1 = self.env["account.move"].create( + { + "invoice_date": recent_date, + "move_type": "out_invoice", + "journal_id": self.sale_journal.id, + "partner_id": self.partner.id, + "invoice_payment_term_id": self.account_payment_term_riba.id, + "invoice_line_ids": [ + ( + 0, + 0, + { + "name": "product1", + "product_id": self.product1.id, + "quantity": 1.0, + "price_unit": 450.00, + "account_id": self.sale_account.id, + "tax_ids": [[6, 0, self.tax_22.ids]], + }, + ) + ], + "related_documents": [ + ( + 0, + 0, + { + "type": "order", + "name": "SO1232", + "cig": "7987210EG5", + "cup": "H71N17000690125", + }, + ) + ], + } + ) + invoice1._onchange_riba_partner_bank_id() + invoice1.action_post() + # issue wizard + riba_move_line_id = invoice.line_ids.filtered( + lambda x: x.account_id == self.account_rec1_id + ) + riba_move_line1_id = invoice1.line_ids.filtered( + lambda x: x.account_id == self.account_rec1_id + ) + wizard_riba_issue = self.env["riba.issue"].create( + {"configuration_id": self.riba_config.id} + ) + action = wizard_riba_issue.with_context( + active_ids=[riba_move_line_id.id, riba_move_line1_id.id] + ).create_list() + riba_list_id = action and action["res_id"] or False + riba_list = self.slip_model.browse(riba_list_id) + riba_list.confirm() + self.assertTrue(len(riba_list.line_ids), 2) + wizard_riba_export = self.env["riba.file.export"].create({}) + wizard_riba_export.with_context(active_ids=[riba_list.id]).act_getfile() + riba_txt = base64.decodebytes(wizard_riba_export.riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690124" in riba_txt) + self.assertTrue(b"CIG: 7987210EG5 CUP: H71N17000690125" in riba_txt) + + def test_riba_presentation(self): + total_amount = 200000 + wizard_riba_issue = self.env["presentation.riba.issue"].create( + {"presentation_amount": total_amount} + ) + domain = wizard_riba_issue.action_presentation_riba()["domain"] + total_issue_amount = sum( + self.env["account.move.line"].search(domain).mapped("amount_residual") + ) + self.assertTrue(total_amount - total_issue_amount >= 0) diff --git a/l10n_it_riba/views/account_config_view.xml b/l10n_it_riba/views/account_config_view.xml new file mode 100644 index 000000000000..e8fcb96abb52 --- /dev/null +++ b/l10n_it_riba/views/account_config_view.xml @@ -0,0 +1,46 @@ + + + + + view_account_config_settings_riba + res.config.settings + + +
+
+
+
+ RiBa Collection Fees + +
+ Product used as Service for RiBa Collection Fees +
+
+
+
+
+
+
+
+ + + diff --git a/l10n_it_riba/views/account_view.xml b/l10n_it_riba/views/account_view.xml new file mode 100644 index 000000000000..e011093b2f63 --- /dev/null +++ b/l10n_it_riba/views/account_view.xml @@ -0,0 +1,204 @@ + + + + + + + + + account.riba.add.text.field + account.payment.term + + + + + + + + + + res.bank.add.text.field + res.bank + + + + + + + + + res.partner.bank.form.sia.inherit + res.partner.bank + + + + + + + + + + + + RiBa Issue + account.move.line + + + + + + + + + + + + + + + + + + + + + + RiBa filter + account.move.line + + + + + + + + + + + + + + + + + + RiBa Issue + account.move.line + tree,form + + + ['&','|',('riba','=','True'),('past_due_invoice_ids','!=',False),('account_id.account_type','=','asset_receivable')] + {'search_default_da_emettere':1, 'search_default_to_reconcile':1} + + + + + + + + + account.move.form + account.move + + + + + + + + + + + + account.move.tree + account.move + + + + + + + + + + Past Due Invoices + account.move + tree,form,graph + + [('move_type','=','out_invoice'), ('past_due_move_line_ids', '!=', False)] + {'default_type':'out_invoice', 'move_type':'out_invoice', 'journal_type': 'sale', 'search_default_past_due': True} + + + + + + + tree + + + + + + form + + + + + + diff --git a/l10n_it_riba/views/configuration_view.xml b/l10n_it_riba/views/configuration_view.xml new file mode 100644 index 000000000000..f86e3ee857cc --- /dev/null +++ b/l10n_it_riba/views/configuration_view.xml @@ -0,0 +1,83 @@ + + + + + + + + + riba.configuration.form + riba.configuration + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + RiBa - Configuration + riba.configuration + tree,form + + + + + + + +
diff --git a/l10n_it_riba/views/partner_view.xml b/l10n_it_riba/views/partner_view.xml new file mode 100644 index 000000000000..056168977bc2 --- /dev/null +++ b/l10n_it_riba/views/partner_view.xml @@ -0,0 +1,24 @@ + + + + + + + + + res.parner.form.riba + res.partner + + + + + + + + + + + diff --git a/l10n_it_riba/views/riba_detail_view.xml b/l10n_it_riba/views/riba_detail_view.xml new file mode 100644 index 000000000000..eba2d824bc78 --- /dev/null +++ b/l10n_it_riba/views/riba_detail_view.xml @@ -0,0 +1,92 @@ + + + + + riba.slip.line.filter + riba.slip.line + + + + + + + + + + + + + + + + + riba.slip.line.tree + riba.slip.line + + + + + + + + + + + + + +

Usage

Italiano

-

Per utilizzare il meccanismo delle RiBa è necessario configurare un termine -di pagamento di tipo ‘RiBa’.

+

Per utilizzare il meccanismo delle RiBa è necessario configurare un +termine di pagamento di tipo ‘RiBa’.

Per emettere una distinta è necessario andare su RiBa → Emetti RiBa e -selezionare i pagamenti per i quali emettere la distinta. -Se per il cliente è stato abilitato il raggruppamento, i pagamenti dello stesso -cliente e con la stessa data di scadenza andranno a costituire un solo elemento -della distinta.

-

I possibili stati della distinta sono: Bozza, Accettata, Accreditata, -Pagata, Insoluta e Annullata. -Ad ogni passaggio di stato sarà possibile generare le relative registrazioni -contabili, le quali verranno riepilogate nella scheda «Contabilità». -Questa scheda è presente sia sulla distinta che sulle sue righe.

+selezionare i pagamenti per i quali emettere la distinta. Se per il +cliente è stato abilitato il raggruppamento, i pagamenti dello stesso +cliente e con la stessa data di scadenza andranno a costituire un solo +elemento della distinta.

+

I possibili stati della distinta sono: Bozza, Accettata, +Accreditata, Pagata, Insoluta e Annullata. Ad ogni passaggio di +stato sarà possibile generare le relative registrazioni contabili, le +quali verranno riepilogate nella scheda «Contabilità». Questa scheda è +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.

Known issues / Roadmap

Italiano

-

Attenzione! -Il modulo è stato migrato, ma gli script di migrazione non sono stati provati.

+

Attenzione! Il modulo è stato migrato, ma gli script di migrazione non +sono stati provati.

Bug Tracker

From 5c4b45d99e7e7d40041423e8ddf7aa0988a370b5 Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Fri, 17 Nov 2023 16:01:53 +0100 Subject: [PATCH 10/50] [REF] l10n_it_riba: Update repo template --- l10n_it_riba/models/account_config.py | 2 -- l10n_it_riba/models/riba_config.py | 1 - l10n_it_riba/report/slip_qweb.py | 1 - l10n_it_riba/wizard/wizard_riba_file_export.py | 2 +- l10n_it_riba/wizard/wizard_riba_issue.py | 2 +- 5 files changed, 2 insertions(+), 6 deletions(-) diff --git a/l10n_it_riba/models/account_config.py b/l10n_it_riba/models/account_config.py index bd32b8c1b124..60494d11c6b3 100644 --- a/l10n_it_riba/models/account_config.py +++ b/l10n_it_riba/models/account_config.py @@ -11,7 +11,6 @@ class ResConfigSettings(models.TransientModel): - _inherit = "res.config.settings" due_cost_service_id = fields.Many2one( @@ -31,7 +30,6 @@ def default_get(self, fields_list): class ResCompany(models.Model): - _inherit = "res.company" due_cost_service_id = fields.Many2one("product.product", "Collection Fees Service") diff --git a/l10n_it_riba/models/riba_config.py b/l10n_it_riba/models/riba_config.py index 989148962c5b..06636028f3a0 100644 --- a/l10n_it_riba/models/riba_config.py +++ b/l10n_it_riba/models/riba_config.py @@ -11,7 +11,6 @@ class RibaConfiguration(models.Model): - _name = "riba.configuration" _description = "Configuration parameters for RiBa" diff --git a/l10n_it_riba/report/slip_qweb.py b/l10n_it_riba/report/slip_qweb.py index d85521371d89..241e23e58709 100644 --- a/l10n_it_riba/report/slip_qweb.py +++ b/l10n_it_riba/report/slip_qweb.py @@ -6,7 +6,6 @@ class SlipReportQweb(models.AbstractModel): - _name = "report.l10n_it_riba.slip_qweb" _description = "RiBa Slip Report" diff --git a/l10n_it_riba/wizard/wizard_riba_file_export.py b/l10n_it_riba/wizard/wizard_riba_file_export.py index 7c8fd7f6cf67..fb06649dbf02 100644 --- a/l10n_it_riba/wizard/wizard_riba_file_export.py +++ b/l10n_it_riba/wizard/wizard_riba_file_export.py @@ -15,7 +15,7 @@ from odoo.exceptions import UserError -class RibaStorage(object): +class RibaStorage: def __init__(self): self.sequence = 0 self.creditor_bank = 0 diff --git a/l10n_it_riba/wizard/wizard_riba_issue.py b/l10n_it_riba/wizard/wizard_riba_issue.py index 648fc50c62db..35c4808191f2 100644 --- a/l10n_it_riba/wizard/wizard_riba_issue.py +++ b/l10n_it_riba/wizard/wizard_riba_issue.py @@ -61,7 +61,7 @@ def create_rdl( if ( len( { - "{}{}".format(x.cig, x.cup) + f"{x.cig}{x.cup}" for x in move_lines.mapped("move_id.related_documents") } ) From a2133d6f9924b65561569b7b53622820b526b4c1 Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Thu, 7 Dec 2023 10:48:07 +0100 Subject: [PATCH 11/50] [REF] l10n_it_riba: Reformatted after template update --- l10n_it_riba/README.rst | 2 +- l10n_it_riba/i18n/it.po | 11 +++-------- l10n_it_riba/i18n/l10n_it_riba.pot | 8 -------- l10n_it_riba/models/account.py | 4 ++-- l10n_it_riba/models/riba.py | 6 +++--- l10n_it_riba/static/description/index.html | 2 +- 6 files changed, 10 insertions(+), 23 deletions(-) diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index 7d7dcf4fc5da..711613d3ac78 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:807b555359fd3f794b146112082720fc47ec37efa5592a26b7421bc89f29dcd2 + !! source digest: sha256:05b7db22665c1179b4f037a0d27eec7dc89b13d8d31ebd3dd8bae9200242637d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/l10n_it_riba/i18n/it.po b/l10n_it_riba/i18n/it.po index 2537935ee563..56dc7e372e75 100644 --- a/l10n_it_riba/i18n/it.po +++ b/l10n_it_riba/i18n/it.po @@ -575,9 +575,7 @@ msgstr "Se selezionata, nuovi messaggi richiedono attenzione." #. module: l10n_it_riba #: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error -#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_sms_error #: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error -#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_sms_error msgid "If checked, some messages have a delivery error." msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." @@ -1206,12 +1204,6 @@ msgstr "Configurazione RiBa da utilizzare." msgid "SIA Code" msgstr "Codice SIA" -#. module: l10n_it_riba -#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_sms_error -#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_sms_error -msgid "SMS Delivery error" -msgstr "Errore consegna SMS" - #. module: l10n_it_riba #. odoo-python #: code:addons/l10n_it_riba/models/account.py:0 @@ -1376,6 +1368,9 @@ msgstr "del" msgid "{line_name} for {month}-{year}" msgstr "{line_name} per {month}-{year}" +#~ msgid "SMS Delivery error" +#~ msgstr "Errore consegna SMS" + #~ msgid "Bank Statement Line" #~ msgstr "Riga estratto conto bancario" diff --git a/l10n_it_riba/i18n/l10n_it_riba.pot b/l10n_it_riba/i18n/l10n_it_riba.pot index e4119776968d..b935797e0151 100644 --- a/l10n_it_riba/i18n/l10n_it_riba.pot +++ b/l10n_it_riba/i18n/l10n_it_riba.pot @@ -558,9 +558,7 @@ msgstr "" #. module: l10n_it_riba #: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_error -#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip__message_has_sms_error #: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_error -#: model:ir.model.fields,help:l10n_it_riba.field_riba_slip_line__message_has_sms_error msgid "If checked, some messages have a delivery error." msgstr "" @@ -1190,12 +1188,6 @@ msgstr "" msgid "SIA Code" msgstr "" -#. module: l10n_it_riba -#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip__message_has_sms_error -#: model:ir.model.fields,field_description:l10n_it_riba.field_riba_slip_line__message_has_sms_error -msgid "SMS Delivery error" -msgstr "" - #. module: l10n_it_riba #. odoo-python #: code:addons/l10n_it_riba/models/account.py:0 diff --git a/l10n_it_riba/models/account.py b/l10n_it_riba/models/account.py index e0ac3725eaae..757914c5ea3f 100644 --- a/l10n_it_riba/models/account.py +++ b/l10n_it_riba/models/account.py @@ -146,7 +146,7 @@ def action_post(self): if not any(line.due_cost_line for line in move_line): move_line = self.env["account.move.line"] # ---- Filtered recordset with date_maturity - move_line = move_line.filtered(lambda l: l.date_maturity is not False) + move_line = move_line.filtered(lambda line: line.date_maturity is not False) # ---- Sorted move_line = move_line.sorted(key=lambda r: r.date_maturity) # ---- Get date @@ -256,7 +256,7 @@ def copy(self, default=None): return invoice def get_due_cost_line_ids(self): - return self.invoice_line_ids.filtered(lambda l: l.due_cost_line).ids + return self.invoice_line_ids.filtered(lambda line: line.due_cost_line).ids # se slip_line_ids == None allora non è stata emessa diff --git a/l10n_it_riba/models/riba.py b/l10n_it_riba/models/riba.py index f77d2b51a29c..87cc820d9e33 100644 --- a/l10n_it_riba/models/riba.py +++ b/l10n_it_riba/models/riba.py @@ -140,7 +140,8 @@ def _unlink_if_not_confirmed(self): if riba_list.state not in ("draft", "cancel"): raise UserError( _( - "Slip %(name)s is in state '%(state)s'. You can only delete documents" + "Slip %(name)s is in state '%(state)s'." + " You can only delete documents" " in state 'Draft' or 'Canceled'.", name=riba_list.name, state=riba_list.state, @@ -416,8 +417,7 @@ def confirm(self): to_be_reconciled |= riba_move_line.move_line_id move_line_model.with_context(check_move_validity=False).create( { - "name": "%s RiBa %s-%s Ref. %s - %s" - % ( + "name": "{} RiBa {}-{} Ref. {} - {}".format( line.invoice_number, line.slip_id.name, line.sequence, diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index 269167f1c8ab..f05cae04649b 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:807b555359fd3f794b146112082720fc47ec37efa5592a26b7421bc89f29dcd2 +!! source digest: sha256:05b7db22665c1179b4f037a0d27eec7dc89b13d8d31ebd3dd8bae9200242637d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Italiano

From 1a3bd558e260187a69a03b769d454dd16dc7982d Mon Sep 17 00:00:00 2001 From: odooNextev Date: Mon, 5 Feb 2024 17:06:18 +0100 Subject: [PATCH 12/50] [FIX] l10n_it_riba: remove account and journal domain --- l10n_it_riba/README.rst | 2 +- l10n_it_riba/__manifest__.py | 2 +- l10n_it_riba/models/riba_config.py | 2 -- l10n_it_riba/static/description/index.html | 2 +- l10n_it_riba/wizard/wizard_past_due.py | 2 -- 5 files changed, 3 insertions(+), 7 deletions(-) diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index 711613d3ac78..3b715e86d498 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:05b7db22665c1179b4f037a0d27eec7dc89b13d8d31ebd3dd8bae9200242637d + !! source digest: sha256:a4b6cd6f6b54c0ed513516a80c3f0c7f11b2b0221d95cd421b335868e1ef3a1a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py index db414562cfe6..8aa398e3349a 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.1", + "version": "16.0.1.2.2", "development_status": "Beta", "author": "Odoo Community Association (OCA)", "category": "Localization/Italy", diff --git a/l10n_it_riba/models/riba_config.py b/l10n_it_riba/models/riba_config.py index 06636028f3a0..7dbfae2ade15 100644 --- a/l10n_it_riba/models/riba_config.py +++ b/l10n_it_riba/models/riba_config.py @@ -58,7 +58,6 @@ class RibaConfiguration(models.Model): bank_account_id = fields.Many2one( "account.account", "A/C Bank Account", - domain=[("account_type", "=", "asset_cash")], ) bank_expense_account_id = fields.Many2one("account.account", "Bank Fees Account") past_due_journal_id = fields.Many2one( @@ -70,7 +69,6 @@ class RibaConfiguration(models.Model): overdue_effects_account_id = fields.Many2one( "account.account", "Past Due Bills Account", - domain=[("account_type", "=", "asset_receivable")], ) protest_charge_account_id = fields.Many2one( "account.account", "Protest Fee Account" diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index f05cae04649b..0231d7425ed5 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:05b7db22665c1179b4f037a0d27eec7dc89b13d8d31ebd3dd8bae9200242637d +!! source digest: sha256:a4b6cd6f6b54c0ed513516a80c3f0c7f11b2b0221d95cd421b335868e1ef3a1a !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Italiano

diff --git a/l10n_it_riba/wizard/wizard_past_due.py b/l10n_it_riba/wizard/wizard_past_due.py index 7cf4216b41d1..15b5d09b9996 100644 --- a/l10n_it_riba/wizard/wizard_past_due.py +++ b/l10n_it_riba/wizard/wizard_past_due.py @@ -65,7 +65,6 @@ def _get_bank_expense_account_id(self): effects_account_id = fields.Many2one( "account.account", "Bills Account", - domain=[("account_type", "=", "asset_receivable")], default=_get_effects_account_id, ) effects_amount = fields.Float("Bills Amount", default=_get_effects_amount) @@ -76,7 +75,6 @@ def _get_bank_expense_account_id(self): overdue_effects_account_id = fields.Many2one( "account.account", "Past Due Bills Account", - domain=[("account_type", "=", "asset_receivable")], default=_get_overdue_effects_account_id, ) overdue_effects_amount = fields.Float( From 2ff39e65938ea437f4bb264f9d821cd23af49b41 Mon Sep 17 00:00:00 2001 From: Giovanni Date: Tue, 21 May 2024 17:38:34 +0200 Subject: [PATCH 13/50] [FIX] l10n_it_riba: fix invoice name --- l10n_it_riba/README.rst | 2 +- l10n_it_riba/__manifest__.py | 2 +- l10n_it_riba/models/riba.py | 4 ++-- l10n_it_riba/static/description/index.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index 3b715e86d498..b4423dc66814 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:a4b6cd6f6b54c0ed513516a80c3f0c7f11b2b0221d95cd421b335868e1ef3a1a + !! source digest: sha256:f183b89e0ff9f4553d6c9b7bf67496a1763367fdd85b99ce7fc0c3151ec78822 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py index 8aa398e3349a..ab3e2564edc5 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.2", + "version": "16.0.1.2.3", "development_status": "Beta", "author": "Odoo Community Association (OCA)", "category": "Localization/Italy", diff --git a/l10n_it_riba/models/riba.py b/l10n_it_riba/models/riba.py index 87cc820d9e33..c4928c7efe56 100644 --- a/l10n_it_riba/models/riba.py +++ b/l10n_it_riba/models/riba.py @@ -236,7 +236,7 @@ def _compute_line_values(self): ) if not line.invoice_number: line.invoice_number = str( - move_line.move_line_id.move_id.move_id.name + move_line.move_line_id.move_id.name if move_line.move_line_id.move_id.display_name == "/" else move_line.move_line_id.move_id.display_name ) @@ -244,7 +244,7 @@ def _compute_line_values(self): line.invoice_number = "{}, {}".format( line.invoice_number, str( - move_line.move_line_id.move_id.move_id.name + move_line.move_line_id.move_id.name if move_line.move_line_id.move_id.display_name == "/" else move_line.move_line_id.move_id.display_name ), diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index 0231d7425ed5..365d63a1dd30 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:a4b6cd6f6b54c0ed513516a80c3f0c7f11b2b0221d95cd421b335868e1ef3a1a +!! source digest: sha256:f183b89e0ff9f4553d6c9b7bf67496a1763367fdd85b99ce7fc0c3151ec78822 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Italiano

From e8f3be72865e741cf7fd93445b5dfed6df10de6c Mon Sep 17 00:00:00 2001 From: odooNextev Date: Thu, 28 Sep 2023 17:28:19 +0200 Subject: [PATCH 14/50] [FIX] l10n_it_riba: Company consistency in RiBa configuration Co-authored-by: SirAionTech --- l10n_it_riba/models/riba_config.py | 25 ++++++++++++++++----- l10n_it_riba/tests/riba_common.py | 12 ++++++++++ l10n_it_riba/tests/test_riba.py | 27 +++++++++++++++++++++++ l10n_it_riba/views/configuration_view.xml | 19 ++++++++++++++++ 4 files changed, 78 insertions(+), 5 deletions(-) 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/tests/riba_common.py b/l10n_it_riba/tests/riba_common.py index a7f39c7152e1..522a17bfc4e8 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,6 +149,13 @@ 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.account_payment_term_riba = self.env.ref( "l10n_it_riba.account_payment_term_riba" diff --git a/l10n_it_riba/tests/test_riba.py b/l10n_it_riba/tests/test_riba.py index e919eb76bf41..891ceeed608b 100644 --- a/l10n_it_riba/tests/test_riba.py +++ b/l10n_it_riba/tests/test_riba.py @@ -7,6 +7,7 @@ import base64 import os +from odoo.exceptions import UserError from odoo.tools import config from . import riba_common @@ -553,3 +554,29 @@ 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) diff --git a/l10n_it_riba/views/configuration_view.xml b/l10n_it_riba/views/configuration_view.xml index f86e3ee857cc..39dda570b322 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" /> + @@ -61,6 +66,20 @@ + + + + + riba.configuration.tree + riba.configuration + + + + + + + + From 91667be800a068e085c69740e3c519a82a9b7a97 Mon Sep 17 00:00:00 2001 From: Borruso Date: Thu, 30 May 2024 17:44:46 +0200 Subject: [PATCH 15/50] [ADD] l10n_it_ricevute_bancarie: allow set 'Paid' lines by due date --- l10n_it_riba/README.rst | 2 +- l10n_it_riba/__manifest__.py | 3 +- l10n_it_riba/i18n/it.po | 30 +++++++++++++++ l10n_it_riba/i18n/l10n_it_riba.pot | 30 +++++++++++++++ l10n_it_riba/models/riba.py | 10 +++++ l10n_it_riba/security/ir.model.access.csv | 1 + l10n_it_riba/static/description/index.html | 2 +- .../views/wizard_due_date_settlement.xml | 37 +++++++++++++++++++ l10n_it_riba/wizard/__init__.py | 1 + .../wizard/wizard_due_date_settlement.py | 22 +++++++++++ 10 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 l10n_it_riba/views/wizard_due_date_settlement.xml create mode 100644 l10n_it_riba/wizard/wizard_due_date_settlement.py diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index b4423dc66814..618c19c937e0 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:d192f19c1c27b915144d849e5737b32bee80180a09bc445feefd66c983d85c71 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py index ab3e2564edc5..d1a443f238a2 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.3.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..fb6171975c16 100644 --- a/l10n_it_riba/i18n/it.po +++ b/l10n_it_riba/i18n/it.po @@ -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 "" + #. 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 "" + #. 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 "" + #. 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,11 @@ 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 "" + #. 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/riba.py b/l10n_it_riba/models/riba.py index c4928c7efe56..3b0f529ec62b 100644 --- a/l10n_it_riba/models/riba.py +++ b/l10n_it_riba/models/riba.py @@ -134,6 +134,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: 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..9f2c3d58c8ff 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:d192f19c1c27b915144d849e5737b32bee80180a09bc445feefd66c983d85c71 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Italiano

diff --git a/l10n_it_riba/views/wizard_due_date_settlement.xml b/l10n_it_riba/views/wizard_due_date_settlement.xml new file mode 100644 index 000000000000..d49d2e522edf --- /dev/null +++ b/l10n_it_riba/views/wizard_due_date_settlement.xml @@ -0,0 +1,37 @@ + + + + + riba.due.date.settlement.wizard + riba.due.date.settlement + +
+ + + + +
+
+ +
+
+ + + C/O Due Date Settlement + + + code + action = records.action_riba_due_date_settlement() + + +
diff --git a/l10n_it_riba/wizard/__init__.py b/l10n_it_riba/wizard/__init__.py index edfc7305728d..1a70ca517010 100644 --- a/l10n_it_riba/wizard/__init__.py +++ b/l10n_it_riba/wizard/__init__.py @@ -11,3 +11,4 @@ from . import wizard_credit from . import wizard_past_due from . import wizard_presentation_riba +from . import wizard_due_date_settlement diff --git a/l10n_it_riba/wizard/wizard_due_date_settlement.py b/l10n_it_riba/wizard/wizard_due_date_settlement.py new file mode 100644 index 000000000000..bd16a2c44127 --- /dev/null +++ b/l10n_it_riba/wizard/wizard_due_date_settlement.py @@ -0,0 +1,22 @@ +# Copyright (C) 2024 Giuseppe Borruso - Dinamiche Aziendali srl +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.exceptions import UserError + + +class RibaDueDateSettlement(models.TransientModel): + _name = "riba.due.date.settlement" + _description = "Riba Due Date Settlement" + + due_date = fields.Date() + + def due_date_settlement_confirm(self): + active_ids = self.env.context.get("active_ids", False) + if not active_ids: + raise UserError(_("No active ID found.")) + riba_ids = self.env["riba.slip"].browse(active_ids) + riba_lines = riba_ids.mapped("line_ids").filtered( + lambda rl: rl.state == "credited" and rl.due_date == self.due_date + ) + riba_lines.riba_line_settlement() From 07f80b24396cd6bc3e0e5aa96e9cced013d9b537 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 24 Jun 2024 12:10:50 +0000 Subject: [PATCH 16/50] Translated using Weblate (Italian) Currently translated at 100.0% (221 of 221 strings) Translation: l10n-italy-16.0/l10n-italy-16.0-l10n_it_riba Translate-URL: https://translation.odoo-community.org/projects/l10n-italy-16-0/l10n-italy-16-0-l10n_it_riba/it/ --- l10n_it_riba/README.rst | 2 +- l10n_it_riba/__manifest__.py | 2 +- l10n_it_riba/i18n/it.po | 10 ++++++---- l10n_it_riba/static/description/index.html | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/l10n_it_riba/README.rst b/l10n_it_riba/README.rst index 618c19c937e0..b05bb73224b3 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:d192f19c1c27b915144d849e5737b32bee80180a09bc445feefd66c983d85c71 + !! source digest: sha256:51bd8c7cbbdce26cf2213589ee7bff9d88d4657bfdfa5ac16384c50fd9f0d2e3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/l10n_it_riba/__manifest__.py b/l10n_it_riba/__manifest__.py index d1a443f238a2..9ed649983afb 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.3.0", + "version": "16.0.1.4.0", "development_status": "Beta", "author": "Odoo Community Association (OCA)", "category": "Localization/Italy", diff --git a/l10n_it_riba/i18n/it.po b/l10n_it_riba/i18n/it.po index fb6171975c16..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" @@ -203,7 +203,7 @@ 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 "" +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 @@ -282,7 +282,7 @@ 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 "" +msgstr "Conferma" #. module: l10n_it_riba #: model:ir.model.fields.selection,name:l10n_it_riba.selection__riba_slip_line__state__confirmed @@ -1221,7 +1221,7 @@ 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 "" +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 @@ -1331,6 +1331,8 @@ msgstr "" #: 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 diff --git a/l10n_it_riba/static/description/index.html b/l10n_it_riba/static/description/index.html index 9f2c3d58c8ff..bd0be7b41be9 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:d192f19c1c27b915144d849e5737b32bee80180a09bc445feefd66c983d85c71 +!! source digest: sha256:51bd8c7cbbdce26cf2213589ee7bff9d88d4657bfdfa5ac16384c50fd9f0d2e3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Italiano

From 53b25df909e33cf495ab475bcd77090eaad9b653 Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Thu, 4 Jan 2024 17:40:25 +0100 Subject: [PATCH 17/50] [IMP] l10n_it_riba: Add After Collection Co-authored-by: SirAionTech --- l10n_it_riba/README.rst | 11 +++++-- l10n_it_riba/readme/CONFIGURE.md | 6 ++-- l10n_it_riba/readme/CONTRIBUTORS.md | 2 ++ l10n_it_riba/static/description/index.html | 11 +++++-- l10n_it_riba/tests/riba_common.py | 12 +++++++ l10n_it_riba/tests/test_riba.py | 37 ++++++++++++++++++++- l10n_it_riba/views/configuration_view.xml | 8 ++++- l10n_it_riba/views/riba_view.xml | 38 +++++++++++++++++----- 8 files changed, 105 insertions(+), 20 deletions(-) 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/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..1950756638fe 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 Colection", + "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..b3f1927f9b88 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 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'))]}" />
    + + + + + + + + + + + + + + + + + +