diff --git a/l10n_fr_account_vat_return/README.rst b/l10n_fr_account_vat_return/README.rst new file mode 100644 index 000000000..cfa3dfa2a --- /dev/null +++ b/l10n_fr_account_vat_return/README.rst @@ -0,0 +1,89 @@ +================= +France VAT Return +================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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--france-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-france/tree/14.0/l10n_fr_account_vat_return + :alt: OCA/l10n-france +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-france-14-0/l10n-france-14-0-l10n_fr_account_vat_return + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/121/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds support for the French VAT declaration *CA3* (monthly or quarterly): + +* computation of the boxes of the CA3 form, +* print the CA3 PDF, +* generate the corresponding journal entry. + +It can also be used for the smaller companies which have a yearly CA12 VAT declaration. But, for CA12, the generation of the PDF and the auto-fill of the form on impots.gouv.fr is not supported: you will have to manually copy the values on the online form. + +This module also supports declaration 3519 for the reimbursement of VAT credit. + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Alexis de Lattre + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via + +Current `maintainer `__: + +|maintainer-alexis-via| + +This module is part of the `OCA/l10n-france `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_fr_account_vat_return/__init__.py b/l10n_fr_account_vat_return/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/l10n_fr_account_vat_return/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/l10n_fr_account_vat_return/__manifest__.py b/l10n_fr_account_vat_return/__manifest__.py new file mode 100644 index 000000000..b82b1a910 --- /dev/null +++ b/l10n_fr_account_vat_return/__manifest__.py @@ -0,0 +1,31 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "France VAT Return", + "version": "16.0.1.0.0", + "category": "Accounting", + "license": "AGPL-3", + "summary": "VAT return for France: CA3, CA12, 3519", + "author": "Akretion,Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "website": "https://github.com/OCA/l10n-france", + "depends": ["l10n_fr", "l10n_fr_oca", "intrastat_base"], + "data": [ + "security/ir.model.access.csv", + "security/ir_rule.xml", + "wizards/l10n_fr_vat_exigibility_update_view.xml", + "wizards/res_config_settings.xml", + "wizards/l10n_fr_account_vat_return_reimbursement_view.xml", + "views/l10n_fr_account_vat_box.xml", + "views/l10n_fr_account_vat_return.xml", + "views/account_fiscal_position.xml", + "views/account_fiscal_position_template.xml", + "views/account_tax.xml", + "views/account_move.xml", + "data/l10n.fr.account.vat.box.csv", + "data/account_fiscal_position_template.xml", + ], + "installable": True, +} diff --git a/l10n_fr_account_vat_return/data/account_fiscal_position_template.xml b/l10n_fr_account_vat_return/data/account_fiscal_position_template.xml new file mode 100644 index 000000000..9e3951b14 --- /dev/null +++ b/l10n_fr_account_vat_return/data/account_fiscal_position_template.xml @@ -0,0 +1,79 @@ + + + + + + + + france + + + intracom_b2c + + + intracom_b2b + + + extracom + + + + 1 + France - Fournisseur TVA sur encaissement + + + france_vendor_vat_on_payment + + + + + france + + + france_vendor_vat_on_payment + + + intracom_b2b + + + intracom_b2c + + + extracom + + + diff --git a/l10n_fr_account_vat_return/data/l10n.fr.account.vat.box.csv b/l10n_fr_account_vat_return/data/l10n.fr.account.vat.box.csv new file mode 100644 index 000000000..e64248907 --- /dev/null +++ b/l10n_fr_account_vat_return/data/l10n.fr.account.vat.box.csv @@ -0,0 +1,279 @@ +id,form_code,sequence,display_type,code,edi_code,edi_type,nref_code,active,box_type,push_sequence,push_box_id/id,push_rate,due_vat_rate,due_vat_base_box_id/id,accounting_method,account_code,negative_switch_box_id/id,name,full_label,print_page,print_x,print_y +ca3_ls,3310CA3,5,,REP,LS,CCI_TBX,912158,True,,,,,,,,,,Mention de qualité de représentant d’un assujetti unique,"Mention de qualité de représentant d’un assujetti unique, article 256 C du CGI",1,560,473 +ca3_kf,3310CA3,10,,NEANT,KF,CCI_TBX,100117,True,,,,,,,,,,Mention déclaration néante,Mention déclaration néante,1,560,411 +ca3_hj,3310CA3,20,,GRP,HJ,CCI_TBX,902353,True,,,,,,,,,,Mention membre d'un groupe,Mention membre d'un groupe,1,560,436 +ca3_bb,3310CA3,30,,IMPUT,BB,CCI_TBX,100123,True,,,,,,,,,,Paiement par imputation,Paiement par imputation (joindre l'imprimé 3516),1,200,309 +ca3_section_operations_realisees,3310CA3,95,section,A,,,,True,,,,,,,,,,MONTANT DES OPÉRATIONS RÉALISÉES,MONTANT DES OPÉRATIONS RÉALISÉES,,, +ca3_sub_section_operations_imposables,3310CA3,100,sub_section,,,,,True,,,,,,,,,,OPÉRATIONS TAXÉES (H.T.),OPÉRATIONS TAXÉES (H.T.),,, +ca3_ce,3310CA3,195,,B5,CE,MOA,100118,True,,,,,,,,,,Régularisations,Opérations taxées - Régularisation,2,292,590 +ca3_ca,3310CA3,110,,A1,CA,MOA,100071,True,taxed_op_france,,,,,,,,l10n_fr_account_vat_return.ca3_ce,"Ventes, prestations de services","Opérations taxées - Ventes, prestations de services",2,292,776 +ca3_cb,3310CA3,120,,A2,CB,MOA,100072,True,,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Autres opérations imposables,Opérations taxées - Autres opérations imposables,2,292,759 +ca3_kh,3310CA3,130,,A3,KH,MOA,900774,True,taxed_op_autoliq_intracom_service,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Achats de prestations de services réalisés auprès d’un assujetti non établi en France (art 283-2 du CGI),Opérations taxées - Achats de prestations de services réalisés auprès d’un assujetti non établi en France (art 283-2 du code général des impôts),2,292,736 +ca3_dk,3310CA3,140,,A4,DK,MOA,911589,True,,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Importations (autres que produits pétroliers),Opérations taxées - Importations (autres que produits pétroliers),2,292,714 +ca3_kv,3310CA3,150,,A5,KV,MOA,911590,True,,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Sorties de régime fiscal suspensif (autres que les produits pétroliers),Opérations taxées - Sorties de régime fiscal suspensif (autres que les produits pétroliers),2,292,696 +ca3_ch,3310CA3,160,,B1,CH,MOA,910758,True,,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Mises à la consommation de produits pétroliers,Opérations taxées - Mises à la consommation de produits pétroliers,2,292,675 +ca3_cc,3310CA3,170,,B2,CC,MOA,100073,True,taxed_op_autoliq_intracom_product,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Acquisitions intra-communautaires,Opérations taxées - Acquisitions intra-communautaires,2,292,657 +ca3_cf,3310CA3,180,,B3,CF,MOA,100121,True,,,,,,,,,l10n_fr_account_vat_return.ca3_ce,"Achats d'électricité, de gaz naturel, de chaleur ou de froid imposables en France","Opérations taxées - Achats d'électricité, de gaz naturel, de chaleur ou de froid imposables en France, base hors taxe",2,292,639 +ca3_cg,3310CA3,190,,B4,CG,MOA,100505,True,taxed_op_autoliq_extracom,,,,,,,,l10n_fr_account_vat_return.ca3_ce,Achats de biens ou de prestations de services réalisés auprès d'un assujetti non établi en France (art 283-1 du CGI),"Opérations taxées - Achats de biens ou de prestations de services réalisés auprès d'un assujetti non établi en France, art 283-1 du CGI",2,292,613 +ca3_sub_section_operations_non_imposables,3310CA3,200,sub_section,,,,,True,,,,,,,,,,OPÉRATIONS NON TAXÉES,OPÉRATIONS NON TAXÉES,,, +ca3_de,3310CA3,290,,F8,DE,MOA,100119,True,,,,,,,,,,Régularisations,Opérations non taxées - Régularisations,2,572,509 +ca3_da,3310CA3,210,,E1,DA,MOA,100075,True,untaxed_op_extracom,,,,,,,,l10n_fr_account_vat_return.ca3_de,Exportations hors UE,Opérations non taxées - Exportations hors UE,2,572,776 +ca3_db,3310CA3,220,,E2,DB,MOA,100076,True,untaxed_op_france_exo,,,,,,,,l10n_fr_account_vat_return.ca3_de,Autres opérations non imposables,Opérations non taxées - Autres opérations non imposables,2,572,759 +ca3_dh,3310CA3,230,,E3,DH,MOA,908462,True,untaxed_op_intracom_b2c,,,,,,,,l10n_fr_account_vat_return.ca3_de,Ventes à distance taxables dans un autre État membre au profit de personnes non assujetties - Ventes B to C,Opérations non taxées - Ventes à distance taxables dans un autre État membre au profit de personnes non assujetties - Ventes B to C,2,572,736 +ca3_kw,3310CA3,240,,E4,KW,MOA,911591,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Importations (autres que les produits pétroliers),Opérations non taxées - Importations (autres que les produits pétroliers),2,572,714 +ca3_kx,3310CA3,245,,E5,KX,MOA,911592,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Sorties de régime fiscal suspensif (autres que les produits pétroliers),Opérations non taxées - Sorties de régime fiscal suspensif (autres que les produits pétroliers),2,572,696 +ca3_ky,3310CA3,250,,E6,KY,MOA,911593,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Importations placées sous régime fiscal suspensif (autres que les produits pétroliers),Opérations non taxées - Importations placées sous régime fiscal suspensif (autres que les produits pétroliers),2,572,675 +ca3_kz,3310CA3,255,,F1,KZ,MOA,911594,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Acquisitions intra-communautaires,Opérations non taxées - Acquisitions intra-communautaires,2,572,657 +ca3_dc,3310CA3,260,,F2,DC,MOA,100077,True,untaxed_op_intracom_b2b,,,,,,,,l10n_fr_account_vat_return.ca3_de,Livraisons intra-communautaires à destination d'une personne assujettie - Ventes B to B,Opérations non taxées - Livraisons intra-communautaires à destination d'une personne assujettie - Ventes B to B,2,572,639 +ca3_df,3310CA3,265,,F3,DF,MOA,100122,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,"Livraisons d'electricité, de gaz naturel, de chaleur ou de froid non imposables en France","Opérations non taxées - Livraisons d'electricité, de gaz naturel, de chaleur ou de froid non imposables en France",2,572,613 +ca3_dj,3310CA3,270,,F4,DJ,MOA,910759,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Mises à la consommation de produits pétroliers,Opérations non taxées - Mises à la consommation de produits pétroliers,2,572,590 +ca3_la,3310CA3,275,,F5,LA,MOA,911595,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Importations de produits pétroliers placées sous régime fiscal suspensif,Opérations non taxées - Importations de produits pétroliers placées sous régime fiscal suspensif,2,572,569 +ca3_dd,3310CA3,280,,F6,DD,MOA,100104,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Achats en franchise,Opérations non taxées - Achats en franchise,2,572,553 +ca3_dg,3310CA3,285,,F7,DG,MOA,100506,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Vente de biens ou de prestations de services réalisées par un assujetti non établi en France (art 283-1 du CGI),"Opérations non taxées - Vente de biens ou de prestations de services réalisées par un assujetti non établi en France, art 283-1 du CGI",2,572,530 +ca3_lr,3310CA3,295,,F9,LR,MOA,912152,True,,,,,,,,,l10n_fr_account_vat_return.ca3_de,Opérations internes réalisées entre membres d’un assujetti unique,Opérations internes réalisées entre membres d’un assujetti unique,2,572,491 +ca3_section_tva_a_payer,3310CA3,300,section,B,,,,True,,,,,,,,,,DÉCOMPTE DE LA TVA À PAYER,DÉCOMPTE DE LA TVA À PAYER,,, +ca3_sub_section_tva_brute,3310CA3,310,sub_section,,,,,True,,,,,,,,,,TVA BRUTE,TVA BRUTE,,, +ca3_hg,3310CA3,700,,23,HG,MOA,,True,deductible_vat_total,,,,,,,,,Total de la TVA déductible (lignes 19 à 2C),Total de la TVA déductible,3,569,636 +ca3_hc,3310CA3,630,,21,HC,MOA,100092,True,,40,l10n_fr_account_vat_return.ca3_hg,,,,credit,,,Autre TVA à déduire,"Autre TVA à déduire, omissions ou compléments de déductions",3,572,712 +ca3_gh,3310CA3,530,,16,GH,MOA,,True,due_vat_total,,,,,,,,,Total de la TVA brute due (lignes 08 à 5B),Total général de la TVA brute due,3,572,817 +ca3_fp,3310CA3,320,,08-base,FP,MOA,904065,True,due_vat_base,,,,,,,,,France métropolitaine - Taux normal 20 % : base HT,Opérations imposables au taux normal de 20% en France métropolitaine : base HT,2,498,414 +ca3_gp,3310CA3,325,,08-taxe,GP,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,2000,l10n_fr_account_vat_return.ca3_fp,debit,,l10n_fr_account_vat_return.ca3_hc,France métropolitaine - Taux normal 20 % : taxe due,Opérations imposables au taux normal de 20% en France métropolitaine : taxe due,2,572,414 +ca3_fb,3310CA3,330,,09-base,FB,MOA,100078,True,due_vat_base,,,,,,,,,"France métropolitaine - Taux réduit 5,5 % : base HT","Opérations imposables au taux réduit de 5,5 % en France métropolitaine : base HT",2,498,400 +ca3_gb,3310CA3,335,,09-taxe,GB,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,550,l10n_fr_account_vat_return.ca3_fb,debit,,l10n_fr_account_vat_return.ca3_hc,"France métropolitaine - Taux réduit 5,5 % : taxe due","Opérations imposables au taux réduit de 5,5 % en France métropolitaine : taxe due",2,572,400 +ca3_fr,3310CA3,340,,9B-base,FR,MOA,904069,True,due_vat_base,,,,,,,,,France métropolitaine - Taux réduit 10 % : base HT,Opérations imposables au taux réduit de 10% en France métropolitaine : base HT,2,498,386 +ca3_gr,3310CA3,345,,9B-taxe,GR,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,1000,l10n_fr_account_vat_return.ca3_fr,debit,,l10n_fr_account_vat_return.ca3_hc,France métropolitaine - Taux réduit 10 % : taxe due,Opérations imposables au taux réduit de 10% en France métropolitaine : taxe due,2,572,386 +ca3_fm,3310CA3,350,,10-base,FM,MOA,100113,True,due_vat_base,,,,,,,,,"DOM - Taux normal 8,5 % : base HT",Opérations réalisées dans les DOM imposables au taux normal : base HT,2,498,354 +ca3_gm,3310CA3,355,,10-taxe,GM,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,850,l10n_fr_account_vat_return.ca3_fm,debit,,l10n_fr_account_vat_return.ca3_hc,"DOM - Taux normal 8,5 % : taxe due",Opérations réalisées dans les DOM imposables au taux normal : taxe due,2,572,354 +ca3_fn,3310CA3,360,,11-base,FN,MOA,100115,True,due_vat_base,,,,,,,,,"DOM - Taux réduit 2,1 % : base HT",Opérations réalisées dans les DOM au taux réduit : base HT,2,498,340 +ca3_gn,3310CA3,361,,11-taxe,GN,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_fn,debit,,l10n_fr_account_vat_return.ca3_hc,"DOM - Taux réduit 2,1 % : taxe due",Opérations réalisées dans les DOM imposables au taux réduit : taxe due,2,572,340 +ca3_bq,3310CA3,364,,T1-base,BQ,MOA,100042,True,due_vat_base,,,,,,,,,"DOM - Taux 1,75 % : base HT","Opérations réalisées dans les DOM et imposables au taux de 1,75 % : base HT",2,498,309 +ca3_cq,3310CA3,365,,T1-taxe,CQ,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_bq,debit,,l10n_fr_account_vat_return.ca3_hc,"DOM - Taux 1,75 % : taxe due","Opérations réalisées dans les DOM et imposables au taux de 1,75 % : taxe due",2,572,309 +ca3_bp,3310CA3,366,,T2-base,BP,MOA,100040,True,due_vat_base,,,,,,,,,"DOM - Taux 1,05 % : base HT","Opérations réalisées dans les DOM et imposables au taux de 1,05 % : base HT",2,498,295 +ca3_cp,3310CA3,367,,T2-taxe,CP,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_bp,debit,,l10n_fr_account_vat_return.ca3_hc,"DOM - Taux 1,05 % : taxe due","Opérations réalisées dans les DOM et imposables au taux de 1,05 % : taxe due",2,572,295 +ca3_bs,3310CA3,368,,T3-base,BS,MOA,904063,True,due_vat_base,,,,,,,,,Corse - Taux 10 % : base HT,Opérations réalisées en Corse et imposables au taux de 10 % : base HT,2,498,281 +ca3_cs,3310CA3,369,,T3-taxe,CS,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_bs,debit,,l10n_fr_account_vat_return.ca3_hc,Corse - Taux 10 % : taxe due,Opérations réalisées en Corse et imposables au taux de 10 % : taxe due,2,572,281 +ca3_bf,3310CA3,370,,T4-base,BF,MOA,100011,True,due_vat_base,,,,,,,,,"Corse - Taux 2,1 % : base HT","Opérations réalisées en Corse et imposables au taux de 2,1 % : base HT",2,498,267 +ca3_mc,3310CA3,371,,T4-taxe,MC,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_bf,debit,,l10n_fr_account_vat_return.ca3_hc,"Corse - Taux 2,1 % : taxe due","Opérations réalisées en Corse et imposables au taux de 2,1 % : taxe due",2,572,267 +ca3_be,3310CA3,372,,T5-base,BE,MOA,100009,True,due_vat_base,,,,,,,,,"Corse - Taux 0,9 % : base HT","Opérations réalisées en Corse et imposables au taux de 0,9 % : base HT",2,498,252 +ca3_ma,3310CA3,373,,T5-taxe,MA,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_be,debit,,l10n_fr_account_vat_return.ca3_hc,"Corse - Taux 0,9 % : taxe due","Opérations réalisées en Corse et imposables au taux de 0,9 % : taxe due",2,572,252 +ca3_mf,3310CA3,374,,T6-base,MF,MOA,100003,True,due_vat_base,,,,,,,,,"France continentale - Taux 2,1 % : base HT","Opérations réalisées en France continentale au taux de 2,1 % : base HT",2,498,238 +ca3_me,3310CA3,375,,T6-taxe,ME,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,210,l10n_fr_account_vat_return.ca3_mf,debit,,l10n_fr_account_vat_return.ca3_hc,"France continentale - Taux 2,1 % : taxe due","Opérations réalisées en France continentale au taux de 2,1 % : taxe due",2,572,238 +ca3_mg,3310CA3,376,,T7-base,MG,MOA,100001,True,due_vat_base,,,,,,,,,Retenue de TVA sur droits d'auteur : base HT,Retenue de TVA sur droits d'auteur : base HT,2,498,224 +ca3_md,3310CA3,377,,T7-taxe,MD,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_mg,debit,,l10n_fr_account_vat_return.ca3_hc,Retenue de TVA sur droits d'auteur : taxe due,Retenue de TVA sur droits d'auteur : taxe due,2,572,224 +ca3_fc,3310CA3,378,,13-base,FC,MOA,100080,True,due_vat_base,,,,,,,,,Anciens taux : base HT,Opérations imposables aux anciens taux : base HT,2,498,210 +ca3_gc,3310CA3,379,,13-taxe,GC,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_fc,debit,,l10n_fr_account_vat_return.ca3_hc,Anciens taux : taxe due,Opérations imposables aux anciens taux : taxe due,2,572,210 +ca3_fd,3310CA3,380,,14-base,FD,MOA,100082,False,,,,,,,,,,Autres taux (décompte effectué sur annexe N° 3310-A) : base HT,Opérations imposables à un taux particulier (décompte effectué sur annexe N° 3310-A) : base HT,2,498,283 +ca3_gd,3310CA3,385,,14-taxe,GD,MOA,,False,,,,,,,,,,Autres taux (décompte effectué sur annexe N° 3310-A) : taxe due,Opérations imposables à un taux particulier (décompte effectué sur annexe N° 3310-A) : taxe due,2,572,283 +ca3_gs,3310CA3,390,,P1-base,GS,MOA,910572,True,due_vat_base,,,,,,,,,France métropolitaine - Taux normal 20 % sur les produits pétroliers : base HT,Opérations imposables au taux normal 20 % sur les produits pétroliers : base HT,2,498,179 +ca3_gt,3310CA3,395,,P1-taxe,GT,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_gs,debit,,l10n_fr_account_vat_return.ca3_hc,France métropolitaine - Taux normal 20 % sur les produits pétroliers : taxe due,Opérations imposables au taux normal 20 % sur les produits pétroliers : taxe due,2,572,179 +ca3_gu,3310CA3,400,,P2-base,GU,MOA,910574,True,due_vat_base,,,,,,,,,France métropolitaine - Taux réduit 13 % sur les produits pétroliers : base HT,Opérations imposables au taux réduit 13 % sur les produits pétroliers : base HT,2,498,165 +ca3_gv,3310CA3,405,,P2-taxe,GV,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,1300,l10n_fr_account_vat_return.ca3_gu,debit,,l10n_fr_account_vat_return.ca3_hc,France métropolitaine - Taux réduit 13 % sur les produits pétroliers : taxe due,Opérations imposables au taux réduit 13 % sur les produits pétroliers : taxe due,2,572,165 +ca3_lb,3310CA3,410,,I1-base,LB,MOA,911596,True,due_vat_base,,,,,,,,,Importations - Taux normal 20 % : base HT,Importations - Taux normal 20 % : base HT,2,498,133 +ca3_lc,3310CA3,415,,I1-taxe,LC,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_lb,debit,,l10n_fr_account_vat_return.ca3_hc,Importations - Taux normal 20 % : taxe due,Importations - Taux normal 20 % : taxe due,2,572,133 +ca3_ld,3310CA3,420,,I2-base,LD,MOA,911598,True,due_vat_base,,,,,,,,,Importations - Taux réduit 10 % : base HT,Importations - Taux réduit 10 % : base HT,2,498,119 +ca3_le,3310CA3,425,,I2-taxe,LE,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_ld,debit,,l10n_fr_account_vat_return.ca3_hc,Importations - Taux réduit 10 % : taxe due,Importations - Taux réduit 10 % : taxe due,2,572,119 +ca3_lf,3310CA3,430,,I3-base,LF,MOA,911600,True,due_vat_base,,,,,,,,,"Importations - Taux réduit 8,5 % : base HT","Importations - Taux réduit 8,5 % : base HT",2,498,106 +ca3_lg,3310CA3,435,,I3-taxe,LG,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_lf,debit,,l10n_fr_account_vat_return.ca3_hc,"Importations - Taux réduit 8,5 % : taxe due","Importations - Taux réduit 8,5 % : taxe due",2,572,106 +ca3_lh,3310CA3,440,,I4-base,LH,MOA,911602,True,due_vat_base,,,,,,,,,"Importations - Taux réduit 5,5 % : base HT","Importations - Taux réduit 5,5 % : base HT",2,498,91 +ca3_lj,3310CA3,445,,I4-taxe,LJ,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_lh,debit,,l10n_fr_account_vat_return.ca3_hc,"Importations - Taux réduit 5,5 % : taxe due","Importations - Taux réduit 5,5 % : taxe due",2,572,91 +ca3_lk,3310CA3,450,,I5-base,LK,MOA,911604,True,due_vat_base,,,,,,,,,"Importations - Taux réduit 2,1 % : base HT","Importations - Taux réduit 2,1 % : base HT",2,498,77 +ca3_ll,3310CA3,455,,I5-taxe,LL,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_lk,debit,,l10n_fr_account_vat_return.ca3_hc,"Importations - Taux réduit 2,1 % : taxe due","Importations - Taux réduit 2,1 % : taxe due",2,572,77 +ca3_lm,3310CA3,460,,I6-base,LM,MOA,911606,True,due_vat_base,,,,,,,,,"Importations - Taux réduit 1,05 % : base HT","Importations - Taux réduit 1,05 % : base HT",2,498,63 +ca3_ln,3310CA3,465,,I6-taxe,LN,MOA,,True,due_vat,40,l10n_fr_account_vat_return.ca3_gh,,,l10n_fr_account_vat_return.ca3_lm,debit,,l10n_fr_account_vat_return.ca3_hc,"Importations - Taux réduit 1,05 % : taxe due","Importations - Taux réduit 1,05 % : taxe due",2,572,63 +ca3_gg,3310CA3,500,,15,GG,MOA,100087,True,,40,l10n_fr_account_vat_return.ca3_gh,,,,,,,TVA antérieurement déduite à reverser,"TVA antérieurement déduite à reverser, taxe due",2,572,40 +ca3_ga,3310CA3,505,,15-dont-pp,GA,MOA,910761,True,,,,,,,,,,TVA antérieurement déduite à reverser : dont TVA sur les produits pétroliers,"TVA antérieurement déduite à reverser, taxe due : dont TVA sur les produits pétroliers",2,326,50 +ca3_lq,3310CA3,510,,15-dont-pi,LQ,MOA,911609,True,,,,,,,,,,TVA antérieurement déduite à reverser : dont TVA sur les produits importés hors produits pétroliers,"TVA antérieurement déduite à reverser, taxe due : dont TVA sur les produits importés hors produits pétroliers",2,387,35 +ca3_ks,3310CA3,520,,5B,KS,MOA,905877,True,,40,l10n_fr_account_vat_return.ca3_gh,,,,,,,"Sommes à ajouter, y compris acompte congés","Sommes à ajouter, y compris acompte congés",2,572,19 +ca3_gj,3310CA3,540,,17,GJ,MOA,100089,True,due_vat_intracom_product,,,,,,,,,Dont TVA sur acquisitions intra-communautaires,TVA brute sur acquisitions intra-communautaires,3,572,798 +ca3_gk,3310CA3,560,,18,GK,MOA,100105,True,due_vat_monaco,,,,,,,,,Dont TVA sur opérations à destination de Monaco,TVA brute due sur opérations à destination de Monaco.,3,572,782 +ca3_sub_section_tva_deductible,3310CA3,600,sub_section,,,,,True,,,,,,,,,,TVA DÉDUCTIBLE,TVA DÉDUCTIBLE,,, +ca3_ha,3310CA3,610,,19,HA,MOA,100090,True,deductible_vat_asset,40,l10n_fr_account_vat_return.ca3_hg,,,,credit,,l10n_fr_account_vat_return.ca3_gg,Biens constituant des immobilisations,TVA déductible sur biens constituant des immobilisations,3,572,745 +ca3_hb,3310CA3,620,,20,HB,MOA,100091,True,deductible_vat_other,40,l10n_fr_account_vat_return.ca3_hg,,,,credit,,l10n_fr_account_vat_return.ca3_gg,Autres biens et services,TVA déductible sur autres biens et services (déduction sur facture),3,572,726 +ca3_hk,3310CA3,640,,21-dont-pp,HK,MOA,910762,True,,,,,,,,,,Dont régularisation de TVA sur les produits pétroliers,"Autres TVA à déduire, dont régularisation de TVA sur les produits pétroliers",3,220,702 +ca3_lp,3310CA3,650,,21-dont-import,LP,MOA,911608,True,,,,,,,,,,Dont régularisation de TVA sur les produits importés (hors produits pétroliers),"Autres TVA à déduire, dont régularisation de TVA sur les produits importés (hors produits pétroliers)",3,293,694 +ca3_hh,3310CA3,660,,21-dont-col-ded,HH,MOA,100120,True,,,,,,,,,,Dont régularisations sur de la TVA collectée sur autres produits ou PS ou déductible,"Autre TVA à déduire, dont régularisation sur de la TVA collectée sur autres produits ou PS ou déductible",3,350,685 +ca3_hd,3310CA3,680,,22,HD,MOA,100093,True,credit_deferment,40,l10n_fr_account_vat_return.ca3_hg,,,,credit,44567,,Report du crédit apparaissant ligne 27 de la précédente déclaration,Report du crédit apparaissant sur la précédente déclaration,3,572,674 +ca3_ku,3310CA3,670,,2C,KU,MOA,905882,True,,40,l10n_fr_account_vat_return.ca3_hg,,,,,,,"Sommes à imputer, y compris acompte congés","Sommes à imputer, y compris acompte congés",3,572,656 +ca3_he,3310CA3,690,,22A,HE,PCD,100094,True,,,,,,,,,,Coefficient de taxation unique applicable pour la période s'il est différent de 100 %,Pourcentage de déduction applicable pour la période s'il est différent de 100 %,3,291,622 +,,,,,,,,,,,,,,,,,,,,,, +ca3_hf,3310CA3,710,,24,HF,MOA,909864,True,,,,,,,,,,Dont TVA déductible sur importations (hors produits pétroliers),Dont TVA déductible sur importations (hors produits pétroliers),3,572,614 +ca3_hl,3310CA3,720,,2E,HL,MOA,910763,True,,,,,,,,,,Dont TVA déductible sur les produits pétroliers,Dont TVA déductible sur les produits pétroliers,3,572,596 +ca3_section_credit,3310CA3,800,section,,,,,True,,,,,,,,,,CRÉDIT,CRÉDIT,,, +ca3_jc,3310CA3,890,,27,JC,MOA,100098,True,end_total_credit,,,,,,debit,44567,,Crédit à reporter (lignes 25 - 26 - AA),Crédit à reporter sur déclaration suivante,3,288,251 +ca3_ja,3310CA3,810,,25,JA,MOA,100096,True,no_push_total_credit,100,l10n_fr_account_vat_return.ca3_jc,,,,,,,Crédit de TVA (lignes 23 - 16),Crédit de TVA,3,288,548 +ca3_jb,3310CA3,820,,26,JB,MOA,100097,True,vat_reimbursement,100,l10n_fr_account_vat_return.ca3_jc,-100,,,debit,44583,,Remboursement de crédit demandé sur formulaire n°3519,Remboursement de crédit demandé sur formulaire n°3519,3,288,300 +ca3_kj,3310CA3,830,,AA,KJ,MOA,902351,True,,100,l10n_fr_account_vat_return.ca3_jc,-100,,,,,,Crédit de TVA transféré à la société tête de groupe,Crédit de TVA transféré à la société tête de groupe,3,288,277 +,,,,,,,,,,,,,,,,,,,,,, +ca3_section_taxe_a_payer,3310CA3,900,section,,,,,True,,,,,,,,,,TAXE À PAYER,TAXE À PAYER,,, +ca3_ke,3310CA3,990,,32,KE,MOA,100103,True,end_total_debit,,,,,,,,,Total à payer (lignes 28 + 29 - AB),Total à payer,3,572,173 +ca3_nd,3310CA3,915,,28,ND,MOA,912255,True,,110,l10n_fr_account_vat_return.ca3_ke,,,,,,,TVA nette due (ligne TD - ligne X5),TVA nette due (ligne TD - ligne X5),3,572,277 +ca3_ka,3310CA3,910,,TD,KA,MOA,100099,True,no_push_total_debit,100,l10n_fr_account_vat_return.ca3_nd,,,,credit,44551,,TVA nette due (lignes 16 - 23),TVA nette due,3,572,548 +ca3_kb,3310CA3,920,,29,KB,MOA,100100,True,,110,l10n_fr_account_vat_return.ca3_ke,,,,credit,4470,,Report du montant de taxes assimilées calculées sur annexe 3310A,Report du montant de taxes assimilées calculées sur annexe 3310A,3,572,251 +ca3_kl,3310CA3,930,,AB,KL,MOA,902352,True,,110,l10n_fr_account_vat_return.ca3_ke,-100,,,,,,Total à payer acquitté par la société tête de groupe (lignes 28 + 29),Total à payer acquitté par la société tête de groupe,3,572,199 +,,,,,,,,,,,,,,,,,,,,,, +a_section_tva,3310A,2000,section,,,,,False,,,,,,,,,,RETENUE DE TVA SUR DROITS D’AUTEUR ET TVA DUE À UN TAUX PARTICULIER,,,, +a_bn,3310A,2280,,,BN,MOA,,False,,,,,,,,,,Total lignes 35 à 46 : base HT (à reporter ligne 14 de la CA3),Total TVA sur droits d'auteurs et TVA due à taux particuliers : base HT (à reporter ligne 14 de la CA3),,, +a_cn,3310A,2290,,,CN,MOA,,False,,,,,,,,,,Total lignes 35 à 46 : taxe due (à reporter ligne 14 de la CA3),Total TVA sur droits d'auteurs et TVA due à taux particuliers : taxe due (à reporter ligne 14 de la CA3),,, +a_ba,3310A,2010,,35-base,BA,MOA,,False,due_vat_base,,,,,,,,,Retenue de TVA sur droits d'auteur : base HT,Retenue de TVA sur droits d'auteur : base HT,,, +a_ca,3310A,2020,,35-taxe,CA,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_ba,debit,,,Retenue de TVA sur droits d'auteur : taxe due,Retenue de TVA sur droits d'auteur : taxe due,,, +a_sub_section_tva_metropole,3310A,2030,sub_section,,,,,False,,,,,,,,,,OPÉRATIONS IMPOSABLES en France continentale à un taux particulier,OPÉRATIONS IMPOSABLES en France continentale à un taux particulier,,, +a_bb,3310A,2040,,36-base,BB,MOA,,False,due_vat_base,,,,,,,,,"France continentale, taux 2,10% : base HT","Opérations imposables en France continentale à un taux particulier taux 2,10% : base HT",,, +a_cb,3310A,2050,,36-taxe,CB,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bb,debit,,,"France continentale, taux 2,10% : taxe due","Opérations imposables en France continentale à un taux particulier taux 2,10% : taxe due",,, +a_bc,3310A,2060,,37-base,BC,MOA,,False,due_vat_base,,,,,,,,,"France continentale, ancien taux : base HT","Opérations imposables en France continentale à un taux particulier, ancien taux : base HT",,, +a_cc,3310A,2070,,37-taxe,CC,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bc,debit,,,"France continentale, anciens taux : taxe due",Opérations imposables en France continentale à un taux particulier anciens taux : taxe due,,, +a_ae,3310A,2080,,38-base,AE,MOA,,False,due_vat_base,,,,,,,,,"France continentale, nouveau taux : base HT",Ligne utilisable pour un nouveau taux en métropole (base hors taxe) (ligne à blanc),,, +a_af,3310A,2090,,38-taxe,AF,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_ae,debit,,,"France continentale, nouveau taux : taxe due",Ligne utilisable pour un nouveau taux en métropole (taxe due) (ligne à blanc),,, +a_sub_section_tva_corse,3310A,2100,sub_section,,,,,False,,,,,,,,,,OPÉRATIONS IMPOSABLES en Corse à un taux particulier,OPÉRATIONS IMPOSABLES en Corse à un taux particulier,,, +a_be,3310A,2110,,39-base,BE,MOA,,False,due_vat_base,,,,,,,,,"Corse, taux 0,90% : base HT","Opérations imposables en Corse à un taux particulier taux 0,90% : base HT",,, +a_ce,3310A,2120,,39-taxe,CE,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_be,debit,,,"Corse, taux 0,90% : taxe due","Opérations imposables en Corse à un taux particulier taux 0,90% : taxe due",,, +a_bf,3310A,2130,,40-base,BF,MOA,,False,due_vat_base,,,,,,,,,"Corse, taux 2,10% : base HT","Opérations imposables en Corse à un taux particulier taux 2,10% : base HT",,, +a_cf,3310A,2140,,40-taxe,CF,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bf,debit,,,"Corse, taux 2,10 % : taxe due","Opérations imposables en Corse à un taux particulier taux 2,10 % : taxe due",,, +a_bs,3310A,2150,,41-base,BS,MOA,,False,due_vat_base,,,,,,,,,"Corse, taux 10% : base HT",Opérations imposables en Corse à un taux particulier taux 10% : base HT,,, +a_cs,3310A,2160,,41-taxe,CS,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bs,debit,,,"Corse, taux 10% : taxe due",Opérations imposables en Corse à un taux particulier taux 10% : taxe due,,, +a_bm,3310A,2190,,43-base,BM,MOA,,False,due_vat_base,,,,,,,,,"Corse, anciens taux : base HT","Opérations imposables en Corse à un taux particulier, anciens taux : base HT",,, +a_cm,3310A,2200,,43-taxe,CM,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bm,debit,,,"Corse, anciens taux : taxe due",Opérations imposables en Corse à un taux particulier anciens taux : taxe due,,, +a_sub_section_tva_dom,3310A,2210,sub_section,,,,,False,,,,,,,,,,OPÉRATIONS IMPOSABLES dans les DOM à un taux particulier,OPÉRATIONS IMPOSABLES dans les DOM à un taux particulier,,, +a_bp,3310A,2220,,44-base,BP,MOA,,False,due_vat_base,,,,,,,,,"DOM, taux 1,05% : base HT","Opérations imposables dans les DOM à un taux particulier, taux 1,05% : base HT",,, +a_cp,3310A,2230,,44-taxe,CP,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bp,debit,,,"DOM, taux 1,05% : taxe due","Opérations imposables dans les DOM à un taux particulier, taux 1,05% : taxe due",,, +a_bq,3310A,2240,,45-base,BQ,MOA,,False,due_vat_base,,,,,,,,,"DOM, taux 1,75% : base HT","Opérations imposables dans les DOM à un taux particulier, taux 1,75% : base HT",,, +a_cq,3310A,2250,,45-taxe,CQ,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_bq,debit,,,"DOM, taux 1,75% : taxe due","Opérations imposables dans les DOM à un taux particulier, taux 1,75% : taxe due",,, +a_br,3310A,2260,,46-base,BR,MOA,,False,due_vat_base,,,,,,,,,"DOM, ancien taux : base HT",Opérations imposables dans les DOM à un ancien taux : base HT,,, +a_cr,3310A,2270,,46-taxe,CR,MOA,,False,due_vat,,,,,l10n_fr_account_vat_return.a_br,debit,,,"DOM, ancien taux : taxe due",Opérations imposables dans les DOM à un ancien taux : taxe due,,, +a_section_other_taxes,3310A,2300,section,,,,,True,,,,,,,,,,DÉCOMPTE DES TAXES ASSIMILÉES,DÉCOMPTE DES TAXES ASSIMILÉES,,, +a_hb,3310A,4000,,,HB,MOA,,True,,30,l10n_fr_account_vat_return.ca3_kb,,,,,,,Total lignes 47 à 133 (à reporter ligne 29 de la CA3),Total lignes 47 à 133 (à reporter ligne 29 de la CA3),,, +a_fa,3310A,2310,,47-taxe,FA,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur certaines dépenses de publicité : taxe due,"Taxe sur certaines dépenses de publicité (CGI, art. 302 bis MA) au taux de 1%",,, +a_nd,3310A,2320,,47-base,ND,MOA,,True,manual,10,l10n_fr_account_vat_return.a_fa,1,,,,,,Taxe sur certaines dépenses de publicité : base,"Base imposable sur la taxe sur certaines dépenses de publicité (CGI, art. 302 bis MA) au taux de 1%",,, +a_fb,3310A,2330,,48-taxe,FB,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les retransmissions sportives : taxe due,"Taxe sur les retransmissions sportives (CGI, art. 302 bis ZE) au taux de 5 %",,, +a_ne,3310A,2340,,48-base,NE,MOA,,True,manual,10,l10n_fr_account_vat_return.a_fb,5,,,,,,Taxe sur la taxe sur les retransmissions sportives : base,"Base imposable sur la taxe sur la taxe sur les retransmissions sportives (CGI, art. 302 bis ZE) au taux de 5 %",,, +a_jf,3310A,2350,,49,JF,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les excédents de provision des entreprises d'assurances de dommages,"Taxe sur les excédents de provision des entreprises d'assurances de dommages (CGI, art. 235 ter X)",,, +a_he,3310A,2360,,50,HE,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur le chiffre d'affaires des exploitants agricoles,"Taxe sur le chiffre d'affaires des exploitants agricoles (CGI, art. 302 bis MB) (cumul de la partie variable et de la partie forfaitaire)",,, +a_fj,3310A,2370,,55-taxe,FJ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les concessionnaires d'autoroute : taxe due,"Taxe due par les concessionnaires d'autoroute (CGI, art 302 bis ZB) (7,32 € pour 1000 km)",,, +a_nf,3310A,2380,,55-base,NF,QTY,,True,manual,,,,,,,,,Taxe sur les concessionnaires d'autoroute : nombre de kms,"Base imposable de la taxe due par les concessionnaires d'autoroutes (CGI, art 302 bis ZB) : nombre de kms",,, +a_jb,3310A,2390,,56,JB,MOA,,False,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,6358,,"Contribution à l'audiovisuel public (CGI, art 1605 et suiv.)","Contribution à l'audiovisuel public (CGI, art 1605 et suiv.)",,, +a_jc,3310A,2400,,57,JC,MOA,,False,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,6358,,Contribution à l'audiovisuel public due par les loueurs d'appareils ,"Contribution à l'audiovisuel public due par les loueurs d'appareils (CGI, art 1605 et suiv.)",,, +a_kj,3310A,2410,,59-taxe,KJ,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux, taux 5,15 % : taxe due","Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux au taux de 5,15 %",,, +a_mk,3310A,2420,,59-base,MK,MOA,,True,manual,10,l10n_fr_account_vat_return.a_kj,5.15,,,,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux, taux 5,15 % : base","Base imposable sur la taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux (CGI, art 1609 sexdecies B) au taux de 5,15 %",,, +a_kl,3310A,2430,,60-taxe,KL,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux, taux 15 % : taxe due",Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux au taux de 15 %,,, +a_ml,3310A,2440,,60-base,ML,MOA,,True,manual,10,l10n_fr_account_vat_return.a_kl,15,,,,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux, taux 15 % : base","Base imposable sur la taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre onéreux (CGI, art 1609 sexdecies B) au taux de 15 %",,, +a_pp,3310A,2450,,60A-taxe,PP,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit, taux 5,15 % : taxe due","Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit (CGI, art 1609 sexdecies B) au taux de 5,15 %",,, +a_pq,3310A,2460,,60A-base,PQ,MOA,,True,manual,10,l10n_fr_account_vat_return.a_pp,5.15,,,,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit, taux 5,15 % : base","Base imposable sur la taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit (CGI, art 1609 sexdecies B) au taux de 5,15 %",,, +a_pr,3310A,2470,,60B-taxe,PR,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit, taux 15 % : taxe due","Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit (CGI, art 1609 sexdecies B) au taux de 15 %",,, +a_ps,3310A,2480,,60B-base,PS,MOA,,True,manual,10,l10n_fr_account_vat_return.a_pr,15,,,,,,"Taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit, taux 15 % : base","Base imposable sur la taxe sur la diffusion en vidéo physique et en ligne de contenus audiovisuels à titre gratuit (CGI, art 1609 sexdecies B) au taux de 15 %",,, +a_ty,3310A,2482,,61,TY,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe due par les employeurs de main-d’œuvre étrangère (uniquement pour les cessations d’activité ayant lieu en 2023),Taxe due par les employeurs de main-d’œuvre étrangère (L. 436-10 du CESEDA) (uniquement pour les cessations d’activité ayant lieu en 2023),,, +a_ug,3310A,2488,,62,UG,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Total de la contribution sur la rente infra-marginale de la production d’électricité (lignes a à q),Total de la contribution sur la rente infra-marginale de la production d’électricité (lignes a à q),,, +a_ft,3310A,2490,,64-taxe,FT,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les actes des huissiers de justice : taxe due,Taxe sur les actes des huissiers de justice,,, +a_mm,3310A,2500,,64-base,MM,MOA,,True,manual,,,,,,,,,Taxe sur les actes des huissiers de justice : base,"Base imposable sur la taxe sur les actes des huissiers de justice (CGI, art 302 bis Y)",,, +a_kg,3310A,2510,,65-taxe,KG,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les services fournis par les opérateurs de communication électronique : taxe due,"Taxe sur les services fournis par les opérateurs de communication électronique (CGI, art 302 bis KH) au taux de 1,3 %",,, +a_nh,3310A,2520,,65-base,NH,MOA,,True,manual,10,l10n_fr_account_vat_return.a_kg,1.3,,,,,,Taxe sur les services fournis par les opérateurs de communication électronique : base,"Base imposable sur la taxe sur les services fournis par les opérateurs de communication électronique (CGI, art 302 bis KH)",,, +a_fv,3310A,2530,,66-taxe-old,FV,MOA,,False,manual,,,,,,debit,,,Taxe sur les embarquements/débarquements de passagers en Corse : taxe due,"Taxe sur les embarquements ou débarquements de passagers en Corse (CGI, art 1599 vicies)",,, +a_mn,3310A,2540,,66-base-old,MN,MOA,,False,manual,,,,,,,,,Taxe sur les embarquements/débarquements de passagers en Corse : base,"Base imposable sur la taxe sur les embarquements ou débarquements de passagers en Corse (CGI, art 1599 vicies)",,, +a_ub,3310A,2522,,66-taxe,UB,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur le transport aérien de passagers - Majoration en Corse : taxe,"Taxe sur le transport aérien de passagers - Majoration en Corse (CIBS, art. L422-13 et L422-29) : taxe",,, +a_tz,3310A,2523,,66-base,TZ,QTY,,True,,,,,,,,,,Taxe sur le transport aérien de passagers - Majoration en Corse : base,"Taxe sur le transport aérien de passagers - Majoration en Corse (CIBS, art. L422-13 et L422-29) : base",,, +a_uc,3310A,2524,,67-taxe,UC,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur le transport maritime de passagers dans certains territoires côtiers - Embarquement ou débarquement en Corse : taxe,"Taxe sur le transport maritime de passagers dans certains territoires côtiers - Embarquement ou débarquement en Corse (CIBS, art. L423-57 et suivants) : taxe",,, +a_ua,3310A,2525,,67-base,UA,QTY,,True,,,,,,,,,,Taxe sur le transport maritime de passagers dans certains territoires côtiers - Embarquement ou débarquement en Corse : base,"Taxe sur le transport maritime de passagers dans certains territoires côtiers - Embarquement ou débarquement en Corse (CIBS, art. L423-57 et suivants) : base",,, +a_hi,3310A,2550,,68-taxe,HI,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe pour le dév. de la formation prof. dans la réparation automobile/cycle/motocycle, taux 0,75 % : taxe due","Taxe pour le développement de la formation professionnelle dans les métiers de la réparation de l'automobile, du cycle et du motocycle au taux de 0,75 %",,, +a_mp,3310A,2560,,68-base,MP,MOA,,True,manual,10,l10n_fr_account_vat_return.a_hi,0.75,,,,,,"Taxe pour le dév. de la formation prof. dans la réparation automobile/cycle/motocycle, taux 0,75 % : base","Base imposable sur la taxe pour le développement de la formation professionnelle dans les métiers de la réparation de l'automobile, du cycle et du motocycle (CGI, art 1609 sexvicies) au taux de 0,75%",,, +a_jg,3310A,2570,,69,JG,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les ordres annulés dans le cadre d'opérations à haute fréquence,"Taxe sur les ordres annulés dans le cadre d'opérations à haute fréquence (CGI, art. 235 ter ZD bis)",,, +a_ud,3310A,2575,,70,UD,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe spéciale due en cas de non-respect de l’engagement de conserver pendant 5 ans les parts de fonds commun de placement à risques ou de fonds professionnels de capital investissement,Taxe spéciale due en cas de non-respect de l’engagement de conserver pendant 5 ans les parts de fonds commun de placement à risques ou de fonds professionnels de capital investissement (art. 209-0-A du CGI),,, +a_kt,3310A,2580,,76,KT,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution due par les gestionnaires des réseaux publics d'électricité,"Contribution due par les gestionnaires des réseaux publics d'électricité (CGCT, art L 2224-31 I bis)",,, +a_jj,3310A,2590,,78,JJ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur le résultat des entreprises ferroviaires,"Taxe sur le résultat des entreprises ferroviaires (CGI, art. 235 ter ZF)",,, +a_jk,3310A,2600,,79,JK,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution de solidarité territoriale,"Contribution de solidarité territoriale (CGI, art. 302 bis ZC)",,, +a_jl,3310A,2610,,80,JL,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Imposition forfaitaire sur les pylônes,"Imposition forfaitaire sur les pylônes (CGI, art. 1519 A)",,, +a_ue,3310A,2616,,81-nom-dpm,UE,NAD,,True,manual,,,,,,,,,Nom du parc éolien en domain public maritime,Nom du parc éolien en domain public maritime,,, +a_uf,3310A,2618,,81-dpm,UF,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les éoliennes maritimes sur le domaine public maritime,"Taxe sur les éoliennes maritimes sur le domaine public maritime (CGI, art. 1519 B)",,, +a_jm,3310A,2620,,81,JM,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les éoliennes maritimes,"Taxe sur les éoliennes maritimes (CGI, art. 1519 B)",,, +a_jp,3310A,2650,,83-taxe,JP,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe pour le fonds de soutien aux collectivités territoriales ayant contracté des produits structurés : taxe,"Taxe pour le financement du fonds de soutien aux collectivités territoriales ayant contracté des produits structurés (CGI, art. 235 ter ZE bis)",,, +a_np,3310A,2660,,83-base,NP,MOA,,True,manual,10,l10n_fr_account_vat_return.a_jp,0.0642,,,,,,Taxe pour le fonds de soutien aux collectivités territoriales ayant contracté des produits structurés : base,"Base imposable sur la taxe pour le financement du fonds de soutien aux collectivités territoriales ayant contracté des produits structurés au taux de 0,0642%",,, +a_jq,3310A,2670,,84A,JQ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance sanitaire d'abattage,"Redevance sanitaire d'abattage (CGI, art. 302 bis N à 302 bis R)",,, +a_jr,3310A,2680,,84B,JR,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance sanitaire de découpage,"Redevance sanitaire de découpage (CGI, art. 302 bis S à 302 bis W)",,, +a_kx,3310A,2690,,85,KX,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance sanitaire pour le contrôle de certaines substances et de leurs résidus,"Redevance sanitaire pour le contrôle de certaines substances et de leurs résidus (CGI, art. 302 bis WC)",,, +a_ky,3310A,2700,,86,KY,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance sanitaire de 1ère mise sur le marché des produits de la pêche ou de l'aquaculture,"Redevance sanitaire de première mise sur le marché des produits de la pêche ou de l'aquaculture (CGI, art. 302 bis WA)",,, +a_kz,3310A,2710,,87-taxe,KZ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance sanitaire de transformation des produits de la pêche ou de l'aquaculture : taxe,"Redevance sanitaire de transformation des produits de la pêche ou de l'aquaculture (CGI, art. 302 bis WB)",,, +a_pe,3310A,2720,,87-base,PE,MOA,,True,manual,,,,,,,,,Redevance sanitaire de transformation des produits de la pêche ou de l'aquaculture : nombre de tonnes,"Base imposable sur la redevance sanitaire de transformation des produits de la pêche ou de l'aquaculture (CGI, art. 302 bis WB) : nombre de tonnes",,, +a_la,3310A,2730,,88-taxe,LA,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance pour agrément des établissements du secteur de l'alimentation animale : taxe,"Redevance pour agrément des établissements du secteur de l'alimentation animale (CGI, art. 302 bis WD à WG)",,, +a_pf,3310A,2740,,88-base,PF,MOA,,True,manual,10,l10n_fr_account_vat_return.a_la,12500,,,,,,Redevance pour agrément des établissements du secteur de l'alimentation animale : nombre d'établissements,"Base imposable sur la redevance pour agrément des établissements du secteur de l'alimentation animale (CGI, art. 302 bis WD à WG) : nombre d'établissements",,, +a_lc,3310A,2750,,89,LC,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance phytosanitaire à la circulation intracommunautaire,Redevance phytosanitaire à la circulation intracommunautaire (PPE) (L 251-17-1 du code rural et de la pêche maritime),,, +a_ld,3310A,2760,,90,LD,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance phytosanitaire à l'exportation,Redevance phytosanitaire à l'exportation (L 251-17-1 du code rural et de la pêche maritime),,, +a_sz,3310A,2766,,90A,SZ,MOA,,True,,,,,,,debit,,,Total de la taxe sur les produits phytopharmaceutiques : taxe,"Total de la taxe sur les produits phytopharmaceutiques (a*0,9 % + b*0,1%) : taxe",,, +a_sx,3310A,2762,,90A-a,SX,MOA,,True,manual,10,l10n_fr_account_vat_return.a_sz,0.9,,,,,,"Taxe sur les produits phytopharmaceutiques au taux de 0,9 % : base","Taxe sur les produits phytopharmaceutiques (Code rural et de la pêche maritime, art. L 253-8-2) au taux de 0,9 % : base",,, +a_sy,3310A,2764,,90A-b,SY,MOA,,True,manual,10,l10n_fr_account_vat_return.a_sz,0.1,,,,,,"Taxe sur les produits phytopharmaceutiques au taux de 0,1 % : base","Taxe sur les produits phytopharmaceutiques (Code rural et de la pêche maritime, art. L 253-8-2) au taux de 0,1 % : base",,, +a_le,3310A,2770,,91-taxe,LE,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe forfaitaire sur les ventes de métaux précieux, taux 11% : taxe","Taxe forfaitaire sur les métaux précieux (CGI, art.150 VM) sur les ventes de métaux précieux",,, +a_md,3310A,2780,,91-base,MD,MOA,,True,manual,,,,,,,,,"Taxe forfaitaire sur les ventes de métaux précieux, taux 11% : base","Base imposable sur la taxe forfaitaire sur les métaux précieux (CGI, art.150 VM) sur les ventes de métaux précieux",,, +a_lf,3310A,2790,,92-taxe,LF,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Taxe forfaitaire sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité, taux 6% : taxe","Taxe forfaitaire sur les métaux précieux (CGI, art.150 VM) sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité",,, +a_me,3310A,2800,,92-base,ME,MOA,,True,manual,,,,,,,,,"Taxe forfaitaire sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité, taux 6% : base","Base imposable sur la taxe forfaitaire sur les métaux précieux (CGI, art.150 VM) sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité",,, +a_lg,3310A,2810,,93-taxe,LG,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"CRDS sur les ventes de métaux précieux, taux 0,5% : taxe","CRDS (CGI, art. 1600-0 I) sur les ventes de métaux précieux au taux de 0,5 %",,, +a_mf,3310A,2820,,93-base,MF,MOA,,True,manual,10,l10n_fr_account_vat_return.a_lg,0.5,,,,,,"CRDS sur les ventes de métaux précieux, taux 0,5% : base","Base imposable sur la CRDS (CGI, art. 1600-0 I) sur les ventes de métaux précieux",,, +a_lh,3310A,2830,,94-taxe,LH,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"CRDS sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité, taux 0,5% : taxe","Contribution pour le remboursement de la dette sociale (CRDS) (CGI, art. 1600-0 I) - sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité au taux de 0,5 %",,, +a_mg,3310A,2840,,94-base,MG,MOA,,True,manual,10,l10n_fr_account_vat_return.a_lh,0.5,,,,,,"CRDS sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité, taux 0,5% : base","Base imposable sur la contribution pour le remboursement de la dette sociale (CRDS) (CGI, art. 1600-0 I) - sur les ventes de bijoux, d'objets d'arts, de collection ou d'antiquité",,, +a_lj,3310A,2850,,95,LJ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution forfaitaire pour le fonds des accidents du travail agricole,"Contribution forfaitaire pour alimentation du fonds commun des accidents du travail agricole (CGI, art. 1622)",,, +a_lk,3310A,2860,,96-taxe,LK,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvements sur les paris hippiques au profit de l'Etat : taxe,"Prélèvements sur les paris hippiques - au profit de l'Etat (CGI, art. 302 bis ZG)",,, +a_mq,3310A,2870,,96-base,MQ,MOA,,True,manual,,,,,,,,,Prélèvements sur les paris hippiques au profit de l'Etat : base,"Base imposable sur le prélèvement sur les paris hippiques au profit de l'Etat (CGI, art. 302 bis ZG) ",,, +a_ll,3310A,2880,,97-taxe,LL,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvements sur les paris hippiques au profit de la sécurité sociale : taxe,"Prélèvements sur les paris hippiques - au profit des organismes de sécurité sociale (CSS, art. L137-20)",,, +a_mz,3310A,2890,,97-base,MZ,MOA,,True,manual,,,,,,,,,Prélèvements sur les paris hippiques au profit de la sécurité sociale : base,"Base imposable sur le prélèvement sur les paris hippiques au profit des organismes de sécurité sociale (CSS, art. L137-20)",,, +a_lm,3310A,2900,,98-taxe,LM,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvements sur les paris hippiques engagés depuis l'étranger des courses françaises et regroupés en France : taxe,"Prélèvements sur les paris hippiques - engagés depuis l'étranger des courses françaises et regroupés en France (CGI, art.302 bis ZO)",,, +a_na,3310A,2910,,98-base,NA,MOA,,True,manual,,,,,,,,,Prélèvements sur les paris hippiques engagés depuis l'étranger des courses françaises et regroupés en France : base,"Base imposable sur le prélèvement sur les paris hippiques engagés depuis l'étranger des courses françaises et regroupés en France (CGI, art.302 bis ZO)",,, +a_ln,3310A,2920,,99,LN,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance due par les opérateurs agréés de paris hippiques en lignes : enjeux relatifs aux courses de trot,"Redevance due par les opérateurs agréés de paris hippiques en lignes - Enjeux relatifs aux courses de trot (CGI, art. 1609 tertricies)",,, +a_lp,3310A,2930,,100,LP,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Redevance due par les opérateurs agréés de paris hippiques en lignes : enjeux relatifs aux courses de galop,"Redevance due par les opérateurs agréés de paris hippiques en lignes - Enjeux relatifs aux courses de galop (CGI, art. 1609 tertricies)",,, +a_qz,3310A,2940,,101A-taxe,QZ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs en ligne au profit de l'Etat, taux 33,7% : taxe","Prélèvements sur les paris sportifs en ligne au profit de l'Etat au taux de 33,7 % (CGI, art. 302 bis ZH)",,, +a_ra,3310A,2950,,102A-taxe,RA,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs en ligne au profit de la sécurité sociale, taux 10,6% : taxe","Prélèvements sur les paris sportifs en ligne au profit des organismes de sécurité sociale au taux de 10,6 % (CSS, art. L137-21)",,, +a_rb,3310A,2960,,103A-taxe,RB,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs en ligne au profit de l'ANS, taux 10,6% : taxe","Prélèvements sur les paris sportifs en ligne au profit de l'agence nationale du sport (ANS) au taux de 10,6 % (CGI, art. 1609 tricies)",,, +a_rf,3310A,2970,,101A-103A-base,RF,MOA,,True,manual,,,,,,,,,Prélèvements sur les paris sportifs en ligne : base,Base imposable sur les prélèvements sur les paris sportifs en ligne,,, +a_rc,3310A,2980,,101B-taxe,RC,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs commercialisés en réseau physique au profit de l'Etat, taux 27,9% : taxe","Prélèvements sur les paris sportifs commercialisés en réseau physique de distribution au profit de l'Etat au taux de 27,9 % (CGI, art. 302 bis ZH)",,, +a_rd,3310A,2990,,102B-taxe,RD,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs commercialisés en réseau physique au profit de la sécurité sociale, taux 6,6% : taxe","Prélèvements sur les paris sportifs commercialisés en réseau physique de distribution au profit des organismes de sécurité sociale au taux de 6,6 % (CSS, art. L137-21)",,, +a_re,3310A,3000,,103B-taxe,RE,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvements sur les paris sportifs commercialisés en réseau physique au profit de l'ANS, taux 6,6% : taxe","Prélèvements sur les paris sportifs commercialisés en réseau physique de distribution au profit de l'agence nationale du sport (ANS) au taux de 6,6 % (CGI, art. 1609 tricies)",,, +a_rg,3310A,3010,,101B-103B-base,RG,MOA,,True,manual,,,,,,,,,Prélèvements sur les paris sportifs commercialisés en réseau physique : base,Base imposable sur les prélèvements sur les paris sportifs commercialisés en réseau physique de distribution,,, +a_lt,3310A,3020,,104-taxe,LT,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvements sur les jeux de cercles au profit de l'Etat : taxe,"Prélèvements sur les jeux de cercles - au profit de l'Etat (CGI, art. 302 bis ZI)",,, +a_lu,3310A,3030,,105-taxe,LU,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvements sur les jeux de cercles au profit de la sécurité sociale : taxe,"Prélèvements sur les jeux de cercles - au profit des organismes de sécurité sociale (CSS, art. L137-22)",,, +a_ms,3310A,3040,,104-105-base,MS,MOA,,True,manual,,,,,,,,,Prélèvements sur les jeux de cercles en ligne : base,Base imposable sur les prélèvements sur les jeux de cercles en ligne,,, +a_rh,3310A,3050,,107A-taxe,RH,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Prélèvement au profit de l'ANS sur les jeux commercialisés par la FdJ, taux 5,1% : taxe","Prélèvement au profit de l'agence nationale du sport (ANS) sur les jeux commercialisés par la Française des jeux au taux de 5,1 % (CGI, art. 1609 novovicies)",,, +a_rj,3310A,3060,,107A-base,RJ,MOA,,True,manual,,,,,,,,,"Prélèvement au profit de l'ANS sur les jeux commercialisés par la FdJ, taux 5,1% : base","Base imposable sur le prélèvement au profit de l'agence nationale du sport (ANS) sur les jeux commercialisés par la Française des jeux au taux de 5,1 % (CGI, art. 1609 novovicies)",,, +a_pb,3310A,3070,,111-taxe,PB,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,CSG sur une fraction du produit des jeux des machines à sous : taxe,"Contribution sociale généralisée (CSS, art. L136-7-1) sur une fraction du produit des jeux des machines à sous",,, +a_nv,3310A,3080,,111-base,NV,MOA,,True,manual,,,,,,,,,CSG sur une fraction du produit des jeux des machines à sous : base,"Base imposable sur la contribution sociale généralisée (CSS, art. L136-7-1) sur une fraction égale à 68% du produit des jeux des machines à sous",,, +a_pc,3310A,3090,,112-taxe,PC,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,CSG sur le montant des gains des machines à sous d'un montant supérieur ou égal à 1 500 € réglés aux joueurs par le caissier sous forme de bons de paiement manuels : taxe,"Contribution sociale généralisée (CSS, art. L136-7-1) sur le montant des gains des machines à sous d'un montant supérieur ou égal à 1 500 € réglés aux joueurs par le caissier sous forme de bons de paiement manuels",,, +a_nw,3310A,3100,,112-base,NW,MOA,,True,manual,,,,,,,,,CSG sur le montant des gains des machines à sous d'un montant supérieur ou égal à 1 500 € réglés aux joueurs par le caissier sous forme de bons de paiement manuels : base,"Base imposable sur la contribution sociale généralisée (CSS, art. L136-7-1) sur le montant des gains des machines à sous d'un montant supérieur ou égal à 1 500 € réglés aux joueurs par le caissier sous forme de bons de paiement manuels",,, +a_pd,3310A,3110,,113-taxe,PD,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,CRDS portant sur le montant du produit total des jeux : taxe,"Contribution pour le remboursement de la dette sociale portant sur le montant du produit total des jeux (CGCT, art. L. 2333-57, articles 18-III et 19 de l'ordonnance n°96-50 du 24 janvier 1996)",,, +a_nx,3310A,3120,,113-base,NX,MOA,,True,manual,,,,,,,,,CRDS portant sur le montant du produit total des jeux : base,"Base imposable sur la contribution pour le remboursement de la dette sociale portant sur le montant du produit total des jeux (CGCT, art. L. 2333-57, articles 18-III et 19 de l'ordonnance n°96-50 du 24 janvier 1996)",,, +a_ma,3310A,3130,,115-taxe,MA,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe annuelle pour frais de contrôle due par les concessionnaires d'autoroutes : taxe,"Taxe annuelle pour frais de contrôle due par les concessionnaires d'autoroutes (CGI, art. 1609 septtricies 302 bis ZB bis) au taux de 0,363 ‰",,, +a_mc,3310A,3140,,115-base,MC,MOA,,True,manual,10,l10n_fr_account_vat_return.a_ma,0.0363,,,,,,Taxe annuelle pour frais de contrôle due par les concessionnaires d'autoroutes : base,"Base imposable sur la taxe annuelle pour frais de contrôle due par les concessionnaires d'autoroutes (CGI, art. 1609 septtricies 302 bis ZB bis)",,, +a_rs,3310A,3300,,116,RS,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Total de la taxe annuelle à l'essieu,"Total de la taxe annuelle à l'essieu due (CGI, art. 1010) (1a + 1b + 2a + 2b + 3)",,, +a_rt,3310A,3150,,116-1a-nb,RT,QTY,,True,manual,,,,,,,,,Véhicules à moteur isolés - PTAC inférieur à 27t - Nombre de véhicules,Véhicules à moteur isolés - PTAC inférieur à 27t - Nombre de véhicules,,, +a_ry,3310A,3160,,116-1a-nb-rr,RY,QTY,,True,manual,,,,,,,,,Véhicules à moteur isolés - PTAC inférieur à 27t - Dont nombre de véhicules rail-route,Véhicules à moteur isolés - PTAC inférieur à 27t - Dont nombre de véhicules rail-route,,, +a_sd,3310A,3170,,116-1a-taxe,SD,MOA,,True,manual,10,l10n_fr_account_vat_return.a_rs,,,,,,,Véhicules à moteur isolés - PTAC inférieur à 27t - Montant de la taxe,Véhicules à moteur isolés - PTAC inférieur à 27t - Montant de la taxe,,, +a_ru,3310A,3180,,116-1b-nb,RU,QTY,,True,manual,,,,,,,,,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Nombre de véhicules,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Nombre de véhicules,,, +a_rz,3310A,3190,,116-1b-nb-rr,RZ,QTY,,True,manual,,,,,,,,,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Dont nombre de véhicules rail-route,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Dont nombre de véhicules rail-route,,, +a_se,3310A,3200,,116-1b-taxe,SE,MOA,,True,manual,10,l10n_fr_account_vat_return.a_rs,,,,,,,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Montant de la taxe,Véhicules à moteur isolés - PTAC supérieur ou égal à 27t - Montant de la taxe,,, +a_rv,3310A,3210,,116-2a-nb,RV,QTY,,True,manual,,,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Nombre de véhicules,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Nombre de véhicules,,, +a_sa,3310A,3220,,116-2a-nb-rr,SA,QTY,,True,manual,,,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Dont nombre de véhicules rail-route,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Dont nombre de véhicules rail-route,,, +a_sf,3310A,3230,,116-2a-taxe,SF,MOA,,True,manual,10,l10n_fr_account_vat_return.a_rs,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Montant de la taxe,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA inférieur à 39t - Montant de la taxe,,, +a_rw,3310A,3240,,116-2b-nb,RW,QTY,,True,manual,,,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Nombre de véhicules,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Nombre de véhicules,,, +a_sb,3310A,3250,,116-2b-nb-rr,SB,QTY,,True,manual,,,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Dont nombre de véhicules rail-route,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Dont nombre de véhicules rail-route,,, +a_sg,3310A,3260,,116-2b-taxe,SG,MOA,,True,manual,10,l10n_fr_account_vat_return.a_rs,,,,,,,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Montant de la taxe,Ensemble articulés constitués d'un tracteur et d'une ou plusieurs semi-remorques - PTRA supérieur ou égal à 39t - Montant de la taxe,,, +a_rx,3310A,3270,,116-3-nb,RX,QTY,,True,manual,,,,,,,,,Remorques de la catégorie O4 - Nombre de véhicules,Remorques de la catégorie O4 - Nombre de véhicules,,, +a_sc,3310A,3280,,116-3-nb-rr,SC,QTY,,True,manual,,,,,,,,,Remorques de la catégorie O4 - Dont nombre de véhicules rail-route,Remorques de la catégorie O4 - Dont nombre de véhicules rail-route,,, +a_sh,3310A,3290,,116-3-taxe,SH,MOA,,True,manual,10,l10n_fr_account_vat_return.a_rs,,,,,,,Remorques de la catégorie O4 - Montant de la taxe,Remorques de la catégorie O4 - Montant de la taxe,,, +a_tf,3310A,3310,,117-nb-nouv,TF,QTY,,True,manual,,,,,,,,,Nombre de véhicules relevant du nouveau dispositif d’immatriculation (depuis le 1er mars 2020),Nombre de véhicules relevant du nouveau dispositif d’immatriculation (depuis le 1er mars 2020),,, +a_tg,3310A,3320,,117-nb-nonouv,TG,QTY,,True,manual,,,,,,,,,"Nombre de véhicules ne relevant pas du nouveau dispositif d’immatriculation : (réception européenne, dont la première mise en circulation est intervenue à compter du 1er juin 2004 et non utilisés par le redevable avant le 1er janvier 2006)","Nombre de véhicules ne relevant pas du nouveau dispositif d’immatriculation : (réception européenne, dont la première mise en circulation est intervenue à compter du 1er juin 2004 et non utilisés par le redevable avant le 1er janvier 2006)",,, +a_th,3310A,3330,,117-nb-autres,TH,QTY,,True,manual,,,,,,,,,Nombre d'autres véhicules soumis à la taxe,Nombre d'autres véhicules soumis à la taxe,,, +a_tj,3310A,3340,,117-nb-elec,TJ,QTY,,True,manual,,,,,,,,,"Nombre de véhicules exonérés dont la source d'énergie est exclusivement l'électricité, l'hydrogène ou une combinaison des deux","Nombre de véhicules exonérés dont la source d'énergie est exclusivement l'électricité, l'hydrogène ou une combinaison des deux",,, +a_tk,3310A,3350,,117-nb-autres-exo,TK,QTY,,True,manual,,,,,,,,,Nombre des autres véhicules exonérés,Nombre des autres véhicules exonérés,,, +a_sl,3310A,3360,,117,SL,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,63514,,Taxe sur les émissions de CO2 due au titre de 2022,"Taxe sur les émissions de CO2 due au titre de 2022 (CGI, art. 1010)",,, +a_sm,3310A,3370,,118,SM,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,63514,,Taxe sur les émissions de polluants atmosphériques due au titre de 2022,"Taxe sur les émissions de polluants atmosphériques due au titre de 2022 (CGI, art. 1010)",,, +a_tx,3310A,3375,,nb-vehicule-exo,TX,QTY,,True,manual,,,,,,,,,Nombre de véhicules exonérés,Nombre de véhicules exonérés,,, +a_nc,3310A,3380,,119-taxe,NC,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Prélèvement progressif sur les clubs de jeux : taxe,Prélèvement progressif sur les clubs de jeux (V de l'article 34 de la loi n° 2017-257 du 28 février 2017 relative au statut de Paris et à l'aménagement métropolitain),,, +a_pg,3310A,3390,,119-base,PG,MOA,,True,manual,,,,,,,,,Prélèvement progressif sur les clubs de jeux : base,Base imposable sur les prélèvement progressif sur les clubs de jeux (V de l'article 34 de la loi n° 2017-257 du 28 février 2017 relative au statut de Paris et à l'aménagement métropolitain),,, +a_sj,3310A,3400,,120,SJ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,"Sommes constatées par les clubs de jeux au titre des ""orphelins""","Sommes constatées par les clubs de jeux au titre des ""orphelins"" (arrêté du 23 février 2021 relatif aux modalités de déclaration et d'encaissement des sommes qualifiées d'orphelins versées par les clubs de jeux)",,, +a_pk,3310A,3430,,121,PK,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Montant total de la taxe sur l'exploration d'hydrocarbures,Montant total de la taxe sur l'exploration d'hydrocarbures,,, +a_ph,3310A,3410,,121-taxe,PH,MOA,,True,manual,10,l10n_fr_account_vat_return.a_pk,,,,,,,Taxe sur l'exploration d'hydrocarbures : taxe,"Droits pour le département ou la collectivité territoriale pour la taxe sur l'exploration d'hydrocarbures (CGI, art 1590)",,, +a_pj,3310A,3420,,121-dpt,PJ,FTX,,True,manual,,,,,,,,,Département bénéficiaire de la taxe sur l'exploration d'hydrocarbures,"Département bénéficiaire de la taxe sur l'exploration d'hydrocarbures (CGI, art 1590)",,, +a_pu,3310A,3440,,124-taxe,PU,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution sur les boissons non alcooliques contenant des sucres ajoutés : taxe,"Contribution sur les boissons non alcooliques contenant des sucres ajoutés (CGI, art. 1613 ter)",,, +a_pw,3310A,3450,,124-base,PW,MOA,,True,manual,,,,,,,,,Contribution sur les boissons non alcooliques contenant des sucres ajoutés : base en hectolitres,Nombre d'hectolitres relatif à la contribution sur les boissons non alcooliques contenant des sucres ajoutés,,, +a_px,3310A,3460,,125-taxe,PX,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution sur les boissons non alcooliques : taxe,"Contribution sur les boissons non alcooliques (CGI, art. 1613 quater II 1°)",,, +a_py,3310A,3470,,125-base,PY,MOA,,True,manual,,,,,,,,,Contribution sur les boissons non alcooliques : base en hectolitres,Nombre d'hectolitres relatif à la contribution sur les boissons non alcooliques,,, +a_qa,3310A,3480,,126-base,QA,MOA,,True,manual,,,,,,,,,Contribution sur les boissons non alcooliques contenant des édulcorants de synthèse : base en hectolitres,Nombre d'hectolitres relatif à la contribution sur les boissons non alcooliques contenant des édulcorants de synthèse,,, +a_pz,3310A,3490,,126-taxe,PZ,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Contribution sur les boissons non alcooliques contenant des édulcorants de synthèse : taxe,"Contribution sur les boissons non alcooliques contenant des édulcorants de synthèse (CGI, art. 1613 quater II 2°)",,, +a_qe,3310A,3500,,128,QE,MOA,,True,,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Montant total de la contribution sur les eaux minérales naturelles,Montant total de la contribution sur les eaux minérales naturelles,,, +a_qb,3310A,3510,,127-taxe,QB,MOA,,True,manual,10,l10n_fr_account_vat_return.a_qe,,,,,,,Contribution sur les eaux minérales naturelles : taxe,"Contribution sur les eaux minérales naturelles (CGI, art. 1582)",,, +a_qc,3310A,3520,,127-commune,QC,FTX,,True,manual,,,,,,,,,N° INSEE de la commune bénéficiaire de la contribution sur les eaux minérales naturelles,Numéro de la commune bénéficiaire de la contribution sur les eaux minérales naturelles,,, +a_qd,3310A,3530,,127-base,QD,MOA,,True,manual,,,,,,,,,Contribution sur les eaux minérales naturelles : base en hectolitres,Nombre d'hectolitres relatif à la contribution sur les eaux minérales naturelles,,, +a_td,3310A,3540,,129-base,TD,MOA,,True,manual,,,,,,,,,Taxe sur les exploitants de plateformes de mise en relation par voie électronique en vue de fournir certaines prestations de transport : base,"Taxe sur les exploitants de plateformes de mise en relation par voie électronique en vue de fournir certaines prestations de transport (CGI, article 300 bis) : base",,, +a_te,3310A,3550,,129-taxe,TE,MOA,,True,manual,20,l10n_fr_account_vat_return.a_hb,,,,debit,,,Taxe sur les exploitants de plateformes de mise en relation par voie électronique en vue de fournir certaines prestations de transport : taxe,"Taxe sur les exploitants de plateformes de mise en relation par voie électronique en vue de fournir certaines prestations de transport (CGI, article 300 bis) : taxe",,, diff --git a/l10n_fr_account_vat_return/i18n/fr.po b/l10n_fr_account_vat_return/i18n/fr.po new file mode 100644 index 000000000..e033e3c71 --- /dev/null +++ b/l10n_fr_account_vat_return/i18n/fr.po @@ -0,0 +1,1990 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_account_vat_return +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-29 20:11+0000\n" +"PO-Revision-Date: 2022-09-29 20:11+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"%d%% of the invoice/refund was unpaid on %s, VAT amount %s => Unpaid VAT " +"amount %s" +msgstr "" +"%d%% de la facture/avoir était impayé au %s, Montant TVA %s => Montant de " +"TVA impayé %s" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "%s (add)" +msgstr "%s (ajout)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__form_code__3310a +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "3310-A" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__form_code__3310ca3 +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "3310-CA3" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_return_start_company_uniq +msgid "A VAT return with the same start date already exists in this company!" +msgstr "" +"Une déclaration de TVA avec la même date de début existe déjà dans cette " +"société !" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "A regular sale " +msgstr "Une vente normale" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"A single box with type '%s' should exists, but there are %d box(es) of that " +"type. This should never happen." +msgstr "" +"Il devrait y avoir une unique case de formulaire de type '%s', mais il y a " +"%d case(s) de ce type. Cela ne devrait jamais arriver." + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_account +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__manual_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__account_id +msgid "Account" +msgstr "Compte" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is a due VAT auto-liquidation account. So it should be empty at " +"the start of the VAT period, but the balance on the last day of the previous " +"period is %s." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Account '%s' is present in the mapping of several fiscal positions." +msgstr "" +"Le compte '%s' est présent dans la table de correspondance de plusieurs " +"positions fiscales." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used as due VAT account on several auto-liquidation taxes " +"for different rates (%.2f%% and %.2f%%)." +msgstr "" +"Le compte '%s' est utilisé comme compte de TVA due sur plusieurs taxes " +"d'autoliquidation pour des taux différents (%.2f%% and %.2f%%)." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used for several kinds of deductible VAT taxes (%s and %s)." +msgstr "" +"Le compte '%s' est utilisé sur plusieurs types de taxes de TVA déductible " +"(%s et %s)." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used on several sale VAT taxes for different rates (%.2f%% " +"and %.2f%%)." +msgstr "" +"Le compte '%s' est utilisé sur plusieurs taxes de TVA à la vente pour " +"différents taux (%.2f%% et %.2f%%)." + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_chart_template +msgid "Account Chart Template" +msgstr "Modèle de plan comptable" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__accounting_method +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_accounting_method +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Accounting Method" +msgstr "Méthode de comptabilisation" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__active +msgid "Active" +msgstr "Actif" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_ids +msgid "Activities" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_state +msgid "Activity State" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__amount +msgid "Amount" +msgstr "Montant" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__manual_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__analytic_account_id +msgid "Analytic Account" +msgstr "Compte analytique" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_expense_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_expense_analytic_account_id +msgid "Analytic Account for Expense Adjustment" +msgstr "Compte analytique pour la charge d'ajustement" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_income_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_income_analytic_account_id +msgid "Analytic Account for Income Adjustment" +msgstr "Compte analytique pour le revenu d'ajustement" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Archived" +msgstr "Archivé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__fr_vat_autoliquidation +msgid "Auto-Liquidation" +msgstr "Auto-liquidation" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Auto-liquidation tax '%s' is not present in the tax mapping of any fiscal " +"position." +msgstr "" +"La taxe d'auto-liquidation '%s' n'est présente dans la table de " +"correspondance d'aucune position fiscale." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__auto +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Automatic Lines" +msgstr "Lignes automatiques" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Back to Manual Lines" +msgstr "Retour aux lignes manuelles" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Based on invoice" +msgstr "TVA sur les débits" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Based on payment" +msgstr "TVA sur les encaissements" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__cci_tbx +msgid "Boolean (CCI/TBX)" +msgstr "Booléen (CCI/TBX)" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Both (automatic)" +msgstr "Les deux (automatique)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_id +msgid "Box" +msgstr "Case" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Box '%s' doesn't have a push box, so it's push rate should be 0." +msgstr "" +"La case '%s' n'a pas de case poussée, donc son taux de poussée devrait être " +"à 0." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' doesn't have an accounting method, so it should not have any " +"accounting parameter." +msgstr "" +"La case '%s' n'a pas de méthode comptable, donc elle ne devrait avoir aucun " +"paramètre comptable." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Box '%s' has a negative value (%s) but it doesn't have a negative switch box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' has a push box '%s' that is configured as manual or not pushed " +"total." +msgstr "" +"La case '%s' a une case poussée '%s' qui est configurée en manuel ou en " +"total non poussé." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Box '%s' has a push box but is missing a push sequence." +msgstr "La case '%s' a une case poussée mais n'a pas de séquence de poussée." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Box '%s' is configured with Manual Account Code '%s', but there are no " +"accounts that start with this code in company '%s'. You may want to setup a " +"specific account on that box." +msgstr "" +"La case '%s' est configurée avec le compte comptable manuel '%s', mais il " +"n'y a aucun compte qui commence par ce code dans la société '%s'. Vous " +"devriez configurer un compte comptable spécifique pour cette case." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' should not have an accounting method considering it's box type." +msgstr "" +"La case '%s' ne devrait pas avoir de méthode comptable au vu de son type." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__box +msgid "Box Value" +msgstr "Valeur de la case" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_id +msgid "CA3 Attachment" +msgstr "Pièce jointe CA3" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_datas +msgid "CA3 File" +msgstr "Fichier CA3" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_name +msgid "CA3 Filename" +msgstr "Nom de fichier CA3" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_form +msgid "Cancel" +msgstr "Annuler" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Cannot delete VAT return '%s' because it is not in 'Manual Lines' state." +msgstr "" +"Vous ne pouvez pas supprimer la déclaration de TVA '%s' car elle n'est pas à " +"l'état 'Lignes manuelles'." + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_vat_exigibility_update +msgid "Change Company VAT Exigibility" +msgstr "Modification du régime de TVA de la société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__ftx +msgid "Char (FTX)" +msgstr "Chaîne de caractère (FTX)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_code +msgid "Code" +msgstr "Code" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__comment_dgfip +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__reimbursement_comment_dgfip +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +#, python-format +msgid "Comment for DGFIP" +msgstr "Commentaire pour la DGFIP" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__company_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__company_id +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Company" +msgstr "Société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__bank_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_bank_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_bank_account_id +msgid "Company Bank Account" +msgstr "Compte bancaire de la société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_currency_id +msgid "Company Currency" +msgstr "Devise société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_partner_id +msgid "Company Partner" +msgstr "Partenaire de la société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_res_company__fr_vat_bank_account_id +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_bank_account_id +msgid "" +"Company bank account used to pay VAT or receive credit VAT reimbursements." +msgstr "" +"Compte bancaire de la société utilisé pour payer la TVA ou recevoir les " +"remboursements de crédit de TVA." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__log_ids +msgid "Computation Details" +msgstr "Détails de calcul" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_form +msgid "Computation and Accounting Details" +msgstr "Détails de calcul et de comptabilisation" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__compute_type +msgid "Compute Type" +msgstr "Type de calcul" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_line_log +msgid "Compute log of VAT Return Line for France (CA3 line)" +msgstr "" +"Détails du calcul de la ligne de déclaration de TVA française (ligne de CA3)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__computed_base +msgid "Computed Base" +msgstr "Base de calcul" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__computed_vat_amount +msgid "Computed VAT Amount" +msgstr "Montant de TVA calculé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_res_config_settings +msgid "Config Settings" +msgstr "Page de configuration" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_first_creation_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__first_creation_date +msgid "Creation Date" +msgstr "Date de création" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Creation Date is not set." +msgstr "La date de création n'est pas renseignée." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__accounting_method__credit +msgid "Credit" +msgstr "Crédit" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__credit_deferment +msgid "Credit Deferment" +msgstr "Report de crédit" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_action +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Credit VAT Reimbursement" +msgstr "Remboursement de crédit" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Credit VAT Reimbursement removed." +msgstr "Retrait de la demande de remboursement de crédit de TVA." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Credit VAT reimbursement of %d € submitted." +msgstr "Soumission d'une demande de remboursement de crédit de TVA de %d €." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__company_currency_id +msgid "Currency" +msgstr "Devise" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__current_fr_vat_exigibility +msgid "Current VAT Exigibility" +msgstr "Régime de TVA actuel" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__accounting_method__debit +msgid "Debit" +msgstr "Débit" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_asset +msgid "Deductible VAT Amount Asset" +msgstr "Montant de TVA déductible sur immobilisation" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_other +msgid "Deductible VAT Amount Other" +msgstr "Autre montant de TVA déductible" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__display_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_display_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Display Type" +msgstr "Type d'affichage" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "" +"Do you confirm that you have validated the VAT return on impots.gouv.fr?" +msgstr "" +"Est-ce que vous confirmez avoir bien validé le formulaire de TVA sur impots." +"gouv.fr ?" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat +msgid "Due VAT Amount" +msgstr "Montant de TVA due" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__due_vat_base_box_id +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_base +msgid "Due VAT Base" +msgstr "Base de TVA due" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_intracom_product +msgid "Due VAT Intracom Products" +msgstr "TVA due intracom - Produits" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_monaco +msgid "Due VAT Monaco" +msgstr "TVA due Monaco" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Due VAT box '%s' has print Y %d whereas Base Due VAT box '%s' has print Y " +"%d. They should be on the same line." +msgstr "" +"La case de TVA due '%s' a la coordonnée Y %d alors que la case de base de " +"TVA '%s' a la coordonnée Y %d. Elles devraient être sur la même ligne." + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "EDI" +msgstr "EDI" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__edi_code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_edi_code +msgid "EDI Code" +msgstr "Code EDI" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__edi_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_edi_type +msgid "EDI Type" +msgstr "Type EDI" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "EDI type not supported for box '%s'." +msgstr "Le type EDI n'est pas supportée pour la case '%s'." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__end_date +msgid "End Date" +msgstr "Date de fin" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__end_total_debit +msgid "End Total Credit" +msgstr "Total crédit final" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__end_total_credit +msgid "End Total Debit" +msgstr "Total débit final" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__balance +msgid "Ending Balance" +msgstr "Solde" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Error in the generation of the computation and accounting details of box " +"'%s': this box has an accounting method but the account is not set." +msgstr "" +"Erreur dans la génération des paramètres de calcul et de comptabilisation de " +"la case '%s' : cette case a une méthode de comptabilisation mais le compte " +"n'est pas configuré." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_end_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__end_date +msgid "Event Date" +msgstr "Date de survenance" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Event Date is not set." +msgstr "La date de survenance n'est pas configurée." + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_reimbursement +msgid "FR VAT Reimbursement (3519)" +msgstr "Remboursement de TVA (3519)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__1 +msgid "First Page" +msgstr "Première page" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_fiscal_position +msgid "Fiscal Position" +msgstr "Position fiscale" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_bank_statement_line__fiscal_position_fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__fiscal_position_fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_payment__fiscal_position_fr_vat_type +msgid "Fiscal Position Type" +msgstr "Type de position fiscale" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__form_code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_form_code +msgid "Form" +msgstr "Formulaire" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.res_config_settings_view_form +msgid "France VAT" +msgstr "TVA française" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_box_action +#: model:ir.ui.menu,name:l10n_fr_account_vat_return.l10n_fr_account_vat_box_menu +msgid "France VAT Boxes" +msgstr "Cases de la déclaration de TVA FR" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return +msgid "France VAT Return (CA3)" +msgstr "Déclaration de TVA française (CA3)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_box +msgid "France VAT Return (CA3) box" +msgstr "Case de la déclaration de TVA (CA3)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_vat_exigibility_update__update_type__from_start +msgid "From the Start" +msgstr "Depuis le début" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__full_label +msgid "Full Label" +msgstr "Libellé complet" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Generate Automatic Lines" +msgstr "Générer les lignes automatiques" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_code +msgid "Generic Account Code" +msgstr "Code comptable générique" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_id +msgid "" +"If not set, Odoo will use the first account that starts with the Generic " +"Account Code. If set, Odoo will ignore the Generic Account Code and use this " +"account." +msgstr "" +"Si non renseigné, Odoo utilisera le premier compte qui commence par le code " +"comptable générique. Si renseigné, Odoo ignorera le code comptable générique " +"et l'utilisera comme compte comptable." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__negative_switch_box_id +msgid "" +"If the amount of this box is negative, its lines will be transfered to " +"another box with a sign inversion." +msgstr "" +"Si le montant de cette case est négatif, ses lignes seront transférées à une " +"autre case avec une inversion du signe." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "" +"If you don't want to change the VAT Exigibility of company '%s', click on " +"the Cancel button." +msgstr "" +"Si vous ne souhaitez pas modifier le régime de TVA de la société '%s', " +"cliquez sur le bouton Annuler." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_manual_int +msgid "Integer Value" +msgstr "Entier" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Invoice/refund is unpaid, Unpaid VAT amount %s" +msgstr "La facture/avoir est impayée, Montant de TVA impayé %s" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Invoice/refund was unpaid on %s, Unpaid VAT amount %s" +msgstr "La facture/avoir était impayée au %s, Montant de TVA impayé %s" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_move +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__move_id +msgid "Journal Entry" +msgstr "Pièce comptable" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Journal entry '%s' uses an intracom autoliquidation due VAT account but is " +"not a supplier invoice/refund. This scenario is not supported." +msgstr "" +"La pièce comptable '%s' utilise un compte pour la taxe d'autoliquidation " +"intracom mais elle n'est pas de type facture/avoir fournisseur. Ce scénario " +"n'est pas supporté." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_journal_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_journal_id +msgid "Journal for VAT Journal Entry" +msgstr "Journal pour l'OD de TVA" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Journal for VAT Journal Entry is not set on company '%s'." +msgstr "" +"Le journal pour la déclaration de TVA n'est pas configuré pour la société " +"'%s'." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_name +msgid "Label" +msgstr "Libellé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__write_uid +msgid "Last Updated by" +msgstr "Dernière modification par" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__write_date +msgid "Last Updated on" +msgstr "Dernière modification le" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Lines" +msgstr "Lignes" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__manual +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__manual +msgid "Manual" +msgstr "Manuel" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__manual +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Manual Lines" +msgstr "Lignes manuelles" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Mark as sent" +msgstr "Marquer comme envoyé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_ids +msgid "Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Missing Due VAT Base on box '%s' which is a Due VAT box." +msgstr "" +"Base de TVA due manquante sur la case '%s' qui est une case de TVA due." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Missing account mapping on fiscal position '%s'." +msgstr "Table de correspondance des comptes vide sur la position fiscale '%s'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Missing print caracteristics on box '%s'." +msgstr "Paramètres d'impression manquants pour la case '%s'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Monaco customer '%s', VAT amount %s" +msgstr "Client monégasque '%s', Montant de TVA %s" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__moa +msgid "Monetary (MOA)" +msgstr "Monétaire (MOA)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__1 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__1 +msgid "Monthly" +msgstr "Mensuel" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__nref_code +msgid "N-REF Code" +msgstr "Code N-REF" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__nad +msgid "Name and address (NAD)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Name or Code" +msgstr "Nom ou Code" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__negative_switch +msgid "Negative Switch" +msgstr "Basculement négatif" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__negative_switch_box_id +msgid "Negative Switch Box" +msgstr "Case de basculement si négatif" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__new_fr_vat_exigibility +msgid "New VAT Exigibility" +msgstr "Nouveau régime de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "No Due VAT box found for VAT rate %.2f%%." +msgstr "Aucune case de TVA due trouvée pour le taux de TVA %.2f%%." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"No account mapping on fiscal position %s. If this fiscal position is not only used for " +"purchase but also for sale, you must configure an account mapping on revenue " +"accounts." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "No sections" +msgstr "Aucune section" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__no_push_total_credit +msgid "Not Pushed Total Credit" +msgstr "Total crédit non poussé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__no_push_total_debit +msgid "Not Pushed Total Debit" +msgstr "Total débit non poussé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__note +msgid "Note" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_log_form +msgid "Notes" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"On box '%s', the Account Code is not set. You may want to setup a specific " +"account on that box." +msgstr "" +"Sur la case '%s', le code comptable n'est pas renseigné. Vous pouvez " +"spécifier un compte sur cette case." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_page +msgid "Page" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_partial_reconcile +msgid "Partial Reconcile" +msgstr "Lettrage partiel" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_company_partner_id +msgid "Partner" +msgstr "Partenaire" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__pcd +msgid "Percentage (PCD)" +msgstr "Pourcentage (PCD)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__name +msgid "Period" +msgstr "Période" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__period_balance +msgid "Period Balance" +msgstr "Balance sur la période" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Post" +msgstr "Comptabiliser" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__posted +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Posted" +msgstr "Comptabilisé" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Print" +msgstr "Imprimer" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_x +msgid "Print Position X" +msgstr "Position X pour l'impression" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_y +msgid "Print Position Y" +msgstr "Position Y pour l'impression" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Problem in the configuration of the due VAT boxes. This should never happen." +msgstr "" +"Problème dans la configuration des cases de TVA due. Cela ne devrait jamais " +"arriver." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_box_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_push_box_id +msgid "Push Box" +msgstr "Case poussée" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Push Compute" +msgstr "Calcul poussé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_rate +msgid "Push Rate" +msgstr "Taux poussé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_sequence +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_push_sequence +msgid "Push Sequence" +msgstr "Séquence poussée" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__qty +msgid "Quantity (QTY)" +msgstr "Quantité (QTY)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__3 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__3 +msgid "Quarterly" +msgstr "Trimestriel" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__amount +msgid "Reimbursement Amount" +msgstr "Montant de remboursement" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_comment_dgfip +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +#, python-format +msgid "Reimbursement Comment for DGFIP" +msgstr "Commentaire remboursement pour la DGFIP" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_min_amount +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__min_amount +msgid "Reimbursement Min Amount" +msgstr "Montant minimum de remboursement" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__reimbursement_type +msgid "Reimbursement Type" +msgstr "Type de remboursement" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Remove Credit VAT Reimbursement" +msgstr "Retrait de la demande de remboursement de TVA" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Report" +msgstr "Rapport" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__line_ids +msgid "Return Lines" +msgstr "Lignes de déclaration" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__2 +msgid "Second Page" +msgstr "Deuxième page" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__display_type__section +msgid "Section" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__sent +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Sent" +msgstr "Envoyé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__sequence +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_sequence +msgid "Sequence" +msgstr "Séquence" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_show_button +msgid "Show VAT Credit Reimbursement Button" +msgstr "Afficher le bouton de remboursement de crédit de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_vat_exigibility_update__update_type__date +msgid "Since Specific Date" +msgstr "Depuis une date particulière" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__origin_move_id +msgid "Source Invoice" +msgstr "Facture d'origine" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__origin_move_partner_id +msgid "Source Invoice Partner" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__start_date +msgid "Start Date" +msgstr "Date de début" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__state +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__state +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "State" +msgstr "État" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__display_type__sub_section +msgid "Sub-Section" +msgstr "Sous-section" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_tax +msgid "Tax" +msgstr "Taxe" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' has an account for invoice (%s) which is different from the account " +"for refund (%s). This scenario not supported." +msgstr "" +"La taxe '%s' a un compte pour les factures (%s) différent du compte pour les " +"avoirs (%s). Ce scénario n'est pas supporté." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' should have only one distribution line for credit notes configured " +"with an account and with '100%% of tax'." +msgstr "" +"La taxe '%s' ne devrait avoir qu'une seule ligne de distribution pour les " +"avoirs configurée avec un compte comptable et avec '100%% de la taxe'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' should have only one distribution line for invoices configured with " +"an account and with '100%% of tax'." +msgstr "" +"La taxe '%s' ne devrait avoir qu'une seule ligne de distribution pour les " +"factures configurée avec un compte comptable et avec '100%% de la taxe'." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_extracom +msgid "Taxed Operations - Extracom Autoliquidation" +msgstr "Opérations taxées - Autoliquidation extracom" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_france +msgid "Taxed Operations - France" +msgstr "Opérations taxées - France" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_intracom_product +msgid "Taxed Operations - Intracom Autoliquidation Products" +msgstr "Opérations taxées - Autoliquidation intracom de biens" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_intracom_service +msgid "Taxed Operations - Intracom Autoliquidation Services" +msgstr "Opérations taxées - Autoliquidation intracom de services" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_fiscal_position_template +msgid "Template for Fiscal Position" +msgstr "Modèle de position fiscale" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_char +msgid "Text" +msgstr "Texte" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The Due VAT box '%s' has '%s' configured as Due VAT Base box, but it has a " +"different type." +msgstr "" +"La case de TVA due '%s' a pour case de base de TVA due '%s' mais elle a un " +"type différent." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_due_vat_rate_positive +msgid "The Due VAT rate must be positive." +msgstr "Le taux de TVA due doit être positif." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_due_vat_rate_max +msgid "The Due VAT rate must be under 10000." +msgstr "Le taux de TVA due doit être inférieur à 10000." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The Journal Entry of this VAT return has been cancelled. You should set it " +"back to draft." +msgstr "" +"La pièce comptable de cette déclaration de TVA a été annulée. Vous devez la " +"remettre en brouillon." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The Journal Entry of this VAT return has been deleted." +msgstr "La pièce comptable de cette déclaration de TVA a été supprimée." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The balance of account '%s' is %s. In France, it should be a integer amount." +msgstr "" +"Le solde du compte '%s' est de %s. En France, ce devrait être un nombre " +"entier." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The balance of account '%s' is %s. It should always be positive." +msgstr "Le solde du compte '%s' est %s. Ce devrait être un montant positif." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' has a negative switch box but it's EDI Type is not 'MOA'." +msgstr "" +"La case '%s' a une case de basculement si négatif mais son type EDI n'est " +"pas 'MOA'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The box '%s' is the negative switch box of '%s' but it's EDI Type is not " +"'MOA'." +msgstr "" +"La case '%s' est la case de basculement si négatif de la case '%s' mais son " +"type EDI n'est pas 'MOA'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have a code." +msgstr "La case '%s' doit avoir un code." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have an EDI code." +msgstr "La case '%s' doit avoir un code EDI." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have an EDI type." +msgstr "La case '%s' doit avoir un type EDI." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "The creation date must be in the past." +msgstr "La date de création doit être dans le passé." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "The date cannot be in the future." +msgstr "La date ne peut pas être dans le futur." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The declaration %s doesn't contain any line." +msgstr "La déclaration %s ne contient aucune ligne." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "The event date must be in the past." +msgstr "La date de l'évênement doit être dans le passé." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The field '%s' is too long: it has %d caracters whereas the maximum is %d " +"caracters." +msgstr "" +"Le champ '%s' est trop long : il compte %d caractères alors que le maximum " +"est de %d caractères." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The field 'Due VAT Base' is set for box '%s' which is not a Due VAT box." +msgstr "" +"La case '%s' a une valeur pour le champ 'Base de TVA due' alors que ce n'est " +"pas une case de TVA due." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The journal entry '%s' generated by the VAT return cannot be deleted because " +"it is already posted." +msgstr "" +"La pièce comptable '%s' générée par la déclaration de TVA ne peut pas être " +"supprimée car elle est déjà comptabilisée." + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_form +msgid "" +"The logs lines below have a negative total, so they were moved from their " +"original box(es) to this box and the sign of the total has been inverted." +msgstr "" +"Les lignes de log ci-dessous ont un total négatif, donc elles ont été " +"déplacées de leur(s) case(s) initiale(s) vers cette case et le signe du " +"total a été inversé." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "" +"The reimbursement amount (%d €) cannot be superior to the amount of the VAT " +"credit (%d €)." +msgstr "" +"Le montant du remboursement (%d €) ne peut pas être supérieur au montant du " +"crédit de TVA (%d €)." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "" +"The reimbursement amount (%d €) cannot be under the minimum amount (%d €)." +msgstr "" +"Le montant du remboursement (%d €) ne peut pas être inférieur au montant " +"minimum (%d €)." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The section or sub-section '%s' is not properly configured." +msgstr "La section ou sous-section '%s' n'est pas correctement configurée." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The start date (%s) must be the first day of a quarter." +msgstr "La date de début (%s) doit être le premier jour d'un trimestre." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The start date (%s) must be the first day of the month." +msgstr "La date de début (%s) doit être le premier jour d'un mois." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The value of line '%s' (%d) is negative." +msgstr "La valeur de la ligne '%s' (%d) est négative." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The value of line '%s' (%d) is over 100." +msgstr "La valeur de la ligne '%s' (%d) est supérieure à 100." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There are %d accounts %s %s in the chart of account of company '%s'. This " +"scenario is not supported." +msgstr "" +"Il y a %d comptes %s %s dans le plan comptable de la société '%s'. Ce " +"scénario n'est pas supporté." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There are still On Payment taxes in company '%s'. To handle on payment VAT, " +"this module uses a different implementation than the native solution based " +"on a configuration parameter on taxes." +msgstr "" +"Il y a encore des taxes sur encaissement dans la société '%s'. Pour la " +"gestion de la TVA sur encaissement, ce module utilise une implémentation " +"différente de l'implémentation native qui est basée sur un paramètre de " +"configuration de la taxe." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_unique_page_x_y +msgid "There is already a box at this position!" +msgstr "Il y a déjà une case à cette position !" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "There is no account %s %s in the chart of account of company '%s'." +msgstr "" +"Il n'y a pas de compte %s %s dans le plan comptable de la société '%s'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There is/are %d draft journal entry/entries dated before %s. You should post " +"this/these journal entry/entries or delete it/them." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__3 +msgid "Third Page" +msgstr "Troisième page" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_edi_code_form_unique +msgid "This EDI code already exists for this form." +msgstr "Ce code EDI existe déjà pour ce formulaire." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_nref_code_unique +msgid "This N-REF code already exists." +msgstr "Ce code N-REF existe déjà." + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "" +"This VAT return has been marked as sent. Are you sure you want to go back to " +"Manual Lines?" +msgstr "" +"Cette déclaration de TVA a été marquée comme envoyée. Êtes-vous sûre que " +"vous souhaitez revenir à l'étape des lignes manuelles ?" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_code_form_unique +msgid "This code already exists for this form." +msgstr "Ce code existe déjà pour ce formulaire." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_bank_statement_line__fiscal_position_fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_fiscal_position__fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_move__fiscal_position_fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_payment__fiscal_position_fr_vat_type +msgid "This field is used by the French VAT return module" +msgstr "Ce champ est utilisé par le module de déclaration de TVA française." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_return_line_unique_return_box +msgid "This line already exists!" +msgstr "Cette ligne existe déjà !" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_sequence_unique +msgid "This sequence already exists." +msgstr "Cette séquence existe déjà." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_total +msgid "Total Deductible VAT" +msgstr "Total de TVA déductible" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_total +msgid "Total Due VAT" +msgstr "Total de TVA due" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__box_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_box_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Type not set on fiscal position '%s'. It must be set on all fiscal positions." +msgstr "" +"Le type n'est pas renseigné sur la position fiscale '%s'. Il doit être " +"renseigné sur toutes les positions fiscales." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__unpaid_vat_on_payment +msgid "Unpaid VAT on Payment" +msgstr "TVA sur encaissement non payé" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_extracom +msgid "Untaxed Operations - Extracom" +msgstr "Opérations non taxées - Extracom" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_france_exo +msgid "Untaxed Operations - France Exonerated" +msgstr "Opérations non taxées - France exonéré" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_intracom_b2b +msgid "Untaxed Operations - Intracom B2B" +msgstr "Opérations non taxées - Intracom B2B" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_intracom_b2c +msgid "Untaxed Operations - Intracom B2C" +msgstr "Opérations non taxées - Intracom B2C" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__update_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.res_config_settings_view_form +msgid "Update" +msgstr "Mettre à jour" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_action +msgid "Update Company VAT Exigibility" +msgstr "Mise à jour du régime de TVA de la société" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_update_lock_dates +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_update_lock_dates +msgid "Update Lock Date upon VAT Return Validation" +msgstr "" +"MAJ des dates de verrouillage suite à la validation de la déclaration de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__update_date +msgid "Update Since" +msgstr "Mise à jour depuis" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT Amount %s, Rate %.2f%%, Base %s" +msgstr "Montant de TVA %s, Taux %.2f%%, Base %s" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT Amount %s, Rate %.2f%%, Base %s, Product Ratio %.2f%%, Product Base %s" +msgstr "" +"Montant de TVA %s, Taux %.2f%%, Base %s, Ratio produit %.2f%%, Base produit " +"%s" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT Amount %s, Rate %.2f%%, Base %s, Service Ratio %.2f%%, Service Base %s" +msgstr "" +"Montant de TVA %s, Taux %.2f%%, Base %s, Ratio service %.2f%%, Base service " +"%s" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__rate +msgid "VAT Amount / VAT Rate" +msgstr "Montant de TVA / Taux de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__vat_credit_total +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__vat_credit_total +msgid "VAT Credit Total" +msgstr "Total crédit de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_exigibility +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_exigibility +msgid "VAT Exigibility" +msgstr "Régime de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__vat_periodicity +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_periodicity +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_periodicity +msgid "VAT Periodicity" +msgstr "Périodicité de la TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__due_vat_rate +msgid "VAT Rate x100" +msgstr "Taux de TVA x100" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__vat_reimbursement +msgid "VAT Reimbursement" +msgstr "Remboursement de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_action +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__parent_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__parent_parent_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__return_id +#: model:ir.ui.menu,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_menu +msgid "VAT Return" +msgstr "Déclaration de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__parent_id +msgid "VAT Return Line" +msgstr "Ligne de déclaration de TVA" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_line +msgid "VAT Return Line for France (CA3 line)" +msgstr "Ligne de déclaration de TVA française (Ligne de CA3)" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT amount %s, Product Ratio %.2f%%, VAT Product Amount %s" +msgstr "Montant de TVA %s, Ratio biens %.2f%%, Montant de TVA sur les biens %s" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT amount %s, Rate %.2f%%, Base %s" +msgstr "Montant de TVA %s, Taux %.2f%%, Base %s" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.view_invoice_tree +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.view_move_form +msgid "VAT on Payment" +msgstr "TVA sur encaissement" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_bank_statement_line__out_vat_on_payment +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__out_vat_on_payment +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_payment__out_vat_on_payment +msgid "VAT on Payment for Customer Invoices" +msgstr "Facture client en TVA sur encaissement" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_form +msgid "Validate" +msgstr "Valider" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value +msgid "Value" +msgstr "Valeur" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_bool +msgid "Value (Y/N)" +msgstr "Valeur (O/N)" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_float +msgid "Value Before Rounding" +msgstr "Valeur avant arrondi" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Wrong accounting method on Due VAT box '%s': it should be 'Debit'." +msgstr "" +"Mauvaise méthode de comptabilisation pour la case de TVA due '%s' : ce " +"devrait être 'Débit'." + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "Wrong value for the new VAT exigibility." +msgstr "Mauvaise valeur pour le nouveau régime de TVA." + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__12 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__12 +msgid "Yearly" +msgstr "Annuelle" + +#, python-format +#~ msgid "Bad configuration on regular purchase tax '%s'." +#~ msgstr "Mauvaise configuration pour la taxe d'achat normale '%s'." + +#~ msgid "Generate Selenium File" +#~ msgstr "Générer le fichier Selenium" + +#, python-format +#~ msgid "Missing NREF code on box '%s'." +#~ msgstr "Code NREF manquant sur la case '%s'." + +#, python-format +#~ msgid "Missing SIRET on company '%s'." +#~ msgstr "SIRET manquant sur la société '%s'." + +#, python-format +#~ msgid "" +#~ "Only MOA fields can be exported to Selenium for the moment. It is not the " +#~ "case of box '%s'." +#~ msgstr "" +#~ "Seuls les champs MOA peuvent être exportés vers Selenium pour le moment. " +#~ "Ce n'est pas le cas pour la case '%s'." + +#~ msgid "Selenium Attachment" +#~ msgstr "Pièce jointe Selenium" + +#~ msgid "Selenium File" +#~ msgstr "Fichier Selenium" + +#~ msgid "Selenium Filename" +#~ msgstr "Nom de fichier Selenium" + +#, python-format +#~ msgid "Selenium IDE File" +#~ msgstr "Fichier Selenium IDE" + +#, python-format +#~ msgid "Selenium cannot work when there are 3310-A lines." +#~ msgstr "Selenium ne fonctionne pas quand il y a des lignes 3310-A." + +#, python-format +#~ msgid "Selenium export only support monthly CA3 returns for the moment." +#~ msgstr "" +#~ "L'export Selenium ne fonctionne que pour les déclarations mensuelles pour " +#~ "le moment." + +#, python-format +#~ msgid "" +#~ "There is/are %d unposted journal entry/entries dated before %s. You " +#~ "should post this/these journal entry/entries or delete it/them." +#~ msgstr "" +#~ "Il y a %d pièce(s) comptable(s) non comptabilisée(s) datée(s) d'avant le " +#~ "%s. Vous devriez comptabiliser cette/ces pièce(s) comptable(s) ou la/les " +#~ "supprimer." diff --git a/l10n_fr_account_vat_return/i18n/l10n_fr_account_vat_return.pot b/l10n_fr_account_vat_return/i18n/l10n_fr_account_vat_return.pot new file mode 100644 index 000000000..84a08d06d --- /dev/null +++ b/l10n_fr_account_vat_return/i18n/l10n_fr_account_vat_return.pot @@ -0,0 +1,1833 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_account_vat_return +# +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_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"%d%% of the invoice/refund was unpaid on %s, VAT amount %s => Unpaid VAT " +"amount %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "%s (add)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__form_code__3310a +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "3310-A" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__form_code__3310ca3 +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "3310-CA3" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_return_start_company_uniq +msgid "A VAT return with the same start date already exists in this company!" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "A regular sale " +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"A single box with type '%s' should exists, but there are %d box(es) of that " +"type. This should never happen." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_account +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__manual_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__account_id +msgid "Account" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is a due VAT auto-liquidation account. So it should be empty at" +" the start of the VAT period, but the balance on the last day of the " +"previous period is %s." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Account '%s' is present in the mapping of several fiscal positions." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used as due VAT account on several auto-liquidation taxes " +"for different rates (%.2f%% and %.2f%%)." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used for several kinds of deductible VAT taxes (%s and %s)." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Account '%s' is used on several sale VAT taxes for different rates (%.2f%% " +"and %.2f%%)." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_chart_template +msgid "Account Chart Template" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__accounting_method +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_accounting_method +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Accounting Method" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__active +msgid "Active" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_ids +msgid "Activities" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_state +msgid "Activity State" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__amount +msgid "Amount" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__manual_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__analytic_account_id +msgid "Analytic Account" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_expense_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_expense_analytic_account_id +msgid "Analytic Account for Expense Adjustment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_income_analytic_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_income_analytic_account_id +msgid "Analytic Account for Income Adjustment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Archived" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__fr_vat_autoliquidation +msgid "Auto-Liquidation" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Auto-liquidation tax '%s' is not present in the tax mapping of any fiscal " +"position." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__auto +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Automatic Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Back to Manual Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Based on invoice" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Based on payment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__cci_tbx +msgid "Boolean (CCI/TBX)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/res_company.py:0 +#, python-format +msgid "Both (automatic)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_id +msgid "Box" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Box '%s' doesn't have a push box, so it's push rate should be 0." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' doesn't have an accounting method, so it should not have any " +"accounting parameter." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Box '%s' has a negative value (%s) but it doesn't have a negative switch " +"box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' has a push box '%s' that is configured as manual or not pushed " +"total." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Box '%s' has a push box but is missing a push sequence." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Box '%s' is configured with Manual Account Code '%s', but there are no " +"accounts that start with this code in company '%s'. You may want to setup a " +"specific account on that box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Box '%s' should not have an accounting method considering it's box type." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__box +msgid "Box Value" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_id +msgid "CA3 Attachment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_datas +msgid "CA3 File" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__ca3_attachment_name +msgid "CA3 Filename" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_form +msgid "Cancel" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Cannot delete VAT return '%s' because it is not in 'Manual Lines' state." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_vat_exigibility_update +msgid "Change Company VAT Exigibility" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__ftx +msgid "Char (FTX)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_code +msgid "Code" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__comment_dgfip +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__reimbursement_comment_dgfip +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +#, python-format +msgid "Comment for DGFIP" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__company_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__company_id +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Company" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__bank_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_bank_account_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_bank_account_id +msgid "Company Bank Account" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_currency_id +msgid "Company Currency" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__company_partner_id +msgid "Company Partner" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_res_company__fr_vat_bank_account_id +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_bank_account_id +msgid "" +"Company bank account used to pay VAT or receive credit VAT reimbursements." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__log_ids +msgid "Computation Details" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_form +msgid "Computation and Accounting Details" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__compute_type +msgid "Compute Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_line_log +msgid "Compute log of VAT Return Line for France (CA3 line)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__computed_base +msgid "Computed Base" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__computed_vat_amount +msgid "Computed VAT Amount" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__create_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__create_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_first_creation_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__first_creation_date +msgid "Creation Date" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Creation Date is not set." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__accounting_method__credit +msgid "Credit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__credit_deferment +msgid "Credit Deferment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_action +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Credit VAT Reimbursement" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Credit VAT Reimbursement removed." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Credit VAT reimbursement of %d € submitted." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__company_currency_id +msgid "Currency" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__current_fr_vat_exigibility +msgid "Current VAT Exigibility" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__accounting_method__debit +msgid "Debit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_asset +msgid "Deductible VAT Amount Asset" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_other +msgid "Deductible VAT Amount Other" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__display_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_display_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Display Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "" +"Do you confirm that you have validated the VAT return on impots.gouv.fr?" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat +msgid "Due VAT Amount" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__due_vat_base_box_id +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_base +msgid "Due VAT Base" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_intracom_product +msgid "Due VAT Intracom Products" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_monaco +msgid "Due VAT Monaco" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"Due VAT box '%s' has print Y %d whereas Base Due VAT box '%s' has print Y " +"%d. They should be on the same line." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "EDI" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__edi_code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_edi_code +msgid "EDI Code" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__edi_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_edi_type +msgid "EDI Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "EDI type not supported for box '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__end_date +msgid "End Date" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__end_total_debit +msgid "End Total Credit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__end_total_credit +msgid "End Total Debit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__balance +msgid "Ending Balance" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Error in the generation of the computation and accounting details of box " +"'%s': this box has an accounting method but the account is not set." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_end_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__end_date +msgid "Event Date" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "Event Date is not set." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_reimbursement +msgid "FR VAT Reimbursement (3519)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__1 +msgid "First Page" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_fiscal_position +msgid "Fiscal Position" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_bank_statement_line__fiscal_position_fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__fiscal_position_fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_payment__fiscal_position_fr_vat_type +msgid "Fiscal Position Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__form_code +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_form_code +msgid "Form" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.res_config_settings_view_form +msgid "France VAT" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_box_action +#: model:ir.ui.menu,name:l10n_fr_account_vat_return.l10n_fr_account_vat_box_menu +msgid "France VAT Boxes" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return +msgid "France VAT Return (CA3)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_box +msgid "France VAT Return (CA3) box" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_vat_exigibility_update__update_type__from_start +msgid "From the Start" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__full_label +msgid "Full Label" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Generate Automatic Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_code +msgid "Generic Account Code" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_icon +msgid "Icon" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__account_id +msgid "" +"If not set, Odoo will use the first account that starts with the Generic " +"Account Code. If set, Odoo will ignore the Generic Account Code and use this" +" account." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__negative_switch_box_id +msgid "" +"If the amount of this box is negative, its lines will be transfered to " +"another box with a sign inversion." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "" +"If you don't want to change the VAT Exigibility of company '%s', click on " +"the Cancel button." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_manual_int +msgid "Integer Value" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Invoice/refund is unpaid, Unpaid VAT amount %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Invoice/refund was unpaid on %s, Unpaid VAT amount %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_move +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__move_id +msgid "Journal Entry" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Journal entry '%s' uses an intracom autoliquidation due VAT account but is " +"not a supplier invoice/refund. This scenario is not supported." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_journal_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_journal_id +msgid "Journal for VAT Journal Entry" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Journal for VAT Journal Entry is not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_name +msgid "Label" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_account____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_chart_template____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_partial_reconcile____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_tax____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__write_uid +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__write_date +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__manual +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__manual +msgid "Manual" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__manual +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Manual Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Mark as sent" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_ids +msgid "Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Missing Due VAT Base on box '%s' which is a Due VAT box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Missing account mapping on fiscal position '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Missing print caracteristics on box '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Monaco customer '%s', VAT amount %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__moa +msgid "Monetary (MOA)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__1 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__1 +msgid "Monthly" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__nref_code +msgid "N-REF Code" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__nad +msgid "Name and address (NAD)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Name or Code" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__negative_switch +msgid "Negative Switch" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__negative_switch_box_id +msgid "Negative Switch Box" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__new_fr_vat_exigibility +msgid "New VAT Exigibility" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "No Due VAT box found for VAT rate %.2f%%." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"No account mapping on fiscal position %s. If this fiscal position " +"is not only used for purchase but also for sale, you must configure an " +"account mapping on revenue accounts." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "No sections" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__no_push_total_credit +msgid "Not Pushed Total Credit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__no_push_total_debit +msgid "Not Pushed Total Debit" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__note +msgid "Note" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_log_form +msgid "Notes" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"On box '%s', the Account Code is not set. You may want to setup a specific " +"account on that box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_page +msgid "Page" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_partial_reconcile +msgid "Partial Reconcile" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_company_partner_id +msgid "Partner" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__pcd +msgid "Percentage (PCD)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__name +msgid "Period" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__period_balance +msgid "Period Balance" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Post" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__posted +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Posted" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Print" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_x +msgid "Print Position X" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__print_y +msgid "Print Position Y" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Problem in the configuration of the due VAT boxes. This should never happen." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_box_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_push_box_id +msgid "Push Box" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Push Compute" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_rate +msgid "Push Rate" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__push_sequence +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_push_sequence +msgid "Push Sequence" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__edi_type__qty +msgid "Quantity (QTY)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__3 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__3 +msgid "Quarterly" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__amount +msgid "Reimbursement Amount" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_comment_dgfip +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +#, python-format +msgid "Reimbursement Comment for DGFIP" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_min_amount +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__min_amount +msgid "Reimbursement Min Amount" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__reimbursement_type +msgid "Reimbursement Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "Remove Credit VAT Reimbursement" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_form +msgid "Report" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__line_ids +msgid "Return Lines" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__2 +msgid "Second Page" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__display_type__section +msgid "Section" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__state__sent +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "Sent" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__sequence +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_sequence +msgid "Sequence" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__reimbursement_show_button +msgid "Show VAT Credit Reimbursement Button" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_vat_exigibility_update__update_type__date +msgid "Since Specific Date" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__origin_move_id +msgid "Source Invoice" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__origin_move_partner_id +msgid "Source Invoice Partner" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__start_date +msgid "Start Date" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__state +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__state +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_search +msgid "State" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__display_type__sub_section +msgid "Sub-Section" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_tax +msgid "Tax" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' has an account for invoice (%s) which is different from the account" +" for refund (%s). This scenario not supported." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' should have only one distribution line for credit notes configured " +"with an account and with '100%% of tax'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Tax '%s' should have only one distribution line for invoices configured with" +" an account and with '100%% of tax'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_extracom +msgid "Taxed Operations - Extracom Autoliquidation" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_france +msgid "Taxed Operations - France" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_intracom_product +msgid "Taxed Operations - Intracom Autoliquidation Products" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__taxed_op_autoliq_intracom_service +msgid "Taxed Operations - Intracom Autoliquidation Services" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_account_fiscal_position_template +msgid "Template for Fiscal Position" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_char +msgid "Text" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The Due VAT box '%s' has '%s' configured as Due VAT Base box, but it has a " +"different type." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_due_vat_rate_positive +msgid "The Due VAT rate must be positive." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_due_vat_rate_max +msgid "The Due VAT rate must be under 10000." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The Journal Entry of this VAT return has been cancelled. You should set it " +"back to draft." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The Journal Entry of this VAT return has been deleted." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The balance of account '%s' is %s. In France, it should be a integer amount." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The balance of account '%s' is %s. It should always be positive." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' has a negative switch box but it's EDI Type is not 'MOA'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The box '%s' is the negative switch box of '%s' but it's EDI Type is not " +"'MOA'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have a code." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have an EDI code." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The box '%s' must have an EDI type." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "The creation date must be in the past." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "The date cannot be in the future." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The declaration %s doesn't contain any line." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "The event date must be in the past." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The field '%s' is too long: it has %d caracters whereas the maximum is %d " +"caracters." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "" +"The field 'Due VAT Base' is set for box '%s' which is not a Due VAT box." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The journal entry '%s' generated by the VAT return cannot be deleted because" +" it is already posted." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_line_form +msgid "" +"The logs lines below have a negative total, so they were moved from their " +"original box(es) to this box and the sign of the total has been inverted." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "" +"The reimbursement amount (%d €) cannot be superior to the amount of the VAT " +"credit (%d €)." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py:0 +#, python-format +msgid "" +"The reimbursement amount (%d €) cannot be under the minimum amount (%d €)." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "The section or sub-section '%s' is not properly configured." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The start date (%s) must be the first day of a quarter." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The start date (%s) must be the first day of the month." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The value of line '%s' (%d) is negative." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The value of line '%s' (%d) is over 100." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There are %d accounts %s %s in the chart of account of company '%s'. This " +"scenario is not supported." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There are still On Payment taxes in company '%s'. To handle on payment VAT, " +"this module uses a different implementation than the native solution based " +"on a configuration parameter on taxes." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_unique_page_x_y +msgid "There is already a box at this position!" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "There is no account %s %s in the chart of account of company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"There is/are %d draft journal entry/entries dated before %s. You should post" +" this/these journal entry/entries or delete it/them." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__print_page__3 +msgid "Third Page" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_edi_code_form_unique +msgid "This EDI code already exists for this form." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_nref_code_unique +msgid "This N-REF code already exists." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_form +msgid "" +"This VAT return has been marked as sent. Are you sure you want to go back to" +" Manual Lines?" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_code_form_unique +msgid "This code already exists for this form." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_bank_statement_line__fiscal_position_fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_fiscal_position__fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_move__fiscal_position_fr_vat_type +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_account_payment__fiscal_position_fr_vat_type +msgid "This field is used by the French VAT return module" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_return_line_unique_return_box +msgid "This line already exists!" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.constraint,message:l10n_fr_account_vat_return.constraint_l10n_fr_account_vat_box_sequence_unique +msgid "This sequence already exists." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__deductible_vat_total +msgid "Total Deductible VAT" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__due_vat_total +msgid "Total Due VAT" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position__fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_fiscal_position_template__fr_vat_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__box_type +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__box_box_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_box_search +msgid "Type" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Type not set on fiscal position '%s'. It must be set on all fiscal " +"positions." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__unpaid_vat_on_payment +msgid "Unpaid VAT on Payment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_extracom +msgid "Untaxed Operations - Extracom" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_france_exo +msgid "Untaxed Operations - France Exonerated" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_intracom_b2b +msgid "Untaxed Operations - Intracom B2B" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__untaxed_op_intracom_b2c +msgid "Untaxed Operations - Intracom B2C" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__update_type +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_form +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.res_config_settings_view_form +msgid "Update" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_vat_exigibility_update_action +msgid "Update Company VAT Exigibility" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_update_lock_dates +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_update_lock_dates +msgid "Update Lock Date upon VAT Return Validation" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_vat_exigibility_update__update_date +msgid "Update Since" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT Amount %s, Rate %.2f%%, Base %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT Amount %s, Rate %.2f%%, Base %s, Product Ratio %.2f%%, Product Base %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT Amount %s, Rate %.2f%%, Base %s, Service Ratio %.2f%%, Service Base %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return_line_log__compute_type__rate +msgid "VAT Amount / VAT Rate" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__vat_credit_total +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__vat_credit_total +msgid "VAT Credit Total" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_exigibility +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_exigibility +msgid "VAT Exigibility" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__vat_periodicity +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_company__fr_vat_periodicity +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_res_config_settings__fr_vat_periodicity +msgid "VAT Periodicity" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_box__due_vat_rate +msgid "VAT Rate x100" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_box__box_type__vat_reimbursement +msgid "VAT Reimbursement" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.actions.act_window,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_action +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__parent_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__parent_parent_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_reimbursement__return_id +#: model:ir.ui.menu,name:l10n_fr_account_vat_return.l10n_fr_account_vat_return_menu +msgid "VAT Return" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line_log__parent_id +msgid "VAT Return Line" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model,name:l10n_fr_account_vat_return.model_l10n_fr_account_vat_return_line +msgid "VAT Return Line for France (CA3 line)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT amount %s, Product Ratio %.2f%%, VAT Product Amount %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT amount %s, Rate %.2f%%, Base %s" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.view_invoice_tree +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.view_move_form +msgid "VAT on Payment" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_bank_statement_line__out_vat_on_payment +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_move__out_vat_on_payment +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_account_payment__out_vat_on_payment +msgid "VAT on Payment for Customer Invoices" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return.l10n_fr_account_vat_return_reimbursement_form +msgid "Validate" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value +msgid "Value" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_bool +msgid "Value (Y/N)" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return_line__value_float +msgid "Value Before Rounding" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields,help:l10n_fr_account_vat_return.field_l10n_fr_account_vat_return__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py:0 +#, python-format +msgid "Wrong accounting method on Due VAT box '%s': it should be 'Debit'." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: code:addons/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py:0 +#, python-format +msgid "Wrong value for the new VAT exigibility." +msgstr "" + +#. module: l10n_fr_account_vat_return +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__l10n_fr_account_vat_return__vat_periodicity__12 +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return.selection__res_company__fr_vat_periodicity__12 +msgid "Yearly" +msgstr "" diff --git a/l10n_fr_account_vat_return/migrations/0.0.0/pre-migration.py b/l10n_fr_account_vat_return/migrations/0.0.0/pre-migration.py new file mode 100644 index 000000000..a7898e895 --- /dev/null +++ b/l10n_fr_account_vat_return/migrations/0.0.0/pre-migration.py @@ -0,0 +1,18 @@ +# Copyright 2023 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# According to odoo/modules/migration.py, a special folder named '0.0.0' +# can contain scripts that will be run on any version change + + +def migrate(cr, version): + # When data/l10n.fr.account.vat.box.csv is updated, + # a box can take the previous value of another box located + # in a row after it in the CSV, so it hits the SQL constraint before + # reaching/updating the other box in the CSV + # Set I set to null the fields that are in a unique SQL constraint + cr.execute( + "UPDATE l10n_fr_account_vat_box SET sequence=null, nref_code=null, " + "print_x=null, print_y=null, print_page=null, code=null" + ) diff --git a/l10n_fr_account_vat_return/models/__init__.py b/l10n_fr_account_vat_return/models/__init__.py new file mode 100644 index 000000000..5ab60bc21 --- /dev/null +++ b/l10n_fr_account_vat_return/models/__init__.py @@ -0,0 +1,8 @@ +from . import res_company +from . import account_account +from . import account_tax +from . import account_fiscal_position +from . import l10n_fr_account_vat_box +from . import l10n_fr_account_vat_return +from . import account_move +from . import account_partial_reconcile diff --git a/l10n_fr_account_vat_return/models/account_account.py b/l10n_fr_account_vat_return/models/account_account.py new file mode 100644 index 000000000..7e63338af --- /dev/null +++ b/l10n_fr_account_vat_return/models/account_account.py @@ -0,0 +1,18 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountAccount(models.Model): + _inherit = "account.account" + + def _fr_vat_get_balance(self, domain_key, speedy): + amlo = self.env["account.move.line"] + rg_res = amlo.read_group( + speedy[domain_key] + [("account_id", "=", self.id)], ["balance"], [] + ) + balance = rg_res and rg_res[0]["balance"] or 0 + balance = speedy["currency"].round(balance) + return balance diff --git a/l10n_fr_account_vat_return/models/account_fiscal_position.py b/l10n_fr_account_vat_return/models/account_fiscal_position.py new file mode 100644 index 000000000..0869d4476 --- /dev/null +++ b/l10n_fr_account_vat_return/models/account_fiscal_position.py @@ -0,0 +1,49 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountFiscalPosition(models.Model): + _inherit = "account.fiscal.position" + + fr_vat_type = fields.Selection( + "_get_fr_vat_type_sel", + string="Type", + help="This field is used by the French VAT return module", + ) + + @api.model + def _get_fr_vat_type_sel(self): + sel = [ + ("france", "France"), + ("france_vendor_vat_on_payment", "France Vendor VAT on Payment"), + ("intracom_b2b", "Intra-EU B2B"), + ("intracom_b2c", "Intra-EU B2C over 10k€ limit"), + ("extracom", "Extra-EU"), + ("france_exo", "France Exonerated"), + ] + return sel + + +class AccountFiscalPositionTemplate(models.Model): + _inherit = "account.fiscal.position.template" + + fr_vat_type = fields.Selection( + "_get_fr_vat_type_sel", + string="Type", + ) + + @api.model + def _get_fr_vat_type_sel(self): + return self.env["account.fiscal.position"]._get_fr_vat_type_sel() + + +class AccountChartTemplate(models.Model): + _inherit = "account.chart.template" + + def _get_fp_vals(self, company, position): + vals = super()._get_fp_vals(company, position) + vals["fr_vat_type"] = position.fr_vat_type + return vals diff --git a/l10n_fr_account_vat_return/models/account_move.py b/l10n_fr_account_vat_return/models/account_move.py new file mode 100644 index 000000000..3dc6f94b1 --- /dev/null +++ b/l10n_fr_account_vat_return/models/account_move.py @@ -0,0 +1,57 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + # I have to write 2 different fields because invalidation is not + # the same and we want to allow manual modification on vendor bills + out_vat_on_payment = fields.Boolean( + string="VAT on Payment for Customer Invoices", + compute="_compute_out_vat_on_payment", + store=True, + ) + fiscal_position_fr_vat_type = fields.Selection( + related="fiscal_position_id.fr_vat_type", + store=True, + string="Fiscal Position Type", + ) + + def _fr_vat_exigibility_auto_compute_vat_on_payment(self): + # This method is designed to be inherited + # so that you can tune the algo when fr_vat_exigibility == "auto" + self.ensure_one() + vat_on_payment = False + product_total = 0.0 + service_total = 0.0 + for line in self.invoice_line_ids: + if not line.display_type and line.product_id: + if line.product_id.type == "service": + service_total += line.price_subtotal + else: + product_total += line.price_subtotal + if self.currency_id.compare_amounts(service_total, product_total) > 0: + vat_on_payment = True + return vat_on_payment + + @api.depends( + "move_type", "invoice_line_ids.product_id", "invoice_line_ids.price_subtotal" + ) + def _compute_out_vat_on_payment(self): + for move in self: + vat_on_payment = False + if move.move_type in ("out_invoice", "out_refund"): + if move.company_id.fr_vat_exigibility == "on_payment": + vat_on_payment = True + elif move.company_id.fr_vat_exigibility == "auto": + vat_on_payment = ( + move._fr_vat_exigibility_auto_compute_vat_on_payment() + ) + move.out_vat_on_payment = vat_on_payment + + def _collect_tax_cash_basis_values(self): + return None diff --git a/l10n_fr_account_vat_return/models/account_partial_reconcile.py b/l10n_fr_account_vat_return/models/account_partial_reconcile.py new file mode 100644 index 000000000..b554f949a --- /dev/null +++ b/l10n_fr_account_vat_return/models/account_partial_reconcile.py @@ -0,0 +1,15 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountPartialReconcile(models.Model): + _inherit = "account.partial.reconcile" + + def _create_tax_cash_basis_moves(self): + return self.env["account.move"] + + def _collect_tax_cash_basis_values(self): + return {} diff --git a/l10n_fr_account_vat_return/models/account_tax.py b/l10n_fr_account_vat_return/models/account_tax.py new file mode 100644 index 000000000..58eb7fee1 --- /dev/null +++ b/l10n_fr_account_vat_return/models/account_tax.py @@ -0,0 +1,54 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import float_is_zero + + +class AccountTax(models.Model): + _inherit = "account.tax" + + fr_vat_autoliquidation = fields.Boolean( + compute="_compute_fr_vat_autoliquidation", store=True, string="Auto-Liquidation" + ) + + @api.depends( + "type_tax_use", + "amount_type", + "amount", + "invoice_repartition_line_ids.repartition_type", + "invoice_repartition_line_ids.account_id", + "invoice_repartition_line_ids.factor_percent", + "refund_repartition_line_ids.repartition_type", + "refund_repartition_line_ids.account_id", + "refund_repartition_line_ids.factor_percent", + ) + def _compute_fr_vat_autoliquidation(self): + atrlo = self.env["account.tax.repartition.line"] + for tax in self: + autoliquidation = False + if ( + tax.type_tax_use == "purchase" + and tax.amount_type == "percent" + and not float_is_zero(tax.amount, precision_digits=2) + ): + autoliquidation = True + for parent_field in ("invoice_tax_id", "refund_tax_id"): + lines = atrlo.search( + [ + (parent_field, "=", tax.id), + ("repartition_type", "=", "tax"), + ("account_id", "!=", False), + ] + ) + if len(lines) != 2: + autoliquidation = False + break + factor_sum = 0.0 + for line in lines: + factor_sum += line.factor_percent + if not float_is_zero(factor_sum, precision_digits=2): + autoliquidation = False + break + tax.fr_vat_autoliquidation = autoliquidation diff --git a/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py b/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py new file mode 100644 index 000000000..ce21b096f --- /dev/null +++ b/l10n_fr_account_vat_return/models/l10n_fr_account_vat_box.py @@ -0,0 +1,415 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.tools import float_is_zero + +PUSH_RATE_PRECISION = 4 + + +class L10nFrAccountVatBox(models.Model): + _name = "l10n.fr.account.vat.box" + _description = "France VAT Return (CA3) box" + _order = "sequence, id" + + sequence = fields.Integer(default=10) + active = fields.Boolean(default=True) + display_type = fields.Selection( + [ + ("section", "Section"), + ("sub_section", "Sub-Section"), + ], + ) + code = fields.Char() + name = fields.Char(string="Label", required=True) + full_label = fields.Char() + box_type = fields.Selection( + [ + ("taxed_op_france", "Taxed Operations - France"), + ( + "taxed_op_autoliq_extracom", + "Taxed Operations - Extracom Autoliquidation", + ), + ( + "taxed_op_autoliq_intracom_service", + "Taxed Operations - Intracom Autoliquidation Services", + ), + ( + "taxed_op_autoliq_intracom_product", + "Taxed Operations - Intracom Autoliquidation Products", + ), + ("untaxed_op_intracom_b2b", "Untaxed Operations - Intracom B2B"), + ("untaxed_op_intracom_b2c", "Untaxed Operations - Intracom B2C"), + ("untaxed_op_extracom", "Untaxed Operations - Extracom"), + ("untaxed_op_france_exo", "Untaxed Operations - France Exonerated"), + ("due_vat", "Due VAT Amount"), + ("due_vat_base", "Due VAT Base"), + ("due_vat_intracom_product", "Due VAT Intracom Products"), + ("due_vat_monaco", "Due VAT Monaco"), + ("due_vat_total", "Total Due VAT"), + ("no_push_total_credit", "Not Pushed Total Credit"), + ("no_push_total_debit", "Not Pushed Total Debit"), + ("end_total_debit", "End Total Credit"), + ("end_total_credit", "End Total Debit"), + ("credit_deferment", "Credit Deferment"), + ("deductible_vat_asset", "Deductible VAT Amount Asset"), + ("deductible_vat_other", "Deductible VAT Amount Other"), + ("deductible_vat_total", "Total Deductible VAT"), + ("vat_reimbursement", "VAT Reimbursement"), + ("manual", "Manual"), # boxes that accountant can select at first step + ], + string="Type", + ) + negative_switch_box_id = fields.Many2one( + "l10n.fr.account.vat.box", + help="If the amount of this box is negative, its lines will be transfered " + "to another box with a sign inversion.", + ) + accounting_method = fields.Selection( + [ + ("debit", "Debit"), + ("credit", "Credit"), + ], + ) + due_vat_rate = fields.Integer(string="VAT Rate x100") + due_vat_base_box_id = fields.Many2one( + "l10n.fr.account.vat.box", + string="Due VAT Base", + domain=[("box_type", "=", "due_vat_base")], + ) + form_code = fields.Selection( + [ + ("3310CA3", "3310-CA3"), + ("3310A", "3310-A"), + ], + string="Form", + required=True, + ) + edi_code = fields.Char(string="EDI Code") + # edi_code can't be required because of sections + edi_type = fields.Selection( + [ + ("MOA", "Monetary (MOA)"), + ("CCI_TBX", "Boolean (CCI/TBX)"), + ("PCD", "Percentage (PCD)"), + ("QTY", "Quantity (QTY)"), + ("FTX", "Char (FTX)"), + ("NAD", "Name and address (NAD)"), + ], + string="EDI Type", + ) + nref_code = fields.Char(string="N-REF Code") + print_page = fields.Selection( + [ + ("1", "First Page"), + ("2", "Second Page"), + ("3", "Third Page"), + ], + string="Page", + ) + print_x = fields.Integer("Print Position X") + print_y = fields.Integer("Print Position Y") + account_code = fields.Char(string="Generic Account Code") + account_id = fields.Many2one( + "account.account", + company_dependent=True, + domain="[('deprecated', '=', False), ('company_id', '=', current_company_id)]", + help="If not set, Odoo will use the first account that starts with the " + "Generic Account Code. If set, Odoo will ignore the Generic Account Code " + "and use this account.", + ) + # analytic_account_id = fields.Many2one( # TODO replace by distribution + # but pb company_dependent=True, + # "account.analytic.account", + # string="Analytic Account", + # company_dependent=True, + # domain="[('company_id', 'in', (False, current_company_id))]", + # ) + push_sequence = fields.Integer() + # 10: appendix lines + # 20: totals cols appendix + # 30 : Appendix to CA3 + # 40 : CA3 total TVA due + total TVA deduc + # 100 : CA3 end : total à payer + crédit à reporter + push_box_id = fields.Many2one( + "l10n.fr.account.vat.box", + domain=[("box_type", "=", "manual")], + ) + push_rate = fields.Float(digits=(16, PUSH_RATE_PRECISION)) + + _sql_constraints = [ + ("sequence_unique", "unique(sequence)", "This sequence already exists."), + ( + "code_form_unique", + "unique(form_code, code)", + "This code already exists for this form.", + ), + ( + "edi_code_form_unique", + "unique(form_code, edi_code)", + "This EDI code already exists for this form.", + ), + ("nref_code_unique", "unique(nref_code)", "This N-REF code already exists."), + ( + "due_vat_rate_positive", + "CHECK(due_vat_rate >= 0)", + "The Due VAT rate must be positive.", + ), + ( + "due_vat_rate_max", + "CHECK(due_vat_rate < 10000)", + "The Due VAT rate must be under 10000.", + ), + ( + "unique_page_x_y", + "unique(print_page, print_x, print_y)", + "There is already a box at this position!", + ), + ] + + @api.onchange("display_type") + def display_type_change(self): + if self.display_type: + self.code = False + self.box_type = False + self.accounting_method = False + self.due_vat_rate = False + self.due_vat_base_box_id = False + self.edi_code = False + self.edi_type = False + self.nref_code = False + self.print_page = False + self.print_x = False + self.print_y = False + self.account_code = False + self.account_id = False + + @api.constrains( + "edi_type", + "display_type", + "due_vat_base_box_id", + "box_type", + "accounting_method", + "account_code", + "account_id", + "push_box_id", + "push_rate", + "push_sequence", + "negative_switch_box_id", + ) + def _check_box(self): # noqa: C901 + for box in self: + if box.display_type: + if ( + box.box_type + or box.accounting_method + or not float_is_zero(self.due_vat_rate, precision_digits=2) + or self.due_vat_base_box_id + or self.edi_code + or self.edi_type + or self.nref_code + or box.print_page + or box.print_x + or box.print_y + or box.push_box_id + or box.negative_switch_box_id + ): + raise ValidationError( + _("The section or sub-section '%s' is not properly configured.") + % box.display_name + ) + else: + if not box.edi_code: + raise ValidationError( + _("The box '%s' must have an EDI code.") % box.display_name + ) + if not box.edi_type: + raise ValidationError( + _("The box '%s' must have an EDI type.") % box.display_name + ) + if box.negative_switch_box_id and box.edi_type != "MOA": + raise ValidationError( + _( + "The box '%s' has a negative switch box but it's EDI Type " + "is not 'MOA'." + ) + % box.display_name + ) + if ( + box.negative_switch_box_id + and box.negative_switch_box_id.edi_type != "MOA" + ): + raise ValidationError( + _( + "The box '%(negative_box)s' is the negative switch box of " + "'%(box)s' but it's EDI Type is not 'MOA'.", + negative_box=box.negative_switch_box_id.display_name, + box=box.display_name, + ) + ) + if not box.code and box.form_code == "3310CA3": + # on 3310-A, total boxes don't have a code + raise ValidationError( + _("The box '%s' must have a code.") % box.display_name + ) + print_data = [box.print_page, box.print_x, box.print_y] + any(print_data) + if box.form_code == "3310CA3" and not all(print_data): + raise ValidationError( + _("Missing print caracteristics on box '%s'.") + % box.display_name + ) + if box.box_type == "due_vat": + if not box.due_vat_base_box_id: + raise ValidationError( + _( + "Missing Due VAT Base on box '%s' which is a Due VAT box." + ) + % box.display_name + ) + elif box.due_vat_base_box_id.box_type != "due_vat_base": + raise ValidationError( + _( + "The Due VAT box '%(due_vat_box)s' has " + "'%(due_vat_base_box)s' configured as " + "Due VAT Base box, but it has a different type.", + due_vat_box=box.display_name, + due_vat_base_box=box.due_vat_base_box_id.display_name, + ) + ) + if box.accounting_method != "debit": + raise ValidationError( + _( + "Wrong accounting method on Due VAT box '%s': " + "it should be 'Debit'." + ) + % box.display_name + ) + if box.print_y != box.due_vat_base_box_id.print_y: + raise ValidationError( + _( + "Due VAT box '%(due_vat_box)s' has print Y " + "%(due_vat_box_print_y)d " + "whereas Due VAT Base box '%(due_vat_base_box)s' " + "has print Y %(due_vat_base_box_print_y)d. " + "They should be on the same line.", + due_vat_box=box.display_name, + due_vat_box_print_y=box.print_y, + due_vat_base_box=box.due_vat_base_box_id.display_name, + due_vat_base_box_print_y=box.due_vat_base_box_id.print_y, + ) + ) + elif box.due_vat_base_box_id: + raise ValidationError( + _( + "The field 'Due VAT Base' is set for box '%s' " + "which is not a Due VAT box." + ) + % box.display_name + ) + if ( + box.box_type + and box.box_type.startswith("untaxed_op_") + and box.accounting_method + ): + raise ValidationError( + _( + "Box '%s' should not have an accounting method " + "considering it's box type." + ) + % box.display_name + ) + if not box.accounting_method: + if box.account_code or box.account_id: + raise ValidationError( + _( + "Box '%s' doesn't have an accounting method, " + "so it should not have any accounting parameter." + ) + % box.display_name + ) + if box.push_box_id: + if box.push_box_id.box_type in ("manual", "no_push_total"): + raise ValidationError( + _( + "Box '%(box)s' has a push box '%(push_box)s' " + "that is configured as manual or not pushed total.", + box=box.display_name, + push_box=box.push_box_id.display_name, + ) + ) + if not box.push_sequence: + raise ValidationError( + _("Box '%s' has a push box but is missing a push sequence.") + % box.display_name + ) + else: + if not float_is_zero( + box.push_rate, precision_digits=PUSH_RATE_PRECISION + ): + raise ValidationError( + _( + "Box '%s' doesn't have a push box, " + "so it's push rate should be 0." + ) + % box.display_name + ) + if box.push_sequence: + raise ValidationError( + _( + "Box '%s' doesn't have a push box, " + "so it's push rate should be 0." + ) + % box.display_name + ) + + @api.depends("code", "name", "display_type") + def name_get(self): + res = [] + form2label = dict( + self.fields_get("form_code", "selection")["form_code"]["selection"] + ) + for box in self: + name = "[%s]" % form2label.get(box.form_code) + if not box.display_type: + if box.code: + name += "(%s) %s" % (box.code, box.name) + else: + name += box.name + else: + if box.code: + name += "%s. %s" % (box.code, box.name) + else: + name += box.name + res.append((box.id, name)) + return res + + @api.model + def name_search(self, name="", args=None, operator="ilike", limit=100): + if args is None: + args = [] + if name and operator == "ilike": + recs = self.search([("code", "=", name)] + args, limit=limit) + if recs: + return recs.name_get() + return super().name_search(name=name, args=args, operator=operator, limit=limit) + + @api.model + def _box_from_single_box_type(self, box_type): + box = self.search([("box_type", "=", box_type)]) + if len(box) != 1: + boxtype2label = dict( + self.fields_get("box_type", "selection")["box_type"]["selection"] + ) + raise UserError( + _( + "A single box with type '%(box_type)s' should exists, " + "but there are %(count)d box(es) of that type. " + "This should never happen.", + box_type=boxtype2label[box_type], + count=len(box), + ) + ) + return box diff --git a/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py b/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py new file mode 100644 index 000000000..9c030ce8b --- /dev/null +++ b/l10n_fr_account_vat_return/models/l10n_fr_account_vat_return.py @@ -0,0 +1,2334 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import io +import json +import logging +import textwrap +from collections import defaultdict + +from dateutil.relativedelta import relativedelta +from PyPDF2 import PdfFileReader, PdfFileWriter +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.pdfgen import canvas +from reportlab.platypus import Paragraph + +from odoo import _, api, fields, models, tools +from odoo.exceptions import UserError, ValidationError +from odoo.tools import date_utils, float_is_zero +from odoo.tools.misc import format_amount, format_date + +from .l10n_fr_account_vat_box import PUSH_RATE_PRECISION + +logger = logging.getLogger(__name__) + +MINIMUM_AMOUNT = 760 +MINIMUM_END_YEAR_AMOUNT = 150 + +MONTH2QUARTER = { + 1: 1, + 4: 2, + 7: 3, + 10: 4, +} + + +class L10nFrAccountVatReturn(models.Model): + _name = "l10n.fr.account.vat.return" + _description = "France VAT Return (CA3)" + _order = "start_date desc" + _check_company_auto = True + _inherit = ["mail.thread", "mail.activity.mixin"] + + name = fields.Char(compute="_compute_name_end_date", string="Period", store=True) + # The default value of the start_date is set by the onchange on company_id + start_date = fields.Date( + required=True, + readonly=True, + states={"manual": [("readonly", False)]}, + tracking=True, + ) + vat_periodicity = fields.Selection( + [ + ("1", "Monthly"), + ("3", "Quarterly"), + ("12", "Yearly"), + ], + string="VAT Periodicity", + required=True, + tracking=True, + readonly=True, + states={"manual": [("readonly", False)]}, + ) + end_date = fields.Date(compute="_compute_name_end_date", store=True) + company_id = fields.Many2one( + "res.company", + ondelete="cascade", + required=True, + readonly=True, + states={"manual": [("readonly", False)]}, + default=lambda self: self.env.company, + tracking=True, + ) + company_partner_id = fields.Many2one( + related="company_id.partner_id", string="Company Partner" + ) + bank_account_id = fields.Many2one( + "res.partner.bank", + string="Company Bank Account", + states={"sent": [("readonly", True)], "posted": [("readonly", True)]}, + check_company=True, + domain="[('partner_id','=', company_partner_id), " + "'|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ondelete="restrict", + ) + company_currency_id = fields.Many2one( + related="company_id.currency_id", store=True, string="Company Currency" + ) + state = fields.Selection( + [ + ("manual", "Manual Lines"), + ("auto", "Automatic Lines"), + ("sent", "Sent"), + ("posted", "Posted"), + ], + default="manual", + required=True, + readonly=True, + tracking=True, + ) + move_id = fields.Many2one( + "account.move", + string="Journal Entry", + readonly=True, + tracking=True, + check_company=True, + ) + vat_credit_total = fields.Integer(string="VAT Credit Total", readonly=True) + # When reimbursement_type = False, the other reimbursement fields are hidden + reimbursement_min_amount = fields.Integer( + compute="_compute_name_end_date", store=True + ) + reimbursement_type = fields.Selection( + "_reimbursement_type_selection", readonly=True + ) + reimbursement_first_creation_date = fields.Date( + string="Creation Date", readonly=True + ) + reimbursement_end_date = fields.Date(string="Event Date", readonly=True) + reimbursement_show_button = fields.Boolean( + compute="_compute_reimbursement_show_button", + string="Show VAT Credit Reimbursement Button", + ) + reimbursement_comment_dgfip = fields.Text( + string="Reimbursement Comment for DGFIP", + states={"sent": [("readonly", True)], "posted": [("readonly", True)]}, + ) + ca3_attachment_id = fields.Many2one("ir.attachment", string="CA3 Attachment") + ca3_attachment_datas = fields.Binary( + related="ca3_attachment_id.datas", string="CA3 File" + ) + ca3_attachment_name = fields.Char( + related="ca3_attachment_id.name", string="CA3 Filename" + ) + comment_dgfip = fields.Text( + string="Comment for DGFIP", + states={"sent": [("readonly", True)], "posted": [("readonly", True)]}, + ) + line_ids = fields.One2many( + "l10n.fr.account.vat.return.line", + "parent_id", + string="Return Lines", + readonly=True, + states={"manual": [("readonly", False)]}, + ) + + _sql_constraints = [ + ( + "start_company_uniq", + "unique(start_date, company_id)", + "A VAT return with the same start date already exists in this company!", + ) + ] + + @api.model + def _reimbursement_type_selection(self): + return [ + ("first", "Demande déposée suite à première demande"), + ( + "end", + "Demande déposée suite à cession ou cessation ou décès ou " + "entrée dans un groupe TVA", + ), + ("other", "Demande déposée suite à autres motifs"), + ] + + @api.constrains("start_date", "vat_periodicity") + def _check_start_date(self): + for rec in self: + if rec.start_date.day != 1: + raise ValidationError( + _("The start date (%s) must be the first day of the month.") + % format_date(self.env, rec.start_date) + ) + if rec.vat_periodicity == "3" and rec.start_date.month not in MONTH2QUARTER: + raise ValidationError( + _("The start date (%s) must be the first day of a quarter.") + % format_date(self.env, rec.start_date) + ) + + @api.constrains("comment_dgfip", "reimbursement_comment_dgfip") + def _check_comment_dgfip(self): + max_comment = 5 * 512 + comment_fields = { + "comment_dgfip": _("Comment for DGFIP"), + "reimbursement_comment_dgfip": _("Reimbursement Comment for DGFIP"), + } + for rec in self: + for field_name, field_label in comment_fields.items(): + if rec[field_name] and len(rec[field_name]) > max_comment: + raise ValidationError( + _( + "The field '%(field_label)s' is too long: " + "it has %(count_char)d caracters " + "whereas the maximum is %(max_char)d caracters.", + field_label=field_label, + count_char=len(rec[field_name]), + max_char=max_comment, + ) + ) + + @api.depends("start_date", "vat_periodicity") + def _compute_name_end_date(self): + for rec in self: + end_date = name = False + reimbursement_min_amount = MINIMUM_AMOUNT + if rec.start_date and rec.vat_periodicity: + start_date = rec.start_date + end_date = start_date + relativedelta( + months=int(rec.vat_periodicity), days=-1 + ) + if rec.vat_periodicity == "1": + name = start_date.strftime("%Y-%m") + elif rec.vat_periodicity == "3": + name = "%s-T%s" % ( + start_date.year, + MONTH2QUARTER.get(start_date.month, "error"), + ) + elif rec.vat_periodicity == "12": + if start_date.month == 1: + name = str(start_date.year) + else: + name = "%s-%s" % (start_date.year, end_date.year) + if end_date.month == 12 or rec.vat_periodicity == "12": + reimbursement_min_amount = MINIMUM_END_YEAR_AMOUNT + rec.name = name + rec.end_date = end_date + rec.reimbursement_min_amount = reimbursement_min_amount + + @api.depends( + "reimbursement_min_amount", "vat_credit_total", "state", "reimbursement_type" + ) + def _compute_reimbursement_show_button(self): + for rec in self: + reimbursement_show_button = False + if ( + rec.state == "auto" + and rec.vat_credit_total + and rec.vat_credit_total > rec.reimbursement_min_amount + and not rec.reimbursement_type + ): + reimbursement_show_button = True + rec.reimbursement_show_button = reimbursement_show_button + + @api.onchange("company_id") + def company_id_change(self): + if self.company_id and self.company_id.fr_vat_periodicity: + self.vat_periodicity = self.company_id.fr_vat_periodicity + self.bank_account_id = self.company_id.fr_vat_bank_account_id.id or False + last_return = self.search( + [("company_id", "=", self.company_id.id)], + limit=1, + order="start_date desc", + ) + if last_return: + self.start_date = last_return.end_date + relativedelta(days=1) + else: + today = fields.Date.context_today(self) + if self.vat_periodicity == "1": + self.start_date = today + relativedelta(months=-1, day=1) + elif self.vat_periodicity == "3": + start_date = today + relativedelta(months=-3, day=1) + while start_date.month not in MONTH2QUARTER: + start_date -= relativedelta(months=1) + self.start_date = start_date + elif self.vat_periodicity == "12": + fy_date_from, fy_date_to = date_utils.get_fiscal_year( + today + relativedelta(years=-1), + day=self.company_id.fiscalyear_last_day, + month=int(self.company_id.fiscalyear_last_month), + ) + self.start_date = fy_date_from + + def _prepare_speedy(self): + # Generate a speed-dict called speedy that is used in several methods + self.ensure_one() + company_domain = [("company_id", "=", self.company_id.id)] + base_domain = company_domain + [("parent_state", "=", "posted")] + base_domain_period = base_domain + [ + ("date", ">=", self.start_date), + ("date", "<=", self.end_date), + ] + base_domain_end = base_domain + [("date", "<=", self.end_date)] + base_domain_end_previous = base_domain + [("date", "<", self.start_date)] + movetype2label = dict( + self.env["account.move"].fields_get("move_type", "selection")["move_type"][ + "selection" + ] + ) + speedy = { + "company_id": self.company_id.id, + "currency": self.company_id.currency_id, + "company_domain": company_domain, + "base_domain": base_domain, + "base_domain_period": base_domain_period, + "base_domain_end": base_domain_end, + "base_domain_end_previous": base_domain_end_previous, + "end_date_formatted": format_date(self.env, self.end_date), + "start_date_formatted": format_date(self.env, self.start_date), + "movetype2label": movetype2label, + "line_obj": self.env["l10n.fr.account.vat.return.line"], + "log_obj": self.env["l10n.fr.account.vat.return.line.log"], + "box_obj": self.env["l10n.fr.account.vat.box"], + "aa_obj": self.env["account.account"], + "am_obj": self.env["account.move"], + "aml_obj": self.env["account.move.line"], + "aj_obj": self.env["account.journal"], + "afp_obj": self.env["account.fiscal.position"], + "afpt_obj": self.env["account.fiscal.position.tax"], + "afpa_obj": self.env["account.fiscal.position.account"], + "at_obj": self.env["account.tax"], + "aadmo_obj": self.env["account.analytic.distribution.model"], + } + speedy["bank_cash_journals"] = speedy["aj_obj"].search( + speedy["company_domain"] + [("type", "in", ("bank", "cash"))] + ) + return speedy + + def _get_adjust_accounts(self, speedy): + # This is the method to inherit if you want to select the appropriate + # accounts via a configuration parameter + # To avoid to have too many configuration params, + # considering that this module is only for France and + # that all French companies must use the PCG, + # I select the account based on the code they should have + self.ensure_one() + account_lookup = { + "expense_adjust_account": ("658", "Charges diverses de gestion courante"), + "income_adjust_account": ("758", "Produits divers de gestion courante"), + } + for key, (account_code, account_name) in account_lookup.items(): + limit = not account_code.startswith("445") and 1 or None + account = speedy["aa_obj"].search( + speedy["company_domain"] + [("code", "=like", account_code + "%")], + limit=limit, + ) + if not account: + raise UserError( + _( + "There is no account %(account_code)s %(account_name)s " + "in the chart of account of company '%(company)s'.", + account_code=account_code, + account_name=account_name, + company=self.company_id.display_name, + ) + ) + if len(account) > 1: + raise UserError( + _( + "There are %(count)d accounts " + "%(account_code)s %(account_name)s in the chart of account " + "of company '%(company)s'. This scenario is not supported.", + count=len(account), + account_code=account_code, + account_name=account_name, + company=self.company_id.display_name, + ) + ) + speedy[key] = account + + def manual2auto(self): + self.ensure_one() + assert self.state == "manual" + speedy = self._prepare_speedy() + self._setup_data_pre_check(speedy) + self._delete_move_and_attachments() # should not be necessary at that step + self._generate_operation_untaxed(speedy) + self._generate_due_vat(speedy) + self._generate_deductible_vat(speedy) + self._switch_negative_boxes(speedy) + self._generate_credit_deferment(speedy) + self._create_push_lines("start", speedy) + self._generate_ca3_bottom_totals(speedy) + self._create_sections(speedy) + move = self._create_draft_account_move(speedy) + self.write( + { + "state": "auto", + "move_id": move.id, + } + ) + + def back_to_manual(self): + self.ensure_one() + assert self.state in ("auto", "sent") + # del auto lines + self.line_ids.filtered(lambda x: x.box_box_type != "manual").unlink() + self._delete_move_and_attachments() + vals = {"state": "manual"} + if self.reimbursement_type: + vals.update(self._prepare_remove_credit_vat_reimbursement()) + self.write(vals) + + def _delete_move_and_attachments(self): + self.ensure_one() + if self.move_id: + if self.move_id.state == "posted": + raise UserError( + _( + "The journal entry '%s' generated by the VAT return " + "cannot be deleted because it is already posted." + ) + % self.move_id.display_name + ) + self.move_id.unlink() + if self.ca3_attachment_id: + self.ca3_attachment_id.unlink() + + def auto2sent(self): + self.ensure_one() + assert self.state == "auto" + if not self.ca3_attachment_id: # for archive + self.generate_ca3_attachment() + self.write( + { + "state": "sent", + } + ) + + def sent2manual(self): + self.ensure_one() + assert self.state == "sent" + self.write( + { + "state": "manual", + } + ) + + def sent2posted(self): + self.ensure_one() + assert self.state == "sent" + speedy = self._prepare_speedy() + move = self.move_id + if not move: + raise UserError(_("The Journal Entry of this VAT return has been deleted.")) + if move.state == "cancel": + raise UserError( + _( + "The Journal Entry of this VAT return has been cancelled. " + "You should set it back to draft." + ) + ) + if move.state == "draft": + move.action_post() + self._reconcile_account_move(move, speedy) + if ( + self.company_id.fr_vat_update_lock_dates + and self.company_id.period_lock_date < self.end_date + ): + self.sudo().company_id.write({"period_lock_date": self.end_date}) + self.write({"state": "posted"}) + + def _setup_data_pre_check(self, speedy): + self.ensure_one() + # Block if there are draft moves before end_date + draft_move_count = speedy["am_obj"].search_count( + [("date", "<=", self.end_date), ("state", "=", "draft")] + + speedy["company_domain"] + ) + if draft_move_count: + raise UserError( + _( + "There is/are %(count)d draft journal entry/entries dated before " + "%(date)s. You should post this/these journal entry/entries or " + "delete it/them.", + count=draft_move_count, + date=format_date(self.env, self.end_date), + ) + ) + bad_fp = speedy["afp_obj"].search( + speedy["company_domain"] + [("fr_vat_type", "=", False)], limit=1 + ) + if bad_fp: + raise UserError( + _( + "Type not set on fiscal position '%s'. It must be set on all " + "fiscal positions." + ) + % bad_fp.display_name + ) + on_payment_taxes_count = speedy["at_obj"].search_count( + speedy["company_domain"] + [("tax_exigibility", "=", "on_payment")] + ) + if on_payment_taxes_count: + raise UserError( + _( + "There are still On Payment taxes in company '%s'. " + "To handle on payment VAT, this module uses a different " + "implementation than the native solution based on a " + "configuration parameter on taxes." + ) + % self.company_id.display_name + ) + + def _generate_ca3_bottom_totals(self, speedy): + # Process the END of CA3 by hand + # Delete no_push_total and end_total lines + # it corresponds to the 4 sum boxes at the bottom block of CA3 + lines_to_del = speedy["line_obj"].search( + [ + ("parent_id", "=", self.id), + ( + "box_box_type", + "in", + ( + "no_push_total_debit", + "no_push_total_credit", + "end_total_debit", + "end_total_credit", + ), + ), + ] + ) + lines_to_del.unlink() + + # Generate the 'no_push_total_xxx' lines: + # 25. Crédit de TVA (lignes 23 - 16) + # 28. TVA nette due (lignes 16 - 23) + due_vat_total_box = speedy["box_obj"]._box_from_single_box_type("due_vat_total") + vat_to_pay_line = speedy["line_obj"].search( + [("parent_id", "=", self.id), ("box_id", "=", due_vat_total_box.id)] + ) + vat_to_pay = vat_to_pay_line and vat_to_pay_line.value or 0 + + deduc_vat_total_box = speedy["box_obj"]._box_from_single_box_type( + "deductible_vat_total" + ) + vat_deduc_line = speedy["line_obj"].search( + [("parent_id", "=", self.id), ("box_id", "=", deduc_vat_total_box.id)] + ) + vat_deduc = vat_deduc_line and vat_deduc_line.value or 0 + logs = [ + { + "compute_type": "box", + "amount": vat_to_pay, + "note": vat_to_pay_line.box_id.display_name, + }, + { + "compute_type": "box", + "amount": -vat_deduc, + "note": vat_deduc_line.box_id.display_name, + }, + ] + sub_total = vat_to_pay - vat_deduc + if sub_total > 0: + box = speedy["box_obj"]._box_from_single_box_type("no_push_total_debit") + else: + box = speedy["box_obj"]._box_from_single_box_type("no_push_total_credit") + for log in logs: + log["amount"] *= -1 + self.write({"vat_credit_total": sub_total * -1}) + if box.accounting_method: # True for no_push_total_debit + account_id = self._get_box_account(box).id + for log in logs: + log["account_id"] = account_id + speedy["line_obj"].create( + { + "parent_id": self.id, + "box_id": box.id, + "log_ids": [(0, 0, x) for x in logs], + } + ) + # Generate push lines for the very bottom of CA3 + self._create_push_lines("end", speedy) + + def _create_push_lines(self, pass_type, speedy): + # only boxes at the bottom of CA3 have a push_sequence >= 100 + assert pass_type in ("start", "end") + if pass_type == "start": + box_domain = [("push_sequence", "<", 100)] + elif pass_type == "end": + box_domain = [("push_sequence", ">=", 100)] + sequences = {} # to have a list of unique push_sequence + boxes = speedy["box_obj"].search( + box_domain + [("push_box_id", "!=", False)], order="push_sequence" + ) + for box in boxes: + sequences[box.push_sequence] = True + + to_push_lines_base_domain = [ + ("parent_id", "=", self.id), + ("box_push_box_id", "!=", False), + ] + cur_amount_domain = [ + ("parent_id", "=", self.id), + ("box_edi_type", "=", "MOA"), + ] + + for push_seq in sequences.keys(): + # Get lines that must generate/update a new line + to_push_lines = speedy["line_obj"].search( + [("box_push_sequence", "=", push_seq)] + to_push_lines_base_domain + ) + new_log_lines = defaultdict(list) # key = box, value = list of logs lines + # get current value for all current boxes + cur_amounts = {} # key = box_id, value = amount (int) + for line in speedy["line_obj"].search(cur_amount_domain): + cur_amounts[line.box_id.id] = line.value # integer + for to_push_line in to_push_lines: + if float_is_zero( + to_push_line.box_id.push_rate, precision_digits=PUSH_RATE_PRECISION + ): + # simple sum boxes + amount = cur_amounts[to_push_line.box_id.id] + note = _("%s (add)") % to_push_line.box_id.display_name + else: + # rate push boxes that can be found in 3310A + amount = int( + round( + to_push_line.box_id.push_rate + * cur_amounts[to_push_line.box_id.id] + / 100 + ) + ) + note = "%s %% x %s €, %s" % ( + to_push_line.box_id.push_rate, + cur_amounts[to_push_line.box_id.id], + to_push_line.box_id.display_name, + ) + push_box = to_push_line.box_id.push_box_id + # prepare new log line + account_id = False + if push_box.accounting_method: + account_id = self._get_box_account(push_box).id + + new_log_lines[push_box].append( + ( + 0, + 0, + { + "compute_type": "box", + "note": note, + "amount": amount, + "account_id": account_id, + # "analytic_account_id": push_box.analytic_account_id.id + # or False, + }, + ) + ) + + # Create new lines + for box, new_log_lines_list in new_log_lines.items(): + speedy["line_obj"].create( + { + "parent_id": self.id, + "box_id": box.id, + "log_ids": new_log_lines_list, + } + ) + + def _generate_credit_deferment(self, speedy): + box = speedy["box_obj"]._box_from_single_box_type("credit_deferment") + account = self._get_box_account(box) + balance = account._fr_vat_get_balance("base_domain_end", speedy) + # Check that the balance of 445670 is an integer + if speedy["currency"].compare_amounts(balance, int(balance)): + raise UserError( + _( + "The balance of account '%(account)s' is %(balance)s. " + "In France, it should be a integer amount.", + account=account.display_name, + balance=format_amount(self.env, balance, speedy["currency"]), + ) + ) + # Check that the balance of 445670 is the right sign + compare_bal = speedy["currency"].compare_amounts(balance, 0) + if compare_bal < 0: + raise UserError( + _( + "The balance of account '%(account)s' is %(balance)s. " + "It should always be positive.", + account=account.display_name, + balance=format_amount(self.env, balance, speedy["currency"]), + ) + ) + elif compare_bal > 0: + speedy["line_obj"].create( + { + "parent_id": self.id, + "box_id": box.id, + "log_ids": [ + ( + 0, + 0, + { + "account_id": account.id, + "compute_type": "balance", + "amount": balance, + }, + ) + ], + } + ) + + def _generate_due_vat(self, speedy): + self.ensure_one() + # TODO Check that an account can't be used in both autoliq and non-autoliq? + # COMPUTE LINES + # There are 2 important dicts: + # 1. rate2logs: generate block "B décompte de la TVA à payer" + # both columns "taxe due" and "Base hors taxe" + rate2logs = defaultdict(list) + # 2. taxedop_type2logs: generate block top left "Opérations imposables" + taxedop_type2logs = defaultdict(list) + + # Compute France and Monaco + monaco_logs = self._generate_due_vat_france( + speedy, rate2logs, taxedop_type2logs + ) + # Compute Auto-liquidation + autoliq_intracom_product_logs = self._generate_due_vat_autoliq( + speedy, rate2logs, taxedop_type2logs + ) + + # CREATE LINES + # Boxes 08, 09, 9A + self._generate_due_vat_create_vat_to_pay_lines(speedy, rate2logs) + # Boxes for taxed operations: A1, B3, A3, B2 + for taxedop_type, logs in taxedop_type2logs.items(): + box_type = "taxed_op_%s" % taxedop_type + self._create_line(speedy, logs, box_type) + # Box 17 "dont TVA sur acquisitions intracom" + self._create_line( + speedy, autoliq_intracom_product_logs, "due_vat_intracom_product" + ) + # Box 18 Dont TVA sur opérations à destination de Monaco + self._create_line(speedy, monaco_logs, "due_vat_monaco") + + def _generate_due_vat_prepare_sale_struct(self, speedy): + # REGULAR SALE TAXES + sale_vat_account2rate = {} + sale_vat_accounts = speedy["aa_obj"] + regular_due_vat_taxes = speedy["at_obj"].search( + speedy["company_domain"] + + [ + ("amount_type", "=", "percent"), + ("amount", ">", 0), + ("fr_vat_autoliquidation", "=", False), + ("type_tax_use", "=", "sale"), + ] + ) + for tax in regular_due_vat_taxes: + invoice_lines = tax.invoice_repartition_line_ids.filtered( + lambda x: x.repartition_type == "tax" + and x.account_id + and int(x.factor_percent) == 100 + ) + if len(invoice_lines) != 1: + raise UserError( + _( + "Tax '%s' should have only one distribution line for " + "invoices configured with an account and with '100%% of tax'." + ) + % tax.display_name + ) + sale_vat_account = invoice_lines.account_id + refund_lines = tax.refund_repartition_line_ids.filtered( + lambda x: x.repartition_type == "tax" + and x.account_id + and int(x.factor_percent) == 100 + ) + if len(refund_lines) != 1: + raise UserError( + _( + "Tax '%s' should have only one distribution line for " + "credit notes configured with an account and with '100%% of tax'." + ) + % tax.display_name + ) + refund_vat_account = refund_lines.account_id + if refund_vat_account != sale_vat_account: + raise UserError( + _( + "Tax '%(tax)s' has an account for invoice " + "(%(account_invoice)s) which is different from the account " + "for refund (%(account_refund)s). This scenario not supported.", + tax=tax.display_name, + account_invoice=sale_vat_account.display_name, + account_refund=refund_vat_account.display_name, + ) + ) + rate_int = int(tax.amount * 100) + if ( + sale_vat_account in sale_vat_account2rate + and sale_vat_account2rate[sale_vat_account] != rate_int + ): + raise UserError( + _( + "Account '%(account)s' is used on several sale VAT taxes " + "for different rates (%(rate1).2f%% and %(rate2).2f%%).", + account=sale_vat_account.display_name, + rate1=rate_int / 100, + rate2=sale_vat_account2rate[sale_vat_account] / 100, + ) + ) + sale_vat_account2rate[sale_vat_account] = rate_int + sale_vat_accounts |= sale_vat_account + + assert sale_vat_accounts + return sale_vat_accounts, sale_vat_account2rate + + def _generate_due_vat_france(self, speedy, rate2logs, taxedop_type2logs): + ( + sale_vat_accounts, + sale_vat_account2rate, + ) = self._generate_due_vat_prepare_sale_struct(speedy) + logger.debug("sale_vat_account2rate=%s", sale_vat_account2rate) + vat_on_payment_account2logs = self._vat_on_payment( + "out", sale_vat_accounts.ids, speedy + ) + # generate taxedop_type2logs['france'] and rate2logs + for sale_vat_account, rate_int in sale_vat_account2rate.items(): + # Start from balance of VAT account, then compute base + balance = ( + sale_vat_account._fr_vat_get_balance("base_domain_end", speedy) * -1 + ) + logger.debug( + "sale VAT account %s (rate %s), balance %s", + sale_vat_account.code, + rate_int, + balance, + ) + if not speedy["currency"].is_zero(balance): + rate2logs[rate_int].append( + { + "account_id": sale_vat_account.id, + "compute_type": "balance", + "amount": balance, + } + ) + base = balance * 10000 / rate_int + taxedop_type2logs["france"].append( + { + "account_id": sale_vat_account.id, + "compute_type": "balance", + "amount": base, + "note": _( + "VAT amount %(vat_amount)s, Rate %(rate).2f%%, " + "Base %(base)s", + vat_amount=format_amount( + self.env, balance, speedy["currency"] + ), + rate=rate_int / 100, + base=format_amount(self.env, base, speedy["currency"]), + ), + } + ) + # remove on_payment invoices unpaid on end_date for rate2logs + rate2logs[rate_int] += vat_on_payment_account2logs[sale_vat_account] + # and also for taxedop_type2logs['france'] + for log in vat_on_payment_account2logs[sale_vat_account]: + base_log = dict(log) + vat_amount = log["amount"] + base = speedy["currency"].round(vat_amount * 10000 / rate_int) + base_log["amount"] = base + taxedop_type2logs["france"].append(base_log) + # MONACO + monaco_logs = self._generate_due_vat_monaco(speedy, sale_vat_accounts) + return monaco_logs + + def _generate_due_vat_autoliq(self, speedy, rate2logs, taxedop_type2logs): + ( + autoliq_taxedop_type2accounts, + autoliq_vat_accounts, + autoliq_vat_account2rate, + autoliq_tax2rate, + ) = self._generate_due_vat_prepare_autoliq_struct(speedy) + # compute bloc "B décompte de la TVA à payer" + self._generate_due_vat_autoliq_vat_to_pay( + speedy, autoliq_vat_account2rate, rate2logs + ) + # compute bloc "opérations imposables" + # Extracom + self._generate_due_vat_taxed_op_extracom( + speedy, + autoliq_vat_account2rate, + autoliq_taxedop_type2accounts, + taxedop_type2logs, + ) + + # Intracom + rate2product_ratio = self._compute_rate2product_ratio( + speedy, autoliq_taxedop_type2accounts, autoliq_tax2rate + ) + + autoliq_intracom_product_logs = self._generate_due_vat_intracom_taxed_op( + speedy, + autoliq_vat_account2rate, + autoliq_taxedop_type2accounts, + rate2product_ratio, + taxedop_type2logs, + ) + return autoliq_intracom_product_logs + + def _generate_due_vat_prepare_autoliq_struct(self, speedy): + autoliq_taxedop_type2accounts = { + "intracom_b2b": speedy["aa_obj"], + "extracom": speedy["aa_obj"], + } + autoliq_vat_account2rate = {} + autoliq_tax2rate = {} + autoliq_vat_accounts = speedy["aa_obj"] + autoliq_vat_taxes = speedy["at_obj"].search( + [ + ("type_tax_use", "=", "purchase"), + ("amount_type", "=", "percent"), + ("amount", ">", 0), + ("fr_vat_autoliquidation", "=", True), + ("company_id", "=", speedy["company_id"]), + ] + ) + for tax in autoliq_vat_taxes: + lines = tax.invoice_repartition_line_ids.filtered( + lambda x: x.repartition_type == "tax" + and x.account_id + and int(x.factor_percent) == -100 + ) + if len(lines) != 1: + raise UserError(_("A regular sale ")) + account = lines.account_id + rate_int = int(tax.amount * 100) + autoliq_tax2rate[tax] = rate_int + if ( + account in autoliq_vat_account2rate + and autoliq_vat_account2rate[account] != rate_int + ): + raise UserError( + _( + "Account '%(account)s' is used as due VAT account on several " + "auto-liquidation taxes for different rates " + "(%(rate1).2f%% and %(rate2).2f%%).", + account=account.display_name, + rate1=rate_int / 100, + rate2=autoliq_vat_account2rate[account] / 100, + ) + ) + autoliq_vat_account2rate[account] = rate_int + autoliq_vat_accounts |= account + tax_map = speedy["afpt_obj"].search( + [ + ("tax_dest_id", "=", tax.id), + ("company_id", "=", speedy["company_id"]), + ], + limit=1, + ) + if not tax_map: + raise UserError( + _( + "Auto-liquidation tax '%s' is not present in the tax mapping " + "of any fiscal position." + ) + % tax.display_name + ) + fr_vat_type = tax_map.position_id.fr_vat_type + autoliq_taxedop_type2accounts[fr_vat_type] |= account + return ( + autoliq_taxedop_type2accounts, + autoliq_vat_accounts, + autoliq_vat_account2rate, + autoliq_tax2rate, + ) + + def _generate_due_vat_autoliq_vat_to_pay( + self, speedy, autoliq_vat_account2rate, rate2logs + ): + # Generate autoliq logs for boxes 08, 09, 9A + # For autoliq, we don't do VAT on payment, we do VAT on debit + # Check that these autoliq due accounts 4452xx are empty at start of period + for account, rate_int in autoliq_vat_account2rate.items(): + # check start balance is empty at start of period + # This check is important because, for intracom autoliq, + # we analyse each invoice for the product/service ratio, + # so it won't work if the autoliq due account has a residual amount + # at start of period (and if we allow that, we get all sorts of problem: + # for example, when the intracom due account has a residual at start + # of period but there are no intracom autoliq invoice in the period, so + # our dicts rate2product_ratio are empty) + balance_end_previous_period = account._fr_vat_get_balance( + "base_domain_end_previous", speedy + ) + if not speedy["currency"].is_zero(balance_end_previous_period): + raise UserError( + _( + "Account '%(account)s' is a due VAT auto-liquidation account. " + "So it should be empty at the start of the VAT period, " + "but the balance on the last day of the previous period " + "is %(balance)s.", + account=account.display_name, + balance=format_amount( + self.env, balance_end_previous_period, speedy["currency"] + ), + ) + ) + balance = account._fr_vat_get_balance("base_domain_end", speedy) * -1 + if not speedy["currency"].is_zero(balance): + rate2logs[rate_int].append( + { + "account_id": account.id, + "compute_type": "balance", + "amount": balance, + } + ) + + def _generate_due_vat_taxed_op_extracom( + self, + speedy, + autoliq_vat_account2rate, + autoliq_taxedop_type2accounts, + taxedop_type2logs, + ): + # Taxable operations - Autoliquidation Extra EU + # Box 3B: Achats de biens ou presta de services réalisés auprès d'un + # assujetti non établi en France (art 283-1 du CGI) + for account in autoliq_taxedop_type2accounts["extracom"]: + vat_amount = account._fr_vat_get_balance("base_domain_end", speedy) * -1 + if not speedy["currency"].is_zero(vat_amount): + rate_int = autoliq_vat_account2rate[account] + base = speedy["currency"].round(vat_amount * 10000 / rate_int) + taxedop_type2logs["autoliq_extracom"].append( + { + "account_id": account.id, + "compute_type": "computed_base", + "amount": base, + "note": _( + "VAT Amount %(vat_amount)s, Rate %(rate).2f%%, " + "Base %(base)s", + vat_amount=format_amount( + self.env, vat_amount, speedy["currency"] + ), + rate=rate_int / 100, + base=format_amount(self.env, base, speedy["currency"]), + ), + } + ) + + def _generate_due_vat_intracom_taxed_op( + self, + speedy, + autoliq_vat_account2rate, + autoliq_taxedop_type2accounts, + rate2product_ratio, + taxedop_type2logs, + ): + # Compute boxes A3, B2 and 17 + autoliq_intracom_product_logs = [] # for box 17 + + for account in autoliq_taxedop_type2accounts["intracom_b2b"]: + vat_amount = account._fr_vat_get_balance("base_domain_end", speedy) * -1 + if not speedy["currency"].is_zero(vat_amount): + rate_int = autoliq_vat_account2rate[account] + product_ratio = rate2product_ratio[rate_int] + service_ratio = 100 - product_ratio + base = speedy["currency"].round(vat_amount * 10000 / rate_int) + product_base = 0 + if not float_is_zero(product_ratio, precision_digits=2): + # Box B2 + product_base = round(base * product_ratio / 100, 2) + taxedop_type2logs["autoliq_intracom_product"].append( + { + "account_id": account.id, + "compute_type": "computed_base", + "amount": product_base, + "note": _( + "VAT Amount %(vat_amount)s, Rate %(rate).2f%%, " + "Base %(base)s, Product Ratio %(product_ratio).2f%%, " + "Product Base %(product_base)s", + vat_amount=format_amount( + self.env, vat_amount, speedy["currency"] + ), + rate=rate_int / 100, + base=format_amount(self.env, base, speedy["currency"]), + product_ratio=product_ratio, + product_base=format_amount( + self.env, product_base, speedy["currency"] + ), + ), + } + ) + # Box 17 + product_vat_amount = round(vat_amount * product_ratio / 100, 2) + autoliq_intracom_product_logs.append( + { + "account_id": account.id, + "compute_type": "computed_vat_amount", + "amount": product_vat_amount, + "note": _( + "VAT amount %(vat_amount)s, " + "Product Ratio %(product_ratio).2f%%, " + "VAT Product Amount %(product_vat_amount)s", + vat_amount=format_amount( + self.env, vat_amount, speedy["currency"] + ), + product_ratio=product_ratio, + product_vat_amount=format_amount( + self.env, product_vat_amount, speedy["currency"] + ), + ), + } + ) + + # Box A3 + service_base = round(base - product_base, 2) + if not float_is_zero(service_base, precision_digits=2): + taxedop_type2logs["autoliq_intracom_service"].append( + { + "account_id": account.id, + "compute_type": "computed_base", + "amount": service_base, + "note": _( + "VAT Amount %(vat_amount)s, Rate %(rate).2f%%, " + "Base %(base)s, Service Ratio %(service_ratio).2f%%, " + "Service Base %(service_base)s", + vat_amount=format_amount( + self.env, vat_amount, speedy["currency"] + ), + rate=rate_int / 100, + base=format_amount(self.env, base, speedy["currency"]), + service_ratio=service_ratio, + service_base=format_amount( + self.env, service_base, speedy["currency"] + ), + ), + } + ) + return autoliq_intracom_product_logs + + def _compute_rate2product_ratio( + self, speedy, autoliq_taxedop_type2accounts, autoliq_tax2rate + ): + rate2total = defaultdict(float) + rate2product = defaultdict(float) + autoliq_vat_move_lines = speedy["aml_obj"].search( + [ + ("account_id", "in", autoliq_taxedop_type2accounts["intracom_b2b"].ids), + ("balance", "!=", 0), + ] + + speedy["base_domain_period"] + ) + + autoliq_vat_moves = autoliq_vat_move_lines.move_id + product_account_prefixes = self._get_product_account_prefixes() + for move in autoliq_vat_moves: + if move.move_type not in ("in_invoice", "in_refund"): + raise UserError( + _( + "Journal entry '%s' uses an intracom autoliquidation due VAT " + "account but is not a supplier invoice/refund. " + "This scenario is not supported." + ) + % move.display_name + ) + for line in move.invoice_line_ids.filtered( + lambda x: x.display_type == "product" + ): + rate_int = 0 + for tax in line.tax_ids: + if tax in autoliq_tax2rate: + rate_int = autoliq_tax2rate[tax] + if rate_int: + rate2total[rate_int] += line.balance + # If we have a product, we use its type and is_accessory_cost + # to determine if it's a product or service + # If we don't have a product, we use the account + if line.product_id: + if ( + line.product_id.type in ("product", "consu") + or line.product_id.is_accessory_cost + ): + rate2product[rate_int] += line.balance + else: + if line.account_id.code.startswith(product_account_prefixes): + rate2product[rate_int] += line.balance + + rate2product_ratio = {} + for rate_int, total in rate2total.items(): + productratio = 0 + if not speedy["currency"].is_zero(total): + productratio = round(100 * rate2product[rate_int] / total, 2) + rate2product_ratio[rate_int] = productratio + + return rate2product_ratio + + @api.model + def _get_product_account_prefixes(self): + return ( + "21", + "601", + "602", + "605", + "606", + "607", + "6091", + "6092", + "6095", + "6096", + "6097", + "6181", + "6183", + "6232", + "6234", + "6236", + ) + + def _generate_due_vat_create_vat_to_pay_lines(self, speedy, rate2logs): + # Create boxes 08, 09, 9B (columns base HT et Taxe due) + rate2box = {} # rate as integer x 100 i.e. 550 for 5,5% + due_vat_boxes = speedy["box_obj"].search( + [ + ("box_type", "=", "due_vat"), + ("due_vat_rate", ">", 0), + ("due_vat_base_box_id", "!=", False), + ] + ) + for due_vat_box in due_vat_boxes: + rate2box[int(due_vat_box.due_vat_rate)] = due_vat_box + if not rate2box: + raise UserError( + _( + "Problem in the configuration of the due VAT boxes. " + "This should never happen." + ) + ) + + for rate_int, logs in rate2logs.items(): + if logs: + if rate_int not in rate2box: + raise UserError( + _("No Due VAT box found for VAT rate %.2f%%.") % rate_int / 100 + ) + box = rate2box[rate_int] + vals = { + "parent_id": self.id, + "box_id": box.id, + "log_ids": [(0, 0, x) for x in logs], + } + line = speedy["line_obj"].create(vals) + box_base = box.due_vat_base_box_id + rate = rate_int / 100 + base_vals = { + "parent_id": self.id, + "box_id": box_base.id, + "log_ids": [ + ( + 0, + 0, + { + "compute_type": "rate", + "amount": line.value_float * 100 / rate, + "note": "VAT Amount %s, Rate %.2f%%, " + "Base = VAT Amount / Rate" + % ( + format_amount( + self.env, line.value_float, speedy["currency"] + ), + rate, + ), + }, + ) + ], + } + speedy["line_obj"].create(base_vals) + + def _generate_due_vat_monaco(self, speedy, sale_vat_accounts): + # Dont TVA sur opérations à destination de Monaco + # WARNING This is fine if the company is VAT on debit, + # but not exact when VAT on payment + # If we want to have accurate support for Monaco with VAT on payment + # we would need a dedicated 44571x account for Monaco (per rate) + # and a dedicated fiscal position => probably not worth it + mc_partners = self.env["res.partner"].search( + [("country_id", "=", self.env.ref("base.mc").id), ("parent_id", "=", False)] + ) + mc_mlines = speedy["aml_obj"].search( + [ + ("partner_id", "in", mc_partners.ids), + ("account_id", "in", sale_vat_accounts.ids), + ("balance", "!=", 0), + ] + + speedy["base_domain_period"] + ) + monaco_box_logs = [] + for mline in mc_mlines: + vat_amount = mline.balance * -1 + monaco_box_logs.append( + { + "account_id": mline.account_id.id, + "compute_type": "computed_vat_amount", + "amount": vat_amount, + "origin_move_id": mline.move_id.id, + "note": _( + "Monaco customer '%(partner)s', VAT amount %(vat_amount)s", + partner=mline.partner_id.display_name, + vat_amount=format_amount( + self.env, vat_amount, speedy["currency"] + ), + ), + } + ) + return monaco_box_logs + + def _create_line(self, speedy, logs, box_type): + if logs: + vals = { + "parent_id": self.id, + "box_id": speedy["box_obj"]._box_from_single_box_type(box_type).id, + "log_ids": [(0, 0, x) for x in logs], + } + speedy["line_obj"].create(vals) + + def _vat_on_payment(self, in_or_out, vat_account_ids, speedy): + assert in_or_out in ("in", "out") + account2logs = defaultdict(list) + common_move_domain = speedy["company_domain"] + [ + ("date", "<=", self.end_date), + ("amount_total", ">", 0), + ("state", "=", "posted"), + ] + if in_or_out == "in": + journal_type = "purchase" + vat_sign = -1 + account_type = "liability_payable" + common_move_domain += [ + ("move_type", "in", ("in_invoice", "in_refund")), + ("fiscal_position_fr_vat_type", "=", "france_vendor_vat_on_payment"), + ] + elif in_or_out == "out": + journal_type = "sale" + vat_sign = 1 + account_type = "asset_receivable" + common_move_domain += [ + ("out_vat_on_payment", "=", True), + ("move_type", "in", ("out_invoice", "out_refund")), + ( + "fiscal_position_fr_vat_type", + "in", + (False, "france", "france_vendor_vat_on_payment"), + ), + ] + # The goal of this method is to "remove" on_payment invoices that were unpaid + # on self.end_date + # Several cases : + # 1) Unpaid invoices today: + # if they are unpaid today, they were unpaid on end_date -> easy + # 2) Partially paid invoices today: + # they were unpaid or partially paid on end_date + # Volume is low, we can analyse them one by one + # 3) Paid and in_payment invoices today: + # we want to find paid/in_payment invoices that were unpaid or partially + # paid on end_date. + # Volume is high, so it would be too lengthy to analyse all of them + # => to detect those, we look at move lines with a full reconcile created + # after end_date + + # Case 1. unpaid invoices + unpaid_invs = speedy["am_obj"].search( + common_move_domain + [("payment_state", "=", "not_paid")] + ) + for unpaid_inv in unpaid_invs: + for line in unpaid_inv.line_ids.filtered( + lambda x: x.display_type == "tax" and x.account_id.id in vat_account_ids + ): + amount = speedy["currency"].round(line.balance) * vat_sign + note = _( + "Invoice/refund is unpaid, Unpaid VAT amount %s" + ) % format_amount(self.env, amount, speedy["currency"]) + account2logs[line.account_id].append( + { + "note": note, + "amount": amount, + "account_id": line.account_id.id, + "compute_type": "unpaid_vat_on_payment", + "origin_move_id": unpaid_inv.id, + } + ) + # Case 2: partially paid invoices + partially_paid_invs = speedy["am_obj"].search( + common_move_domain + [("payment_state", "=", "partial")] + ) + + # Case 3: paid and in_payment invoices + purchase_or_sale_journals = speedy["aj_obj"].search( + speedy["company_domain"] + [("type", "=", journal_type)] + ) + # won't work when the invoice is paid next month by a refund + payable_or_receivable_accounts = speedy["aa_obj"].search( + speedy["company_domain"] + [("account_type", "=", account_type)] + ) + # I want reconcile marks after first day of current month + # But, to avoid trouble with timezones, I use '>=' self.end_date (and not '>') + # It's not a problem if we have few additionnal invoices to analyse + full_reconcile_post_end = self.env["account.full.reconcile"].search( + [("create_date", ">=", self.end_date)] + ) + reconciled_purchase_or_sale_lines = speedy["aml_obj"].search( + speedy["base_domain"] + + [ + ("full_reconcile_id", "in", full_reconcile_post_end.ids), + ("journal_id", "in", purchase_or_sale_journals.ids), + ("date", "<=", self.end_date), + ("account_id", "in", payable_or_receivable_accounts.ids), + ("balance", "!=", 0), + ] + ) + # I do confirm that, if 2 moves lines in reconciled_purchase_or_sale_lines + # are part of the same move, that move will be present only once + # in paid_invoices_to_analyse (tested on v14) + paid_invoices_to_analyse = speedy["am_obj"].search( + common_move_domain + + [ + ("payment_state", "in", ("paid", "in_payment", "reversed")), + ("id", "in", reconciled_purchase_or_sale_lines.move_id.ids), + ] + ) + # Process case 2 and 3 + invoices_to_analyse = partially_paid_invs + invoices_to_analyse |= paid_invoices_to_analyse + for move in invoices_to_analyse: + # compute unpaid_amount on end_date + unpaid_amount = move.amount_total # initialize value + fully_unpaid = True + pay_infos = ( + isinstance(move.invoice_payments_widget, dict) + and move.invoice_payments_widget["content"] + or [] + ) + for payment in pay_infos: + if payment["date"] <= self.end_date and payment["amount"]: + unpaid_amount -= payment["amount"] + fully_unpaid = False + # If invoice is not fully paid on end_date, compute an unpaid ratio + if not move.currency_id.is_zero(unpaid_amount): + unpaid_ratio = unpaid_amount / move.amount_total + for line in move.line_ids.filtered( + lambda x: x.display_type == "tax" + and x.account_id.id in vat_account_ids + ): + balance = line.balance * vat_sign + if fully_unpaid: + amount = speedy["currency"].round(balance) + note = _( + "Invoice/refund was unpaid on %(date)s, " + "Unpaid VAT amount %(amount)s", + date=speedy["end_date_formatted"], + amount=format_amount(self.env, amount, speedy["currency"]), + ) + else: + amount = speedy["currency"].round(balance * unpaid_ratio) + note = _( + "%(ratio)d%% of the invoice/refund was unpaid on %(date)s, " + "VAT amount %(vat_amount)s ➔ " + "Unpaid VAT amount %(unpaid_vat_amount)s", + ratio=int(round(unpaid_ratio * 100)), + date=speedy["end_date_formatted"], + vat_amount=format_amount( + self.env, balance, speedy["currency"] + ), + unpaid_vat_amount=format_amount( + self.env, amount, speedy["currency"] + ), + ) + + account2logs[line.account_id].append( + { + "note": note, + "amount": amount, + "account_id": line.account_id.id, + "compute_type": "unpaid_vat_on_payment", + "origin_move_id": move.id, + } + ) + return account2logs + + def _generate_deductible_vat(self, speedy): + self.ensure_one() + vat_account2type = self._generate_deductible_vat_prepare_struct(speedy) + # vat_account2type is a dict with: + # key = deduc VAT account + # value = 'asset', 'regular' or 'autoliq' + boxtype2vat_accounts = { + "deductible_vat_asset": [ + account + for (account, vtype) in vat_account2type.items() + if vtype == "asset" + ], + "deductible_vat_other": [ + account + for (account, vtype) in vat_account2type.items() + if vtype in ("autoliq", "regular") + ], + } + + vat_payment_deduc_accounts = speedy["aa_obj"] + for (account, vtype) in vat_account2type.items(): + if vtype in ("asset", "regular"): + vat_payment_deduc_accounts |= account + + # Generate logs for vat_on_payment supplier invoices + vat_on_payment_account2logs = self._vat_on_payment( + "in", vat_payment_deduc_accounts.ids, speedy + ) + + # Generate return line for the 2 deduc VAT boxes + for box_type, vat_accounts in boxtype2vat_accounts.items(): + logger.info( + "Deduc VAT accounts: %s go to box type %s", + ", ".join([x.code for x in vat_accounts]), + box_type, + ) + logs = [] + for vat_account in vat_accounts: + # balance of deduc VAT account + balance = vat_account._fr_vat_get_balance("base_domain_end", speedy) + if not speedy["currency"].is_zero(balance): + logs.append( + { + "account_id": vat_account.id, + "compute_type": "balance", + "amount": balance, + } + ) + # minus unpaid vat_on_payment supplier invoices + logs += vat_on_payment_account2logs[vat_account] + self._create_line(speedy, logs, box_type) + + def _generate_deductible_vat_prepare_struct(self, speedy): + vat_account2type = {} + deduc_vat_taxes = speedy["at_obj"].search( + speedy["company_domain"] + + [ + ("amount_type", "=", "percent"), + ("amount", ">", 0), + ("type_tax_use", "=", "purchase"), + ] + ) + for tax in deduc_vat_taxes: + line = tax.invoice_repartition_line_ids.filtered( + lambda x: x.repartition_type == "tax" + and x.account_id + and int(x.factor_percent) == 100 + ) + if len(line) != 1: + logger.debug( + "Check that tax %s is a special gasoline tax", tax.display_name + ) + continue + vat_account = line.account_id + if tax.fr_vat_autoliquidation: + vtype = "autoliq" + else: + if vat_account.code.startswith("44562"): + vtype = "asset" + else: + vtype = "regular" + if not vat_account.code.startswith("44566"): + logger.warning( + "Found regular deduc VAT account %s. " + "Very strange, it should start with 44566." + % vat_account.code + ) + if ( + vat_account in vat_account2type + and vat_account2type[vat_account] != vtype + ): + raise UserError( + _( + "Account '%(account)s' is used for several kinds of " + "deductible VAT taxes (%(tax_type1)s and %(tax_type2)s).", + account=vat_account.display_name, + tax_type1=vtype, + tax_type2=vat_account2type[vat_account], + ) + ) + vat_account2type[vat_account] = vtype + + logger.info( + "Deduc VAT accounts: %s" + % ", ".join( + [ + "%s (%s)" % (acc.code, vtype) + for (acc, vtype) in vat_account2type.items() + ] + ) + ) + return vat_account2type + + def _generate_operation_untaxed(self, speedy): + self.ensure_one() + fp_types = ["intracom_b2b", "intracom_b2c", "extracom", "france_exo"] + fpositions2boxtype = {} + for fp_type in fp_types: + box_type = "untaxed_op_%s" % fp_type + fpositions = speedy["afp_obj"].search( + speedy["company_domain"] + [("fr_vat_type", "=", fp_type)] + ) + fpositions2boxtype[fpositions] = box_type + boxtype2accounts = {} + for fpositions, box_type in fpositions2boxtype.items(): + for fposition in fpositions: + revenue_account_mappings = fposition.account_ids.filtered( + lambda x: x.account_src_id.code.startswith("7") + and x.account_dest_id.code.startswith("7") + ) + if not revenue_account_mappings: + if fposition.fr_vat_type == "france_exo": + # it may be a purchase-only fiscal position (ex: Auto-entrep) + # -> no raise, only write a warning in chatter + self.message_post( + body=_( + "No account mapping on fiscal position " + "%(fp_name)s. " + "If this fiscal position is not " + "only used for purchase but also for sale, you must " + "configure an account mapping on revenue accounts.", + fp_id=fposition.id, + fp_name=fposition.display_name, + ) + ) + else: + raise UserError( + _("Missing account mapping on fiscal position '%s'.") + % fposition.display_name + ) + for mapping in revenue_account_mappings: + if box_type not in boxtype2accounts: + boxtype2accounts[box_type] = mapping.account_dest_id + else: + boxtype2accounts[box_type] |= mapping.account_dest_id + # check that an account is not present in several fiscal positions + # and create lines + account_unicity = [] + for (box_type, accounts) in boxtype2accounts.items(): + if account_unicity: + for acc in accounts: + if acc.id in account_unicity: + raise UserError( + _( + "Account '%s' is present in the mapping of several " + "fiscal positions." + ) + % acc.display_name + ) + account_unicity += accounts.ids + # create the declaration lines + logs = [] + for account in accounts: + balance = account._fr_vat_get_balance("base_domain_period", speedy) + if not speedy["currency"].is_zero(balance): + logs.append( + { + "amount": balance * -1, + "account_id": account.id, + "compute_type": "period_balance", + } + ) + self._create_line(speedy, logs, box_type) + + def _switch_negative_boxes(self, speedy): + negative_lines = speedy["line_obj"].search( + [ + ("value", "<", 0), + ("box_edi_type", "=", "MOA"), + ("parent_id", "=", self.id), + ] + ) + logger.info("%d negative lines detected", len(negative_lines)) + for line in negative_lines: + # delete negative due VAT base lines + if line.box_box_type == "due_vat_base": + line.unlink() + continue + negative_box = line.box_id.negative_switch_box_id + if not negative_box: + raise UserError( + _( + "Box '%(box)s' has a negative value (%(value)s) " + "but it doesn't have a negative switch box.", + box=line.box_id.display_name, + value=line.value, + ) + ) + negative_line = speedy["line_obj"].search( + [ + ("parent_id", "=", self.id), + ("box_id", "=", negative_box.id), + ], + limit=1, + ) + if not negative_line: + negative_line = speedy["line_obj"].create( + { + "box_id": negative_box.id, + "parent_id": self.id, + "negative_switch": True, + } + ) + # Transfer log line to the negative box line + for log in line.log_ids: + vals = { + "parent_id": negative_line.id, + } + log.write(vals) + line.unlink() + + def create_reimbursement_line(self, amount): + assert isinstance(amount, int) + assert amount > 0 + speedy = self._prepare_speedy() + box = self.env["l10n.fr.account.vat.box"]._box_from_single_box_type( + "vat_reimbursement" + ) + account_id = self._get_box_account(box).id + log_vals = { + "amount": amount, + "compute_type": "manual", + "account_id": account_id, + } + vals = {"box_id": box.id, "parent_id": self.id, "log_ids": [(0, 0, log_vals)]} + speedy["line_obj"].create(vals) + self._generate_ca3_bottom_totals(speedy) + + def _prepare_remove_credit_vat_reimbursement(self): + vals = { + "reimbursement_type": False, + "reimbursement_first_creation_date": False, + "reimbursement_end_date": False, + "reimbursement_comment_dgfip": False, + } + return vals + + def remove_credit_vat_reimbursement(self): + self.ensure_one() + speedy = self._prepare_speedy() + self.message_post(body=_("Credit VAT Reimbursement removed.")) + line_to_delete = speedy["line_obj"].search( + [("box_box_type", "=", "vat_reimbursement"), ("parent_id", "=", self.id)] + ) + line_to_delete.unlink() + self._generate_ca3_bottom_totals(speedy) + self._delete_move_and_attachments() + move = self._create_draft_account_move(speedy) + vals = self._prepare_remove_credit_vat_reimbursement() + vals["move_id"] = move.id + self.write(vals) + + def _create_sections(self, speedy): + # sections are created at the very end of generate_lines() + # that way, we don't create sections for 3310A if there are not 3310A lines + self.ensure_one() + box_domain = [("display_type", "!=", False)] + if not speedy["line_obj"].search_count( + [("box_form_code", "=", "3310A"), ("parent_id", "=", self.id)] + ): + box_domain.append(("form_code", "!=", "3310A")) + boxes = speedy["box_obj"].search(box_domain) + speedy["line_obj"].create( + [{"parent_id": self.id, "box_id": box.id} for box in boxes] + ) + + def _prepare_account_move(self, speedy): + self.ensure_one() + if not self.company_id.fr_vat_journal_id: + raise UserError( + _("Journal for VAT Journal Entry is not set on company '%s'.") + % self.company_id.display_name + ) + self._get_adjust_accounts(speedy) + lvals_list = [] + total = 0.0 + account2amount = defaultdict(float) + for line in self.line_ids.filtered(lambda x: x.box_accounting_method): + method = line.box_accounting_method + sign = method == "credit" and 1 or -1 + if line.box_box_type == "manual" and line.value_manual_int: + account = self._get_box_account(line.box_id, raise_if_none=True) + account2amount[ + (account, json.dumps(line.manual_analytic_distribution)) + ] += (line.value_manual_int * sign) + else: + for log in line.log_ids: + assert log.account_id # there is a python constrain on this + amount = log.amount * sign + # Special case for for VAT credit account 44567: + # we don't want to group + if log.account_id.code.startswith("44567"): + lvals = { + "account_id": log.account_id.id, + "analytic_distribution": log.analytic_distribution, + } + amount = speedy["currency"].round(amount) + total += amount + compare = speedy["currency"].compare_amounts(amount, 0) + if compare > 0: + lvals["credit"] = amount + lvals_list.append(lvals) + elif compare < 0: + lvals["debit"] = -amount + lvals_list.append(lvals) + logger.debug( + "VAT move account %s: %s", log.account_id.code, lvals + ) + else: + account2amount[ + (log.account_id, json.dumps(log.analytic_distribution)) + ] += amount + for (account, analytic_distribution_str), amount in account2amount.items(): + analytic_distribution = json.loads(analytic_distribution_str) + amount = speedy["currency"].round(amount) + total += amount + compare = speedy["currency"].compare_amounts(amount, 0) + lvals = { + "account_id": account.id, + "analytic_distribution": analytic_distribution, + } + if compare > 0: + lvals["credit"] = amount + lvals_list.append(lvals) + elif compare < 0: + lvals["debit"] = -amount + lvals_list.append(lvals) + logger.debug("VAT move account %s: %s", account.code, lvals) + total_compare = speedy["currency"].compare_amounts(total, 0) + total = speedy["currency"].round(total) + if total_compare > 0: + analytic_dist = self.company_id.fr_vat_expense_analytic_distribution + lvals_list.append( + { + "debit": total, + "account_id": speedy["expense_adjust_account"].id, + "analytic_distribution": analytic_dist, + } + ) + elif total_compare < 0: + analytic_dist = self.company_id.fr_vat_income_analytic_distribution + lvals_list.append( + { + "credit": -total, + "account_id": speedy["income_adjust_account"].id, + "analytic_distribution": analytic_dist, + } + ) + + vals = { + "date": self.end_date, + "journal_id": self.company_id.fr_vat_journal_id.id, + "ref": "CA3 %s" % self.display_name, + "company_id": speedy["company_id"], + "line_ids": [(0, 0, x) for x in lvals_list], + } + return vals + + def _reconcile_account_move(self, move, speedy): + excluded_lines = speedy["log_obj"].search_read( + [ + ("parent_parent_id", "=", self.id), + ("origin_move_id", "!=", False), + ("compute_type", "=", "unpaid_vat_on_payment"), + ], + ["origin_move_id"], + ) + excluded_line_ids = [x["origin_move_id"][0] for x in excluded_lines] + for line in move.line_ids.filtered(lambda x: x.account_id.reconcile): + account = line.account_id + domain = speedy["base_domain_end"] + [ + ("account_id", "=", account.id), + ("full_reconcile_id", "=", False), + ("move_id", "not in", excluded_line_ids), + ] + rg_res = speedy["aml_obj"].read_group(domain, ["balance"], []) + # or 0 is need to avoid a crash: rg_res[0]["balance"] = None + # when the moves are already reconciled + if rg_res and speedy["currency"].is_zero(rg_res[0]["balance"] or 0): + moves_to_reconcile = speedy["aml_obj"].search(domain) + moves_to_reconcile.remove_move_reconcile() + moves_to_reconcile.reconcile() + + def _create_draft_account_move(self, speedy): + self.ensure_one() + assert self.state in ("manual", "auto") + if not self.line_ids.filtered(lambda x: not x.box_display_type): + raise UserError( + _("The declaration %s doesn't contain any line.") % self.display_name + ) + move = speedy["am_obj"].create(self._prepare_account_move(speedy)) + return move + + def _get_box_account(self, box, raise_if_none=True): + self.ensure_one() + # I can't use speedy because this method is also called by onchange + company_id = self.company_id.id + account = box.with_company(company_id).account_id or False + if account: + return account + if not box.account_code: + if raise_if_none: + raise UserError( + _( + "On box '%s', the Account Code is not set. " + "You may want to setup a specific account on that box." + ) + % box.display_name + ) + return None + accounts = self.env["account.account"].search( + [ + ("company_id", "=", company_id), + ("deprecated", "=", False), + ("code", "=like", box.account_code + "%"), + ] + ) + if not accounts: + if raise_if_none: + raise UserError( + _( + "Box '%(box)s' is configured with Manual Account Code " + "'%(account_code)s', but there are no accounts that start " + "with this code in company '%(company)s'. " + "You may want to setup a specific account on that box.", + box=box.display_name, + account_code=box.account_code, + company=self.company_id.display_name, + ) + ) + return None + if len(accounts) > 1: + logger.warning( + "There are %d accounts that start with '%s' in company %s", + len(accounts), + box.account_code, + self.company_id.display_name, + ) + return accounts[0] + + def unlink(self): + for rec in self: + if rec.state != "manual": + raise UserError( + _( + "Cannot delete VAT return '%s' because it is not in " + "'Manual Lines' state." + ) + % rec.display_name + ) + return super().unlink() + + def print_ca3(self): + self.ensure_one() + # In manu/auto, we re-generate it every time because comment_dgfip + # may have changed + if self.ca3_attachment_id and self.state in ("manual", "auto"): + self.ca3_attachment_id.unlink() + if not self.ca3_attachment_id: + self.generate_ca3_attachment() + action = { + "name": "FEC", + "type": "ir.actions.act_url", + "url": "web/content/?model=%s&id=%d&filename_field=ca3_attachment_name&" + "field=ca3_attachment_datas&download=true&filename=%s" + % (self._name, self.id, self.ca3_attachment_name), + "target": "new", + # target: "new" and NOT "self", otherwise you get the following bug: + # after this action, all UserError won't show a pop-up to the user + # but will only show a warning message in the logs until the web + # page is reloaded + } + return action + + def generate_ca3_attachment(self): + packet1 = io.BytesIO() + packet2 = io.BytesIO() + packet3 = io.BytesIO() + # create a new PDF that contains the additional text with Reportlab + page2canvas = { + "1": canvas.Canvas(packet1, pagesize=A4), + "2": canvas.Canvas(packet2, pagesize=A4), + "3": canvas.Canvas(packet3, pagesize=A4), + } + page2canvas["1"].setFont("Helvetica", 10) + page2canvas["2"].setFont("Helvetica", 8) + page2canvas["3"].setFont("Helvetica", 8) + + for line in self.line_ids.filtered( + lambda x: not x.box_display_type and not x.box_form_code == "3310A" + ): + box = line.box_id + if not box.print_page or not box.print_x or not box.print_y: + logger.warning( + "Box %s not printed on PDF because missing page or x/y position", + box.name, + ) + continue + if box.edi_type == "MOA": + pdf_value = format(line.value, "_").replace("_", chr(160)) + elif box.edi_type == "CCI_TBX": + pdf_value = line.value_bool and "x" or False + else: + raise UserError(_("EDI type not supported for box '%s'.") % box.name) + + if pdf_value: + page2canvas[box.print_page].drawRightString( + box.print_x, box.print_y, pdf_value + ) + # Add static prints + static_prints = { + "company_name": { + "value": self.company_id.name, + "x": 282, + "y": 656, + }, + "siret": { + "value": self.company_id.siret, + "x": 408, + "y": 524, + }, + "vat": { + "value": self.company_id.vat, + "x": 408, + "y": 509, + }, + "start_day": { + "value": "%02d" % self.start_date.day, + "x": 151, + "y": 741, + }, + "start_month": { + "value": "%02d" % self.start_date.month, + "x": 169, + "y": 741, + }, + "start_year": { + "value": str(self.start_date.year), + "x": 186, + "y": 741, + }, + "end_day": { + "value": "%02d" % self.end_date.day, + "x": 220, + "y": 741, + }, + "end_month": { + "value": "%02d" % self.end_date.month, + "x": 239, + "y": 741, + }, + "end_year": { + "value": str(self.end_date.year), + "x": 258, + "y": 741, + }, + } + for pvals in static_prints.values(): + if pvals["value"]: + page2canvas["1"].drawString(pvals["x"], pvals["y"], pvals["value"]) + # Comment => block of text + if self.comment_dgfip: + text_object = page2canvas["1"].beginText(21, 290) + for line in self.comment_dgfip.splitlines(): + line_wrapped = textwrap.wrap( + line, width=120, break_long_words=False, replace_whitespace=False + ) + for wline in line_wrapped: + text_object.textLine(wline.rstrip()) + page2canvas["1"].drawText(text_object) + # Address => use flowable because it is multiline + addr = self.company_id.partner_id._display_address(without_company=True) + if addr: + styleSheet = getSampleStyleSheet() + style = styleSheet["BodyText"] + style.fontSize = 8 + style.leading = 9 + addr_para = Paragraph(addr.replace("\n", "
"), style) + addr_para.wrap(570 - 282, 636 - 602) + addr_para.drawOn(page2canvas["1"], 282, 602) + for canv in page2canvas.values(): + canv.save() + + # move to the beginning of the StringIO buffer + packet1.seek(0) + packet2.seek(0) + packet3.seek(0) + watermark_pdf_reader_p1 = PdfFileReader(packet1) + watermark_pdf_reader_p2 = PdfFileReader(packet2) + watermark_pdf_reader_p3 = PdfFileReader(packet3) + # read your existing PDF + ca3_original_fd = tools.file_open( + "l10n_fr_account_vat_return/report/CA3_cerfa.pdf", "rb" + ) + ca3_original_reader = PdfFileReader(ca3_original_fd) + ca3_writer = PdfFileWriter() + # add the "watermark" (which is the new pdf) on the existing page + page1 = ca3_original_reader.getPage(0) + page2 = ca3_original_reader.getPage(1) + page3 = ca3_original_reader.getPage(2) + page1.mergePage(watermark_pdf_reader_p1.getPage(0)) + page2.mergePage(watermark_pdf_reader_p2.getPage(0)) + page3.mergePage(watermark_pdf_reader_p3.getPage(0)) + ca3_writer.addPage(page1) + ca3_writer.addPage(page2) + ca3_writer.addPage(page3) + # finally, write "output" to a real file + out_ca3_io = io.BytesIO() + ca3_writer.write(out_ca3_io) + out_ca3_bytes = out_ca3_io.getvalue() + ca3_original_fd.close() + + filename = "CA3_%s.pdf" % self.display_name + attach = self.env["ir.attachment"].create( + { + "name": filename, + "res_id": self.id, + "res_model": self._name, + "raw": out_ca3_bytes, + } + ) + self.write({"ca3_attachment_id": attach.id}) + + +class L10nFrAccountVatReturnLine(models.Model): + _name = "l10n.fr.account.vat.return.line" + _description = "VAT Return Line for France (CA3 line)" + _order = "parent_id, box_sequence" + _check_company_auto = True + + parent_id = fields.Many2one( + "l10n.fr.account.vat.return", string="VAT Return", ondelete="cascade" + ) + company_id = fields.Many2one(related="parent_id.company_id", store=True) + state = fields.Selection(related="parent_id.state", store=True) + box_id = fields.Many2one( + "l10n.fr.account.vat.box", string="Box", ondelete="restrict", required=True + ) + box_code = fields.Char(related="box_id.code", store=True) + box_form_code = fields.Selection(related="box_id.form_code", store=True) + box_edi_type = fields.Selection(related="box_id.edi_type", store=True) + box_edi_code = fields.Char(related="box_id.edi_code", store=True) + box_accounting_method = fields.Selection( + related="box_id.accounting_method", store=True + ) + box_push_box_id = fields.Many2one(related="box_id.push_box_id", store=True) + box_push_sequence = fields.Integer(related="box_id.push_sequence", store=True) + box_box_type = fields.Selection(related="box_id.box_type", store=True) + box_name = fields.Char(related="box_id.name", store=True) + box_display_type = fields.Selection(related="box_id.display_type", store=True) + box_sequence = fields.Integer(related="box_id.sequence", store=True) + negative_switch = fields.Boolean(readonly=True) + value = fields.Integer( + compute="_compute_value", store=True + ) # MOA, QTY, PCD, CCI_TBX (manual + auto) + value_float = fields.Float( + compute="_compute_value", store=True, string="Value Before Rounding" + ) # MOA, QTY, PCD (auto) + value_bool = fields.Boolean(string="Value (Y/N)") # CCI_TBX (manual + auto) + value_manual_int = fields.Integer(string="Integer Value") # MOA, QTY, PCD (manual) + value_char = fields.Char(string="Text") # FTX (manual + auto), except for BA field + log_ids = fields.One2many( + "l10n.fr.account.vat.return.line.log", + "parent_id", + string="Computation Details", + readonly=True, + ) + manual_account_id = fields.Many2one( + "account.account", + string="Account", + compute="_compute_manual_account_id", + check_company=True, + readonly=False, + store=True, + precompute=True, + domain="[('company_id', '=', company_id), ('deprecated', '=', False)]", + ) + manual_analytic_distribution = fields.Json( + string="Analytic", + compute="_compute_manual_account_id", + readonly=False, + store=True, + precompute=True, + ) + analytic_precision = fields.Integer( + default=lambda self: self.env["decimal.precision"].precision_get( + "Percentage Analytic" + ), + ) + + # idea: field value_tree type fields.Char() that would agregate + # all types (adding € sign for MOA) and be used in tree view + # but the content would be aligned on the right => not so good idea... + + _sql_constraints = [ + ("unique_return_box", "unique(parent_id, box_id)", "This line already exists!") + ] + + @api.depends("box_id") + def _compute_manual_account_id(self): + aadmo = self.env["account.analytic.distribution.model"] + for line in self: + manual_account_id = False + manual_analytic_distribution = False + if line.box_id and line.box_id.box_type == "manual" and line.parent_id: + account = line.parent_id._get_box_account( + line.box_id, raise_if_none=False + ) + if account: + manual_account_id = account.id + manual_analytic_distribution = aadmo._get_distribution( + { + "account_prefix": account.code, + "company_id": line.parent_id.company_id.id, + } + ) + line.manual_account_id = manual_account_id + line.manual_analytic_distribution = manual_analytic_distribution + + @api.constrains("value_manual_int") + def _check_values(self): + for line in self: + if line.value_manual_int < 0: + raise UserError( + _( + "The value of line '%(box)s' (%(value)d) is negative.", + box=line.box_id.display_name, + value=line.value_manual_int, + ) + ) + if line.box_id.edi_type == "PCD" and line.value_manual_int > 100: + raise UserError( + _( + "The value of line '%(box)s' (%(value)d) is over 100.", + box=line.box_id.display_name, + value=line.value_manual_int, + ) + ) + + @api.depends( + "log_ids", + "log_ids.amount", + "value_bool", + "value_manual_int", + "box_id", + "negative_switch", + ) + def _compute_value(self): + rg_res = self.env["l10n.fr.account.vat.return.line.log"].read_group( + [("parent_id", "in", self.ids)], ["parent_id", "amount"], ["parent_id"] + ) + mapped_data = {x["parent_id"][0]: x["amount"] for x in rg_res} + for line in self: + value = 0 + value_float = 0 + sign = line.negative_switch and -1 or 1 + if not line.box_id.display_type: + if line.box_id.edi_type in ("MOA", "QTY", "PCD"): + if line.box_id.box_type == "manual": + value = line.value_manual_int + else: + value_float = mapped_data.get(line.id, 0) + value = int(round(value_float)) + elif line.box_id.edi_type == "CCI_TBX": + value = int(line.value_bool) + line.value = value * sign + line.value_float = value_float * sign + + +class L10nFrAccountVatReturnLineLog(models.Model): + _name = "l10n.fr.account.vat.return.line.log" + _description = "Compute log of VAT Return Line for France (CA3 line)" + _order = "parent_id, id" + + # for MOA fields only + parent_id = fields.Many2one( + "l10n.fr.account.vat.return.line", + string="VAT Return Line", + ondelete="cascade", + readonly=True, + ) + parent_parent_id = fields.Many2one(related="parent_id.parent_id", store=True) + # account_id is used for the generation of the account.move + # when box_accounting_method != False, and it is just informative + # when box_accounting_method = False + account_id = fields.Many2one( + "account.account", string="Account", ondelete="restrict", readonly=True + ) + # I don't inherit from analytic.mixin because I don't want analytic_distribution + # to have a compute method + analytic_distribution = fields.Json( + string="Analytic", + readonly=True, + ) + analytic_precision = fields.Integer( + default=lambda self: self.env["decimal.precision"].precision_get( + "Percentage Analytic" + ), + ) + compute_type = fields.Selection( + [ + ("period_balance", "Period Balance"), # used for untaxed operations + ("balance", "Ending Balance"), # used for VAT boxes + ("unpaid_vat_on_payment", "Unpaid VAT on Payment"), # used for VAT boxes + ("computed_base", "Computed Base"), # used for base VAT boxes + ("computed_vat_amount", "Computed VAT Amount"), + ("rate", "VAT Amount / VAT Rate"), + ("box", "Box Value"), # used for sum boxes (totals) + ("manual", "Manual"), # used for credit VAT reimbursement line + ], + required=True, + readonly=True, + ) + amount = fields.Float(readonly=True) + origin_move_id = fields.Many2one( + "account.move", string="Source Invoice", readonly=True + ) + origin_move_partner_id = fields.Many2one( + related="origin_move_id.commercial_partner_id", + string="Source Invoice Partner", + store=True, + ) + note = fields.Char() + + @api.constrains("parent_id", "account_id") + def _check_account_id(self): + for log in self: + if ( + log.parent_id + and log.parent_id.box_accounting_method + and not log.account_id + ): + raise ValidationError( + _( + "Error in the generation of the computation and " + "accounting details of box '%s': this box has an " + "accounting method but the account is not set." + ) + % log.parent_id.box_id.display_name + ) diff --git a/l10n_fr_account_vat_return/models/res_company.py b/l10n_fr_account_vat_return/models/res_company.py new file mode 100644 index 000000000..32443ee5d --- /dev/null +++ b/l10n_fr_account_vat_return/models/res_company.py @@ -0,0 +1,788 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.tools import float_compare + + +class ResCompany(models.Model): + _inherit = "res.company" + + fr_vat_periodicity = fields.Selection( + [ + ("1", "Monthly"), + ("3", "Quarterly"), + ("12", "Yearly"), + ], + default="1", + string="VAT Periodicity", + ) + fr_vat_exigibility = fields.Selection( + "_fr_vat_exigibility_selection", + default="on_invoice", + string="VAT Exigibility", + ) + fr_vat_update_lock_dates = fields.Boolean( + string="Update Lock Date upon VAT Return Validation" + ) + fr_vat_journal_id = fields.Many2one( + "account.journal", + string="Journal for VAT Journal Entry", + ondelete="restrict", + check_company=True, + ) + fr_vat_expense_analytic_distribution = fields.Json( + string="Analytic for Expense Adjustment", + compute="_compute_fr_vat_analytic_distribution", + store=True, + readonly=False, + precompute=True, + ) + fr_vat_income_analytic_distribution = fields.Json( + string="Analytic Account for Income Adjustment", + compute="_compute_fr_vat_analytic_distribution", + store=True, + readonly=False, + precompute=True, + ) + analytic_precision = fields.Integer( + default=lambda self: self.env["decimal.precision"].precision_get( + "Percentage Analytic" + ), + ) + fr_vat_bank_account_id = fields.Many2one( + "res.partner.bank", + string="Company Bank Account", + check_company=True, + ondelete="restrict", + help="Company bank account used to pay VAT or receive credit VAT reimbursements.", + ) + + @api.model + def _fr_vat_exigibility_selection(self): + res = [ + ("on_invoice", _("Based on invoice")), + ("on_payment", _("Based on payment")), + ("auto", _("Both (automatic)")), + ] + return res + + def _compute_fr_vat_analytic_distribution(self): + aadmo = self.env["account.analytic.distribution.model"] + for company in self: + company_id = company and company.id or False + expense_distri = aadmo._get_distribution( + { + "account_prefix": "658", + "company_id": company_id, + } + ) + income_distri = aadmo._get_distribution( + { + "account_prefix": "758", + "company_id": company_id, + } + ) + company.fr_vat_expense_analytic_distribution = expense_distri + company.fr_vat_income_analytic_distribution = income_distri + + @api.model + def _test_fr_vat_create_company( + self, company_name=None, fr_vat_exigibility="on_invoice" + ): + # I write this method here and not in the test, + # because it can be very useful for demos too + self = self.sudo() + company = self.create( + { + "name": company_name or "FR Company VAT", + "fr_vat_exigibility": fr_vat_exigibility, + "street": "42 rue du logiciel libre", + "zip": "69009", + "city": "Lyon", + "country_id": self.env.ref("base.fr").id, + "siret": "77788899100018", + "vat": "FR51777888991", + } + ) + self.env.user.write({"company_ids": [(4, company.id)]}) + fr_chart_template = self.env.ref("l10n_fr_oca.l10n_fr_pcg_chart_template") + fr_chart_template._load(company) + company._setup_l10n_fr_coa_vat_company() + return company + + def _setup_l10n_fr_coa_vat_company(self): # noqa: C901 + self.ensure_one() + afpo = self.env["account.fiscal.position"] + afpao = self.env["account.fiscal.position.account"] + afpto = self.env["account.fiscal.position.tax"] + aao = self.env["account.account"] + ato = self.env["account.tax"] + cdomain = [("company_id", "=", self.id)] + od_journal = self.env["account.journal"].search( + cdomain + [("type", "=", "general")], limit=1 + ) + self.write({"fr_vat_journal_id": od_journal.id}) + # activate all taxes + ato.search(cdomain + [("active", "=", False)]).write({"active": True}) + # Create France exo FP + france_exo_fp = afpo.create( + { + "name": "France exonéré", + "fr_vat_type": "france_exo", + "auto_apply": False, + "company_id": self.id, + } + ) + exo_fp_account_map = { + "701100": "701500", + "706100": "706500", + "707100": "707500", + "708510": "708550", + } + for (src_acc_code, dest_acc_code) in exo_fp_account_map.items(): + src_account = aao.search(cdomain + [("code", "=", src_acc_code)], limit=1) + assert src_account + dest_account = aao.create( + { + "company_id": self.id, + "code": dest_acc_code, + "name": "%s exonéré" % src_account.name, + "account_type": "income", + "reconcile": False, + "tax_ids": False, + } + ) + afpao.create( + { + "position_id": france_exo_fp.id, + "account_src_id": src_account.id, + "account_dest_id": dest_account.id, + } + ) + # I use extracom FP to get the list of source taxes + extracom_fp = afpo.search(cdomain + [("fr_vat_type", "=", "extracom")], limit=1) + tax_0_xmlid = "l10n_fr_oca.%d_tva_%s_0_exo" + sale_tax_dest_id = self.env.ref(tax_0_xmlid % (self.id, "sale")).id + purchase_tax_dest_id = self.env.ref(tax_0_xmlid % (self.id, "purchase")).id + + for extracom_tax_line in extracom_fp.tax_ids: + if extracom_tax_line.tax_src_id.type_tax_use == "sale": + tax_dest_id = sale_tax_dest_id + else: + tax_dest_id = purchase_tax_dest_id + afpto.create( + { + "position_id": france_exo_fp.id, + "tax_src_id": extracom_tax_line.tax_src_id.id, + "tax_dest_id": tax_dest_id, + } + ) + # Update account mapping on IntraEU B2B and Export + fp_to_update = { + "extracom": { + "701500": "701400", + "706500": "706400", + "707500": "707400", + "708550": "708540", + }, + "intracom_b2b": { + "701500": "701200", + "706500": "706200", + "707500": "707200", + "708550": "708520", + }, + } + for fp_fr_vat_type, fp_account_map in fp_to_update.items(): + fp = afpo.search(cdomain + [("fr_vat_type", "=", fp_fr_vat_type)], limit=1) + for src_acc_code, dest_acc_code in fp_account_map.items(): + src_acc = aao.search(cdomain + [("code", "=", src_acc_code)]) + dest_acc = aao.search(cdomain + [("code", "=", dest_acc_code)]) + afpao.create( + { + "position_id": fp.id, + "account_src_id": src_acc.id, + "account_dest_id": dest_acc.id, + } + ) + + def _test_create_invoice_with_payment( + self, move_type, date, partner, lines, payments, force_in_vat_on_payment=False + ): + self.ensure_one() + amo = self.env["account.move"].with_company(self.id) + self.env["account.move.line"].with_company(self.id) + apro = self.env["account.payment.register"] + vals = { + "company_id": self.id, + "move_type": move_type, + "invoice_date": date, + "partner_id": partner.id, + "currency_id": self.currency_id.id, + "invoice_line_ids": [], + } + for line in lines: + if "quantity" not in line: + line["quantity"] = 1 + line["display_type"] = "product" + vals["invoice_line_ids"].append((0, 0, line)) + move = amo.create(vals) + if move_type in ("in_invoice", "in_refund") and force_in_vat_on_payment: + move.write({"in_vat_on_payment": True}) + move.action_post() + + bank_journal = self.env["account.journal"].search( + [("type", "=", "bank"), ("company_id", "=", self.id)], limit=1 + ) + assert bank_journal + for (pay_date, payment_ratio) in payments.items(): + vals = { + "journal_id": bank_journal.id, + "payment_date": pay_date, + } + if payment_ratio != "residual": + assert payment_ratio > 0 and payment_ratio < 100 + vals["amount"] = self.currency_id.round( + move.amount_total * payment_ratio / 100 + ) + payment_wiz = apro.with_context( + active_model="account.move", active_ids=[move.id] + ).create(vals) + payment_wiz.action_create_payments() + return move + + def _test_get_account(self, code): + self.ensure_one() + account = self.env["account.account"].search( + [ + ("code", "=", code), + ("company_id", "=", self.id), + ], + limit=1, + ) + assert account + return account + + def _test_get_tax(self, type_tax_use, vat_rate, asset=False): + self.ensure_one() + taxes = ( + self.env["account.tax"] + .with_context(active_test=False) + .search( + [ + ("company_id", "=", self.id), + ("type_tax_use", "=", type_tax_use), + ("amount_type", "=", "percent"), + ("price_include", "=", False), + ("fr_vat_autoliquidation", "=", False), + ] + ) + ) + for tax in taxes: + if not asset and "immo" in tax.name: + continue + if asset and "immo" not in tax.name: + continue + if not float_compare(vat_rate, tax.amount, precision_digits=4): + return tax + return False + + def _test_common_product_dict( + self, product_dict, asset=False, product_type="consu" + ): + # I can't use product_type="product" because this module + # doesn't depend on the module "stock" + ppo = self.env["product.product"].with_company(self.id) + for vat_rate in product_dict.keys(): + if vat_rate == 21 and asset: + continue + if vat_rate: + real_vat_rate = vat_rate / 10 + sale_tax = self._test_get_tax("sale", real_vat_rate) + assert sale_tax + sale_tax_ids = [(6, 0, [sale_tax.id])] + purchase_tax = self._test_get_tax( + "purchase", real_vat_rate, asset=asset + ) + assert purchase_tax + purchase_tax_ids = [(6, 0, [purchase_tax.id])] + account_income_id = False + else: + real_vat_rate = 0 + exo_tax_xmlid = "l10n_fr_oca.%d_tva_%s_0_exo" + sale_tax = self.env.ref(exo_tax_xmlid % (self.id, "sale")) + sale_tax_ids = [(6, 0, [sale_tax.id])] + purchase_tax = self.env.ref(exo_tax_xmlid % (self.id, "purchase")) + purchase_tax_ids = [(6, 0, [purchase_tax.id])] + account_income_id = self._test_get_account("707500") + product_name = "Test-demo TVA %s %%" % real_vat_rate + if asset: + product_name += " immo" + product = ppo.create( + { + "name": product_name, + "type": product_type, + "sale_ok": True, + "purchase_ok": True, + "taxes_id": sale_tax_ids, + "supplier_taxes_id": purchase_tax_ids, + "categ_id": self.env.ref("product.product_category_all").id, + "property_account_income_id": account_income_id, + "company_id": self.id, + } + ) + product_dict[vat_rate] = product + + def _test_prepare_product_dict(self): + rate2product = { + 200: False, + 100: False, + 55: False, + 21: False, + 0: False, + } + + product_dict = { + "product": dict(rate2product), + "service": dict(rate2product), + "asset": dict(rate2product), + } + self._test_common_product_dict(product_dict["product"]) + self._test_common_product_dict(product_dict["asset"], asset=True) + self._test_common_product_dict(product_dict["service"], product_type="service") + return product_dict + + def _test_prepare_expense_account_dict(self): + aao = self.env["account.account"] + account_dict = { + "service": "6226", + "product": "607", + } + for key, account_prefix in account_dict.items(): + account = aao.search( + [ + ("code", "=ilike", account_prefix + "%"), + ("company_id", "=", self.id), + ], + limit=1, + ) + assert account + account_dict[key] = account + return account_dict + + def _test_prepare_partner_dict(self): + self.ensure_one() + partner_dict = { + "france": False, + "france_vendor_vat_on_payment": False, + "intracom_b2b": False, + # "intracom_b2c": False, + "extracom": False, + "france_exo": False, + } + afpo = self.env["account.fiscal.position"] + rpo = self.env["res.partner"].with_company(self.id) + for fr_vat_type in partner_dict.keys(): + fiscal_position = afpo.search( + [("company_id", "=", self.id), ("fr_vat_type", "=", fr_vat_type)], + limit=1, + ) + if fiscal_position: + # to avoid error on invoice validation + if fr_vat_type == "intracom_b2b": + fiscal_position.write({"vat_required": False}) + partner = rpo.create( + { + "is_company": True, + "name": "Test-demo %s" % fr_vat_type, + "property_account_position_id": fiscal_position.id, + "company_id": self.id, + } + ) + partner_dict[fr_vat_type] = partner + france_fiscal_position = afpo.search( + [("company_id", "=", self.id), ("fr_vat_type", "=", "france")], limit=1 + ) + partner_dict["monaco"] = rpo.create( + { + "name": "Monaco Partner", + "is_company": True, + "company_id": self.id, + "country_id": self.env.ref("base.mc").id, + "property_account_position_id": france_fiscal_position.id, + } + ) + return partner_dict + + def _test_create_move_init_vat_credit(self, amount, start_date): + self.ensure_one() + credit_acc = self._test_get_account("445670") + wait_acc = self._test_get_account("471000") + date = start_date + relativedelta(months=-3) + move = self.env["account.move"].create( + { + "company_id": self.id, + "date": date, + "journal_id": self.fr_vat_journal_id.id, + "line_ids": [ + ( + 0, + 0, + { + "account_id": credit_acc.id, + "debit": amount, + }, + ), + ( + 0, + 0, + { + "account_id": wait_acc.id, + "credit": amount, + }, + ), + ], + } + ) + move.action_post() + + def _test_create_invoice_data( + self, + start_date, + extracom_refund_ratio=0.5, + ): + product_dict = self._test_prepare_product_dict() + partner_dict = self._test_prepare_partner_dict() + account_dict = self._test_prepare_expense_account_dict() + after_end_date = start_date + relativedelta(months=1) + mid_date = start_date + relativedelta(days=12) + # OUT INVOICE/REFUND + # regular unpaid + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 10}, + {"product_id": product_dict["product"][100].id, "price_unit": 20}, + {"product_id": product_dict["product"][55].id, "price_unit": 1000}, + {"product_id": product_dict["product"][21].id, "price_unit": 2000}, + {"product_id": product_dict["product"][0].id, "price_unit": 100}, + ], + {}, + ) + # regular partially paid before end date + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 30}, + {"product_id": product_dict["product"][100].id, "price_unit": 40}, + {"product_id": product_dict["product"][55].id, "price_unit": 3000}, + {"product_id": product_dict["product"][21].id, "price_unit": 4000}, + {"product_id": product_dict["product"][0].id, "price_unit": 200}, + ], + {start_date: 25}, + ) + # regular partially paid after end date + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 50}, + {"product_id": product_dict["product"][100].id, "price_unit": 60}, + {"product_id": product_dict["product"][55].id, "price_unit": 5000}, + {"product_id": product_dict["product"][21].id, "price_unit": 6000}, + {"product_id": product_dict["product"][0].id, "price_unit": 300}, + ], + {after_end_date: 40}, + ) + # regular paid before end date + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 70}, + {"product_id": product_dict["product"][100].id, "price_unit": 80}, + {"product_id": product_dict["product"][55].id, "price_unit": 7000}, + {"product_id": product_dict["product"][21].id, "price_unit": 8000}, + {"product_id": product_dict["product"][0].id, "price_unit": 400}, + ], + {mid_date: "residual"}, + ) + # regular paid after end date + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 90}, + {"product_id": product_dict["product"][100].id, "price_unit": 100}, + {"product_id": product_dict["product"][55].id, "price_unit": 9000}, + {"product_id": product_dict["product"][21].id, "price_unit": 10000}, + {"product_id": product_dict["product"][0].id, "price_unit": 500}, + ], + {after_end_date: "residual"}, + ) + # monaco + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["monaco"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 110}, + {"product_id": product_dict["product"][100].id, "price_unit": 120}, + {"product_id": product_dict["product"][55].id, "price_unit": 11000}, + {"product_id": product_dict["product"][21].id, "price_unit": 12000}, + {"product_id": product_dict["product"][0].id, "price_unit": 600}, + ], + {start_date: "residual"}, + ) + # refund unpaid + self._test_create_invoice_with_payment( + "out_refund", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 130}, + {"product_id": product_dict["product"][100].id, "price_unit": 140}, + {"product_id": product_dict["product"][55].id, "price_unit": 13000}, + {"product_id": product_dict["product"][21].id, "price_unit": 14000}, + {"product_id": product_dict["product"][0].id, "price_unit": 700}, + ], + {}, + ) + # intracom B2B + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["intracom_b2b"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 10}, + {"product_id": product_dict["product"][100].id, "price_unit": 20}, + {"product_id": product_dict["product"][55].id, "price_unit": 30}, + {"product_id": product_dict["product"][21].id, "price_unit": 40}, + {"product_id": product_dict["product"][0].id, "price_unit": 50}, + ], + {start_date: "residual"}, + ) + # extracom invoice + self._test_create_invoice_with_payment( + "out_invoice", + start_date, + partner_dict["extracom"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 100}, + {"product_id": product_dict["product"][100].id, "price_unit": 200}, + {"product_id": product_dict["product"][55].id, "price_unit": 300}, + {"product_id": product_dict["product"][21].id, "price_unit": 400}, + {"product_id": product_dict["product"][0].id, "price_unit": 500}, + ], + {start_date: "residual"}, + ) + # extracom refund + ratio = extracom_refund_ratio + self._test_create_invoice_with_payment( + "out_refund", + start_date, + partner_dict["extracom"], + [ + { + "product_id": product_dict["product"][200].id, + "price_unit": 100 * ratio, + }, + { + "product_id": product_dict["product"][100].id, + "price_unit": 200 * ratio, + }, + { + "product_id": product_dict["product"][55].id, + "price_unit": 300 * ratio, + }, + { + "product_id": product_dict["product"][21].id, + "price_unit": 400 * ratio, + }, + { + "product_id": product_dict["product"][0].id, + "price_unit": 500 * ratio, + }, + ], + {start_date: "residual"}, + ) + # IN INVOICE/PAYMENT + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 110}, + {"product_id": product_dict["product"][100].id, "price_unit": 110}, + {"product_id": product_dict["product"][55].id, "price_unit": 110}, + {"product_id": product_dict["product"][21].id, "price_unit": 110}, + ], + {start_date: "residual"}, + ) + self._test_create_invoice_with_payment( + "in_refund", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 10}, + {"product_id": product_dict["product"][100].id, "price_unit": 10}, + {"product_id": product_dict["product"][55].id, "price_unit": 10}, + {"product_id": product_dict["product"][21].id, "price_unit": 10}, + ], + {start_date: "residual"}, + ) + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["france"], + [ + {"product_id": product_dict["asset"][200].id, "price_unit": 5000}, + {"product_id": product_dict["asset"][100].id, "price_unit": 100}, + {"product_id": product_dict["asset"][55].id, "price_unit": 1000}, + ], + {start_date: "residual"}, + ) + self._test_create_invoice_with_payment( # No impact + "in_invoice", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["asset"][200].id, "price_unit": 10000}], + {}, + ) + self._test_create_invoice_with_payment( # No impact + "in_refund", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["asset"][200].id, "price_unit": 1234}], + {}, + ) + self._test_create_invoice_with_payment( # No impact + "in_invoice", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["product"][200].id, "price_unit": 10000}], + {after_end_date: "residual"}, + ) + # VAT on payment with partial payment + # I don't put partial payment in asset supplier invoices in order + # to allow 445620 to be reconciled and test that it works + self._test_create_invoice_with_payment( # No impact + "in_invoice", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["product"][200].id, "price_unit": 10000}], + {after_end_date: 25}, + ) + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["product"][200].id, "price_unit": 1000}], + {start_date: 25}, + ) + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["product"][100].id, "price_unit": 100}], + {start_date: 70, after_end_date: "residual"}, + ) + # HA intracom + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["intracom_b2b"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 75}, + {"product_id": product_dict["service"][200].id, "price_unit": 25}, + {"product_id": product_dict["product"][100].id, "price_unit": 80}, + {"product_id": product_dict["service"][100].id, "price_unit": 30}, + {"product_id": product_dict["product"][55].id, "price_unit": 750}, + {"product_id": product_dict["service"][55].id, "price_unit": 250}, + {"product_id": product_dict["product"][21].id, "price_unit": 300}, + {"product_id": product_dict["service"][21].id, "price_unit": 800}, + ], + {start_date: "residual"}, + ) + intra_tax_ids = {} + intra_b2b_fp = self.env["account.fiscal.position"].search( + [("company_id", "=", self.id), ("fr_vat_type", "=", "intracom_b2b")], + limit=1, + ) + for tax_map_line in intra_b2b_fp.tax_ids: + tax = tax_map_line.tax_dest_id + if tax.type_tax_use == "purchase": + rate = int(round(tax.amount * 10)) + intra_tax_ids[rate] = [(6, 0, [tax.id])] + + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["intracom_b2b"], + [ + { + "account_id": account_dict["product"].id, + "tax_ids": intra_tax_ids[200], + "price_unit": 75, + }, + { + "account_id": account_dict["service"].id, + "tax_ids": intra_tax_ids[200], + "price_unit": 25, + }, + { + "account_id": account_dict["product"].id, + "tax_ids": intra_tax_ids[100], + "price_unit": 80, + }, + { + "account_id": account_dict["service"].id, + "tax_ids": intra_tax_ids[100], + "price_unit": 30, + }, + { + "account_id": account_dict["product"].id, + "tax_ids": intra_tax_ids[55], + "price_unit": 750, + }, + { + "account_id": account_dict["service"].id, + "tax_ids": intra_tax_ids[55], + "price_unit": 250, + }, + { + "account_id": account_dict["product"].id, + "tax_ids": intra_tax_ids[21], + "price_unit": 300, + }, + { + "account_id": account_dict["service"].id, + "tax_ids": intra_tax_ids[21], + "price_unit": 800, + }, + ], + {start_date: "residual"}, + ) + # HA extracom + self._test_create_invoice_with_payment( + "in_invoice", + start_date, + partner_dict["extracom"], + [ + {"product_id": product_dict["service"][200].id, "price_unit": 300}, + {"product_id": product_dict["service"][100].id, "price_unit": 310}, + {"product_id": product_dict["service"][55].id, "price_unit": 3000}, + {"product_id": product_dict["service"][21].id, "price_unit": 3100}, + ], + {start_date: "residual"}, + ) diff --git a/l10n_fr_account_vat_return/readme/CONTRIBUTORS.rst b/l10n_fr_account_vat_return/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..ff65d68ce --- /dev/null +++ b/l10n_fr_account_vat_return/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/l10n_fr_account_vat_return/readme/DESCRIPTION.rst b/l10n_fr_account_vat_return/readme/DESCRIPTION.rst new file mode 100644 index 000000000..b4284235c --- /dev/null +++ b/l10n_fr_account_vat_return/readme/DESCRIPTION.rst @@ -0,0 +1,9 @@ +This module adds support for the French VAT declaration *CA3* (monthly or quarterly): + +* computation of the boxes of the CA3 form, +* print the CA3 PDF, +* generate the corresponding journal entry. + +It can also be used for the smaller companies which have a yearly CA12 VAT declaration. But, for CA12, the generation of the PDF and the auto-fill of the form on impots.gouv.fr is not supported: you will have to manually copy the values on the online form. + +This module also supports declaration 3519 for the reimbursement of VAT credit. diff --git a/l10n_fr_account_vat_return/report/CA3_cerfa.pdf b/l10n_fr_account_vat_return/report/CA3_cerfa.pdf new file mode 100644 index 000000000..0f9c55897 Binary files /dev/null and b/l10n_fr_account_vat_return/report/CA3_cerfa.pdf differ diff --git a/l10n_fr_account_vat_return/security/ir.model.access.csv b/l10n_fr_account_vat_return/security/ir.model.access.csv new file mode 100644 index 000000000..4dab6c6bb --- /dev/null +++ b/l10n_fr_account_vat_return/security/ir.model.access.csv @@ -0,0 +1,8 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_l10n_fr_account_vat_box_read,Read access on l10n.fr.account.vat.box,model_l10n_fr_account_vat_box,base.group_user,1,0,0,0 +access_l10n_fr_account_vat_box_full,Full access on l10n.fr.account.vat.box,model_l10n_fr_account_vat_box,account.group_account_manager,1,1,1,1 +access_l10n_fr_account_vat_return_full,Full access on l10n.fr.account.vat.return,model_l10n_fr_account_vat_return,account.group_account_user,1,1,1,1 +access_l10n_fr_account_vat_return_line_full,Full access on l10n.fr.account.vat.return.line,model_l10n_fr_account_vat_return_line,account.group_account_user,1,1,1,1 +access_l10n_fr_account_vat_return_line_log_full,Full access on l10n.fr.account.vat.return.line.log,model_l10n_fr_account_vat_return_line_log,account.group_account_user,1,1,1,1 +access_l10n_fr_account_vat_return_reimbursement_full,Full access on l10n.fr.account.vat.return.reimbursement wizard,model_l10n_fr_account_vat_return_reimbursement,account.group_account_user,1,1,1,1 +access_l10n_fr_vat_exigibility_update,Full access on l10n_fr_vat_exigibility_update wizard,model_l10n_fr_vat_exigibility_update,account.group_account_manager,1,1,1,1 diff --git a/l10n_fr_account_vat_return/security/ir_rule.xml b/l10n_fr_account_vat_return/security/ir_rule.xml new file mode 100644 index 000000000..d79d71470 --- /dev/null +++ b/l10n_fr_account_vat_return/security/ir_rule.xml @@ -0,0 +1,15 @@ + + + + + + FR VAT return multi-company + + [('company_id', 'in', company_ids)] + + + diff --git a/l10n_fr_account_vat_return/static/description/icon.png b/l10n_fr_account_vat_return/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/l10n_fr_account_vat_return/static/description/icon.png differ diff --git a/l10n_fr_account_vat_return/static/description/index.html b/l10n_fr_account_vat_return/static/description/index.html new file mode 100644 index 000000000..b7452db6a --- /dev/null +++ b/l10n_fr_account_vat_return/static/description/index.html @@ -0,0 +1,428 @@ + + + + + + +France VAT Return + + + +
+

