diff --git a/l10n_it_declaration_of_intent/README.rst b/l10n_it_declaration_of_intent/README.rst new file mode 100644 index 000000000000..09fe0eb9b60f --- /dev/null +++ b/l10n_it_declaration_of_intent/README.rst @@ -0,0 +1,117 @@ +============================== +ITA - Dichiarazione di intento +============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--italy-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-italy/tree/14.0/l10n_it_declaration_of_intent + :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-14-0/l10n-italy-14-0-l10n_it_declaration_of_intent + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/122/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +**Italiano** + +Questo modulo consente di gestire le dichiarazioni d'intento. + +**English** + +This module allows you to manage declarations of intent. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Creare: + +1. | un'imposta di tipo vendite con importo 0. + | Ad esempio "Non imponibile art.8c Lettera intento" + +2. una posizione fiscale per le dichiarazioni d'intento, avente: + + - il flag `Valida per dichiarazione d'intento` attivato, + - | una mappatura delle imposte opportuna. + | Ad esempio tra "IVA al 22% (debito) (Vendita)" e "Non imponibile art.8c Lettera intento". + +In Impostazioni > Utenti e aziende, selezionare un'azienda e, nella scheda Dichiarazioni d'intento, definire un plafond annuale. + +Usage +===== + +Per ogni cliente o fornitore soggetto a dichiarazione d'intento, creare una dichiarazione d'intento inserendo tutti i dati e selezionando la posizione fiscale dedicata. + +Nota che il menu Fatturazione > Contabilità > Dichiarazioni d'intento è visibile solo per gli utenti nel gruppo `Mostrare funzionalità contabili complete`. + +In fase di fatturazione, utilizzare la posizione fiscale apposita. + +Known issues / Roadmap +====================== + +Improve management of currency (see https://github.com/OCA/l10n-italy/issues/2428). + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Francesco Apruzzese +* Sergio Corato +* Glauco Prina +* Lara Baggio + +Contributors +~~~~~~~~~~~~ + +* Francesco Apruzzese +* Sergio Corato +* Glauco Prina +* Lorenzo Battistini +* Lara Baggio +* 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_declaration_of_intent/__init__.py b/l10n_it_declaration_of_intent/__init__.py new file mode 100644 index 000000000000..9b4296142f47 --- /dev/null +++ b/l10n_it_declaration_of_intent/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/l10n_it_declaration_of_intent/__manifest__.py b/l10n_it_declaration_of_intent/__manifest__.py new file mode 100644 index 000000000000..f49e860d6120 --- /dev/null +++ b/l10n_it_declaration_of_intent/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright 2017 Francesco Apruzzese , +# Copyright 2019 Alessandro Camilli , +# Link IT +# Copyright 2022 Alex Comba +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "ITA - Dichiarazione di intento", + "summary": "Gestione dichiarazioni di intento", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Francesco Apruzzese, Sergio Corato, Glauco Prina, Lara Baggio, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/l10n-italy", + "depends": [ + "account", + "sale", + ], + "data": [ + "security/declaration_security.xml", + "security/ir.model.access.csv", + "data/sequence.xml", + "wizard/select_declarations_view.xml", + "views/account_view.xml", + "views/declaration_of_intent_view.xml", + "views/company_view.xml", + "views/account_invoice_view.xml", + ], +} diff --git a/l10n_it_declaration_of_intent/data/sequence.xml b/l10n_it_declaration_of_intent/data/sequence.xml new file mode 100644 index 000000000000..454ec011aa0b --- /dev/null +++ b/l10n_it_declaration_of_intent/data/sequence.xml @@ -0,0 +1,11 @@ + + + + + Declaration of intent sequence + declaration_of_intent + + + + + diff --git a/l10n_it_declaration_of_intent/i18n/it.po b/l10n_it_declaration_of_intent/i18n/it.po new file mode 100644 index 000000000000..998672c2d2a0 --- /dev/null +++ b/l10n_it_declaration_of_intent/i18n/it.po @@ -0,0 +1,480 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_dichiarazione_intento +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-15 14:06+0000\n" +"PO-Revision-Date: 2022-10-26 13:43+0000\n" +"Last-Translator: Francesco Foresti \n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Accounting" +msgstr "Contabilità" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "" +"All taxes in declaration of intent must be used in fiscal position taxes" +msgstr "" +"Tutte le imposte della dichiarazione d'intento devono essere nella posizione " +"fiscale" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__amount +msgid "Amount" +msgstr "Importo" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__available_amount +msgid "Available Amount" +msgstr "Importo disponibile" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account_move.py:0 +#, python-format +msgid "" +"Available plafond insufficent.\n" +"Excess value: %s" +msgstr "" +"Plafond insufficiente.\n" +"Valore in eccesso: %s" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__base_amount +msgid "Base Amount" +msgstr "Importo imponibile" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__close +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Close" +msgstr "Chiudi" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__company_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__company_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__company_id +msgid "Company" +msgstr "Azienda" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Confirm" +msgstr "Conferma" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__currency_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__currency_id +msgid "Currency" +msgstr "Valuta" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date +msgid "Date" +msgstr "Data" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date_end +msgid "Date End" +msgstr "Data fine" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__date_invoice +msgid "Date Invoice" +msgstr "Data fattura" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date_start +msgid "Date Start" +msgstr "Data inizio" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,help:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_date +msgid "Date of partner's document" +msgstr "Data documento del partner" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__declaration_id +msgid "Declaration" +msgstr "Dichiarazione" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_declaration +msgid "Declaration of intent" +msgstr "Dichiarazione d'intento" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account_move.py:0 +#, python-format +msgid "" +"Declaration of intent not found. Add new declaration or change fiscal " +"position and verify applied tax" +msgstr "" +"Dichiarazione d'intento non trovata. Aggiungere una nuova dichiarazione o " +"modificare la posizione fiscale e verificare l'imposta applicata" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__declaration_yearly_limit_ids +msgid "Declaration yearly limit" +msgstr "Limite annuale dichiarazione" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__declaration_ids +msgid "Declarations of Intent" +msgstr "Dichiarazioni d'intento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.actions.act_window,name:l10n_it_declaration_of_intent.declaration_of_intent_action +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_bank_statement_line__declaration_of_intent_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__declaration_of_intent_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_payment__declaration_of_intent_ids +#: model:ir.ui.menu,name:l10n_it_declaration_of_intent.declaration_of_intent_menu +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_view_company_form +msgid "Declarations of intent" +msgstr "Dichiarazioni d'intento" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Define a yearly plafond for in documents in your company settings" +msgstr "" +"Definire un plafond annuale per i documenti in ingresso nelle impostazione " +"dell'azienda" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account.py:0 +#, python-format +msgid "Define taxes for fiscal position %s valid for declaration of intent" +msgstr "" +"Definire delle imposte per la posizione fiscale %s valide per la " +"dichiarazione d'intento" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Details" +msgstr "Dettagli" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_declaration_line +msgid "Details of declaration of intent" +msgstr "Dettagli della dichiarazione d'intento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Document Amount" +msgstr "Importo documento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_date +msgid "Document Date" +msgstr "Data documento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_number +msgid "Document Number" +msgstr "Numero documento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__expired +msgid "Expired" +msgstr "Scaduta" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_fiscal_position +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__fiscal_position_id +msgid "Fiscal Position" +msgstr "Posizione fiscale" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__force_close +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Force Close" +msgstr "Forza chiusura" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__force_declaration_of_intent_id +msgid "Force Declaration of Intent" +msgstr "Forzare dichiarazione d'intento" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Force Reopen" +msgstr "Forza riapertura" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order__id +msgid "ID" +msgstr "ID" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Impossible to delete a document with linked invoices" +msgstr "Impossibile eliminare un documento con fatture collegate" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__invoice_id +msgid "Invoice" +msgstr "Fattura" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__type__in +msgid "Issued from company" +msgstr "Emessa dall'azienda" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_move +msgid "Journal Entry" +msgstr "Registrazione contabile" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_move_line +msgid "Journal Item" +msgstr "Movimento contabile" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__limit_amount +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__limit_amount +msgid "Limit Amount" +msgstr "Importo limite" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "" +"Limit passed for declaration %s.\n" +"Excess value: %s%s" +msgstr "" +"Limite oltrepassato per la dichiarazione %s.\n" +"Valore in eccesso: %s%s" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__line_ids +msgid "Lines" +msgstr "Righe" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__move_line_ids +msgid "Move Lines" +msgstr "Righe movimenti" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__number +msgid "Number" +msgstr "Numero" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,help:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_number +msgid "Number of partner's document" +msgstr "Numero documento del partner" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_id +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Partner" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_product_product +msgid "Product" +msgstr "Prodotto" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__type__out +msgid "Received from customers" +msgstr "Ricevuta da clienti" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Refs" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_invoice_form +msgid "Select Manually" +msgstr "Seleziona manualmente" + +#. module: l10n_it_declaration_of_intent +#: model:ir.actions.act_window,name:l10n_it_declaration_of_intent.select_manually_declarations_action +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Select Manually Declarations" +msgstr "Selezione manuale delle dichiarazioni" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_select_declarations +msgid "Set declaration of intent manually on invoice" +msgstr "Impostare la dichiarazione d'intento manualmente sulla fattura" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__state +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "State" +msgstr "Provincia" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__taxes_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__taxes_ids +msgid "Taxes" +msgstr "Imposte" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__telematic_protocol +msgid "Telematic Protocol" +msgstr "Protocollo telematico" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Total of documents exceed yearly limit" +msgstr "Il totale dei documenti supera il limite annuale" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__type +msgid "Type" +msgstr "Tipologia" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__used_amount +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__used_amount +msgid "Used Amount" +msgstr "Importo usato" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__valid +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Valid" +msgstr "Valido" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Valid Period" +msgstr "Periodo valido" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__valid_for_declaration_of_intent +msgid "Valid for declaration of intent" +msgstr "Valida per dichiarazione d'intento" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__year +msgid "Year" +msgstr "Anno" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_yearly_limit +msgid "Yearly limit for declarations" +msgstr "Limite annuale per le dichiarazioni" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "or" +msgstr "o" + +#, python-format +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "Vostra dichiarazione d'intento nr %s del %s, nostro protocollo nr %s del " +#~ "%s, protocollo telematico nr %s." +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "Vostra dichiarazione d'intento nr %s del %s, nostro protocollo nr %s del " +#~ "%s, protocollo telematico nr %s." diff --git a/l10n_it_declaration_of_intent/i18n/l10n_it_declaration_of_intent.pot b/l10n_it_declaration_of_intent/i18n/l10n_it_declaration_of_intent.pot new file mode 100644 index 000000000000..47901390babc --- /dev/null +++ b/l10n_it_declaration_of_intent/i18n/l10n_it_declaration_of_intent.pot @@ -0,0 +1,453 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_declaration_of_intent +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \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_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Accounting" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "" +"All taxes in declaration of intent must be used in fiscal position taxes" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__amount +msgid "Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__available_amount +msgid "Available Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account_move.py:0 +#: code:addons/l10n_it_declaration_of_intent/models/account_move.py:0 +#, python-format +msgid "" +"Available plafond insufficent.\n" +"Excess value: %s" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__base_amount +msgid "Base Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Cancel" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__close +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Close" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__company_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__company_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__company_id +msgid "Company" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Confirm" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__create_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__create_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__currency_id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__currency_id +msgid "Currency" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date +msgid "Date" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date_end +msgid "Date End" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__date_invoice +msgid "Date Invoice" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__date_start +msgid "Date Start" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,help:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_date +msgid "Date of partner's document" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__declaration_id +msgid "Declaration" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_declaration +msgid "Declaration of intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account_move.py:0 +#, python-format +msgid "" +"Declaration of intent not found. Add new declaration or change fiscal " +"position and verify applied tax" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__declaration_yearly_limit_ids +msgid "Declaration yearly limit" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__declaration_ids +msgid "Declarations of Intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.actions.act_window,name:l10n_it_declaration_of_intent.declaration_of_intent_action +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_bank_statement_line__declaration_of_intent_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__declaration_of_intent_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_payment__declaration_of_intent_ids +#: model:ir.ui.menu,name:l10n_it_declaration_of_intent.declaration_of_intent_menu +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_view_company_form +msgid "Declarations of intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Define a yearly plafond for in documents in your company settings" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/account.py:0 +#, python-format +msgid "Define taxes for fiscal position %s valid for declaration of intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Details" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_declaration_line +msgid "Details of declaration of intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Document Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_date +msgid "Document Date" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_number +msgid "Document Number" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__expired +msgid "Expired" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_fiscal_position +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__fiscal_position_id +msgid "Fiscal Position" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__force_close +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Force Close" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__force_declaration_of_intent_id +msgid "Force Declaration of Intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Force Reopen" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company__id +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order__id +msgid "ID" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Impossible to delete a document with linked invoices" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__invoice_id +msgid "Invoice" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__type__in +msgid "Issued from company" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_move_line____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_product_product____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_sale_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__write_uid +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_select_declarations__write_date +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__limit_amount +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__limit_amount +msgid "Limit Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "" +"Limit passed for declaration %s.\n" +"Excess value: %s%s" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__line_ids +msgid "Lines" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__move_line_ids +msgid "Move Lines" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__number +msgid "Number" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,help:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_document_number +msgid "Number of partner's document" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__partner_id +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Partner" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_product_product +msgid "Product" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__type__out +msgid "Received from customers" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Refs" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_invoice_form +msgid "Select Manually" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.actions.act_window,name:l10n_it_declaration_of_intent.select_manually_declarations_action +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "Select Manually Declarations" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_select_declarations +msgid "Set declaration of intent manually on invoice" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__state +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "State" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__taxes_ids +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration_line__taxes_ids +msgid "Taxes" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__telematic_protocol +msgid "Telematic Protocol" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: code:addons/l10n_it_declaration_of_intent/models/declaration.py:0 +#, python-format +msgid "Total of documents exceed yearly limit" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__type +msgid "Type" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_declaration__used_amount +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__used_amount +msgid "Used Amount" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields.selection,name:l10n_it_declaration_of_intent.selection__l10n_it_declaration_of_intent_declaration__state__valid +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_search +msgid "Valid" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.declaration_of_intent_form +msgid "Valid Period" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_account_fiscal_position__valid_for_declaration_of_intent +msgid "Valid for declaration of intent" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model.fields,field_description:l10n_it_declaration_of_intent.field_l10n_it_declaration_of_intent_yearly_limit__year +msgid "Year" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model:ir.model,name:l10n_it_declaration_of_intent.model_l10n_it_declaration_of_intent_yearly_limit +msgid "Yearly limit for declarations" +msgstr "" + +#. module: l10n_it_declaration_of_intent +#: model_terms:ir.ui.view,arch_db:l10n_it_declaration_of_intent.select_manually_declarations_wizard +msgid "or" +msgstr "" diff --git a/l10n_it_declaration_of_intent/i18n/l10n_it_dichiarazione_intento.pot b/l10n_it_declaration_of_intent/i18n/l10n_it_dichiarazione_intento.pot new file mode 100644 index 000000000000..be353345e1be --- /dev/null +++ b/l10n_it_declaration_of_intent/i18n/l10n_it_dichiarazione_intento.pot @@ -0,0 +1,453 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_it_dichiarazione_intento +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2021-01-15 14:09+0000\n" +"PO-Revision-Date: 2021-01-15 14:09+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_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Accounting" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/dichiarazione_intento.py:0 +#, python-format +msgid "" +"All taxes in declaration of intent must be used in fiscal position taxes" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__amount +msgid "Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__available_amount +msgid "Available Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/account_invoice.py:0 +#: code:addons/l10n_it_dichiarazione_intento/models/account_invoice.py:0 +#, python-format +msgid "" +"Available plafond insufficent.\n" +"Excess value: %s" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__base_amount +msgid "Base Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.select_manually_declarations_wizard +msgid "Cancel" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields.selection,name:l10n_it_dichiarazione_intento.selection__dichiarazione_intento__state__close +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_search +msgid "Close" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__company_id +msgid "Company" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.select_manually_declarations_wizard +msgid "Confirm" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__create_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__create_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__create_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__create_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__create_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__create_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__currency_id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__currency_id +msgid "Currency" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__date +msgid "Date" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__date_end +msgid "Date End" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__date_invoice +msgid "Date Invoice" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__date_start +msgid "Date Start" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,help:l10n_it_dichiarazione_intento.field_dichiarazione_intento__partner_document_date +msgid "Date of partner's document" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__dichiarazione_id +msgid "Declaration" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_dichiarazione_intento +msgid "Declaration of intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/account_invoice.py:0 +#, python-format +msgid "" +"Declaration of intent not found. Add new declaration or change fiscal " +"position and verify applied tax" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_res_company__dichiarazione_yearly_limit_ids +msgid "Declaration yearly limit" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__declaration_ids +msgid "Declarations of Intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.actions.act_window,name:l10n_it_dichiarazione_intento.dichiarazione_intento_action +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_bank_statement_line__dichiarazione_intento_ids +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move__dichiarazione_intento_ids +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_payment__dichiarazione_intento_ids +#: model:ir.ui.menu,name:l10n_it_dichiarazione_intento.dichiarazione_intento_menu +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_search +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_view_company_form +msgid "Declarations of intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/dichiarazione_intento.py:0 +#, python-format +msgid "Define a yearly plafond for in documents in your company settings" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/account.py:0 +#, python-format +msgid "Define taxes for fiscal position %s valid for declaration of intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Details" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_dichiarazione_intento_line +msgid "Details of declaration of intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_fiscal_position__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move_line__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_product_product__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_sale_order__display_name +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Document Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__partner_document_date +msgid "Document Date" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__partner_document_number +msgid "Document Number" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields.selection,name:l10n_it_dichiarazione_intento.selection__dichiarazione_intento__state__expired +msgid "Expired" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_account_fiscal_position +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__fiscal_position_id +msgid "Fiscal Position" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__force_close +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Force Close" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move_line__force_dichiarazione_intento_id +msgid "Force Declaration of Intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Force Reopen" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_fiscal_position__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move_line__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_product_product__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_res_company__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_sale_order__id +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__id +msgid "ID" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/dichiarazione_intento.py:0 +#, python-format +msgid "Impossible to delete a document with linked invoices" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__invoice_id +msgid "Invoice" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields.selection,name:l10n_it_dichiarazione_intento.selection__dichiarazione_intento__type__in +msgid "Issued from company" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_fiscal_position____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_move_line____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_product_product____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_sale_order____last_update +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__write_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__write_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__write_uid +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__write_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__write_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__write_date +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_select_manually_declarations__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__limit_amount +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__limit_amount +msgid "Limit Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/dichiarazione_intento.py:0 +#, python-format +msgid "" +"Limit passed for declaration %s.\n" +"Excess value: %s%s" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__line_ids +msgid "Lines" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__move_line_ids +msgid "Move Lines" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__number +msgid "Number" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,help:l10n_it_dichiarazione_intento.field_dichiarazione_intento__partner_document_number +msgid "Number of partner's document" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__partner_id +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_search +msgid "Partner" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_product_product +msgid "Product" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields.selection,name:l10n_it_dichiarazione_intento.selection__dichiarazione_intento__type__out +msgid "Received from customers" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Refs" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_invoice_form +msgid "Select Manually" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.actions.act_window,name:l10n_it_dichiarazione_intento.select_manually_declarations_action +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.select_manually_declarations_wizard +msgid "Select Manually Declarations" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_select_manually_declarations +msgid "Set declaration of intent manually on invoice" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__state +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_search +msgid "State" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__taxes_ids +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_line__taxes_ids +msgid "Taxes" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__telematic_protocol +msgid "Telematic Protocol" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: code:addons/l10n_it_dichiarazione_intento/models/dichiarazione_intento.py:0 +#, python-format +msgid "Total of documents exceed yearly limit" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__type +msgid "Type" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento__used_amount +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__used_amount +msgid "Used Amount" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields.selection,name:l10n_it_dichiarazione_intento.selection__dichiarazione_intento__state__valid +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_search +msgid "Valid" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.dichiarazione_intento_form +msgid "Valid Period" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_account_fiscal_position__valid_for_dichiarazione_intento +msgid "Valid for declaration of intent" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model.fields,field_description:l10n_it_dichiarazione_intento.field_dichiarazione_intento_yearly_limit__year +msgid "Year" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model:ir.model,name:l10n_it_dichiarazione_intento.model_dichiarazione_intento_yearly_limit +msgid "Yearly limit for declarations" +msgstr "" + +#. module: l10n_it_dichiarazione_intento +#: model_terms:ir.ui.view,arch_db:l10n_it_dichiarazione_intento.select_manually_declarations_wizard +msgid "or" +msgstr "" \ No newline at end of file diff --git a/l10n_it_declaration_of_intent/models/__init__.py b/l10n_it_declaration_of_intent/models/__init__.py new file mode 100644 index 000000000000..588c91f5c211 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/__init__.py @@ -0,0 +1,6 @@ +from . import account +from . import declaration +from . import company +from . import account_move +from . import sale +from . import product diff --git a/l10n_it_declaration_of_intent/models/account.py b/l10n_it_declaration_of_intent/models/account.py new file mode 100644 index 000000000000..680acd04f13f --- /dev/null +++ b/l10n_it_declaration_of_intent/models/account.py @@ -0,0 +1,27 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class AccountFiscalPosition(models.Model): + + _inherit = "account.fiscal.position" + + valid_for_declaration_of_intent = fields.Boolean("Valid for declaration of intent") + + @api.constrains("valid_for_declaration_of_intent", "tax_ids") + def _check_taxes_for_declaration_of_intent(self): + for fiscal_position in self: + if ( + fiscal_position.valid_for_declaration_of_intent + and not fiscal_position.tax_ids + ): + raise ValidationError( + _( + "Define taxes for fiscal position %s valid " + "for declaration of intent" + ) + % fiscal_position.name + ) diff --git a/l10n_it_declaration_of_intent/models/account_move.py b/l10n_it_declaration_of_intent/models/account_move.py new file mode 100644 index 000000000000..b16794689167 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/account_move.py @@ -0,0 +1,299 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.tools.misc import format_date + + +class AccountMove(models.Model): + + _inherit = "account.move" + + declaration_of_intent_ids = fields.Many2many( + comodel_name="l10n_it_declaration_of_intent.declaration", + string="Declarations of intent", + ) + + def _set_fiscal_position(self): + for invoice in self: + if invoice.partner_id: + invoice_type_short = invoice.get_type_short() + if not invoice_type_short: + continue + all_declarations = self.env[ + "l10n_it_declaration_of_intent.declaration" + ].get_all_for_partner( + invoice_type_short, + invoice.partner_id.commercial_partner_id.id, + ) + if not all_declarations: + return + valid_date = invoice.invoice_date or fields.Date.context_today(invoice) + + valid_declarations = all_declarations.filtered( + lambda d: d.date_start <= valid_date <= d.date_end + ) + if valid_declarations: + invoice.fiscal_position_id = valid_declarations[ + 0 + ].fiscal_position_id.id + elif invoice.fiscal_position_id and invoice.fiscal_position_id.id in [ + d.fiscal_position_id.id for d in all_declarations + ]: + invoice.fiscal_position_id = False + + def get_type_short(self): + """ + Get in/out value from the invoice. + + This will then be matched with field + l10n_it_declaration_of_intent.declaration.type. + For instance: + an invoice of type `in_refund` returns `in`, + an invoice of type `out_refund` returns `out`, + an invoice of type `entry` returns ``. + """ + self.ensure_one() + invoice_type_short = "" + if self.move_type and "_" in self.move_type: + invoice_type_short = self.move_type.split("_")[0] + return invoice_type_short + + @api.onchange("invoice_date") + def _onchange_date_invoice(self): + self._set_fiscal_position() + + @api.onchange("partner_id", "company_id") + def _onchange_partner_id(self): + res = super()._onchange_partner_id() + self._set_fiscal_position() + return res + + def select_manually_declarations(self): + self.ensure_one() + action = self.env.ref( + "l10n_it_declaration_of_intent.select_manually_declarations_action" + ).read()[0] + return action + + def action_post(self): + res = super().action_post() + # Check if there is enough available amount on declarations + for invoice in self: + declarations = invoice.get_declarations() + # If partner has no declarations, do nothing + if not declarations: + # If fiscal position is valid for declaration of intent, + # there should be a valid declaration of intent + if invoice.fiscal_position_id.valid_for_declaration_of_intent: + raise UserError( + _( + "Declaration of intent not found. Add new declaration or " + "change fiscal position and verify applied tax" + ) + ) + else: + continue + + invoice.check_declarations_amounts(declarations) + + # Assign account move lines to declarations for each invoice + for invoice in self: + declarations = invoice.get_declarations() + # If partner has no declarations, do nothing + if not declarations: + continue + # Get only lines with taxes + lines = invoice.line_ids.filtered("tax_ids") + if not lines: + continue + # Group lines by tax + grouped_lines = self.get_move_lines_by_declaration(lines) + invoice.update_declarations(declarations, grouped_lines) + + return res + + def update_declarations(self, declarations, grouped_lines): + """ + Update the declarations adding a new line representing this invoice. + + Also add a comment in this invoice stating which declaration is into. + """ + self.ensure_one() + is_sale_document = self.is_sale_document() + for force_declaration in grouped_lines.keys(): + for tax, lines in grouped_lines[force_declaration].items(): + # Create a detail in declaration for every tax group + amount = sum(line.balance for line in lines) + if is_sale_document: + amount *= -1 + # Select right declaration(s) + if force_declaration: + declarations = [force_declaration] + else: + declarations = declarations + + for declaration in declarations: + if tax not in declaration.taxes_ids: + continue + # avoid creating line with same invoice_id + declaration.line_ids.filtered( + lambda line: line.invoice_id == self + ).unlink() + declaration.line_ids = [ + (0, 0, self._prepare_declaration_line(amount, lines, tax)), + ] + # Link declaration to invoice + self.declaration_of_intent_ids = [(4, declaration.id)] + if is_sale_document: + cmt = self.narration or "" + msg = ( + "Vostra dichiarazione d'intento nr %s del %s, " + "nostro protocollo nr %s del %s, " + "protocollo telematico nr %s." + % ( + declaration.partner_document_number, + format_date( + self.env, declaration.partner_document_date + ), + declaration.number, + format_date(self.env, declaration.date), + declaration.telematic_protocol, + ) + ) + # Avoid duplication + if msg not in cmt: + if cmt.strip(): + cmt += "\n\n" + msg + else: + cmt = msg + self.narration = cmt + + def _prepare_declaration_line(self, amount, lines, tax): + """Dictionary used to create declaration line for this invoice.""" + self.ensure_one() + return { + "taxes_ids": [ + (6, 0, tax.ids), + ], + "move_line_ids": [ + (6, 0, lines.ids), + ], + "amount": amount, + "invoice_id": self.id, + "base_amount": self.amount_untaxed, + "currency_id": self.currency_id.id, + } + + @api.model + def get_move_lines_by_declaration(self, lines): + """Get account move lines grouped by the declaration forced in each line.""" + grouped_lines = {} + invoice_line_model = self.env["account.move.line"] + for line in lines: + force_declaration = line.force_declaration_of_intent_id + if force_declaration not in grouped_lines: + grouped_lines.update({force_declaration: {}}) + + tax = line.tax_ids[0] + if tax not in grouped_lines[force_declaration]: + grouped_lines[force_declaration].update( + {tax: invoice_line_model.browse()} + ) + + grouped_lines[force_declaration][tax] |= line + return grouped_lines + + def get_declarations(self): + """Get declarations linked directly or indirectly to this invoice.""" + self.ensure_one() + declaration_model = self.env["l10n_it_declaration_of_intent.declaration"] + if self.declaration_of_intent_ids: + declarations = self.declaration_of_intent_ids + else: + declarations = declaration_model.with_context( + ignore_state=True if self.move_type.endswith("_refund") else False + ).get_valid( + type_d=self.move_type.split("_")[0], + partner_id=self.partner_id.id, + date=self.invoice_date, + ) + return declarations + + def check_declarations_amounts(self, declarations): + """ + Compare this invoice's tax amounts and `declarations` plafond. + + An exception is raised if the plafond of the declarations + is not sufficient for this invoice's taxes. + """ + self.ensure_one() + declarations_amounts = self.get_declaration_residual_amounts(declarations) + + declarations_residual = sum( + [declarations_amounts[da] for da in declarations_amounts] + ) + if declarations_residual < 0: + raise UserError( + _("Available plafond insufficent.\n" "Excess value: %s") + % (abs(declarations_residual)) + ) + + # Check se con nota credito ho superato il plafond + declaration_model = self.env["l10n_it_declaration_of_intent.declaration"] + for declaration_id in declarations_amounts: + declaration = declaration_model.browse(declaration_id) + # declarations_amounts contains residual, so, if > limit_amount, + # used_amount went < 0 + if declarations_amounts[declaration_id] > declaration.limit_amount: + excess = abs( + declarations_amounts[declaration_id] - declaration.limit_amount + ) + raise UserError( + _("Available plafond insufficent.\n" "Excess value: %s") % excess + ) + return True + + def get_declaration_residual_amounts(self, declarations): + """Get residual amount for every `declarations`.""" + declarations_amounts = {} + # If the tax amount is 0, then there is no line representing the tax + # so there will be no line having tax_line_id. + # Therefore we choose instead the lines that + # should generate the tax line i.e. the lines that have `tax_ids` + tax_lines = self.line_ids.filtered("tax_ids") + for tax_line in tax_lines: + # Move lines having `tax_ids` represent the base amount for those taxes + amount = tax_line.price_subtotal + for declaration in declarations: + if declaration.id not in declarations_amounts: + declarations_amounts[declaration.id] = declaration.available_amount + if any(tax in declaration.taxes_ids for tax in tax_line.tax_ids): + declarations_amounts[declaration.id] -= amount + for declaration in declarations: + # exclude amount from lines with invoice_id equals to self + for line in declaration.line_ids.filtered(lambda l: l.invoice_id == self): + declarations_amounts[declaration.id] += line.amount + return declarations_amounts + + def button_cancel(self): + line_model = self.env["l10n_it_declaration_of_intent.declaration_line"] + for invoice in self: + # Force unlink of declaration details to compute used amount field + lines = line_model.search([("invoice_id", "=", invoice.id)]) + if lines: + for line in lines: + invoice.declaration_of_intent_ids = [(3, line.declaration_id.id)] + lines.unlink() + return super().button_cancel() + + +class AccountMoveLine(models.Model): + + _inherit = "account.move.line" + + force_declaration_of_intent_id = fields.Many2one( + comodel_name="l10n_it_declaration_of_intent.declaration", + string="Force Declaration of Intent", + ) diff --git a/l10n_it_declaration_of_intent/models/company.py b/l10n_it_declaration_of_intent/models/company.py new file mode 100644 index 000000000000..c4e0bc988d07 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/company.py @@ -0,0 +1,15 @@ +# Copyright 2018 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + + _inherit = "res.company" + + declaration_yearly_limit_ids = fields.One2many( + comodel_name="l10n_it_declaration_of_intent.yearly_limit", + inverse_name="company_id", + string="Declaration yearly limit", + ) diff --git a/l10n_it_declaration_of_intent/models/declaration.py b/l10n_it_declaration_of_intent/models/declaration.py new file mode 100644 index 000000000000..01e738436294 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/declaration.py @@ -0,0 +1,280 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + + +class DeclarationOfIntentYearlyLimit(models.Model): + + _name = "l10n_it_declaration_of_intent.yearly_limit" + _description = "Yearly limit for declarations" + _order = "company_id, year desc" + _rec_name = "year" + + company_id = fields.Many2one("res.company", string="Company") + year = fields.Char(required=True) + limit_amount = fields.Float() + used_amount = fields.Float(compute="_compute_used_amount") + + def _compute_used_amount(self): + for record in self: + date_start = datetime.strptime("01-01-{}".format(record.year), "%d-%m-%Y") + date_end = datetime.strptime("31-12-{}".format(record.year), "%d-%m-%Y") + declarations = self.env["l10n_it_declaration_of_intent.declaration"].search( + [ + ("date_start", ">=", date_start), + ("date_end", "<=", date_end), + ("type", "=", "in"), + ] + ) + record.used_amount = sum([d.limit_amount for d in declarations]) + + +class DeclarationOfIntent(models.Model): + + _name = "l10n_it_declaration_of_intent.declaration" + _description = "Declaration of intent" + _order = "date_start desc,date_end desc" + + @api.model + def _default_currency(self): + return self.env.company.currency_id + + number = fields.Char(copy=False) + date = fields.Date(required=True) + date_start = fields.Date(required=True) + date_end = fields.Date(required=True) + type = fields.Selection( + [("in", "Issued from company"), ("out", "Received from customers")], + required=True, + default="in", + ) + partner_id = fields.Many2one("res.partner", string="Partner", required=True) + telematic_protocol = fields.Char(required=True) + partner_document_number = fields.Char( + required=True, string="Document Number", help="Number of partner's document" + ) + partner_document_date = fields.Date( + required=True, string="Document Date", help="Date of partner's document" + ) + taxes_ids = fields.Many2many("account.tax", string="Taxes", required=True) + used_amount = fields.Monetary(compute="_compute_amounts", store=True) + limit_amount = fields.Monetary(required=True) + available_amount = fields.Monetary(compute="_compute_amounts", store=True) + company_id = fields.Many2one( + "res.company", string="Company", default=lambda self: self.env.company + ) + currency_id = fields.Many2one( + "res.currency", + string="Currency", + default=_default_currency, + ) + fiscal_position_id = fields.Many2one( + "account.fiscal.position", + string="Fiscal Position", + required=True, + domain=[("valid_for_declaration_of_intent", "=", True)], + ) + state = fields.Selection( + [("valid", "Valid"), ("expired", "Expired"), ("close", "Close")], + compute="_compute_state", + store=True, + ) + force_close = fields.Boolean() + line_ids = fields.One2many( + comodel_name="l10n_it_declaration_of_intent.declaration_line", + inverse_name="declaration_id", + string="Lines", + ) + + @api.model_create_multi + def create(self, vals_list): + for values in vals_list: + # ----- Check if yearly plafond is enough + # to create an in declaration + # Declaration issued by company are "IN" + if values.get("type", False) == "in": + year = fields.Date.to_date(values["date_start"]).strftime("%Y") + plafond = self.env.company.declaration_yearly_limit_ids.filtered( + lambda r: r.year == year + ) + if not plafond: + raise UserError( + _( + "Define a yearly plafond for in documents in your company " + "settings" + ) + ) + date_start = datetime.strptime("01-01-{}".format(year), "%d-%m-%Y") + date_end = datetime.strptime("31-12-{}".format(year), "%d-%m-%Y") + declarations = self.search( + [ + ("date_start", ">=", date_start), + ("date_end", "<=", date_end), + ("type", "=", "in"), + ] + ) + actual_limit_total = ( + sum([d.limit_amount for d in declarations]) + values["limit_amount"] + ) + if actual_limit_total > plafond.limit_amount: + raise UserError(_("Total of documents exceed yearly limit")) + # ----- Assign a number to declaration + if values and not values.get("number", ""): + values["number"] = self.env["ir.sequence"].next_by_code( + "declaration_of_intent" + ) + return super().create(vals_list) + + def unlink(self): + for record in self: + if record.line_ids: + raise UserError( + _("Impossible to delete a document with linked invoices") + ) + return super().unlink() + + @api.constrains("fiscal_position_id", "taxes_ids") + def _check_taxes_for_declaration_of_intent(self): + for declaration in self: + if ( + declaration.taxes_ids + and declaration.fiscal_position_id + and declaration.fiscal_position_id.tax_ids + ): + taxes = [ + t.tax_dest_id.id for t in declaration.fiscal_position_id.tax_ids + ] + for tax in declaration.taxes_ids: + if tax.id not in taxes: + raise ValidationError( + _( + "All taxes in declaration of intent must be used " + "in fiscal position taxes" + ) + ) + + @api.constrains("limit_amount", "used_amount", "line_ids") + def _check_available_amount(self): + for declaration in self: + if declaration.available_amount < 0: + raise UserError( + _( + "Limit passed for declaration {number}." + "\nExcess value: {symbol}{available_amount}" + ).format( + number=declaration.number, + symbol=declaration.currency_id.symbol, + available_amount=abs(declaration.available_amount), + ) + ) + + def name_get(self): + res = [] + for record in self: + complete_name = record.number + if record.partner_document_number: + complete_name = "{} ({})".format( + complete_name, + record.partner_document_number, + ) + res.append( + (record.id, complete_name), + ) + return res + + @api.depends("line_ids", "line_ids.amount", "limit_amount") + def _compute_amounts(self): + for record in self: + amount = sum(line.amount for line in record.line_ids) + # ----- Force value to 0 + if amount < 0.0: + amount = 0.0 + record.used_amount = amount + record.available_amount = record.limit_amount - record.used_amount + + @api.depends("used_amount", "limit_amount", "date_end", "force_close") + def _compute_state(self): + for record in self: + # ----- If state is forced to be close, close document + if record.force_close: + state = "close" + # ----- If used amount is bigger than limit, close document + elif record.limit_amount and record.used_amount >= record.limit_amount: + state = "close" + # ----- If date is passed, close document + elif record.date_end and record.date_end < datetime.today().date(): + state = "expired" + else: + state = "valid" + record.state = state + + @api.onchange("fiscal_position_id", "type") + def onchange_fiscal_position_id(self): + taxes = self.env["account.tax"] + for tax_mapping in self.fiscal_position_id.tax_ids: + if tax_mapping.tax_dest_id: + if ( + self.type == "in" + and tax_mapping.tax_dest_id.type_tax_use == "purchase" + ) or ( + self.type == "out" + and tax_mapping.tax_dest_id.type_tax_use == "sale" + ): + taxes |= tax_mapping.tax_dest_id + if taxes: + self.taxes_ids = [(6, 0, taxes.ids)] + + def change_force_close(self): + for record in self: + record.force_close = not record.force_close + + def get_valid(self, type_d=None, partner_id=False, date=False): + if not partner_id or not type_d or not date: + return False + ignore_state = self.env.context.get("ignore_state", False) + all_for_partner = self.get_all_for_partner(type_d, partner_id, ignore_state) + # # ----- return valid documents for partner + records = all_for_partner.filtered(lambda d: d.date_start <= date <= d.date_end) + return records + + def get_all_for_partner(self, type_d=None, partner_id=False, ignore_state=False): + if not partner_id or not type_d: + return False + # ----- return all documents for partner + domain = [("partner_id", "=", partner_id), ("type", "=", type_d)] + if not ignore_state: + domain.append( + ("state", "!=", "close"), + ) + records = self.search(domain, order="state desc, date") + return records + + +class DeclarationOfIntentLine(models.Model): + + _name = "l10n_it_declaration_of_intent.declaration_line" + _description = "Details of declaration of intent" + + declaration_id = fields.Many2one( + comodel_name="l10n_it_declaration_of_intent.declaration", + string="Declaration", + ) + taxes_ids = fields.Many2many("account.tax", string="Taxes") + move_line_ids = fields.Many2many( + comodel_name="account.move.line", + relation="move_line_declaration_line_rel", + string="Move Lines", + ondelete="cascade", + ) + amount = fields.Monetary() + base_amount = fields.Monetary() + invoice_id = fields.Many2one("account.move", string="Invoice") + date_invoice = fields.Date(related="invoice_id.invoice_date", string="Date Invoice") + company_id = fields.Many2one( + "res.company", string="Company", related="declaration_id.company_id" + ) + currency_id = fields.Many2one("res.currency", string="Currency") diff --git a/l10n_it_declaration_of_intent/models/product.py b/l10n_it_declaration_of_intent/models/product.py new file mode 100644 index 000000000000..101ef9959f38 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/product.py @@ -0,0 +1,20 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class ProductProduct(models.Model): + + _inherit = "product.product" + + @api.model + def _convert_prepared_anglosaxon_line(self, line, partner): + res = super(ProductProduct, self)._convert_prepared_anglosaxon_line( + line, partner + ) + if line.get("force_declaration_of_intent_id", False): + res["force_declaration_of_intent_id"] = line[ + "force_declaration_of_intent_id" + ] + return res diff --git a/l10n_it_declaration_of_intent/models/sale.py b/l10n_it_declaration_of_intent/models/sale.py new file mode 100644 index 000000000000..39d073af1948 --- /dev/null +++ b/l10n_it_declaration_of_intent/models/sale.py @@ -0,0 +1,29 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + + _inherit = "sale.order" + + def _set_fiscal_position(self): + for sale in self: + if sale.partner_id and sale.date_order: + declarations = self.env[ + "l10n_it_declaration_of_intent.declaration" + ].get_valid( + "out", sale.partner_id.id, fields.Date.to_date(sale.date_order) + ) + if declarations: + sale.fiscal_position_id = declarations[0].fiscal_position_id.id + + @api.onchange("date_order") + def onchange_date_order(self): + self._set_fiscal_position() + + def _compute_fiscal_position_id(self): + res = super()._compute_fiscal_position_id() + self._set_fiscal_position() + return res diff --git a/l10n_it_declaration_of_intent/readme/CONFIGURE.rst b/l10n_it_declaration_of_intent/readme/CONFIGURE.rst new file mode 100644 index 000000000000..1dc819020bb7 --- /dev/null +++ b/l10n_it_declaration_of_intent/readme/CONFIGURE.rst @@ -0,0 +1,12 @@ +Creare: + +1. | un'imposta di tipo vendite con importo 0. + | Ad esempio "Non imponibile art.8c Lettera intento" + +2. una posizione fiscale per le dichiarazioni d'intento, avente: + + - il flag `Valida per dichiarazione d'intento` attivato, + - | una mappatura delle imposte opportuna. + | Ad esempio tra "IVA al 22% (debito) (Vendita)" e "Non imponibile art.8c Lettera intento". + +In Impostazioni > Utenti e aziende, selezionare un'azienda e, nella scheda Dichiarazioni d'intento, definire un plafond annuale. diff --git a/l10n_it_declaration_of_intent/readme/CONTRIBUTORS.rst b/l10n_it_declaration_of_intent/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..8b87edfd5e24 --- /dev/null +++ b/l10n_it_declaration_of_intent/readme/CONTRIBUTORS.rst @@ -0,0 +1,8 @@ +* Francesco Apruzzese +* Sergio Corato +* Glauco Prina +* Lorenzo Battistini +* Lara Baggio +* Simone Rubino +* Arcadio Pinto +* Alex Comba diff --git a/l10n_it_declaration_of_intent/readme/DESCRIPTION.rst b/l10n_it_declaration_of_intent/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..168852c5d547 --- /dev/null +++ b/l10n_it_declaration_of_intent/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +**Italiano** + +Questo modulo consente di gestire le dichiarazioni d'intento. + +**English** + +This module allows you to manage declarations of intent. diff --git a/l10n_it_declaration_of_intent/readme/ROADMAP.rst b/l10n_it_declaration_of_intent/readme/ROADMAP.rst new file mode 100644 index 000000000000..5f6c29779008 --- /dev/null +++ b/l10n_it_declaration_of_intent/readme/ROADMAP.rst @@ -0,0 +1 @@ +Improve management of currency (see https://github.com/OCA/l10n-italy/issues/2428). diff --git a/l10n_it_declaration_of_intent/readme/USAGE.rst b/l10n_it_declaration_of_intent/readme/USAGE.rst new file mode 100644 index 000000000000..d5abce675833 --- /dev/null +++ b/l10n_it_declaration_of_intent/readme/USAGE.rst @@ -0,0 +1,5 @@ +Per ogni cliente o fornitore soggetto a dichiarazione d'intento, creare una dichiarazione d'intento inserendo tutti i dati e selezionando la posizione fiscale dedicata. + +Nota che il menu Fatturazione > Contabilità > Dichiarazioni d'intento è visibile solo per gli utenti nel gruppo `Mostrare funzionalità contabili complete`. + +In fase di fatturazione, utilizzare la posizione fiscale apposita. diff --git a/l10n_it_declaration_of_intent/security/declaration_security.xml b/l10n_it_declaration_of_intent/security/declaration_security.xml new file mode 100644 index 000000000000..4ddd94555855 --- /dev/null +++ b/l10n_it_declaration_of_intent/security/declaration_security.xml @@ -0,0 +1,41 @@ + + + + + + Yearly limit multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + Declaration multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + + Declaration line multi-company + + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + + diff --git a/l10n_it_declaration_of_intent/security/ir.model.access.csv b/l10n_it_declaration_of_intent/security/ir.model.access.csv new file mode 100644 index 000000000000..f7302ae9a709 --- /dev/null +++ b/l10n_it_declaration_of_intent/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_declaration_of_intent,declaration_of_intent access,model_l10n_it_declaration_of_intent_declaration,account.group_account_invoice,1,1,1,1 +access_declaration_of_intent_base,declaration_of_intent read access,model_l10n_it_declaration_of_intent_declaration,base.group_user,1,0,0,0 +access_declaration_of_intent_line,declaration_of_intent line access,model_l10n_it_declaration_of_intent_declaration_line,account.group_account_invoice,1,1,1,1 +access_declaration_of_intent_yearly_limit,declaration_of_intent.yearly_limit access,model_l10n_it_declaration_of_intent_yearly_limit,account.group_account_invoice,1,1,1,1 +access_select_declarations,access_select_declarations,model_l10n_it_declaration_of_intent_select_declarations,base.group_user,1,1,1,1 diff --git a/l10n_it_declaration_of_intent/static/description/icon.png b/l10n_it_declaration_of_intent/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/l10n_it_declaration_of_intent/static/description/icon.png differ diff --git a/l10n_it_declaration_of_intent/static/description/index.html b/l10n_it_declaration_of_intent/static/description/index.html new file mode 100644 index 000000000000..4b8d7d37b078 --- /dev/null +++ b/l10n_it_declaration_of_intent/static/description/index.html @@ -0,0 +1,466 @@ + + + + + + +ITA - Dichiarazione di intento + + + +
+

ITA - Dichiarazione di intento

+ + +

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

+

Italiano

+

Questo modulo consente di gestire le dichiarazioni d’intento.

+

English

+

This module allows you to manage declarations of intent.

+

Table of contents

+ +
+

Configuration

+

Creare:

+
    +
  1. +
    un’imposta di tipo vendite con importo 0.
    +
    Ad esempio “Non imponibile art.8c Lettera intento”
    +
    +
  2. +
  3. una posizione fiscale per le dichiarazioni d’intento, avente:

    +
      +
    • il flag Valida per dichiarazione d’intento attivato,

      +
    • +
    • +
      una mappatura delle imposte opportuna.
      +
      Ad esempio tra “IVA al 22% (debito) (Vendita)” e “Non imponibile art.8c Lettera intento”.
      +
      +
    • +
    +
  4. +
+

In Impostazioni > Utenti e aziende, selezionare un’azienda e, nella scheda Dichiarazioni d’intento, definire un plafond annuale.

+
+
+

Usage

+

Per ogni cliente o fornitore soggetto a dichiarazione d’intento, creare una dichiarazione d’intento inserendo tutti i dati e selezionando la posizione fiscale dedicata.

+

Nota che il menu Fatturazione > Contabilità > Dichiarazioni d’intento è visibile solo per gli utenti nel gruppo Mostrare funzionalità contabili complete.

+

In fase di fatturazione, utilizzare la posizione fiscale apposita.

+
+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Francesco Apruzzese
  • +
  • Sergio Corato
  • +
  • Glauco Prina
  • +
  • Lara Baggio
  • +
+
+
+

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_declaration_of_intent/tests/__init__.py b/l10n_it_declaration_of_intent/tests/__init__.py new file mode 100644 index 000000000000..68120d464d6d --- /dev/null +++ b/l10n_it_declaration_of_intent/tests/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_account +from . import test_declaration_of_intent diff --git a/l10n_it_declaration_of_intent/tests/test_account.py b/l10n_it_declaration_of_intent/tests/test_account.py new file mode 100644 index 000000000000..da315584d8a8 --- /dev/null +++ b/l10n_it_declaration_of_intent/tests/test_account.py @@ -0,0 +1,24 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestAccount(TransactionCase): + def setUp(self): + super(TestAccount, self).setUp() + self.fiscal_position = ( + self.env["account.fiscal.position"] + .sudo() + .create( + { + "name": "Test Fiscal Position", + "valid_for_declaration_of_intent": False, + } + ) + ) + + def test_valid_for_declaration_of_intent(self): + with self.assertRaises(ValidationError): + self.fiscal_position.valid_for_declaration_of_intent = True diff --git a/l10n_it_declaration_of_intent/tests/test_declaration_of_intent.py b/l10n_it_declaration_of_intent/tests/test_declaration_of_intent.py new file mode 100644 index 000000000000..f0b674d0c17f --- /dev/null +++ b/l10n_it_declaration_of_intent/tests/test_declaration_of_intent.py @@ -0,0 +1,479 @@ +# Copyright 2017 Francesco Apruzzese +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, timedelta + +from odoo import fields +from odoo.exceptions import UserError, ValidationError +from odoo.tests import tagged +from odoo.tests.common import Form +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged("post_install", "-at_install") +class TestDeclarationOfIntent(AccountTestInvoicingCommon): + @classmethod + def _create_declaration(cls, partner, type_d): + return cls.env["l10n_it_declaration_of_intent.declaration"].create( + { + "partner_id": partner.id, + "partner_document_number": "PartnerTest%s" % partner.id, + "partner_document_date": cls.today_date, + "date": cls.today_date, + "date_start": cls.today_date, + "date_end": cls.today_date, + "taxes_ids": [(6, 0, [cls.tax1.id])], + "limit_amount": 1000.00, + "fiscal_position_id": cls.fiscal_position.id, + "type": type_d, + "telematic_protocol": "08060120341234567-000001", + } + ) + + @classmethod + def _create_invoice(cls, name, partner, tax=False, date=False, in_type=False): + invoice_form = Form( + cls.env["account.move"].with_context( + default_move_type="in_invoice" if in_type else "out_invoice" + ) + ) + invoice_form.partner_id = partner + invoice_form.invoice_date = date if date else cls.today_date + invoice_form.invoice_payment_term_id = cls.env.ref( + "account.account_payment_term_advance" + ) + cls._add_invoice_line_id(invoice_form, tax=tax, in_type=in_type) + invoice = invoice_form.save() + return invoice + + @classmethod + def _add_invoice_line_id(cls, invoice_form, tax=False, in_type=False): + with invoice_form.invoice_line_ids.new() as invoice_line: + invoice_line.product_id = cls.env.ref("product.product_product_5") + invoice_line.quantity = 10.00 + invoice_line.account_id = cls.a_cost if in_type else cls.a_sale + invoice_line.name = "test line" + invoice_line.price_unit = 90.00 + if tax: + invoice_line.tax_ids.clear() + invoice_line.tax_ids.add(tax) + + @classmethod + def _create_refund(cls, partner, tax=False, date=False, in_type=False): + refund_form = Form( + cls.env["account.move"].with_context( + default_move_type="in_refund" if in_type else "out_refund" + ) + ) + refund_form.partner_id = partner + refund_form.invoice_date = date if date else cls.today_date + refund_form.invoice_payment_term_id = cls.env.ref( + "account.account_payment_term_advance" + ) + + with refund_form.invoice_line_ids.new() as refund_line: + refund_line.quantity = 1.00 + refund_line.account_id = cls.a_sale + refund_line.name = "test refund line" + refund_line.price_unit = 100.00 + if tax: + refund_line.tax_ids.clear() + refund_line.tax_ids.add(tax) + + refund = refund_form.save() + return refund + + @classmethod + def setUpClass(cls, chart_template_ref=None): + super().setUpClass(chart_template_ref=chart_template_ref) + + # Copy declaration sequence to current company + cls.env.ref("l10n_it_declaration_of_intent.declaration_of_intent_seq").copy( + default=dict( + company_id=cls.env.company.id, + ) + ) + + cls.tax_model = cls.env["account.tax"] + cls.a_sale = cls.env["account.account"].search( + [ + ( + "account_type", + "=", + "income", + ) + ], + limit=1, + ) + cls.a_cost = cls.env["account.account"].search( + [ + ( + "account_type", + "=", + "expense_direct_cost", + ) + ], + limit=1, + ) + cls.today_date = fields.Date.today() + cls.partner1 = cls.env.ref("base.res_partner_2") + cls.partner2 = cls.env.ref("base.res_partner_12") + cls.partner3 = cls.env.ref("base.res_partner_10") + cls.partner4 = cls.env.ref("base.res_partner_4") + cls.tax22 = cls.tax_model.create( + { + "name": "22%", + "amount": 22, + } + ) + cls.tax10 = cls.tax_model.create( + { + "name": "10%", + "amount": 10, + } + ) + cls.tax2 = cls.tax_model.create( + { + "name": "2%", + "amount": 2, + } + ) + cls.tax1 = cls.tax_model.create( + { + "name": "FC INC", + "amount": 0, + "price_include": True, + } + ) + cls.fiscal_position = cls.env["account.fiscal.position"].create( + { + "name": "Test declaration", + "valid_for_declaration_of_intent": True, + "tax_ids": [ + ( + 0, + 0, + { + "tax_src_id": cls.tax10.id, + "tax_dest_id": cls.tax1.id, + }, + ) + ], + } + ) + cls.fiscal_position_with_wrong_taxes = cls.env[ + "account.fiscal.position" + ].create( + { + "name": "Test wrong declaration", + "valid_for_declaration_of_intent": True, + "tax_ids": [ + ( + 0, + 0, + { + "tax_src_id": cls.tax10.id, + "tax_dest_id": cls.tax22.id, + }, + ) + ], + } + ) + cls.fiscal_position2 = cls.env["account.fiscal.position"].create( + { + "name": "Test declaration 2", + "valid_for_declaration_of_intent": False, + "tax_ids": [ + ( + 0, + 0, + { + "tax_src_id": cls.tax22.id, + "tax_dest_id": cls.tax10.id, + }, + ) + ], + } + ) + + cls.declaration1 = cls._create_declaration(cls.partner1, "out") + cls.declaration2 = cls._create_declaration(cls.partner2, "out") + cls.declaration3 = cls._create_declaration(cls.partner2, "out") + cls.env["l10n_it_declaration_of_intent.yearly_limit"].create( + { + "year": cls.today_date.year, + "limit_amount": 50000.0, + "company_id": cls.env.company.id, + } + ) + cls.declaration4 = cls._create_declaration(cls.partner4, "in") + cls.invoice1 = cls._create_invoice("1", cls.partner1) + cls.invoice2 = cls._create_invoice("2", cls.partner1, tax=cls.tax1) + cls.invoice3 = cls._create_invoice("3", cls.partner1, tax=cls.tax1) + cls.invoice_without_valid_taxes = cls._create_invoice( + "no valid taxes", cls.partner1, tax=cls.tax2 + ) + future_date = datetime.today() + timedelta(days=10) + future_date = future_date.strftime(DEFAULT_SERVER_DATE_FORMAT) + cls.invoice_future = cls._create_invoice( + "future", cls.partner1, date=future_date, tax=cls.tax1 + ) + cls.out_refund = cls._create_refund(cls.partner1, tax=cls.tax1) + cls.in_refund = cls._create_refund( + cls.partner1, + tax=cls.tax1, + in_type=True, + ) + cls.invoice4 = cls._create_invoice("4", cls.partner3, tax=cls.tax22) + cls.invoice4.fiscal_position_id = cls.fiscal_position2.id + cls.invoice5 = cls._create_invoice( + "5", cls.partner4, tax=cls.tax1, in_type=True + ) + cls.other_company = cls.env["res.company"].create( + { + "name": "other", + } + ) + cls.other_user = cls.env["res.users"].create( + { + "name": "User of other company", + "login": "other", + "company_ids": [ + (4, cls.other_company.id), + ], + "company_id": cls.other_company.id, + } + ) + + def test_declaration_data(self): + self.assertTrue(self.declaration1.number) + + def test_costraints(self): + with self.assertRaises(ValidationError): + self.declaration1.fiscal_position_id = ( + self.fiscal_position_with_wrong_taxes.id + ) + + def test_get_valid(self): + declaration_model = self.env["l10n_it_declaration_of_intent.declaration"] + self.assertFalse(declaration_model.get_valid()) + records = declaration_model.get_valid( + type_d="out", partner_id=self.partner1.id, date=self.today_date + ) + self.assertEqual(len(records), 1) + records = declaration_model.get_valid( + type_d="out", partner_id=self.partner2.id, date=self.today_date + ) + self.assertEqual(len(records), 2) + + def test_declaration_state_change(self): + self.assertEqual(self.declaration1.state, "valid") + # Close declaration by moving end date before today + previuos_date = datetime.today() - timedelta(days=10) + self.declaration1.date_start = previuos_date.strftime( + DEFAULT_SERVER_DATE_FORMAT + ) + self.declaration1.date_end = previuos_date.strftime(DEFAULT_SERVER_DATE_FORMAT) + self.assertEqual(self.declaration1.state, "expired") + + def test_invoice_validation_with_no_effect_on_declaration(self): + previous_used_amount = self.declaration1.used_amount + self.invoice1.action_post() + post_used_amount = self.declaration1.used_amount + self.assertEqual(previous_used_amount, post_used_amount) + self.invoice_future.action_post() + post_used_amount = self.declaration1.used_amount + self.assertEqual(previous_used_amount, post_used_amount) + self.invoice_without_valid_taxes.action_post() + post_used_amount = self.declaration1.used_amount + self.assertEqual(previous_used_amount, post_used_amount) + + def test_invoice_reopen_with_no_effect_on_declaration(self): + previous_used_amount = self.declaration1.used_amount + self.invoice1.action_post() + self.invoice1.button_cancel() + post_used_amount = self.declaration1.used_amount + self.assertEqual(previous_used_amount, post_used_amount) + + def test_invoice_validation_under_declaration_limit(self): + previous_used_amount = self.declaration1.used_amount + self.invoice2.action_post() + post_used_amount = self.declaration1.used_amount + self.assertNotEqual(previous_used_amount, post_used_amount) + + def test_invoice_validation_over_declaration_limit(self): + self.invoice2.action_post() + with self.assertRaises(UserError): + self.invoice3.action_post() + + def test_invoice_reopen_with_effect_on_declaration(self): + previous_used_amount = self.declaration1.used_amount + self.invoice2.action_post() + self.invoice2.button_cancel() + post_used_amount = self.declaration1.used_amount + self.assertEqual(previous_used_amount, post_used_amount) + + def test_refund(self): + self.invoice2.action_post() + previous_used_amount = self.declaration1.used_amount + self.out_refund.action_post() + post_used_amount = self.declaration1.used_amount + self.assertNotEqual(previous_used_amount, post_used_amount) + + def test_refund_with_amount_bigger_than_residual(self): + self.invoice2.action_post() + refund_form = Form(self.out_refund) + with refund_form.invoice_line_ids.edit(0) as line_form: + line_form.quantity = 10 + refund_form.save() + + # Check that base amount has been updated + self.assertEqual(self.out_refund.amount_untaxed, 1000) + + # Refund goes over plafond: 100 + 1000 > 1000 + self.assertEqual(self.declaration1.available_amount, 100) + self.assertEqual(self.out_refund.amount_untaxed, 1000) + self.assertEqual(self.declaration1.limit_amount, 1000) + with self.assertRaises(UserError): + self.out_refund.action_post() + + def test_fiscal_position_no_declaration(self): + self.invoice4._onchange_date_invoice() + self.assertEqual(self.invoice4.fiscal_position_id.id, self.fiscal_position2.id) + + def test_invoice_vendor_with_no_effect_on_declaration(self): + previous_used_amount = self.declaration4.used_amount + self.assertAlmostEqual(previous_used_amount, 0.0, 2) + self.invoice5.action_post() + post_used_amount = self.declaration4.used_amount + self.assertAlmostEqual(post_used_amount, 900.0, 2) + + def test_all_invoice_types(self): + """ + Check that a declaration with all the invoice types + computes the totals correctly. + """ + partner = self.partner1 + + out_invoice = self._create_invoice( + "test_all_out_invoice", partner, tax=self.tax1, in_type=False + ) + self.assertEqual(out_invoice.move_type, "out_invoice") + out_invoice_balance = out_invoice.line_ids.filtered("tax_ids").balance + self.assertEqual(out_invoice_balance, -900) + + in_invoice = self._create_invoice( + "test_all_in_invoice", partner, tax=self.tax1, in_type=True + ) + self.assertEqual(in_invoice.move_type, "in_invoice") + in_invoice_balance = in_invoice.line_ids.filtered("tax_ids").balance + self.assertEqual(in_invoice_balance, 900) + + out_refund = self._create_refund(partner, tax=self.tax1, in_type=False) + self.assertEqual(out_refund.move_type, "out_refund") + out_refund_balance = out_refund.line_ids.filtered("tax_ids").balance + self.assertEqual(out_refund_balance, 100) + + in_refund = self._create_refund(partner, tax=self.tax1, in_type=True) + self.assertEqual(in_refund.move_type, "in_refund") + in_refund_balance = in_refund.line_ids.filtered("tax_ids").balance + self.assertEqual(in_refund_balance, -100) + + invoices = out_invoice | in_invoice | out_refund | in_refund + + declaration = self._create_declaration(partner, "out") + declaration.limit_amount = 2000 + invoices.declaration_of_intent_ids = declaration + + invoices.action_post() + used_amount = ( + -out_invoice_balance + + in_invoice_balance + - out_refund_balance + + in_refund_balance + ) + self.assertEqual(declaration.available_amount, 2000 - used_amount) + + def test_invoice_repost(self): + invoice = self._create_invoice( + "test_invoice_repost", self.partner1, tax=self.tax1 + ) + invoice_form = Form(invoice) + for tax in (self.tax2, self.tax22): + self._add_invoice_line_id(invoice_form, tax=tax) + invoice = invoice_form.save() + invoice.action_post() + invoice.button_draft() + invoice.action_post() + self.assertEqual( + len( + self.declaration1.line_ids.filtered( + lambda line: line.invoice_id == invoice + ) + ), + 1, + ) + + def test_multi_company(self): + """Check that a user can only see and create declarations in his company.""" + self.env = self.env(user=self.other_user) + declaration_model = self.env["l10n_it_declaration_of_intent.declaration"] + + # See only declarations in current company + self.assertFalse(declaration_model.search_count([])) + + # Create tax_id in other company + other_tax10 = self.env["account.tax"].create( + { + "name": "10%", + "amount": 10, + "country_id": self.env.ref("base.it").id, + } + ) + other_tax1 = self.env["account.tax"].create( + { + "name": "FC INC", + "amount": 0, + "price_include": True, + "country_id": self.env.ref("base.it").id, + } + ) + + # Create fiscal_position in other company + fiscal_position2 = self.env["account.fiscal.position"].create( + { + "name": "Test Fiscal Position2", + "valid_for_declaration_of_intent": False, + "tax_ids": [ + ( + 0, + 0, + { + "tax_src_id": other_tax10.id, + "tax_dest_id": other_tax1.id, + }, + ) + ], + } + ) + + # Create declaration in other company + declaration = self.env["l10n_it_declaration_of_intent.declaration"].create( + { + "partner_id": self.partner1.id, + "partner_document_number": "PartnerTest%s" % self.partner1.id, + "partner_document_date": self.today_date, + "date": self.today_date, + "date_start": self.today_date, + "date_end": self.today_date, + "taxes_ids": [(6, 0, [other_tax1.id])], + "limit_amount": 1000.00, + "fiscal_position_id": fiscal_position2.id, + "type": "out", + "telematic_protocol": "08060120341234567-000001", + } + ) + self.assertEqual(declaration_model.search([]), declaration) + self.assertEqual(self.env.company, declaration.company_id) diff --git a/l10n_it_declaration_of_intent/views/account_invoice_view.xml b/l10n_it_declaration_of_intent/views/account_invoice_view.xml new file mode 100644 index 000000000000..45e9e95df11f --- /dev/null +++ b/l10n_it_declaration_of_intent/views/account_invoice_view.xml @@ -0,0 +1,51 @@ + + + + Add declaration of intent fields to invoice form + account.move + + + + + + + + + + + + Add declaration of intent fields to invoice line form + account.move.line + + + + + + + + diff --git a/l10n_it_declaration_of_intent/views/account_view.xml b/l10n_it_declaration_of_intent/views/account_view.xml new file mode 100644 index 000000000000..f38bab628717 --- /dev/null +++ b/l10n_it_declaration_of_intent/views/account_view.xml @@ -0,0 +1,13 @@ + + + + Add declaration of intent fields + account.fiscal.position + + + + + + + + diff --git a/l10n_it_declaration_of_intent/views/company_view.xml b/l10n_it_declaration_of_intent/views/company_view.xml new file mode 100644 index 000000000000..eae75e5c27ba --- /dev/null +++ b/l10n_it_declaration_of_intent/views/company_view.xml @@ -0,0 +1,21 @@ + + + + Add declaration of intent fields + res.company + + + + + + + + + + + + + + + + diff --git a/l10n_it_declaration_of_intent/views/declaration_of_intent_view.xml b/l10n_it_declaration_of_intent/views/declaration_of_intent_view.xml new file mode 100644 index 000000000000..4f488a57fe6e --- /dev/null +++ b/l10n_it_declaration_of_intent/views/declaration_of_intent_view.xml @@ -0,0 +1,197 @@ + + + + Form view for declaration of intent + l10n_it_declaration_of_intent.declaration + +
+
+
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + Search view for declaration_of_intent + l10n_it_declaration_of_intent.declaration + + + + + + + + + + + + + + + + + + + + Tree view for declaration_of_intent + l10n_it_declaration_of_intent.declaration + + + + + + + + + + + + + + + + Declarations of intent + l10n_it_declaration_of_intent.declaration + tree,form + {'default_search_state_valid': 1} + + + +
diff --git a/l10n_it_declaration_of_intent/wizard/__init__.py b/l10n_it_declaration_of_intent/wizard/__init__.py new file mode 100644 index 000000000000..dae470c1a359 --- /dev/null +++ b/l10n_it_declaration_of_intent/wizard/__init__.py @@ -0,0 +1 @@ +from . import select_declarations diff --git a/l10n_it_declaration_of_intent/wizard/select_declarations.py b/l10n_it_declaration_of_intent/wizard/select_declarations.py new file mode 100644 index 000000000000..9c895d5ffd83 --- /dev/null +++ b/l10n_it_declaration_of_intent/wizard/select_declarations.py @@ -0,0 +1,52 @@ +# Copyright 2019 Francesco Apruzzese +# License AGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import fields, models +from odoo.osv import expression + + +class SelectManuallyDeclarations(models.TransientModel): + + _name = "l10n_it_declaration_of_intent.select_declarations" + _description = "Set declaration of intent manually on invoice" + + def _default_declaration(self): + declaration_model = self.env["l10n_it_declaration_of_intent.declaration"] + + invoice_id = self._context.get("active_id", False) + if not invoice_id: + return declaration_model.browse() + invoice = self.env["account.move"].browse(invoice_id) + type_short = invoice.get_type_short() + if not type_short: + return declaration_model.browse() + domain = [ + ("partner_id", "=", invoice.partner_id.commercial_partner_id.id), + ("type", "=", type_short), + ] + if invoice.invoice_date: + date_domain = [ + ("date_start", "<=", invoice.invoice_date), + ("date_end", ">=", invoice.invoice_date), + ] + domain = expression.AND([domain, date_domain]) + return declaration_model.search(domain) + + declaration_ids = fields.Many2many( + comodel_name="l10n_it_declaration_of_intent.declaration", + relation="declaration_select_manually_rel", + string="Declarations of Intent", + default=_default_declaration, + ) + + def confirm(self): + self.ensure_one() + res = True + # Link declaration to invoice + invoice_id = self.env.context.get("active_id", False) + if not invoice_id: + return res + invoice = self.env["account.move"].browse(invoice_id) + for declaration in self.declaration_ids: + invoice.declaration_of_intent_ids = [(4, declaration.id)] + return True diff --git a/l10n_it_declaration_of_intent/wizard/select_declarations_view.xml b/l10n_it_declaration_of_intent/wizard/select_declarations_view.xml new file mode 100644 index 000000000000..7044079e528c --- /dev/null +++ b/l10n_it_declaration_of_intent/wizard/select_declarations_view.xml @@ -0,0 +1,34 @@ + + + + Select Manually Declarations + l10n_it_declaration_of_intent.select_declarations + +
+ + + +
+
+
+
+
+ + + Select Manually Declarations + l10n_it_declaration_of_intent.select_declarations + tree,form + + new + +
diff --git a/setup/l10n_it_declaration_of_intent/odoo/addons/l10n_it_declaration_of_intent b/setup/l10n_it_declaration_of_intent/odoo/addons/l10n_it_declaration_of_intent new file mode 120000 index 000000000000..d77ca6ec43aa --- /dev/null +++ b/setup/l10n_it_declaration_of_intent/odoo/addons/l10n_it_declaration_of_intent @@ -0,0 +1 @@ +../../../../l10n_it_declaration_of_intent \ No newline at end of file diff --git a/setup/l10n_it_declaration_of_intent/setup.py b/setup/l10n_it_declaration_of_intent/setup.py new file mode 100644 index 000000000000..28c57bb64031 --- /dev/null +++ b/setup/l10n_it_declaration_of_intent/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)