France VAT Return

+ + +

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

+

This module adds support for the French VAT declaration CA3 (monthly or quarterly):

+
    +
  • computation of the boxes of the CA3 form,
  • +
  • print the CA3 PDF,
  • +
  • generate the corresponding journal entry.
  • +
+

It can also be used for the smaller companies which have a yearly CA12 VAT declaration. But, for CA12, the generation of the PDF and the auto-fill of the form on impots.gouv.fr is not supported: you will have to manually copy the values on the online form.

+

This module also supports declaration 3519 for the reimbursement of VAT credit.

+

Table of contents

+ +
+

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

+
    +
  • Akretion
  • +
+
+
+

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.

+

Current maintainer:

+

alexis-via

+

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

+

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

+
+
+
+ + diff --git a/l10n_fr_account_vat_return/tests/__init__.py b/l10n_fr_account_vat_return/tests/__init__.py new file mode 100644 index 000000000..5fb2aeb10 --- /dev/null +++ b/l10n_fr_account_vat_return/tests/__init__.py @@ -0,0 +1 @@ +from . import test_fr_account_vat_return diff --git a/l10n_fr_account_vat_return/tests/test_fr_account_vat_return.py b/l10n_fr_account_vat_return/tests/test_fr_account_vat_return.py new file mode 100644 index 000000000..4bf1e5a7e --- /dev/null +++ b/l10n_fr_account_vat_return/tests/test_fr_account_vat_return.py @@ -0,0 +1,378 @@ +# Copyright 2022 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from collections import defaultdict +from datetime import datetime + +from dateutil.relativedelta import relativedelta + +from odoo import fields +from odoo.tests import tagged +from odoo.tests.common import TransactionCase + + +@tagged("post_install", "-at_install") +class TestFrAccountVatReturn(TransactionCase): + def setUp(self): + super().setUp() + self.today = datetime.now().date() + self.start_date = self.today + relativedelta(months=-1, day=1) + self.before_start_date = self.start_date + relativedelta(days=-1) + self.end_date = self.start_date + relativedelta(day=31) + self.first_creation_date = fields.Date.from_string("2022-01-01") + + def _check_vat_return_result(self, vat_return, result): + box2value = {} + for line in vat_return.line_ids.filtered( + lambda x: not x.box_display_type and x.box_edi_type == "MOA" + ): + box2value[(line.box_form_code, line.box_edi_code)] = line.value + for box_xmlid, expected_value in result.items(): + box = self.env.ref("l10n_fr_account_vat_return.%s" % box_xmlid) + real_valuebox = box2value.pop((box.form_code, box.edi_code)) + self.assertEqual(real_valuebox, expected_value) + self.assertFalse(box2value) + + def _move_to_dict(self, move): + assert move + currency = move.company_id.currency_id + move_dict = defaultdict(float) + for line in move.line_ids: + move_dict[line.account_id.code] += line.balance + self.assertEqual( + currency.compare_amounts(move_dict.get("758000", 0) * -1, 1), -1 + ) + self.assertEqual(currency.compare_amounts(move_dict.get("658000", 0), 1), -1) + return move_dict + + def test_vat_return_on_invoice(self): + company = self.env["res.company"]._test_fr_vat_create_company( + company_name="FR Company VAT on_invoice", fr_vat_exigibility="on_invoice" + ) + currency = company.currency_id + initial_credit_vat = 3333 + company._test_create_move_init_vat_credit( + initial_credit_vat, self.before_start_date + ) + company._test_create_invoice_data(self.start_date) + vat_return = self.env["l10n.fr.account.vat.return"].create( + { + "company_id": company.id, + "start_date": self.start_date, + "vat_periodicity": "1", + } + ) + self.assertEqual(vat_return.end_date, self.end_date) + self.assertEqual(vat_return.state, "manual") + # Create a manual line redevance TV + self.env["l10n.fr.account.vat.return.line"].create( + { + "box_id": self.env.ref("l10n_fr_account_vat_return.a_jb").id, + "value_manual_int": 134, + "parent_id": vat_return.id, + } + ) + # Create another manual line with a rate + manual_account_id = self.env["account.account"].create( + { + "code": "635820", + "name": "Taxe sur la diffusion de contenus audiovisuels", + "company_id": company.id, + "account_type": "expense", + } + ) + self.env.ref("l10n_fr_account_vat_return.a_kj").with_company(company.id).write( + {"account_id": manual_account_id} + ) + self.env["l10n.fr.account.vat.return.line"].create( + { + "box_id": self.env.ref("l10n_fr_account_vat_return.a_mk").id, + "value_manual_int": 1000, + "parent_id": vat_return.id, + } + ) + vat_return.manual2auto() + self.assertEqual(vat_return.state, "auto") + expected_res = { + "ca3_ca": 51510, # A + "ca3_kh": 2210, # A3 HA intracom services + "ca3_cc": 2410, # B2 HA intracom products + "ca3_cg": 6710, # B4 HA extracom + "ca3_da": 750, # E1 Extracom + "ca3_db": 1400, # E2 Autres opérations non imposables + "ca3_dc": 150, # F2 livraisons intracom + ###### + "ca3_fp": 730, # base 20% + "ca3_gp": 146, # montant collecté 20% + "ca3_fr": 810, # base 10% + "ca3_gr": 81, # montant collecté 10% + "ca3_fb": 28000, # base 5,5% + "ca3_gb": 1540, # montant collecté 5,5% + "ca3_mf": 33300, # base 2,1% + "ca3_me": 699, # montant collecté 2,1% + "ca3_gh": 2466, # Total TVA collectée + "ca3_gj": 141, # dont TVA sur acquisitions intracom + "ca3_gk": 891, # dont TVA à Monaco + ###### + "ca3_ha": 1065, # TVA déduc immo + "ca3_hb": 634, # TVA déduc biens et services + "ca3_hd": initial_credit_vat, # report crédit TVA + "ca3_hg": 5032, # total VAT deduc + ###### + "a_jb": 134, + "a_mk": 1000, + "a_kj": 52, + "a_hb": 186, + "ca3_kb": 186, # Report taxes annexes + "ca3_ke": 186, # Total à payer + "ca3_ja": 2566, # credit TVA (ligne 23 - 16) + "ca3_jc": 2566, # crédit à reporter + } + self._check_vat_return_result(vat_return, expected_res) + move = vat_return.move_id + self.assertTrue(move) + self.assertEqual(move.state, "draft") + self.assertEqual(move.date, vat_return.end_date) + self.assertEqual(move.journal_id, company.fr_vat_journal_id) + move_dict = self._move_to_dict(move) + self.assertFalse( + currency.compare_amounts(move_dict["447000"], expected_res["ca3_kb"] * -1) + ) + self.assertFalse( + currency.compare_amounts( + move_dict["445670"], expected_res["ca3_jc"] - expected_res["ca3_hd"] + ) + ) + self.assertFalse( + currency.compare_amounts(move_dict["635820"], expected_res["a_kj"]) + ) + self.assertFalse( + currency.compare_amounts(move_dict["635800"], expected_res["a_jb"]) + ) + + # Test reimbursement + self.assertTrue(vat_return.reimbursement_show_button) + reimbursement_type = "first" + reimbursement_amount = 2000 + reimb_wiz = self.env["l10n.fr.account.vat.return.reimbursement"].create( + { + "return_id": vat_return.id, + "amount": reimbursement_amount, + "reimbursement_type": reimbursement_type, + "first_creation_date": self.first_creation_date, + } + ) + reimb_wiz.validate() + reimb_expected_res = dict(expected_res) + reimb_expected_res.update( + { + "ca3_jb": reimbursement_amount, + "ca3_jc": expected_res["ca3_jc"] - reimbursement_amount, + } + ) + self._check_vat_return_result(vat_return, reimb_expected_res) + self.assertEqual(vat_return.reimbursement_type, reimbursement_type) + self.assertEqual( + vat_return.reimbursement_first_creation_date, self.first_creation_date + ) + move = vat_return.move_id + move_dict = self._move_to_dict(move) + self.assertFalse( + currency.compare_amounts(move_dict["445830"], reimbursement_amount) + ) + # 445670: Do not mix the balance of the move and the balance of the + # account. The balance of the account must be equal to + # reimb_expected_res["ca3_jc"] + self.assertFalse( + currency.compare_amounts( + initial_credit_vat + move_dict["445670"], reimb_expected_res["ca3_jc"] + ) + ) + vat_return.remove_credit_vat_reimbursement() + move = vat_return.move_id + self._check_vat_return_result(vat_return, expected_res) + self.assertFalse(vat_return.reimbursement_type) + self.assertFalse(vat_return.reimbursement_first_creation_date) + vat_return.print_ca3() + vat_return.auto2sent() + self.assertEqual(vat_return.state, "sent") + vat_return.sent2posted() + self.assertEqual(vat_return.state, "posted") + self.assertEqual(move.state, "posted") + aao = self.env["account.account"] + speedy = vat_return._prepare_speedy() + bal_zero_accounts = ["445711", "445712", "445713", "445714", "445715"] + for acc_code in bal_zero_accounts: + acc = aao.search( + [("code", "=", acc_code), ("company_id", "=", company.id)], limit=1 + ) + self.assertTrue(acc) + balance = acc._fr_vat_get_balance("base_domain_end", speedy) + self.assertTrue(currency.is_zero(balance)) + must_be_reconciled = bal_zero_accounts + ["445620"] + for line in move.line_ids: + if line.account_id.code in must_be_reconciled: + self.assertTrue(line.full_reconcile_id) + + def test_vat_return_on_payment(self): + company = self.env["res.company"]._test_fr_vat_create_company( + company_name="FR Company VAT on_payment", fr_vat_exigibility="on_payment" + ) + currency = company.currency_id + initial_credit_vat = 22 + company._test_create_move_init_vat_credit( + initial_credit_vat, self.before_start_date + ) + company._test_create_invoice_data(self.start_date, extracom_refund_ratio=2) + vat_return = self.env["l10n.fr.account.vat.return"].create( + { + "company_id": company.id, + "start_date": self.start_date, + "vat_periodicity": "1", + } + ) + self.assertEqual(vat_return.end_date, self.end_date) + self.assertEqual(vat_return.state, "manual") + vat_return.manual2auto() + self.assertEqual(vat_return.state, "auto") + expected_res = { + "ca3_ca": 40148, # A + "ca3_kh": 2210, # A3 HA intracom services + "ca3_cc": 2410, # B2 HA intracom products + "ca3_cg": 6710, # B4 HA extracom + "ca3_db": 1400, # E2 Autres opérations non imposables + "ca3_dc": 150, # F2 livraisons intracom + "ca3_de": 1500, # F8 régularisations + # => replaces E1 because the extracom amount is negative + ###### + "ca3_fp": 688, # base 20% + "ca3_gp": 138, # montant collecté 20% + "ca3_fr": 740, # base 10% + "ca3_gr": 74, # montant collecté 10% + "ca3_fb": 23750, # base 5,5% + "ca3_gb": 1306, # montant collecté 5,5% + "ca3_mf": 26300, # base 2,1% + "ca3_me": 552, # montant collecté 2,1% + "ca3_gh": 2070, # Total TVA collectée + "ca3_gj": 141, # dont TVA sur acquisitions intracom + "ca3_gk": 891, # dont TVA à Monaco + ###### + "ca3_ha": 1065, # TVA déduc immo + "ca3_hb": 634, # TVA déduc biens et services + "ca3_hd": initial_credit_vat, # report crédit TVA + "ca3_hg": 1721, # total VAT deduc + ###### + "ca3_ka": 349, # TVA à payer (ligne 16 - 23) + "ca3_nd": 349, # TVA nette due (ligne TD - X5) + "ca3_ke": 349, # Total à payer + } + self._check_vat_return_result(vat_return, expected_res) + move = vat_return.move_id + self.assertTrue(move) + self.assertEqual(move.state, "draft") + self.assertEqual(move.date, vat_return.end_date) + self.assertEqual(move.journal_id, company.fr_vat_journal_id) + move_dict = self._move_to_dict(move) + self.assertFalse( + currency.compare_amounts(move_dict["445510"], expected_res["ca3_ke"] * -1) + ) + self.assertFalse( + currency.compare_amounts(move_dict["445670"], initial_credit_vat * -1) + ) + vat_return.print_ca3() + vat_return.auto2sent() + self.assertEqual(vat_return.state, "sent") + vat_return.sent2posted() + self.assertEqual(vat_return.state, "posted") + self.assertEqual(move.state, "posted") + aao = self.env["account.account"] + speedy = vat_return._prepare_speedy() + acc2bal = { + "445711": -8.5, # 20% + "445712": -7, # 10% + "445713": -233.75, # 5,5% + "445714": -147, # 2,1 % + "445715": 0, # 8,5% + } + for acc_code, expected_bal in acc2bal.items(): + acc = aao.search( + [("code", "=", acc_code), ("company_id", "=", company.id)], limit=1 + ) + self.assertTrue(acc) + real_bal = acc._fr_vat_get_balance("base_domain_end", speedy) + self.assertFalse(currency.compare_amounts(real_bal, expected_bal)) + must_be_reconciled = ["445620"] + for line in move.line_ids: + if line.account_id.code in must_be_reconciled: + self.assertTrue(line.full_reconcile_id) + + def test_vat_return_on_invoice_negative(self): + company = self.env["res.company"]._test_fr_vat_create_company( + company_name="FR Company VAT on_invoice neg", + fr_vat_exigibility="on_invoice", + ) + initial_credit_vat = 44 + company._test_create_move_init_vat_credit( + initial_credit_vat, self.before_start_date + ) + product_dict = company._test_prepare_product_dict() + partner_dict = company._test_prepare_partner_dict() + company._test_create_invoice_with_payment( + "out_invoice", + self.start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 200}, + {"product_id": product_dict["product"][100].id, "price_unit": 100}, + ], + {}, + ) + company._test_create_invoice_with_payment( + "out_refund", + self.start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 400}, + {"product_id": product_dict["product"][100].id, "price_unit": 200}, + ], + {}, + ) + company._test_create_invoice_with_payment( + "in_refund", + self.start_date, + partner_dict["france"], + [ + {"product_id": product_dict["product"][200].id, "price_unit": 100}, + {"product_id": product_dict["product"][100].id, "price_unit": 10}, + ], + {}, + ) + company._test_create_invoice_with_payment( + "in_refund", + self.start_date, + partner_dict["france_vendor_vat_on_payment"], + [{"product_id": product_dict["asset"][55].id, "price_unit": 1000}], + {self.start_date: "residual"}, + ) + lfavro = self.env["l10n.fr.account.vat.return"] + vat_return = lfavro.create( + { + "company_id": company.id, + "start_date": self.start_date, + "vat_periodicity": "1", + } + ) + vat_return.manual2auto() + expected_res = { + "ca3_ce": 300, # B5 regul + "ca3_gg": 76, # 15 TVA antérieurement déduite à reverser + "ca3_gh": 76, # Total TVA collectée + "ca3_hc": 50, # TVA déduc biens et services + "ca3_hd": initial_credit_vat, # report crédit TVA + "ca3_hg": 50 + initial_credit_vat, # total VAT deduc + ###### + "ca3_ja": initial_credit_vat - 76 + 50, # Crédit TVA + "ca3_jc": initial_credit_vat - 76 + 50, # Crédit TVA + } + self._check_vat_return_result(vat_return, expected_res) diff --git a/l10n_fr_account_vat_return/views/account_fiscal_position.xml b/l10n_fr_account_vat_return/views/account_fiscal_position.xml new file mode 100644 index 000000000..f1db5d810 --- /dev/null +++ b/l10n_fr_account_vat_return/views/account_fiscal_position.xml @@ -0,0 +1,35 @@ + + + + + + account.fiscal.position + + + + + + + + + + account.fiscal.position + + + + + + + + + diff --git a/l10n_fr_account_vat_return/views/account_fiscal_position_template.xml b/l10n_fr_account_vat_return/views/account_fiscal_position_template.xml new file mode 100644 index 000000000..9f7d60c2a --- /dev/null +++ b/l10n_fr_account_vat_return/views/account_fiscal_position_template.xml @@ -0,0 +1,28 @@ + + + + + intrastat.account.fiscal.position.template.form + account.fiscal.position.template + + + + + + + + + intrastat.account.fiscal.position.template.tree + account.fiscal.position.template + + + + + + + + diff --git a/l10n_fr_account_vat_return/views/account_move.xml b/l10n_fr_account_vat_return/views/account_move.xml new file mode 100644 index 000000000..c85fc379e --- /dev/null +++ b/l10n_fr_account_vat_return/views/account_move.xml @@ -0,0 +1,40 @@ + + + + + + account.move + + + + + + + + + + + + account.move + + + + + + + + + diff --git a/l10n_fr_account_vat_return/views/account_tax.xml b/l10n_fr_account_vat_return/views/account_tax.xml new file mode 100644 index 000000000..1ceb2b05e --- /dev/null +++ b/l10n_fr_account_vat_return/views/account_tax.xml @@ -0,0 +1,29 @@ + + + + + + account.tax + + + + + + + + + + account.tax + + + + + + + + + diff --git a/l10n_fr_account_vat_return/views/l10n_fr_account_vat_box.xml b/l10n_fr_account_vat_return/views/l10n_fr_account_vat_box.xml new file mode 100644 index 000000000..a44ce9bab --- /dev/null +++ b/l10n_fr_account_vat_return/views/l10n_fr_account_vat_box.xml @@ -0,0 +1,220 @@ + + + + + + l10n.fr.account.vat.box + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + l10n.fr.account.vat.box + + + + + + + + + + + + + + + + + + + + + + + + + + + + + l10n.fr.account.vat.box + + + + + + + + + + + + + + + + + + + + France VAT Boxes + l10n.fr.account.vat.box + tree,form + + + + +
diff --git a/l10n_fr_account_vat_return/views/l10n_fr_account_vat_return.xml b/l10n_fr_account_vat_return/views/l10n_fr_account_vat_return.xml new file mode 100644 index 000000000..6d07f7e9d --- /dev/null +++ b/l10n_fr_account_vat_return/views/l10n_fr_account_vat_return.xml @@ -0,0 +1,472 @@ + + + + + + l10n.fr.account.vat.return + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+
+
+
+ + + l10n.fr.account.vat.return + + + + + + + + + + + + + + l10n.fr.account.vat.return + + + + + + + + + + + + + + + + + VAT Return + l10n.fr.account.vat.return + tree,form + + + + + + l10n.fr.account.vat.return.line + +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + l10n.fr.account.vat.return.line + + + + + + + + + + + + + + + + + l10n.fr.account.vat.return.line.log + + + + + + + + + + + + + + + + l10n.fr.account.vat.return.line.log + +
+ + + + + + + + + + + + +
+
+
+ + + +
diff --git a/l10n_fr_account_vat_return/wizards/__init__.py b/l10n_fr_account_vat_return/wizards/__init__.py new file mode 100644 index 000000000..24fea40fb --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/__init__.py @@ -0,0 +1,3 @@ +from . import res_config_settings +from . import l10n_fr_account_vat_return_reimbursement +from . import l10n_fr_vat_exigibility_update diff --git a/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py b/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py new file mode 100644 index 000000000..9523658aa --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement.py @@ -0,0 +1,81 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class L10nFrAccountVatReturnReimbursement(models.TransientModel): + _name = "l10n.fr.account.vat.return.reimbursement" + _description = "FR VAT Reimbursement (3519)" + + return_id = fields.Many2one( + "l10n.fr.account.vat.return", readonly=True, required=True, string="VAT Return" + ) + company_currency_id = fields.Many2one(related="return_id.company_id.currency_id") + min_amount = fields.Integer(related="return_id.reimbursement_min_amount") + vat_credit_total = fields.Integer(related="return_id.vat_credit_total") + amount = fields.Integer(string="Reimbursement Amount", required=True) + reimbursement_type = fields.Selection( + "_reimbursement_type_selection", required=True + ) + first_creation_date = fields.Date(string="Creation Date") + end_date = fields.Date(string="Event Date") + reimbursement_comment_dgfip = fields.Text(string="Comment for DGFIP") + + def validate(self): + self.ensure_one() + speedy = self.return_id._prepare_speedy() + if self.amount < self.min_amount: + raise UserError( + _( + "The reimbursement amount (%(amount)d €) cannot be under the " + "minimum amount (%(min_amount)d €).", + amount=self.amount, + min_amount=self.min_amount, + ) + ) + if self.amount > self.vat_credit_total: + raise UserError( + _( + "The reimbursement amount (%(amount)d €) cannot be superior to the " + "amount of the VAT credit (%(vat_credit_amount)d €).", + amount=self.amount, + vat_credit_amount=self.vat_credit_total, + ) + ) + today = fields.Date.context_today(self) + if self.reimbursement_type == "first": + if not self.first_creation_date: + raise UserError(_("Creation Date is not set.")) + if self.first_creation_date >= today: + raise UserError(_("The creation date must be in the past.")) + elif self.reimbursement_type == "end": + if not self.end_date: + raise UserError(_("Event Date is not set.")) + if self.end_date >= today: + raise UserError(_("The event date must be in the past.")) + self.return_id.message_post( + body=_("Credit VAT reimbursement of %d € submitted.") % self.amount + ) + self.return_id.create_reimbursement_line(self.amount) + self.return_id._delete_move_and_attachments() + move = self.return_id._create_draft_account_move(speedy) + self.return_id.write(self._prepare_return_write(move.id)) + + def _prepare_return_write(self, move_id): + vals = { + "reimbursement_type": self.reimbursement_type, + "move_id": move_id, + "reimbursement_comment_dgfip": self.reimbursement_comment_dgfip, + } + if self.reimbursement_type == "first": + vals["reimbursement_first_creation_date"] = self.first_creation_date + elif self.reimbursement_type == "end": + vals["reimbursement_end_date"] = self.end_date + return vals + + @api.model + def _reimbursement_type_selection(self): + return self.env["l10n.fr.account.vat.return"]._reimbursement_type_selection() diff --git a/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement_view.xml b/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement_view.xml new file mode 100644 index 000000000..f7b85a7db --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/l10n_fr_account_vat_return_reimbursement_view.xml @@ -0,0 +1,64 @@ + + + + + + + l10n.fr.account.vat.return.reimbursement + +
+ + + + + + + + + + + +
+
+
+
+
+ + + Credit VAT Reimbursement + l10n.fr.account.vat.return.reimbursement + form + new + + +
diff --git a/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py b/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py new file mode 100644 index 000000000..48e1834da --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update.py @@ -0,0 +1,78 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class L10nFrVatExigibilityUpdate(models.TransientModel): + _name = "l10n.fr.vat.exigibility.update" + _description = "Change Company VAT Exigibility" + + company_id = fields.Many2one("res.company", required=True, readonly=True) + current_fr_vat_exigibility = fields.Selection( + related="company_id.fr_vat_exigibility", string="Current VAT Exigibility" + ) + new_fr_vat_exigibility = fields.Selection( + "_fr_vat_exigibility_selection", string="New VAT Exigibility", required=True + ) + update_type = fields.Selection( + [ + ("from_start", "From the Start"), + ("date", "Since Specific Date"), + ], + default="from_start", + required=True, + string="Update", + ) + update_date = fields.Date(default=fields.Date.context_today, string="Update Since") + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + company = self.env["res.company"].browse(res["company_id"]) + switch = {"on_invoice": "on_payment", "on_payment": "on_invoice"} + if company.fr_vat_exigibility and company.fr_vat_exigibility in switch: + res["new_fr_vat_exigibility"] = switch[company.fr_vat_exigibility] + return res + + @api.model + def _fr_vat_exigibility_selection(self): + return self.env["res.company"]._fr_vat_exigibility_selection() + + def run(self): + self.ensure_one() + if self.current_fr_vat_exigibility == self.new_fr_vat_exigibility: + raise UserError( + _( + "If you don't want to change the VAT Exigibility of company '%s', " + "click on the Cancel button." + ) + % self.company_id.display_name + ) + self.company_id.write({"fr_vat_exigibility": self.new_fr_vat_exigibility}) + domain = [ + ("company_id", "=", self.company_id.id), + ("move_type", "in", ("out_invoice", "out_refund")), + ] + if self.update_type == "date": + today = fields.Date.context_today(self) + if self.update_date > today: + raise UserError(_("The date cannot be in the future.")) + domain += [ + "|", + ("invoice_date", "=", False), + ("invoice_date", ">=", self.update_date), + ] + moves_to_update = self.env["account.move"].search(domain) + if self.new_fr_vat_exigibility == "auto": + for move in moves_to_update: + vat_on_payment = move._fr_vat_exigibility_auto_compute_vat_on_payment() + move.write({"out_vat_on_payment": vat_on_payment}) + elif self.new_fr_vat_exigibility == "on_invoice": + moves_to_update.write({"out_vat_on_payment": False}) + elif self.new_fr_vat_exigibility == "on_payment": + moves_to_update.write({"out_vat_on_payment": True}) + else: + raise UserError(_("Wrong value for the new VAT exigibility.")) diff --git a/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update_view.xml b/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update_view.xml new file mode 100644 index 000000000..68adb3653 --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/l10n_fr_vat_exigibility_update_view.xml @@ -0,0 +1,45 @@ + + + + + + + l10n.fr.vat.exigibility.update + +
+ + + + + + + +
+
+
+
+
+ + + Update Company VAT Exigibility + l10n.fr.vat.exigibility.update + form + new + + +
diff --git a/l10n_fr_account_vat_return/wizards/res_config_settings.py b/l10n_fr_account_vat_return/wizards/res_config_settings.py new file mode 100644 index 000000000..91a0405ef --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/res_config_settings.py @@ -0,0 +1,42 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + fr_vat_periodicity = fields.Selection( + related="company_id.fr_vat_periodicity", readonly=False + ) + fr_vat_exigibility = fields.Selection( + related="company_id.fr_vat_exigibility", + readonly=True + # value is updated by the wizard l10n.fr.vat.exigibility.update + ) + fr_vat_update_lock_dates = fields.Boolean( + related="company_id.fr_vat_update_lock_dates", readonly=False + ) + fr_vat_journal_id = fields.Many2one( + related="company_id.fr_vat_journal_id", + readonly=False, + domain="[('company_id', '=', company_id), ('type', '=', 'general')]", + ) + fr_vat_expense_analytic_distribution = fields.Json( + related="company_id.fr_vat_expense_analytic_distribution", + readonly=False, + ) + fr_vat_income_analytic_distribution = fields.Json( + related="company_id.fr_vat_income_analytic_distribution", + readonly=False, + ) + analytic_precision = fields.Integer(related="company_id.analytic_precision") + fr_vat_bank_account_id = fields.Many2one( + related="company_id.fr_vat_bank_account_id", + readonly=False, + domain="[('partner_id','=', fr_vat_company_partner_id), " + "'|', ('company_id', '=', False), ('company_id', '=', company_id)]", + ) + fr_vat_company_partner_id = fields.Many2one(related="company_id.partner_id") diff --git a/l10n_fr_account_vat_return/wizards/res_config_settings.xml b/l10n_fr_account_vat_return/wizards/res_config_settings.xml new file mode 100644 index 000000000..78fb3b8e3 --- /dev/null +++ b/l10n_fr_account_vat_return/wizards/res_config_settings.xml @@ -0,0 +1,95 @@ + + + + + + + res.config.settings + + + +

France VAT

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + + diff --git a/l10n_fr_account_vat_return_teledec/README.rst b/l10n_fr_account_vat_return_teledec/README.rst new file mode 100644 index 000000000..53c7882f9 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/README.rst @@ -0,0 +1,112 @@ +=================================== +VAT Teletransmission via Teledec.fr +=================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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--france-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-france/tree/14.0/l10n_fr_account_vat_return_teledec + :alt: OCA/l10n-france +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-france-14-0/l10n-france-14-0-l10n_fr_account_vat_return_teledec + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/121/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds support for EDI teletransmission of the VAT return via `Teledec.fr `_. As explained on `this page `_ of impots.gouv.fr, you have to select an EDI partner if you want to teletransmit your VAT return (there is no open/public API). Teledec is listed on the official `list of active EDI partners `_ under their legal name *LPI Conseil* with their official EDI partner reference 7500201. + +This module supports EDI teletransmission of: +- 3310-CA3 monthly and quarterly, +- 3310-A (Appendix), +- 3514 (Credit VAT reimbursement). + +The price of this EDI service for VAT returns is written on the `VAT page `_ of the Teledec.fr website. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Under the menu *Invoicing > Configuration > Settings*, in the *France VAT* section, you must configure: + +* the company bank account that will be used as the default bank account to pay VAT, +* the email (login) corresponding to your account in Teledec.fr +* select the legal representative of your company. This person must have a name, an email, a function and a title (mister or madam). +* the Company Legal Form (select in the list), +* Teledec Test Mode: if enable, the VAT returns will be sent to the Teledec staging server and the VAT returns will not relayed to DGFiP. + +In the Odoo Server configuration file, add an entry **teledec_private_key** with the private key that was sent to your by Teledec. + +Usage +===== + +On a VAT return in Odoo, when you reach the step *Automatic Lines*, you will see a button *Transmit via Teledec.fr*. Simply click on this button to teletransmit the VAT return to DGFiP via Teledec. + +.. figure:: https://raw.githubusercontent.com/OCA/l10n-france/14.0/l10n_fr_account_vat_return_teledec/static/description/transmit_teledec_button.png + :scale: 80 % + :alt: VAT Return with option to teletransmit via Teledec.fr. + +Teledec will send you an email once they have successfully transmitted your VAT return to DGFiP. + +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 +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* Alexis de Lattre + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via + +Current `maintainer `__: + +|maintainer-alexis-via| + +This module is part of the `OCA/l10n-france `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/l10n_fr_account_vat_return_teledec/__init__.py b/l10n_fr_account_vat_return_teledec/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/l10n_fr_account_vat_return_teledec/__manifest__.py b/l10n_fr_account_vat_return_teledec/__manifest__.py new file mode 100644 index 000000000..272304f29 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "VAT Teletransmission via Teledec.fr", + "version": "16.0.1.0.0", + "category": "Accounting", + "license": "AGPL-3", + "summary": "Teletransmit CA3 via Teledec.fr (subscription required)", + "author": "Akretion,Odoo Community Association (OCA)", + "maintainers": ["alexis-via"], + "website": "https://github.com/OCA/l10n-france", + "depends": ["l10n_fr_account_vat_return"], + "external_dependencies": {"python": ["requests"]}, + "data": [ + "wizards/res_config_settings.xml", + "views/l10n_fr_account_vat_return.xml", + ], + "installable": True, +} diff --git a/l10n_fr_account_vat_return_teledec/i18n/fr.po b/l10n_fr_account_vat_return_teledec/i18n/fr.po new file mode 100644 index 000000000..5246cd5de --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/i18n/fr.po @@ -0,0 +1,385 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_account_vat_return_teledec +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-06-19 09:57+0000\n" +"PO-Revision-Date: 2022-06-19 09:57+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.res_config_settings_view_form +msgid "" +"Teletransmission via Teledec.fr\n" +" " +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__ass +msgid "Association" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "BIC is missing on the company bank account %s." +msgstr "Le BIC est manquant sur le compte bancaire %s de la société." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Cannot teletransmit box '%s': box types '%s' are not supported for the " +"moment." +msgstr "" +"Impossible de télétransmettre la case '%s' : les types de case '%s' ne sont " +"pas supportés actuellement." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_legal_form +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_legal_form +msgid "Company Legal Form" +msgstr "Forme juridique de la société" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Company Legal Form is not set on company '%s'." +msgstr "La forme juridique de la société n'est pas défini sur la société '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_res_config_settings +msgid "Config Settings" +msgstr "Page de configuration" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_email +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_email +msgid "E-mail for Teledec.fr" +msgstr "E-mail pour Teledec.fr" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "E-mail for Teledec.fr is not set on company '%s'." +msgstr "L'e-mail pour Teledec.fr n'est pas renseigné sur la société '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "E-mail missing on partner '%s'." +msgstr "E-mail manquant sur le partenaire '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__arl +msgid "EARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__ei +msgid "EI" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__eir +msgid "EIRL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__erl +msgid "EURL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Failed to send the request to Teledec.fr. Technical error: %s." +msgstr "Échec d'envoi de la requête à Teledec.fr. Erreur technique : %s." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_l10n_fr_account_vat_return +msgid "France VAT Return (CA3)" +msgstr "Déclaration de TVA française (CA3)" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__gec +msgid "GAEC" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__gie +msgid "GIE" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Go to configuration page" +msgstr "Aller à la page de configuration" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_test_mode +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_test_mode +msgid "" +"If active, the request will be sent to the test serveur of Teledec.fr and " +"nothing will be retransmitted to DGFIP." +msgstr "" +"Si activé, la requête sera envoyée au serveur de test de Teledec.fr et rien " +"ne sera retransmis à la DGFIP." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Job position missing on partner '%s'." +msgstr "Fonction manquante sur le partenaire '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_legal_representative_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_legal_representative_id +msgid "Legal Representative" +msgstr "Représentant légal" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Legal Representative is not set on company '%s'." +msgstr "Le représentant légal n'est pas renseigné sur la société '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Missing 'teledec_private_key' in the Odoo server configuration file." +msgstr "" +"Clé 'teledec_private_key' manquante sur le fichier de configuration du " +"serveur Odoo." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_email +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_email +msgid "Must correspond to your login on the Teledec.fr website" +msgstr "Doit correspondre à votre login sur le site web de Teledec.fr" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "None" +msgstr "Aucun" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__zzz +msgid "Other" +msgstr "Autre" + +#. module: l10n_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.res_config_settings_view_form +msgid "Parameters required for the teletransmission of CA3" +msgstr "Paramètres requis pour la télétransmission de la CA3" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sa +msgid "SA" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__srl +msgid "SARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sas +msgid "SAS" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sasu +msgid "SASU" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sea +msgid "SCEA" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sci +msgid "SCI" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__scm +msgid "SCM" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__slr +msgid "SELARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "SIRET not set on company '%s'." +msgstr "Le SIRET n'est pas renseigné sur la société '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__snc +msgid "SNC" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__teledec_sent_datetime +msgid "Teledec.fr Dispatch Date" +msgstr "Date d'envoi à Teledec.fr" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_test_mode +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_test_mode +msgid "Teledec.fr Test Mode" +msgstr "Mode de test pour Teledec.fr" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Teletransmission via Teledec.fr is not yet supported for CA12 (yearly VAT " +"returns). At the moment, it only works for CA3 (monthly or quarterly)." +msgstr "" +"La télétransmission via Teledec.fr n'est pas supportée pour le moment pour " +"la CA12 (déclaration de TVA annuelle). Pour le moment, cela ne fonctionne " +"qu'avec la CA3 (mensuelle et trimestrielle)." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The VAT declaration '%s' has already been sent on %s." +msgstr "La déclaration de TVA '%s' a déjà été envoyée le %s." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The address of partner '%s' is incomplete: it must have at least the street, " +"zip, city and country." +msgstr "" +"L'adresse du partenaire '%s' est incomplète : elle doit comporter au moins " +"la première ligne d'adresse, le code postal, la ville et le pays." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The company bank account %s is not an IBAN." +msgstr "Le compte bancaire %s de la société n'est pas un IBAN." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The company bank account is not set on VAT return %s." +msgstr "" +"Le compte bancaire de la société n'est pas renseigné sur la déclaration de " +"TVA %s." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The query to the Teledec.fr webservice was successful, but the answer of the " +"webservice was not in the expected format. You should contact Teledec.fr and " +"request them to setup your account with a JSON answer." +msgstr "" +"La requête vers le webservice de Teledec.fr a bien fonctionné, mais la " +"réponse du webservice n'était pas dans le format attendu. Vous devez " +"contacter Teledec.fr et leur demander de configurer votre compte avec une " +"réponse au format JSON." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The request sent to Teledec.fr got an HTTP error code %s." +msgstr "" +"La requête envoyée à Teledec.fr a reçu en retour un code d'erreur HTTP %s." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The request sent to Teledec.fr got an answer '%s' (it should have received " +"'ok'). Error message: '%s'." +msgstr "" +"La requête envoyée à Teledec.fr a reçu une réponse '%s' (la réponse aurait " +"dû être 'ok'). Message d'erreur : '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The title of partner '%s' must be Mister or Madam." +msgstr "Le titre du partenaire '%s' doit être Monsieur ou Madame." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "There are no lines on VAT return %s." +msgstr "Il n'y a aucune ligne sur la déclaration de TVA %s." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Title (Mister or Madam) missing on partner '%s'." +msgstr "Titre (Monsieur ou Madame) manquant sur le partenaire '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.l10n_fr_account_vat_return_form +msgid "Transmit via Teledec.fr" +msgstr "Envoyer via Teledec.fr" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT number not set on company '%s'." +msgstr "Numéro de TVA non renseigné sur la société '%s'." + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT return successfully sent to Teledec.fr." +msgstr "" +"Déclaration de TVA envoyée avec succès à Teledec.fr." diff --git a/l10n_fr_account_vat_return_teledec/i18n/l10n_fr_account_vat_return_teledec.pot b/l10n_fr_account_vat_return_teledec/i18n/l10n_fr_account_vat_return_teledec.pot new file mode 100644 index 000000000..de22d115b --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/i18n/l10n_fr_account_vat_return_teledec.pot @@ -0,0 +1,358 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_account_vat_return_teledec +# +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_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.res_config_settings_view_form +msgid "" +"Teletransmission via Teledec.fr\n" +" " +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__ass +msgid "Association" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "BIC is missing on the company bank account %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Cannot teletransmit box '%s': box types '%s' are not supported for the " +"moment." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_legal_form +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_legal_form +msgid "Company Legal Form" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Company Legal Form is not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_email +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_email +msgid "E-mail for Teledec.fr" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "E-mail for Teledec.fr is not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "E-mail missing on partner '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__arl +msgid "EARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__ei +msgid "EI" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__eir +msgid "EIRL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__erl +msgid "EURL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Failed to send the request to Teledec.fr. Technical error: %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model,name:l10n_fr_account_vat_return_teledec.model_l10n_fr_account_vat_return +msgid "France VAT Return (CA3)" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__gec +msgid "GAEC" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__gie +msgid "GIE" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Go to configuration page" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_test_mode +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_test_mode +msgid "" +"If active, the request will be sent to the test serveur of Teledec.fr and " +"nothing will be retransmitted to DGFIP." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Job position missing on partner '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_legal_representative_id +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_legal_representative_id +msgid "Legal Representative" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Legal Representative is not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Missing 'teledec_private_key' in the Odoo server configuration file." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_email +#: model:ir.model.fields,help:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_email +msgid "Must correspond to your login on the Teledec.fr website" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "None" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__zzz +msgid "Other" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.res_config_settings_view_form +msgid "Parameters required for the teletransmission of CA3" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sa +msgid "SA" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__srl +msgid "SARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sas +msgid "SAS" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sasu +msgid "SASU" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sea +msgid "SCEA" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__sci +msgid "SCI" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__scm +msgid "SCM" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__slr +msgid "SELARL" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "SIRET not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields.selection,name:l10n_fr_account_vat_return_teledec.selection__res_company__fr_vat_teledec_legal_form__snc +msgid "SNC" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_l10n_fr_account_vat_return__teledec_sent_datetime +msgid "Teledec.fr Dispatch Date" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_company__fr_vat_teledec_test_mode +#: model:ir.model.fields,field_description:l10n_fr_account_vat_return_teledec.field_res_config_settings__fr_vat_teledec_test_mode +msgid "Teledec.fr Test Mode" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"Teletransmission via Teledec.fr is not yet supported for CA12 (yearly VAT " +"returns). At the moment, it only works for CA3 (monthly or quarterly)." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The VAT declaration '%s' has already been sent on %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The address of partner '%s' is incomplete: it must have at least the street," +" zip, city and country." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The company bank account %s is not an IBAN." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The company bank account is not set on VAT return %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The query to the Teledec.fr webservice was successful, but the answer of the" +" webservice was not in the expected format. You should contact Teledec.fr " +"and request them to setup your account with a JSON answer." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The request sent to Teledec.fr got an HTTP error code %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"The request sent to Teledec.fr got an answer '%s' (it should have received " +"'ok'). Error message: '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "The title of partner '%s' must be Mister or Madam." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "There are no lines on VAT return %s." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "Title (Mister or Madam) missing on partner '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: model_terms:ir.ui.view,arch_db:l10n_fr_account_vat_return_teledec.l10n_fr_account_vat_return_form +msgid "Transmit via Teledec.fr" +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "VAT number not set on company '%s'." +msgstr "" + +#. module: l10n_fr_account_vat_return_teledec +#: code:addons/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py:0 +#, python-format +msgid "" +"VAT return successfully sent to Teledec.fr." +msgstr "" diff --git a/l10n_fr_account_vat_return_teledec/models/__init__.py b/l10n_fr_account_vat_return_teledec/models/__init__.py new file mode 100644 index 000000000..bca2faa8b --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_company +from . import l10n_fr_account_vat_return diff --git a/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py b/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py new file mode 100644 index 000000000..ddd5a07f4 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/models/l10n_fr_account_vat_return.py @@ -0,0 +1,361 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import hashlib +import hmac +import json +import logging +from datetime import datetime + +import pytz +import requests + +from odoo import _, fields, models, tools +from odoo.exceptions import RedirectWarning, UserError +from odoo.tools.misc import format_datetime + +logger = logging.getLogger(__name__) + +TELEDEC_DATE_FORMAT = "%Y-%m-%d" +TIMEOUT = 20 + + +class L10nFrAccountVatReturn(models.Model): + _inherit = "l10n.fr.account.vat.return" + + teledec_sent_datetime = fields.Datetime( + string="Teledec.fr Dispatch Date", readonly=True + ) + + def _prepare_json_teledec_headers(self, teledec_dict, title_id2code): + self.ensure_one() + company = self.company_id + partner = company.partner_id + legal_rep = company.fr_vat_teledec_legal_representative_id + # They want datetime in Paris timezone + utc_datetime_aware = pytz.utc.localize(datetime.utcnow()) + paris_tz = pytz.timezone("Europe/Paris") + paris_datetime_aware = utc_datetime_aware.astimezone(paris_tz) + timestamp = paris_datetime_aware.strftime("%Y-%m-%dT%H:%M:%S") + action = self.env.ref("account.action_account_config") + goto_msg = _("Go to configuration page") + if not company.fr_vat_teledec_email: + raise RedirectWarning( + _("E-mail for Teledec.fr is not set on company '%s'.") + % company.display_name, + action.id, + goto_msg, + ) + if not company.fr_vat_teledec_legal_form: + raise RedirectWarning( + _("Company Legal Form is not set on company '%s'.") + % company.display_name, + action.id, + goto_msg, + ) + if not legal_rep: + raise RedirectWarning( + _("Legal Representative is not set on company '%s'.") + % company.display_name, + action.id, + goto_msg, + ) + if not legal_rep.email: + raise UserError( + _("E-mail missing on partner '%s'.") % legal_rep.display_name + ) + if not legal_rep.title: + raise UserError( + _("Title (Mister or Madam) missing on partner '%s'.") + % legal_rep.display_name + ) + + if legal_rep.title.id not in title_id2code: + raise UserError( + _("The title of partner '%s' must be Mister or Madam.") + % legal_rep.display_name + ) + if not legal_rep.function: + raise UserError( + _("Job position missing on partner '%s'.") % legal_rep.display_name + ) + if not company.siret: + raise UserError(_("SIRET not set on company '%s'.") % company.display_name) + if not self.bank_account_id: + raise UserError( + _("The company bank account is not set on VAT return %s.") + % self.display_name + ) + if self.bank_account_id.acc_type != "iban": + raise UserError( + _("The company bank account %s is not an IBAN.") + % self.bank_account_id.display_name + ) + if not self.bank_account_id.bank_bic: + raise UserError( + _("BIC is missing on the company bank account %s.") + % self.bank_account_id.display_name + ) + if ( + not partner.city + or not partner.zip + or not partner.street + or not partner.country_id + ): + raise UserError( + _( + "The address of partner '%s' is incomplete: " + "it must have at least the street, zip, city and country." + ) + % partner.display_name + ) + # phone is not a required field + phone = legal_rep.phone + if not phone: + phone = legal_rep.mobile + if not phone: + phone = partner.phone + if not phone: + phone = partner.mobile + teledec_dict.update( + { + "auth": { + "email": company.fr_vat_teledec_email, # teledec account ID + "timestamp": timestamp, + "partenaire": tools.config.get( + "teledec_invoicing_partner", "AKRETION" + ), + }, + "identity": { + "siret": company.siret, # we can write SIREN or SIRET here + "name": company.name, + "fullRegimeFiscal": "ISRN", # ISRN or ISRS + "regimeFiscalTVA": "RN", # in which case is RS ? CA12 ? + # yearEndxxx fields are ignored for VAT but required by Teledec + # so we always write 31/12 even if the FY doesn't end on 31/12 + "yearEndMonth": 12, + "yearEndDay": 31, + "addressStreet": partner.street, + "addressComplement": partner.street2, + # "addressNeighborhood": "", + "addressPostalCode": partner.zip, + "addressCity": partner.city, + "addressCountry": partner.country_id.code, + "legalForm": company.fr_vat_teledec_legal_form, + "legalRepresentative": legal_rep.name, + "legalRepresentativeAs": legal_rep.function, + # 2 possible values: M or MME + "legalRepresentativeTitle": title_id2code[legal_rep.title.id], + "telephone": phone, + "email": legal_rep.email, + "BIC": self.bank_account_id.bank_bic, + "IBAN": self.bank_account_id.acc_number, + }, + } + ) + + def _prepare_json_teledec_period(self, teledec_dict): + company = self.company_id + if not company.vat: + raise UserError( + _("VAT number not set on company '%s'.") % company.display_name + ) + teledec_dict["period"] = { + "begin": self.start_date.strftime(TELEDEC_DATE_FORMAT), + "end": self.end_date.strftime(TELEDEC_DATE_FORMAT), + "millesime": self.end_date.year, + # suspension: write CSS for "cession d'activité" + "suspension": False, + "reference": "%s_%s" % (company.vat, self.name), # optional field + } + + def _prepare_json_teledec(self): + self.ensure_one() + title_id2code = { + self.env.ref("base.res_partner_title_madam").id: "MME", + self.env.ref("base.res_partner_title_mister").id: "M", + } + teledec_dict = { + "3310CA3": {}, + "3310A": {}, + } + self._prepare_json_teledec_headers(teledec_dict, title_id2code) + self._prepare_json_teledec_period(teledec_dict) + lines = self.line_ids.filtered(lambda x: not x.box_display_type) + if not lines: + raise UserError( + _("There are no lines on VAT return %s.") % self.display_name + ) + vat_reimbursement_box_id = ( + self.env["l10n.fr.account.vat.box"] + ._box_from_single_box_type("vat_reimbursement") + .id + ) + credit_vat_reimbursement_amount = 0 + for line in lines: + if line.box_edi_type in ("MOA", "QTY", "PCD"): + teledec_dict[line.box_form_code][line.box_id.edi_code] = line.value + elif line.box_edi_type == "CCI_TBX": + teledec_dict[line.box_form_code][line.box_id.edi_code] = line.value_bool + elif line.box_edi_type in ("FTX", "NAD"): + teledec_dict[line.box_form_code][line.box_id.edi_code] = line.value_char + else: + raise UserError( + _( + "Cannot teletransmit box '%(box)s': box types " + "'%(box_edi_type)s' are not supported for the moment.", + box=line.box_id.display_name, + box_edi_type=line.box_edi_type, + ) + ) + if line.box_id.id == vat_reimbursement_box_id: + credit_vat_reimbursement_amount = line.value + if self.comment_dgfip: # 5 lines of 512 chars max + teledec_dict["3310CA3"]["BC"] = True # mention expresse + self._prepare_comment(self.comment_dgfip, "BA", teledec_dict["3310CA3"]) + if credit_vat_reimbursement_amount > 0: + dict_3519 = self._prepare_3519( + credit_vat_reimbursement_amount, title_id2code + ) + teledec_dict["3519"] = dict_3519 + + logger.debug("teledec_dict=%s", teledec_dict) + return teledec_dict + + def _prepare_comment(self, comment, edi_code, formdict): + # For comments 5 x 512 + assert comment + start_char = 0 + i = 1 + while i <= 5: + end_char = start_char + 512 + value_char = comment[start_char:end_char] + if value_char: + formdict["%s_4440_%d" % (edi_code, i)] = value_char + else: + break + i += 1 + start_char += 512 + + def _prepare_3519(self, amount, title_id2code): + assert self.reimbursement_type in ("first", "end", "other") + assert isinstance(amount, int) + assert self.bank_account_id + assert self.bank_account_id.acc_type == "iban" + assert self.bank_account_id.bank_bic + + company = self.company_id + legal_rep = company.fr_vat_teledec_legal_representative_id + dict_3519 = { + "AA_3192_1": self.company_id.name, + "DD": True, # Entreprise FR + "DG_3164_1": company.city, + "DG_3036_1": legal_rep.name, # nom prénom + "DG_3036_2": legal_rep.function, # qualité + "DG_3036_3": title_id2code[legal_rep.title.id], # titre + "DN": amount, + "FK": True, # à créditer au compte désigné + "AA_3433_1": self.bank_account_id.bank_bic, + "AA_3194_1": self.bank_account_id.acc_number, + } + if self.reimbursement_type == "first": + dict_3519["DI"] = True # Première demande + dict_3519["DL"] = self.reimbursement_first_creation_date.strftime( + TELEDEC_DATE_FORMAT + ) + elif self.reimbursement_type == "end": + dict_3519["DJ"] = True # Cession, cessation, décès + dict_3519["DM"] = self.reimbursement_end_date.strftime(TELEDEC_DATE_FORMAT) + elif self.reimbursement_type == "other": + dict_3519["DK"] = True # Autres + if self.reimbursement_comment_dgfip: + self._prepare_comment(self.reimbursement_comment_dgfip, "FJ", dict_3519) + return dict_3519 + + def send_ca3_via_teledec(self): + self.ensure_one() + if self.teledec_sent_datetime: + raise UserError( + _( + "The VAT declaration '%(vat_return)s' has already been sent " + "on %(datetime)s.", + vat_return=self.display_name, + datetime=format_datetime(self.env, self.teledec_sent_datetime), + ) + ) + assert self.state == "auto" + if self.vat_periodicity == "12": + raise UserError( + _( + "Teletransmission via Teledec.fr is not yet supported for CA12 " + "(yearly VAT returns). At the moment, it only works for CA3 " + "(monthly or quarterly)." + ) + ) + test_mode = self.company_id.fr_vat_teledec_test_mode + prefix = test_mode and "http://stage" or "https://www" + url = "%s.teledec.fr/service/declaration-marque-blanche" % prefix + teledec_dict = self._prepare_json_teledec() + teledec_str = json.dumps(teledec_dict) + priv_key = tools.config.get("teledec_private_key") + if not priv_key: + raise UserError( + _( + "Missing 'teledec_private_key' in the Odoo server configuration " + "file." + ) + ) + hash_obj = hmac.new( + priv_key.encode("utf-8"), + msg=teledec_str.encode("utf-8"), + digestmod=hashlib.sha256, + ) + params = {"hash": hash_obj.hexdigest()} + headers = {"Content-type": "application/json", "Accept": "application/json"} + try: + logger.info("Sending HTTP POST on %s with params=%s", url, params) + res = requests.post( + url, params=params, headers=headers, data=teledec_str, timeout=TIMEOUT + ) + except Exception as e: + raise UserError( + _("Failed to send the request to Teledec.fr. Technical error: %s.") % e + ) from e + logger.debug("Teledec answer HTTP code %s texte %s", res.status_code, res.text) + if res.status_code == 200: + try: + res_json = res.json() # crashes here + except Exception: + raise UserError( + _( + "The query to the Teledec.fr webservice was successful, " + "but the answer of the webservice was not in the " + "expected format. You should contact Teledec.fr and " + "request them to setup your account with a " + "JSON answer." + ) + ) from None + # to reproduice the crash, just change the login + if res_json.get("status") != "ok": + raise UserError( + _( + "The request sent to Teledec.fr got an answer '%(answer)s' " + "(it should have received 'ok'). Error message: '%(error)s'.", + answer=res_json.get("status"), + error=res_json.get("message", _("None")), + ) + ) from None + self.write({"teledec_sent_datetime": fields.Datetime.now()}) + self.message_post( + body=_( + "VAT return successfully sent to " + 'Teledec.fr.' + ) + ) + self.auto2sent() + else: + raise UserError( + _("The request sent to Teledec.fr got an HTTP error code %s.") + % res.status_code + ) diff --git a/l10n_fr_account_vat_return_teledec/models/res_company.py b/l10n_fr_account_vat_return_teledec/models/res_company.py new file mode 100644 index 000000000..75c81030d --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/models/res_company.py @@ -0,0 +1,47 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + fr_vat_teledec_legal_representative_id = fields.Many2one( + "res.partner", + string="Legal Representative", + ondelete="restrict", + domain=[("is_company", "=", False)], + ) + fr_vat_teledec_legal_form = fields.Selection( + [ + ("ASS", "Association"), + ("ARL", "EARL"), + ("EI", "EI"), + ("EIR", "EIRL"), + ("ERL", "EURL"), + ("GEC", "GAEC"), + ("GIE", "GIE"), + ("SA", "SA"), + ("SAS", "SAS"), + ("SASU", "SASU"), + ("SRL", "SARL"), + ("SEA", "SCEA"), + ("SCI", "SCI"), + ("SCM", "SCM"), + ("SLR", "SELARL"), + ("SNC", "SNC"), + ("ZZZ", "Other"), + ], + string="Company Legal Form", + ) + fr_vat_teledec_email = fields.Char( + "E-mail for Teledec.fr", + help="Must correspond to your login on the Teledec.fr website", + ) + fr_vat_teledec_test_mode = fields.Boolean( + string="Teledec.fr Test Mode", + help="If active, the request will be sent to the test serveur of " + "Teledec.fr and nothing will be retransmitted to DGFIP.", + ) diff --git a/l10n_fr_account_vat_return_teledec/readme/CONFIGURE.rst b/l10n_fr_account_vat_return_teledec/readme/CONFIGURE.rst new file mode 100644 index 000000000..085057b49 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ +Under the menu *Invoicing > Configuration > Settings*, in the *France VAT* section, you must configure: + +* the company bank account that will be used as the default bank account to pay VAT, +* the email (login) corresponding to your account in Teledec.fr +* select the legal representative of your company. This person must have a name, an email, a function and a title (mister or madam). +* the Company Legal Form (select in the list), +* Teledec Test Mode: if enable, the VAT returns will be sent to the Teledec staging server and the VAT returns will not relayed to DGFiP. + +In the Odoo Server configuration file, add an entry **teledec_private_key** with the private key that was sent to your by Teledec. diff --git a/l10n_fr_account_vat_return_teledec/readme/CONTRIBUTORS.rst b/l10n_fr_account_vat_return_teledec/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..ff65d68ce --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexis de Lattre diff --git a/l10n_fr_account_vat_return_teledec/readme/DESCRIPTION.rst b/l10n_fr_account_vat_return_teledec/readme/DESCRIPTION.rst new file mode 100644 index 000000000..de53e496f --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +This module adds support for EDI teletransmission of the VAT return via `Teledec.fr `_. As explained on `this page `_ of impots.gouv.fr, you have to select an EDI partner if you want to teletransmit your VAT return (there is no open/public API). Teledec is listed on the official `list of active EDI partners `_ under their legal name *LPI Conseil* with their official EDI partner reference 7500201. + +This module supports EDI teletransmission of: +- 3310-CA3 monthly and quarterly, +- 3310-A (Appendix), +- 3514 (Credit VAT reimbursement). + +The price of this EDI service for VAT returns is written on the `VAT page `_ of the Teledec.fr website. diff --git a/l10n_fr_account_vat_return_teledec/readme/USAGE.rst b/l10n_fr_account_vat_return_teledec/readme/USAGE.rst new file mode 100644 index 000000000..c4191e091 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/readme/USAGE.rst @@ -0,0 +1,7 @@ +On a VAT return in Odoo, when you reach the step *Automatic Lines*, you will see a button *Transmit via Teledec.fr*. Simply click on this button to teletransmit the VAT return to DGFiP via Teledec. + +.. figure:: static/description/transmit_teledec_button.png + :scale: 80 % + :alt: VAT Return with option to teletransmit via Teledec.fr. + +Teledec will send you an email once they have successfully transmitted your VAT return to DGFiP. diff --git a/l10n_fr_account_vat_return_teledec/static/description/icon.png b/l10n_fr_account_vat_return_teledec/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/l10n_fr_account_vat_return_teledec/static/description/icon.png differ diff --git a/l10n_fr_account_vat_return_teledec/static/description/index.html b/l10n_fr_account_vat_return_teledec/static/description/index.html new file mode 100644 index 000000000..d616b434a --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/static/description/index.html @@ -0,0 +1,448 @@ + + + + + + +VAT Teletransmission via Teledec.fr + + + +
+

VAT Teletransmission via Teledec.fr

+ + +

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

+

This module adds support for EDI teletransmission of the VAT return via Teledec.fr. As explained on this page of impots.gouv.fr, you have to select an EDI partner if you want to teletransmit your VAT return (there is no open/public API). Teledec is listed on the official list of active EDI partners under their legal name LPI Conseil with their official EDI partner reference 7500201.

+

This module supports EDI teletransmission of: +- 3310-CA3 monthly and quarterly, +- 3310-A (Appendix), +- 3514 (Credit VAT reimbursement).

+

The price of this EDI service for VAT returns is written on the VAT page of the Teledec.fr website.

+

Table of contents

+ +
+

Configuration

+

Under the menu Invoicing > Configuration > Settings, in the France VAT section, you must configure:

+
    +
  • the company bank account that will be used as the default bank account to pay VAT,
  • +
  • the email (login) corresponding to your account in Teledec.fr
  • +
  • select the legal representative of your company. This person must have a name, an email, a function and a title (mister or madam).
  • +
  • the Company Legal Form (select in the list),
  • +
  • Teledec Test Mode: if enable, the VAT returns will be sent to the Teledec staging server and the VAT returns will not relayed to DGFiP.
  • +
+

In the Odoo Server configuration file, add an entry teledec_private_key with the private key that was sent to your by Teledec.

+
+
+

Usage

+

On a VAT return in Odoo, when you reach the step Automatic Lines, you will see a button Transmit via Teledec.fr. Simply click on this button to teletransmit the VAT return to DGFiP via Teledec.

+
+VAT Return with option to teletransmit via Teledec.fr. +
+

Teledec will send you an email once they have successfully transmitted your VAT return to DGFiP.

+
+
+

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

+
    +
  • Akretion
  • +
+
+
+

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.

+

Current maintainer:

+

alexis-via

+

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

+

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

+
+
+
+ + diff --git a/l10n_fr_account_vat_return_teledec/static/description/transmit_teledec_button.png b/l10n_fr_account_vat_return_teledec/static/description/transmit_teledec_button.png new file mode 100644 index 000000000..00dd4e399 Binary files /dev/null and b/l10n_fr_account_vat_return_teledec/static/description/transmit_teledec_button.png differ diff --git a/l10n_fr_account_vat_return_teledec/views/l10n_fr_account_vat_return.xml b/l10n_fr_account_vat_return_teledec/views/l10n_fr_account_vat_return.xml new file mode 100644 index 000000000..eb3acf8dd --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/views/l10n_fr_account_vat_return.xml @@ -0,0 +1,64 @@ + + + + + + l10n.fr.account.vat.return + + + + + + + + + + + + + + + + diff --git a/l10n_fr_account_vat_return_teledec/wizards/__init__.py b/l10n_fr_account_vat_return_teledec/wizards/__init__.py new file mode 100644 index 000000000..0deb68c46 --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/wizards/__init__.py @@ -0,0 +1 @@ +from . import res_config_settings diff --git a/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.py b/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.py new file mode 100644 index 000000000..4260e118b --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.py @@ -0,0 +1,22 @@ +# Copyright 2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + fr_vat_teledec_legal_representative_id = fields.Many2one( + related="company_id.fr_vat_teledec_legal_representative_id", readonly=False + ) + fr_vat_teledec_legal_form = fields.Selection( + related="company_id.fr_vat_teledec_legal_form", readonly=False + ) + fr_vat_teledec_email = fields.Char( + related="company_id.fr_vat_teledec_email", readonly=False + ) + fr_vat_teledec_test_mode = fields.Boolean( + related="company_id.fr_vat_teledec_test_mode", readonly=False + ) diff --git a/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.xml b/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.xml new file mode 100644 index 000000000..e3b88f96c --- /dev/null +++ b/l10n_fr_account_vat_return_teledec/wizards/res_config_settings.xml @@ -0,0 +1,65 @@ + + + + + + + res.config.settings + + + +
+
+
+ Teletransmission via Teledec.fr + +
+ Parameters required for the teletransmission of CA3 +
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+
+
+ + + + + + diff --git a/setup/l10n_fr_account_vat_return/odoo/addons/l10n_fr_account_vat_return b/setup/l10n_fr_account_vat_return/odoo/addons/l10n_fr_account_vat_return new file mode 120000 index 000000000..c30339013 --- /dev/null +++ b/setup/l10n_fr_account_vat_return/odoo/addons/l10n_fr_account_vat_return @@ -0,0 +1 @@ +../../../../l10n_fr_account_vat_return \ No newline at end of file diff --git a/setup/l10n_fr_account_vat_return/setup.py b/setup/l10n_fr_account_vat_return/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/l10n_fr_account_vat_return/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/setup/l10n_fr_account_vat_return_teledec/odoo/addons/l10n_fr_account_vat_return_teledec b/setup/l10n_fr_account_vat_return_teledec/odoo/addons/l10n_fr_account_vat_return_teledec new file mode 120000 index 000000000..761b5bb36 --- /dev/null +++ b/setup/l10n_fr_account_vat_return_teledec/odoo/addons/l10n_fr_account_vat_return_teledec @@ -0,0 +1 @@ +../../../../l10n_fr_account_vat_return_teledec \ No newline at end of file diff --git a/setup/l10n_fr_account_vat_return_teledec/setup.py b/setup/l10n_fr_account_vat_return_teledec/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/l10n_fr_account_vat_return_teledec/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)