Initial commit: L10N_Europe packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:52 +02:00
commit 9803722600
2377 changed files with 380711 additions and 0 deletions

View file

@ -0,0 +1,54 @@
# Italy - E-invoicing (Withholding)
Withholding and Pension Fund handling for the E-invoice implementation for Italy.
The Withholding tax and the Pension Fund tax are computed like every other tax
with the ordering by sequence, so please be careful with the order of the taxes
in your tax configuration.
Please also update the Italian Accounting module (l10n_it) when you install this module.
## Installation
```bash
pip install odoo-bringout-oca-ocb-l10n_it_edi_withholding
```
## Dependencies
This addon depends on:
- l10n_it_edi
## Manifest Information
- **Name**: Italy - E-invoicing (Withholding)
- **Version**: 0.1
- **Category**: Accounting/Localizations/EDI
- **License**: LGPL-3
- **Installable**: False
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `l10n_it_edi_withholding`.
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph L10n_it_edi_withholding Module - l10n_it_edi_withholding
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for l10n_it_edi_withholding. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [l10n_it_edi](../../odoo-bringout-oca-ocb-l10n_it_edi)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon l10n_it_edi_withholding or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-ocb-l10n_it_edi_withholding"
# or
uv pip install odoo-bringout-oca-ocb-l10n_it_edi_withholding"
```

View file

@ -0,0 +1,16 @@
# Models
Detected core models and extensions in l10n_it_edi_withholding.
```mermaid
classDiagram
class account_chart_template
class account_edi_format
class account_move
class account_tax
class account_tax_template
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: l10n_it_edi_withholding. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon l10n_it_edi_withholding
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon l10n_it_edi_withholding
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import psycopg2
from . import models
from odoo import api, SUPERUSER_ID
import logging
_logger = logging.getLogger(__name__)
def _l10n_it_edi_add_accounts(env, company):
""" Create the transition accounts """
generated_accounts_ref = {}
account_templates = {account_code: env.ref(f'l10n_it_edi_withholding.{account_code}') for account_code in ['1611', '2603']}
try:
with env.cr.savepoint():
for account_code, account_template in account_templates.items():
template_vals = [(account_template, company.chart_template_id._get_account_vals(company, account_template, account_code, {}))]
generated_accounts_ref[account_template] = company.chart_template_id._create_records_with_xmlid('account.account', template_vals, company)
_logger.info("Created withholding accounts for company: %s(%s).", company.name, company.id)
except psycopg2.errors.UniqueViolation:
generated_accounts_ref = {}
_logger.error("Cash basis transition accounts already exist for company: %s(%s).", company.name, company.id)
return generated_accounts_ref
def _l10n_it_edi_withholding_add_taxes(env, company):
""" Create the new taxes on existing company """
templates = env['account.tax.template']
generated_taxes_ref = {}
try:
with env.cr.savepoint():
for xml_id in (
'20awi', '20vwi',
'20awc', '20vwc',
'23awo', '23vwo',
'4vcp', '4acp',
'4vinps', '4ainps'
):
templates |= env.ref(f"l10n_it_edi_withholding.{xml_id}")
generated_taxes_ref = templates._generate_tax(company)
_logger.info("Created withholding taxes for company: %s(%s).", company.name, company.id)
# Increase the sequence number of the old taxes multiplying it by 10 and adding 21
# so that the withholding can have sequence=10 and the pension fund sequence=20
offset = 21
all_taxes = env['account.tax'].with_context(active_test=False).search([('company_id', '=', company.id)])
for tax in all_taxes.filtered(lambda x: (x.sequence <= 20 and not x.l10n_it_pension_fund_type and not x.l10n_it_withholding_type)):
if not tax.l10n_it_withholding_type and not tax.l10n_it_pension_fund_type:
tax.sequence += offset
_logger.info("Increased sequence number of old taxes by %s for company: %s(%s).", offset, company.name, company.id)
except psycopg2.errors.UniqueViolation:
generated_taxes_ref = {}
_logger.error("Withholding and Pension Fund taxes already exist for company: %s(%s).", company.name, company.id)
return generated_taxes_ref
def _l10n_it_edi_setup_accounts_on_taxes(env, company, generated_taxes_ref, generated_accounts_ref):
""" Setup the accounts on the taxes, after the accounts have been created """
# Set the transition account
for tax, value in generated_taxes_ref['account_dict']['account.tax'].items():
transition_account = value['cash_basis_transition_account_id']
if transition_account:
tax.cash_basis_transition_account_id = generated_accounts_ref.get(transition_account)
# The tax repartition lines accounts has already been generated from the template by l10n_it
referenced_accounts = {}
repartitions_dict = generated_taxes_ref['account_dict']['account.tax.repartition.line']
for dummy, value_dict in repartitions_dict.items():
account_template = value_dict['account_id']
template_xml_id = account_template.get_external_id()[account_template.id]
xml_id = template_xml_id.split('.')
referenced_accounts[template_xml_id] = env.ref(f'{xml_id[0]}.{company.id}_{xml_id[1]}')
# Set the tax repartition lines accounts on the generated taxes
for repartition_line, value in repartitions_dict.items():
template = value['account_id']
if template:
repartition_line.account_id = referenced_accounts[template.get_external_id()[template.id]]
_logger.info("Cash Basis Transition Accounts and Repartition accounts on taxes for company: %s(%s).", company.name, company.id)
def _l10n_it_edi_withholding_post_init(cr, registry):
""" Existing companies that have the Italian Chart of Accounts set """
env = api.Environment(cr, SUPERUSER_ID, {})
chart_template = env.ref('l10n_it.l10n_it_chart_template_generic')
if chart_template:
for company in env['res.company'].search([('chart_template_id', '=', chart_template.id)]):
_logger.info("Company %s already has the Italian localization installed, updating...", company.name)
generated_taxes_ref = _l10n_it_edi_withholding_add_taxes(env, company)
generated_accounts_ref = {} if not generated_taxes_ref else _l10n_it_edi_add_accounts(env, company)
if generated_accounts_ref:
_l10n_it_edi_setup_accounts_on_taxes(env, company, generated_taxes_ref, generated_accounts_ref)

View file

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Italy - E-invoicing (Withholding)',
'version': '0.1',
'depends': [
'l10n_it_edi'
],
'author': 'Odoo',
'description': """
Withholding and Pension Fund handling for the E-invoice implementation for Italy.
The Withholding tax and the Pension Fund tax are computed like every other tax
with the ordering by sequence, so please be careful with the order of the taxes
in your tax configuration.
Please also update the Italian Accounting module (l10n_it) when you install this module.
""",
'category': 'Accounting/Localizations/EDI',
'website': 'https://www.odoo.com/documentation/16.0/applications/finance/accounting/fiscal_localizations/localizations/italy.html',
'data': [
'data/account_tax_group_data.xml',
'data/account_withholding_report_data.xml',
'data/account.account.template.csv',
'data/account_tax_template.xml',
'data/invoice_it_template.xml',
'views/l10n_it_view.xml'
],
'post_init_hook': '_l10n_it_edi_withholding_post_init',
'license': 'LGPL-3',
}

View file

@ -0,0 +1,3 @@
id,code,name,account_type,reconcile,chart_template_id:id,tag_ids:id
1611,1611,Crediti per ritenute subite (appoggio),asset_current,FALSE,l10n_it.l10n_it_chart_template_generic,l10n_it.account_tag_C_ATT
2603,2603,Debiti per ritenute da versare (appoggio),liability_current,FALSE,l10n_it.l10n_it_chart_template_generic,l10n_it.account_tag_D_PASS
1 id code name account_type reconcile chart_template_id:id tag_ids:id
2 1611 1611 Crediti per ritenute subite (appoggio) asset_current FALSE l10n_it.l10n_it_chart_template_generic l10n_it.account_tag_C_ATT
3 2603 2603 Debiti per ritenute da versare (appoggio) liability_current FALSE l10n_it.l10n_it_chart_template_generic l10n_it.account_tag_D_PASS

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="tax_group_pension_fund" model="account.tax.group">
<field name="name">Fondi Pensione</field>
<field name="sequence">0</field>
<field name="country_id" ref="base.it"/>
<field name="preceding_subtotal">Fondi Pensione Esclusi</field>
</record>
<record id="tax_group_enasarco" model="account.tax.group">
<field name="name">Enasarco</field>
<field name="sequence">999</field>
<field name="country_id" ref="base.it"/>
<field name="preceding_subtotal">ENASARCO Escluso</field>
</record>
<record id="tax_group_withholding" model="account.tax.group">
<field name="name">Ritenute</field>
<field name="sequence">1000</field>
<field name="country_id" ref="base.it"/>
<field name="preceding_subtotal">Totale Ritenute Escluse</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,460 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<!-- Withholding Taxes (Ritenute) ......................................................... -->
<!-- Individuals -->
<record id="20vwi" model="account.tax.template">
<field name="description">20% Ritenuta Persone Fisiche</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">20% RIT PF</field>
<field name="sequence">10</field>
<field name="amount">-20</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT01</field>
<field name="l10n_it_withholding_reason">A</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.1611"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'minus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'plus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
</record>
<record id="20awi" model="account.tax.template">
<field name="description">20% Ritenuta Persone Fisiche</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">20% RIT PF</field>
<field name="sequence">10</field>
<field name="amount">-20</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT01</field>
<field name="l10n_it_withholding_reason">A</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.2603"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'plus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'minus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
</record>
<!-- Individual Companies -->
<record id="20vwc" model="account.tax.template">
<field name="description">20% Ritenuta Persone Giuridiche</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">20% RIT PG</field>
<field name="sequence">11</field>
<field name="amount">-20</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT02</field>
<field name="l10n_it_withholding_reason">A</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.1611"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'minus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'plus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
</record>
<record id="20awc" model="account.tax.template">
<field name="description">20% Ritenuta Persone Giuridiche</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">20% RIT PG</field>
<field name="sequence">11</field>
<field name="amount">-20</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT02</field>
<field name="l10n_it_withholding_reason">A</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.2603"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'plus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'minus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
</record>
<!-- Agents and Representatives -->
<record id="23vwo" model="account.tax.template">
<field name="description">23% Ritenuta Agenti e Rappresentanti</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">23% RIT AG</field>
<field name="sequence">12</field>
<field name="amount">-23</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT02</field>
<field name="l10n_it_withholding_reason">ZO</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.1611"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 50,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'minus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 50,
'repartition_type': 'tax',
'account_id': ref('l10n_it.1609'),
'plus_report_expression_ids': [ref('withh_sale_tax_report_it_line_tag')],
}),
]"/>
</record>
<record id="23awo" model="account.tax.template">
<field name="description">23% Ritenuta Agenti e Rappresentanti</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">23% RIT AG</field>
<field name="sequence">12</field>
<field name="amount">-23</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="tax_group_id" ref="tax_group_withholding"/>
<field name="l10n_it_withholding_type">RT02</field>
<field name="l10n_it_withholding_reason">ZO</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.2603"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 50,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'plus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 50,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2602'),
'minus_report_expression_ids': [ref('withh_purchase_tax_report_it_line_tag')],
}),
]"/>
</record>
<!-- INPS ................................................................................. -->
<record id="4vinps" model="account.tax.template">
<field name="description">4% Contributo INPS</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">4% INPS</field>
<field name="sequence">5</field>
<field name="amount">4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="include_base_amount">True</field>
<field name="tax_group_id" ref="tax_group_pension_fund"/>
<field name="l10n_it_pension_fund_type">TC22</field>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
}),
]"/>
</record>
<record id="4ainps" model="account.tax.template">
<field name="description">4% Contributo INPS</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">4% INPS</field>
<field name="sequence">5</field>
<field name="amount">4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="include_base_amount">True</field>
<field name="l10n_it_pension_fund_type">TC22</field>
<field name="tax_group_id" ref="tax_group_pension_fund"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.4402'),
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.4402'),
}),
]"/>
</record>
<!-- Pension Fund (Cassa Previdenziale) ................................................... -->
<record id="4vcp" model="account.tax.template">
<field name="description">4% Contributo Fondo Pensione</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">4% F.Pens.</field>
<field name="sequence">20</field>
<field name="amount">4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="include_base_amount">True</field>
<field name="tax_group_id" ref="tax_group_pension_fund"/>
<field name="l10n_it_pension_fund_type">TC01</field>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
}),
]"/>
</record>
<record id="4acp" model="account.tax.template">
<field name="description">4% Contributo Fondo Pensione</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">4% F.Pens.</field>
<field name="sequence">20</field>
<field name="amount">4</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="include_base_amount">True</field>
<field name="l10n_it_pension_fund_type">TC01</field>
<field name="tax_group_id" ref="tax_group_pension_fund"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.4402'),
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.4402'),
}),
]"/>
</record>
<!-- ENASARCO ................................................................ -->
<record id="enasarcov" model="account.tax.template">
<field name="description">8.5% Ritenuta ENASARCO</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">ENASARCO</field>
<field name="sequence">13</field>
<field name="amount">-8.5</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">sale</field>
<field name="tax_group_id" ref="tax_group_enasarco"/>
<field name="l10n_it_pension_fund_type">TC07</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.1611"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
'minus_report_expression_ids': [ref('enasarco_sale_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
'plus_report_expression_ids': [ref('enasarco_sale_tax_report_it_line_tag')],
}),
]"/>
</record>
<record id="enasarcoa" model="account.tax.template">
<field name="description">8.5% Ritenuta ENASARCO</field>
<field name="chart_template_id" ref="l10n_it.l10n_it_chart_template_generic"/>
<field name="name">ENASARCO</field>
<field name="sequence">13</field>
<field name="amount">-8.5</field>
<field name="amount_type">percent</field>
<field name="type_tax_use">purchase</field>
<field name="tax_group_id" ref="tax_group_enasarco"/>
<field name="l10n_it_pension_fund_type">TC07</field>
<field name="tax_exigibility">on_payment</field>
<field name="cash_basis_transition_account_id" ref="l10n_it_edi_withholding.1611"/>
<field name="invoice_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
'plus_report_expression_ids': [ref('enasarco_purchase_tax_report_it_line_tag')],
}),
]"/>
<field name="refund_repartition_line_ids" eval="[(5, 0, 0),
(0,0, {
'factor_percent': 100,
'repartition_type': 'base',
}),
(0,0, {
'factor_percent': 100,
'repartition_type': 'tax',
'account_id': ref('l10n_it.2630'),
'minus_report_expression_ids': [ref('enasarco_purchase_tax_report_it_line_tag')],
}),
]"/>
</record>
</odoo>

View file

@ -0,0 +1,60 @@
<?xml version='1.0' encoding='UTF-8'?>
<odoo>
<record id="withh_tax_report_it" model="account.report">
<field name="name">Withholding Report</field>
<field name="root_report_id" ref="account.generic_tax_report"/>
<field name="country_id" ref="base.it"/>
<field name="column_ids">
<record id="withh_tax_report_balance" model="account.report.column">
<field name="name">Total</field>
<field name="expression_label">total</field>
</record>
</field>
<field name="line_ids">
<record id="withh_sale_tax_report_it_line" model="account.report.line">
<field name="name">Withholding Amount (Sales)</field>
<field name="code">ritv</field>
<field name="expression_ids">
<record id="withh_sale_tax_report_it_line_tag" model="account.report.expression">
<field name="label">total</field>
<field name="engine">tax_tags</field>
<field name="formula">RITV</field>
</record>
</field>
</record>
<record id="enasarco_sale_tax_report_it_line" model="account.report.line">
<field name="name">ENASARCO Amount (Sales)</field>
<field name="code">enasarcov</field>
<field name="expression_ids">
<record id="enasarco_sale_tax_report_it_line_tag" model="account.report.expression">
<field name="label">total</field>
<field name="engine">tax_tags</field>
<field name="formula">ENASARCOV</field>
</record>
</field>
</record>
<record id="withh_purchase_tax_report_it_line" model="account.report.line">
<field name="name">Withholding Amount (Purchase)</field>
<field name="code">rita</field>
<field name="expression_ids">
<record id="withh_purchase_tax_report_it_line_tag" model="account.report.expression">
<field name="label">total</field>
<field name="engine">tax_tags</field>
<field name="formula">RITA</field>
</record>
</field>
</record>
<record id="enasarco_purchase_tax_report_it_line" model="account.report.line">
<field name="name">ENASARCO Amount (Purchase)</field>
<field name="code">enasarcoa</field>
<field name="expression_ids">
<record id="enasarco_purchase_tax_report_it_line_tag" model="account.report.expression">
<field name="label">total</field>
<field name="engine">tax_tags</field>
<field name="formula">ENASARCOA</field>
</record>
</field>
</record>
</field>
</record>
</odoo>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="account_invoice_it_FatturaPA_export_withholding" inherit_id="l10n_it_edi.account_invoice_it_FatturaPA_export">
<xpath expr="//DatiGeneraliDocumento/Numero" position="after">
<t t-if="withholding_values" t-foreach="withholding_values" t-as="withholding">
<DatiRitenuta>
<TipoRitenuta t-esc="format_alphanumeric(withholding.tax.l10n_it_withholding_type)"/>
<ImportoRitenuta t-esc="format_monetary(withholding.tax_amount, currency)"/>
<AliquotaRitenuta t-esc="format_numbers(abs(withholding.tax.amount))"/>
<CausalePagamento t-esc="format_alphanumeric(withholding.tax.l10n_it_withholding_reason)"/>
</DatiRitenuta>
</t>
</xpath>
<xpath expr="//DatiGeneraliDocumento/ImportoTotaleDocumento" position="before">
<t t-if="pension_fund_values" t-foreach="pension_fund_values" t-as="pension_fund">
<DatiCassaPrevidenziale>
<TipoCassa t-esc="format_alphanumeric(pension_fund.tax.l10n_it_pension_fund_type)"/>
<AlCassa t-esc="format_numbers(pension_fund.tax.amount)"/>
<ImportoContributoCassa t-esc="format_monetary(pension_fund.tax_amount, currency)"/>
<ImponibileCassa t-esc="format_monetary(pension_fund.base_amount, currency)"/>
<AliquotaIVA t-esc="format_numbers(pension_fund.vat_tax.amount or 0.0)"/>
<Ritenuta t-if="pension_fund.withholding_tax and pension_fund.withholding_tax.sequence > pension_fund.tax.sequence">SI</Ritenuta>
<Natura t-if="pension_fund.vat_tax.l10n_it_has_exoneration" t-esc="format_alphanumeric(pension_fund.vat_tax.l10n_it_kind_exoneration)"/>
<RiferimentoAmministrazione t-if="pension_fund.tax.description" t-esc="format_alphanumeric(pension_fund.tax.description)[:20]"/>
</DatiCassaPrevidenziale>
</t>
</xpath>
</template>
<template id="account_invoice_line_it_FatturaPA_withholding" inherit_id="l10n_it_edi.account_invoice_line_it_FatturaPA">
<xpath expr="//AliquotaIVA" position="after">
<t t-if="line.tax_ids._l10n_it_filter_kind('withholding')">
<Ritenuta>SI</Ritenuta>
</t>
</xpath>
<xpath expr="//DettaglioLinee" position="inside">
<t t-if="enasarco_values and enasarco_values[line.id]">
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto t-esc="format_alphanumeric('TC07 - ENASARCO (' + format_numbers(abs(enasarco_values[line.id]['amount'])).rstrip('.0') + '%)')"/>
<RiferimentoNumero t-esc="format_monetary(enasarco_values[line.id]['tax_amount'], currency)"/>
</AltriDatiGestionali>
</t>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,729 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_it_edi_withholding
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-26 11:16+0000\n"
"PO-Revision-Date: 2023-01-26 11:16+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_chart_template
msgid "Account Chart Template"
msgstr "Modello piano dei conti"
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "All Taxes Included"
msgstr "Tasse incluse"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_before_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_before_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_before_withholding_signed
msgid "All taxes included"
msgstr "Tasse incluse"
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid ""
"Bad tax configuration for line %s, there must be one Withholding tax and one"
" Pension Fund tax at max."
msgstr ""
"Configurazione tasse errata nella linea %s, ci devono essere al massimo una "
"Ritenuta ed un Contributo a fondi pensionistici per linea."
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid ""
"Bad tax configuration for line %s, there must be one and only one VAT tax "
"per line"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc16
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc16
msgid "CASAGIT Additional pension fund for journalists"
msgstr "Cassa autonoma assistenza integrativa giornalisti italiani (CASAGIT)"
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_line_it_FatturaPA_withholding
msgid "CASSA-PREV"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_edi_format
msgid "EDI format"
msgstr "Formato EDI"
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.enasarco_purchase_tax_report_it_line
msgid "ENASARCO Amount (Purchase)"
msgstr "Ritenute ENASARCO Operate (Acquisti)"
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.enasarco_sale_tax_report_it_line
msgid "ENASARCO Amount (Sales)"
msgstr "Ritenute ENASARCO Subite (Vendite)"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_enasarco
msgid "ENASARCO Excluded"
msgstr "Ritenuta ENASARCO Esclusa"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc07
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc07
msgid "ENASARCO pension fund for sales agents"
msgstr ""
"Ente nazionale assistenza agenti e rappresentanti di commercio (ENASARCO)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc19
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc19
msgid "ENPAB national pension fund for biologists"
msgstr "Ente nazionale previdenza e assistenza biologi (ENPAB)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc08
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc08
msgid "ENPACL pension fund for labor consultants"
msgstr "Ente nazionale previdenza e assistenza consulenti del lavoro (ENPACL)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc10
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc10
msgid "ENPAF pension fund for chemists"
msgstr "Ente nazionale previdenza e assistenza farmacisti (ENPAF)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc12
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc12
msgid "ENPAIA pension fund for people working in agriculture"
msgstr ""
"Ente nazionale previdenza e assistenza impiegati dell'agricoltura (ENPAIA)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc09
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc09
msgid "ENPAM pension fund for doctors"
msgstr "Ente nazionale previdenza e assistenza medici (ENPAM)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc21
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc21
msgid "ENPAP national pension fund for psychologists"
msgstr "Ente nazionale previdenza e assistenza psicologi (ENPAP)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc20
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc20
msgid "ENPAPI national pension fund for nurses"
msgstr ""
"Ente nazionale previdenza e assistenza professione infermieristica (ENPAPI)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc11
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc11
msgid "ENPAV pension fund for veterinaries"
msgstr "Ente nazionale previdenza e assistenza veterinari (ENPAV)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc18
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc18
msgid "EPAP pension fund"
msgstr "Ente previdenza e assistenza pluricategoriale (EPAP)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc17
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc17
msgid "EPPI pension fund for industrial experts"
msgstr ""
"Ente previdenza periti industriali e periti industriali laureati (EPPI)"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_enasarco
msgid "Enasarco"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc14
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc14
msgid "INPGI pension fund for journalists"
msgstr "Istituto nazionale previdenza giornalisti italiani (INPGI)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc22
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc22
msgid "INPS national pension fund"
msgstr "Fondo pensione nazionale (INPS)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_group__preceding_subtotal
msgid ""
"If set, this value will be used on documents as the label of a subtotal "
"excluding this tax group before displaying it. If not set, the tax group "
"will be displayed after the 'Untaxed amount' subtotal."
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_move
msgid "Journal Entry"
msgstr "Movimento Contabile"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc04
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc04
msgid "National pension fund for associated engineers and architects"
msgstr ""
"Cassa nazionale previdenza e assistenza ingegneri e architetti liberi "
"professionisti"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc01
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc01
msgid "National pension fund for lawyers and solicitors"
msgstr "Cassa nazionale previdenza e assistenza avvocati e procuratori legali"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc05
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc05
msgid "National pension fund for notaries"
msgstr "Cassa nazionale del notariato"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc15
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc15
msgid "ONAOSI fund for sanitary orphans"
msgstr "Opera nazionale assistenza orfani sanitari italiani (ONAOSI)"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_pension_fund
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_pension_fund_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_pension_fund_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_pension_fund_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Pension Fund"
msgstr "Cassa previdenziale"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_pension_fund
msgid "Pension Fund Excluded"
msgstr "Cassa Previdenziale Esclusa"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_pension_fund_type
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_pension_fund_type
msgid "Pension Fund Type. Only for Italian accounting EDI."
msgstr "Tipo di Cassa Previdenziale. Solo per la contabilità italiana."
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid "Pension Fund tax not found"
msgstr "Contributo Cassa Previdenziale non trovato"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc02
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc02
msgid "Pension fund for accountants with a degree"
msgstr "Cassa previdenza dottori commercialisti"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc06
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc06
msgid "Pension fund for accountants without a degree and commercial experts"
msgstr ""
"Cassa nazionale previdenza e assistenza ragionieri e periti commerciali"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc13
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc13
msgid "Pension fund for employees in delivery and marine agencies"
msgstr "Fondo previdenza impiegati imprese di spedizione e agenzie marittime"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc03
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc03
msgid "Pension fund for surveyors"
msgstr "Cassa previdenza e assistenza geometri"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_pension_fund_type
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_pension_fund_type
msgid "Pension fund type (Italy)"
msgstr "Tipo di Cassa Previdenziale (Italia)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_group__preceding_subtotal
msgid "Preceding Subtotal"
msgstr "Subtotale precedente"
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_it_FatturaPA_export_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_line_it_FatturaPA_withholding
msgid "SI"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax
msgid "Tax"
msgstr "Imposta"
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' cannot be both a Withholding tax and a Pension fund tax. Please "
"create two separate ones."
msgstr ""
"'%s' non puo essere sia una Ritenuta che un Contributo Cassa Previdenziale. "
"Per favore, crea due Imposte separate."
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' has a withholding reason, so the withholding type must also be "
"specified"
msgstr ""
"'%s' ha una Causale Ritenuta, quindi dev'essere specificato anche il Tipo "
"Ritenuta"
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid "Tax '%s' has a withholding type so the amount must be negative."
msgstr "'%s' ha un Tipo Ritenuta, quindi l'ammontare dev'essere negativo."
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' has a withholding type, so the withholding reason must also be "
"specified"
msgstr ""
"'%s' ha un Tipo Ritenuta, quindi dev'essere specificata anche una Causale "
"Ritenuta"
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax_group
msgid "Tax Group"
msgstr "Gruppo imposta"
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax_template
msgid "Templates for Taxes"
msgstr "Modelli per imposte"
#. module: l10n_it_edi_withholding
#: model:account.report.column,name:l10n_it_edi_withholding.withh_tax_report_balance
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Total"
msgstr "Totale"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_withholding
msgid "Total Before Withholding"
msgstr "Totale Ritenute Escluse"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_vat_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_vat_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_vat_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "VAT"
msgstr "IVA"
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_withholding_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Withholding"
msgstr "Ritenuta"
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.withh_purchase_tax_report_it_line
msgid "Withholding Amount (Purchase)"
msgstr "Ritenute Operate (Acquisti)"
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.withh_sale_tax_report_it_line
msgid "Withholding Amount (Sales)"
msgstr "Ritenute Subite (Vendite)"
#. module: l10n_it_edi_withholding
#: model:account.report,name:l10n_it_edi_withholding.withh_tax_report_it
msgid "Withholding Report"
msgstr "Riepilogo Ritenute"
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid "Withholding tax not found"
msgstr "Ritenuta non trovata"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_reason
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_reason
msgid "Withholding tax reason (Italy)"
msgstr "Causale Ritenuta (Italia)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_reason
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_reason
msgid "Withholding tax reason. Only for Italian accounting EDI."
msgstr "Causale Ritenuta. Solo per la contabilità itlaliana."
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_type
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_type
msgid "Withholding tax type (Italy)"
msgstr "Tipo Ritenuta (Italia)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_type
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_type
msgid "Withholding tax type. Only for Italian accounting EDI."
msgstr "Tipo Ritenuta. Solo per la contabilità italiana."
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__a
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__a
msgid "[A] Autonomous work in the fields of art or profession"
msgstr ""
"[A] Prestazioni di lavoro autonomo rientranti nellesercizio di arte o "
"professione abituale"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__b
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__b
msgid ""
"[B] Income from the use of intellectual properties or patents or processes, "
"formulas and informations in the fields of science, commerce or science"
msgstr ""
"[B] Utilizzazione economica, da parte dellautore o dellinventore, di opere"
" dellingegno, di brevetti industriali e di processi, relativi a esperienze "
"acquisite in campo industriale, commerciale o scientifico"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__c
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__c
msgid ""
"[C] Income from work as part of association groups or other cooperation "
"determined by contracts"
msgstr ""
"[C] Utili derivanti da contratti di associazione in partecipazione e da "
"contratti di cointeressenza, quando lapporto è costituito esclusivamente "
"dalla prestazione di lavoro"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__d
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__d
msgid "[D] Income as partner or founder of a corporation"
msgstr ""
"[D] Utili spettanti ai soci promotori e ai soci fondatori delle società di "
"capitali"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__e
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__e
msgid "[E] Income from client-related bill protests made by town secretaries"
msgstr "[E] Levata di protesti cambiari da parte dei segretari comunali"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__g
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__g
msgid "[G] Compensation for the end of a professional sport career"
msgstr ""
"[G] Indennità corrisposte per la cessazione di attività sportiva "
"professionale"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__h
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__h
msgid ""
"[H] Compensation for the end of a societary career (excluded those earned "
"before 31.12.2003) and already taxed"
msgstr ""
"[H] Indennità corrisposte per la cessazione dei rapporti di agenzia delle "
"persone fisiche e delle società di persone, con esclusione delle somme "
"maturate entro il 31.12.2003, già imputate per competenza"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__i
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__i
msgid "[I] Compensation for the end of a notary career"
msgstr "[I] Indennità corrisposte per la cessazione da funzioni notarili"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__k
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__k
msgid "[K] Civil service checks, ref art. 16 D.lgs. n.40 6/03/2017"
msgstr ""
"[K] Assegni di servizio civile di cui allart. 16 del D.lgs. n. 40 del 6 "
"marzo 2017"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__l1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__l1
msgid ""
"[L1] Income from the use of intellectual properties or patents or processes,"
" formulas and informations in the fields of science, commerce or science, "
"from someone who actively bought the use rights"
msgstr ""
"[L1] Redditi derivanti dallutilizzazione economica di opere dellingegno, "
"di brevetti industriali e di processi, che sono percepiti da soggetti che "
"abbiano acquistato a titolo oneroso i diritti alla loro utilizzazione"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__l
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__l
msgid ""
"[L] Income from the use of intellectual properties or patents or processes, "
"formulas and informations in the fields of science, commerce or science, but"
" not made by the author/inventor"
msgstr ""
"[L] Utilizzazione economica, da parte di soggetto diverso dallautore o "
"dallinventore, di opere dellingegno, di brevetti industriali e di "
"processi, formule e informazioni relative a esperienze acquisite"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m1
msgid "[M1] Incomes due for an obligation to act, not to act, or to allow"
msgstr ""
"[M1] Redditi derivanti dallassunzione di obblighi di fare, di non fare o "
"permettere"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m2
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m2
msgid ""
"[M2] Autonomous work which isn't part of usual professional/artistic duties,"
" or incomes due for an obligation to act, not to act, or to allow - that "
"require being registered to the \"Gestione separata\""
msgstr ""
"[M2] Prestazioni di lavoro autonomo non esercitate abitualmente per le quali"
" sussiste lobbligo di iscrizione alla Gestione Separata ENPAPI"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m
msgid ""
"[M] Autonomous work which isn't part of usual professional/artistic duties, "
"or incomes due for an obligation to act, not to act, or to allow"
msgstr ""
"[M] Prestazioni di lavoro autonomo non esercitate abitualmente, obblighi di "
"fare, di non fare o permettere"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__n
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__n
msgid ""
"[N] Compensation for travel, expenses, prizes, or other compensations for "
"amateur sport activities"
msgstr ""
"[N] Indennità di trasferta, rimborso forfettario di spese, premi e compensi "
"erogati nellesercizio diretto di attività sportive dilettantistiche"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__o1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__o1
msgid ""
"[O1] Incomes due for an obligation to act, not to act, or to allow - that do"
" not require being registered to the \"Gestione Separata\""
msgstr ""
"[O1] Redditi derivanti dallassunzione di obblighi di fare, di non fare o "
"permettere, per le quali non sussiste lobbligo di iscrizione alla gestione "
"separata (Circ. INPS n. 104/2001)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__o
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__o
msgid ""
"[O] Autonomous work which isn't part of usual professional/artistic duties, "
"or incomes due for an obligation to act, not to act, or to allow - that do "
"not require being registered to the \"Gestione separata\""
msgstr ""
"[O] Prestazioni di lavoro autonomo non esercitate abitualmente, obblighi di "
"fare, di non fare o permettere, per le quali non sussiste lobbligo di "
"iscrizione alla gestione separata (Circ. Inps 104/2001)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__p
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__p
msgid ""
"[P] Compensation for people residing abroad for continuous use or concession"
" of industrial machinery, commercial or scientific tools that are on the "
"Italian soil"
msgstr ""
"[P] Compensi corrisposti a soggetti non residenti privi di stabile "
"organizzazione per luso o la concessione in uso di attrezzature "
"industriali, commerciali o scientifiche che si trovano nel territorio dello "
"Stato"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__q
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__q
msgid "[Q] Provisions for exclusive agents or sales representatives' work"
msgstr ""
"[Q] Provvigioni corrisposte ad agente o rappresentante di commercio "
"monomandatario"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt01
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt01
msgid "[RT01] Withholding for persons"
msgstr "[RT01] Ritenuta persone fisiche"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt02
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt02
msgid "[RT02] Withholding for personal businesses"
msgstr "[RT02] Ritenuta persone giuridiche"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt03
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt03
msgid "[RT03] INPS Pension fund contribution"
msgstr "[RT04] Contributo INPS"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt04
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt04
msgid "[RT04] ENASARCO pension fund contribution"
msgstr "[RT04] Contributo ENASARCO"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt05
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt05
msgid "[RT05] ENPAM pension fund contribution"
msgstr "[RT05] Contributo ENPAM"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt06
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt06
msgid "[RT06] Other pension fund contribution"
msgstr "[RT06] Altro contributo previdenziale"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__r
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__r
msgid "[R] Provisions for non-exclusive agents or sales representatives' work"
msgstr ""
"[R] Provvigioni corrisposte ad agente o rappresentante di commercio "
"plurimandatario"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__s
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__s
msgid "[S] Provisions for commissioner work"
msgstr "[S] Provvigioni corrisposte a commissionario"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__t
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__t
msgid "[T] Provisions for mediator work"
msgstr "[T] Provvigioni corrisposte a mediatore"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__u
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__u
msgid "[U] Provisions for procurer work"
msgstr "[U] Provvigioni corrisposte a procacciatore di affari"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v1
msgid ""
"[V1] Income from unusual commercial activities (such as provisions for "
"occasional work or sales representative, mediator, procurer)"
msgstr ""
"[V1] Redditi derivanti da attività commerciali non esercitate abitualmente "
"(ad esempio, provvigioni corrisposte per prestazioni occasionali ad agente o"
" rappresentante di commercio, mediatore, procacciatore daffari);"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v2
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v2
msgid ""
"[V2] Income from unusual work activities from door-to-door sales "
"representatives"
msgstr ""
"[V2] Redditi derivanti dalle prestazioni non esercitate abitualmente rese "
"dagli incaricati alla vendita diretta a domicilio;"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v
msgid ""
"[V] Provisions for door-to-door sales persons and newspaper selling in "
"kiosks"
msgstr ""
"[V] Provvigioni corrisposte a incaricato per le vendite a domicilio e "
"provvigioni corrisposte a incaricato per la vendita porta a porta e per la "
"vendita ambulante di giornali quotidiani e periodici (L. 25.02.1987, n. 67)"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__w
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__w
msgid ""
"[W] Income from 2015 tinders subject to law art. 25-ter D.P.R. 600/1973"
msgstr ""
"[W] Corrispettivi erogati nel 2015 per prestazioni relative a contratti "
"dappalto cui si sono resi applicabili le disposizioni contenute nellart "
"25-ter D.P.R. 600/1973"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__x
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__x
msgid ""
"[X] Income from 2014 for foreign companies or institutions subject to law "
"art. 26-quater, c. 1, lett. a) and b) D.P.R. 600/1973"
msgstr ""
"[X] Canoni corrisposti nel 2004 da società o enti residenti, ovvero da "
"stabili organizzazioni di società estere di cui allart. 26-quater, c. 1, "
"lett. a) e b) D.P.R. 600/1973"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__y
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__y
msgid ""
"[Y] Income from 1.01.2005 to 26.07.2005 from companies or institutions not "
"included in the description above"
msgstr ""
"[Y] Canoni corrisposti dal 1.01.2005 al 26.07.2005 da soggetti di cui al "
"punto precedente"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__zo
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__zo
msgid "[ZO] Other reason"
msgstr "[Z0] Titolo diverso dai precedenti"
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__z
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__z
msgid "[Z] Deprecated"
msgstr "[Z] Obsoleto"

View file

@ -0,0 +1,653 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_it_edi_withholding
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-26 11:16+0000\n"
"PO-Revision-Date: 2023-01-26 11:16+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_chart_template
msgid "Account Chart Template"
msgstr ""
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "All Taxes Included"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_before_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_before_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_before_withholding_signed
msgid "All taxes included"
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid ""
"Bad tax configuration for line %s, there must be one Withholding tax and one"
" Pension Fund tax at max."
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid ""
"Bad tax configuration for line %s, there must be one and only one VAT tax "
"per line"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc16
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc16
msgid "CASAGIT Additional pension fund for journalists"
msgstr ""
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_line_it_FatturaPA_withholding
msgid "CASSA-PREV"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_edi_format
msgid "EDI format"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.enasarco_purchase_tax_report_it_line
msgid "ENASARCO Amount (Purchase)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.enasarco_sale_tax_report_it_line
msgid "ENASARCO Amount (Sales)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_enasarco
msgid "ENASARCO Excluded"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc07
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc07
msgid "ENASARCO pension fund for sales agents"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc19
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc19
msgid "ENPAB national pension fund for biologists"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc08
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc08
msgid "ENPACL pension fund for labor consultants"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc10
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc10
msgid "ENPAF pension fund for chemists"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc12
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc12
msgid "ENPAIA pension fund for people working in agriculture"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc09
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc09
msgid "ENPAM pension fund for doctors"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc21
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc21
msgid "ENPAP national pension fund for psychologists"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc20
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc20
msgid "ENPAPI national pension fund for nurses"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc11
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc11
msgid "ENPAV pension fund for veterinaries"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc18
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc18
msgid "EPAP pension fund"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc17
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc17
msgid "EPPI pension fund for industrial experts"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_enasarco
msgid "Enasarco"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc14
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc14
msgid "INPGI pension fund for journalists"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc22
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc22
msgid "INPS national pension fund"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_group__preceding_subtotal
msgid ""
"If set, this value will be used on documents as the label of a subtotal "
"excluding this tax group before displaying it. If not set, the tax group "
"will be displayed after the 'Untaxed amount' subtotal."
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc04
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc04
msgid "National pension fund for associated engineers and architects"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc01
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc01
msgid "National pension fund for lawyers and solicitors"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc05
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc05
msgid "National pension fund for notaries"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc15
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc15
msgid "ONAOSI fund for sanitary orphans"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_pension_fund
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_pension_fund_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_pension_fund_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_pension_fund_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Pension Fund"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_pension_fund
msgid "Pension Fund Excluded"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_pension_fund_type
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_pension_fund_type
msgid "Pension Fund Type. Only for Italian accounting EDI."
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid "Pension Fund tax not found"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc02
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc02
msgid "Pension fund for accountants with a degree"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc06
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc06
msgid "Pension fund for accountants without a degree and commercial experts"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc13
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc13
msgid "Pension fund for employees in delivery and marine agencies"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_pension_fund_type__tc03
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_pension_fund_type__tc03
msgid "Pension fund for surveyors"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_pension_fund_type
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_pension_fund_type
msgid "Pension fund type (Italy)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_group__preceding_subtotal
msgid "Preceding Subtotal"
msgstr ""
#. module: l10n_it_edi_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_it_FatturaPA_export_withholding
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.account_invoice_line_it_FatturaPA_withholding
msgid "SI"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax
msgid "Tax"
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' cannot be both a Withholding tax and a Pension fund tax. Please "
"create two separate ones."
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' has a withholding reason, so the withholding type must also be "
"specified"
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid "Tax '%s' has a withholding type so the amount must be negative."
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_tax.py:0
#, python-format
msgid ""
"Tax '%s' has a withholding type, so the withholding reason must also be "
"specified"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax_group
msgid "Tax Group"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model,name:l10n_it_edi_withholding.model_account_tax_template
msgid "Templates for Taxes"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report.column,name:l10n_it_edi_withholding.withh_tax_report_balance
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Total"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,preceding_subtotal:l10n_it_edi_withholding.tax_group_withholding
msgid "Total Before Withholding"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_vat_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_vat_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_vat_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "VAT"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.tax.group,name:l10n_it_edi_withholding.tax_group_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_bank_statement_line__l10n_it_amount_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_move__l10n_it_amount_withholding_signed
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_payment__l10n_it_amount_withholding_signed
#: model_terms:ir.ui.view,arch_db:l10n_it_edi_withholding.view_invoice_tree_l10n_it_edi_extended
msgid "Withholding"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.withh_purchase_tax_report_it_line
msgid "Withholding Amount (Purchase)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report.line,name:l10n_it_edi_withholding.withh_sale_tax_report_it_line
msgid "Withholding Amount (Sales)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:account.report,name:l10n_it_edi_withholding.withh_tax_report_it
msgid "Withholding Report"
msgstr ""
#. module: l10n_it_edi_withholding
#. odoo-python
#: code:addons/l10n_it_edi_withholding/models/account_edi_format.py:0
#, python-format
msgid "Withholding tax not found"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_reason
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_reason
msgid "Withholding tax reason (Italy)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_reason
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_reason
msgid "Withholding tax reason. Only for Italian accounting EDI."
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_type
#: model:ir.model.fields,field_description:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_type
msgid "Withholding tax type (Italy)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax__l10n_it_withholding_type
#: model:ir.model.fields,help:l10n_it_edi_withholding.field_account_tax_template__l10n_it_withholding_type
msgid "Withholding tax type. Only for Italian accounting EDI."
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__a
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__a
msgid "[A] Autonomous work in the fields of art or profession"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__b
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__b
msgid ""
"[B] Income from the use of intellectual properties or patents or processes, "
"formulas and informations in the fields of science, commerce or science"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__c
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__c
msgid ""
"[C] Income from work as part of association groups or other cooperation "
"determined by contracts"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__d
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__d
msgid "[D] Income as partner or founder of a corporation"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__e
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__e
msgid "[E] Income from client-related bill protests made by town secretaries"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__g
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__g
msgid "[G] Compensation for the end of a professional sport career"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__h
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__h
msgid ""
"[H] Compensation for the end of a societary career (excluded those earned "
"before 31.12.2003) and already taxed"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__i
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__i
msgid "[I] Compensation for the end of a notary career"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__k
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__k
msgid "[K] Civil service checks, ref art. 16 D.lgs. n.40 6/03/2017"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__l1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__l1
msgid ""
"[L1] Income from the use of intellectual properties or patents or processes,"
" formulas and informations in the fields of science, commerce or science, "
"from someone who actively bought the use rights"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__l
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__l
msgid ""
"[L] Income from the use of intellectual properties or patents or processes, "
"formulas and informations in the fields of science, commerce or science, but"
" not made by the author/inventor"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m1
msgid "[M1] Incomes due for an obligation to act, not to act, or to allow"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m2
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m2
msgid ""
"[M2] Autonomous work which isn't part of usual professional/artistic duties,"
" or incomes due for an obligation to act, not to act, or to allow - that "
"require being registered to the \"Gestione separata\""
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__m
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__m
msgid ""
"[M] Autonomous work which isn't part of usual professional/artistic duties, "
"or incomes due for an obligation to act, not to act, or to allow"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__n
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__n
msgid ""
"[N] Compensation for travel, expenses, prizes, or other compensations for "
"amateur sport activities"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__o1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__o1
msgid ""
"[O1] Incomes due for an obligation to act, not to act, or to allow - that do"
" not require being registered to the \"Gestione Separata\""
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__o
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__o
msgid ""
"[O] Autonomous work which isn't part of usual professional/artistic duties, "
"or incomes due for an obligation to act, not to act, or to allow - that do "
"not require being registered to the \"Gestione separata\""
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__p
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__p
msgid ""
"[P] Compensation for people residing abroad for continuous use or concession"
" of industrial machinery, commercial or scientific tools that are on the "
"Italian soil"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__q
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__q
msgid "[Q] Provisions for exclusive agents or sales representatives' work"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt01
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt01
msgid "[RT01] Withholding for persons"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt02
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt02
msgid "[RT02] Withholding for personal businesses"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt03
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt03
msgid "[RT03] INPS Pension fund contribution"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt04
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt04
msgid "[RT04] ENASARCO pension fund contribution"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt05
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt05
msgid "[RT05] ENPAM pension fund contribution"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_type__rt06
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_type__rt06
msgid "[RT06] Other pension fund contribution"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__r
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__r
msgid "[R] Provisions for non-exclusive agents or sales representatives' work"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__s
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__s
msgid "[S] Provisions for commissioner work"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__t
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__t
msgid "[T] Provisions for mediator work"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__u
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__u
msgid "[U] Provisions for procurer work"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v1
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v1
msgid ""
"[V1] Income from unusual commercial activities (such as provisions for "
"occasional work or sales representative, mediator, procurer)"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v2
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v2
msgid ""
"[V2] Income from unusual work activities from door-to-door sales "
"representatives"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__v
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__v
msgid ""
"[V] Provisions for door-to-door sales persons and newspaper selling in "
"kiosks"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__w
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__w
msgid ""
"[W] Income from 2015 tinders subject to law art. 25-ter D.P.R. 600/1973"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__x
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__x
msgid ""
"[X] Income from 2014 for foreign companies or institutions subject to law "
"art. 26-quater, c. 1, lett. a) and b) D.P.R. 600/1973"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__y
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__y
msgid ""
"[Y] Income from 1.01.2005 to 26.07.2005 from companies or institutions not "
"included in the description above"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__zo
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__zo
msgid "[ZO] Other reason"
msgstr ""
#. module: l10n_it_edi_withholding
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax__l10n_it_withholding_reason__z
#: model:ir.model.fields.selection,name:l10n_it_edi_withholding.selection__account_tax_template__l10n_it_withholding_reason__z
msgid "[Z] Deprecated"
msgstr ""

View file

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account_tax
from . import account_chart_template
from . import account_move
from . import account_edi_format

View file

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from odoo import models
_logger = logging.getLogger(__name__)
class AccountChartTemplate(models.Model):
_inherit = 'account.chart.template'
def _load(self, company):
"""
Override normal default taxes, which are the ones with lowest sequence.
"""
result = super()._load(company)
if company.chart_template_id == self.env.ref('l10n_it.l10n_it_chart_template_generic'):
company.account_sale_tax_id = self.env.ref(f'l10n_it.{company.id}_22v')
company.account_purchase_tax_id = self.env.ref(f'l10n_it.{company.id}_22am')
return result

View file

@ -0,0 +1,136 @@
# -*- coding:utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, _
import logging
_logger = logging.getLogger(__name__)
class AccountEdiFormat(models.Model):
_inherit = 'account.edi.format'
def _l10n_it_edi_search_tax_for_import(self, company, percentage, extra_domain=None, vat_only=True):
""" In case no withholding_type or pension_fund is specified, exclude taxes that have it.
It means that we're searching for VAT taxes, especially in the base l10n_it_edi module
"""
if vat_only:
extra_domain += [('l10n_it_withholding_type', '=', False), ('l10n_it_pension_fund_type', '=', False)]
return super()._l10n_it_edi_search_tax_for_import(company, percentage, extra_domain)
def _l10n_it_edi_check_taxes_configuration(self, invoice):
"""
Override to also allow pension_fund, withholding taxes.
Needs not to call super, because super checks for one tax only per line.
"""
errors = []
for invoice_line in invoice.invoice_line_ids.filtered(lambda x: x.display_type == 'product'):
all_taxes = invoice_line.tax_ids.flatten_taxes_hierarchy()
vat_taxes, withholding_taxes, pension_fund_taxes = (all_taxes._l10n_it_filter_kind(kind) for kind in ('vat', 'withholding', 'pension_fund'))
if len(vat_taxes.filtered(lambda x: x.amount >= 0)) != 1:
errors.append(_("Bad tax configuration for line %s, there must be one and only one VAT tax per line", invoice_line.name))
if len(pension_fund_taxes) > 1 or len(withholding_taxes) > 1:
errors.append(_("Bad tax configuration for line %s, there must be one Withholding tax and one Pension Fund tax at max.", invoice_line.name))
return errors
def _l10n_it_edi_get_extra_info(self, company, document_type, body_tree, incoming=True):
extra_info, message_to_log = super()._l10n_it_edi_get_extra_info(company, document_type, body_tree, incoming=incoming)
type_tax_use_domain = extra_info['type_tax_use_domain']
withholding_elements = body_tree.xpath('.//DatiGeneraliDocumento/DatiRitenuta')
withholding_taxes = []
for withholding in (withholding_elements or []):
tipo_ritenuta = withholding.find("TipoRitenuta")
reason = withholding.find("CausalePagamento")
percentage = withholding.find('AliquotaRitenuta')
withholding_type = tipo_ritenuta.text if tipo_ritenuta is not None else "RT02"
withholding_reason = reason.text if reason is not None else "A"
withholding_percentage = -float(percentage.text if percentage is not None else "0.0")
withholding_tax = self._l10n_it_edi_search_tax_for_import(
company,
withholding_percentage,
([('l10n_it_withholding_type', '=', withholding_type),
('l10n_it_withholding_reason', '=', withholding_reason)]
+ type_tax_use_domain),
vat_only=False)
if withholding_tax:
withholding_taxes.append(withholding_tax)
else:
message_to_log.append("%s<br/>%s" % (
_("Withholding tax not found"),
self.env['account.move']._compose_info_message(body_tree, '.'),
))
extra_info["withholding_taxes"] = withholding_taxes
pension_fund_elements = body_tree.xpath('.//DatiGeneraliDocumento/DatiCassaPrevidenziale')
pension_fund_taxes = []
for pension_fund in (pension_fund_elements or []):
pension_fund_type = pension_fund.find("TipoCassa")
tax_factor_percent = pension_fund.find("AlCassa")
vat_tax_factor_percent = pension_fund.find("AliquotaIVA")
pension_fund_type = pension_fund_type.text if pension_fund_type is not None else ""
tax_factor_percent = float(tax_factor_percent.text or "0.0")
vat_tax_factor_percent = float(vat_tax_factor_percent.text or "0.0")
pension_fund_tax = self._l10n_it_edi_search_tax_for_import(
company,
tax_factor_percent,
([('l10n_it_pension_fund_type', '=', pension_fund_type)]
+ type_tax_use_domain),
vat_only=False)
if pension_fund_tax:
pension_fund_taxes.append(pension_fund_tax)
else:
message_to_log.append("%s<br/>%s" % (
_("Pension Fund tax not found"),
self.env['account.move']._compose_info_message(body_tree, '.'),
))
extra_info["pension_fund_taxes"] = pension_fund_taxes
return extra_info, message_to_log
def _import_fattura_pa_line(self, element, invoice_line_form, extra_info):
messages_to_log = super()._import_fattura_pa_line(element, invoice_line_form, extra_info)
type_tax_use_domain = extra_info['type_tax_use_domain']
for withholding_tax in extra_info.get('withholding_taxes', []):
withholding_tags = element.xpath("Ritenuta")
if withholding_tags and withholding_tags[0].text == 'SI':
invoice_line_form.tax_ids |= withholding_tax
for pension_fund_tax in extra_info.get('pension_fund_taxes', []):
invoice_line_form.tax_ids |= pension_fund_tax
if extra_info['simplified']:
return messages_to_log
price_subtotal = invoice_line_form.price_unit
company = invoice_line_form.company_id
# ENASARCO Pension Fund tax (works as a withholding)
for other_data_element in element.xpath('.//AltriDatiGestionali'):
data_kind_element = other_data_element.xpath("./TipoDato")
text_element = other_data_element.xpath("./RiferimentoTesto")
number_element = other_data_element.xpath("./RiferimentoNumero")
if not data_kind_element or not text_element or not number_element:
continue
data_kind, data_text, number_text = data_kind_element[0].text.lower(), text_element[0].text.lower(), number_element[0].text
if data_kind != 'cassa-prev' or ('enasarco' not in data_text and not 'tc07' in data_text):
continue
enasarco_amount = float(number_text)
enasarco_percentage = -self.env.company.currency_id.round(enasarco_amount / price_subtotal * 100)
enasarco_tax = self._l10n_it_edi_search_tax_for_import(
company,
enasarco_percentage,
[('l10n_it_pension_fund_type', '=', 'TC07')] + type_tax_use_domain,
vat_only=False)
if enasarco_tax:
invoice_line_form.tax_ids |= enasarco_tax
else:
messages_to_log.append("%s<br/>%s" % (
_("Enasarco tax not found for line with description '%s'", invoice_line_form.name),
self.env['account.move']._compose_info_message(other_data_element, '.'),
))
return messages_to_log

View file

@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from collections import namedtuple
from odoo import api, fields, models
_logger = logging.getLogger(__name__)
class AccountMove(models.Model):
_inherit = 'account.move'
l10n_it_amount_vat_signed = fields.Monetary(string='VAT', compute='_compute_amount_extended', currency_field='company_currency_id')
l10n_it_amount_pension_fund_signed = fields.Monetary(string='Pension Fund', compute='_compute_amount_extended', currency_field='company_currency_id')
l10n_it_amount_withholding_signed = fields.Monetary(string='Withholding', compute='_compute_amount_extended', currency_field='company_currency_id')
l10n_it_amount_before_withholding_signed = fields.Monetary(string='Total Before Withholding', compute='_compute_amount_extended', currency_field='company_currency_id')
@api.depends('amount_total_signed')
def _compute_amount_extended(self):
for move in self:
totals = dict(vat=0.0, withholding=0.0, pension_fund=0.0)
if move.is_invoice(True):
for line in [line for line in move.line_ids if line.tax_line_id]:
totals[line.tax_line_id._l10n_it_get_tax_kind()] -= line.balance
move.l10n_it_amount_vat_signed = totals['vat']
move.l10n_it_amount_withholding_signed = totals['withholding']
move.l10n_it_amount_pension_fund_signed = totals['pension_fund']
move.l10n_it_amount_before_withholding_signed = move.amount_untaxed_signed + totals['vat'] + totals['pension_fund']
def _l10n_it_edi_filter_fatturapa_tax_details(self, line, tax_values):
"""Filters tax details to only include the positive amounted lines regarding VAT taxes."""
repartition_line = tax_values['tax_repartition_line']
repartition_line_vat = repartition_line.tax_id._l10n_it_filter_kind('vat')
return repartition_line.factor_percent >= 0 and repartition_line_vat and repartition_line_vat.amount >= 0
def _prepare_fatturapa_export_values(self):
"""Add withholding and pension_fund features."""
template_values = super()._prepare_fatturapa_export_values()
# Withholding tax data
WithholdingTaxData = namedtuple('TaxData', ['tax', 'tax_amount'])
withholding_lines = self.line_ids.filtered(lambda x: x.tax_line_id._l10n_it_filter_kind('withholding'))
withholding_values = [WithholdingTaxData(x.tax_line_id, abs(x.balance)) for x in withholding_lines]
# Eventually fix the total as it must be computed before applying the Withholding.
# Withholding amount is negatively signed, so we need to subtract it
document_total = template_values['document_total']
document_total -= self.l10n_it_amount_withholding_signed
# Pension fund tax data, I need the base amount so I have to sum the amounts of the lines with the tax
PensionFundTaxData = namedtuple('TaxData', ['tax', 'base_amount', 'tax_amount', 'vat_tax', 'withholding_tax'])
pension_fund_lines = self.line_ids.filtered(lambda line: line.tax_line_id._l10n_it_filter_kind('pension_fund'))
pension_fund_mapping = {}
for line in self.line_ids:
pension_fund_tax = line.tax_ids._l10n_it_filter_kind('pension_fund')
if pension_fund_tax:
pension_fund_mapping[pension_fund_tax.id] = (line.tax_ids._l10n_it_filter_kind('vat'), line.tax_ids._l10n_it_filter_kind('withholding'))
# Pension fund taxes in the XML must have a reference to their VAT tax (Aliquota tag)
pension_fund_values = []
enasarco_taxes = []
for line in pension_fund_lines:
# Enasarco must be treated separately
if line.tax_line_id.l10n_it_pension_fund_type == 'TC07':
enasarco_taxes.append(line.tax_line_id)
continue
pension_fund_tax = line.tax_line_id
# Here we are supposing that the same pension_fund is always associated to the same VAT and Withholding taxes
# That's also what the "Aliquota" tag seems to imply in the XML.
vat_tax, withholding_tax = pension_fund_mapping[pension_fund_tax.id]
pension_fund_values.append(PensionFundTaxData(pension_fund_tax, line.tax_base_amount, abs(line.balance), vat_tax, withholding_tax))
# Enasarco pension fund must be expressed in the AltriDatiGestionali at the line detail level
enasarco_values = False
if enasarco_taxes:
enasarco_values = {}
enasarco_details = self._prepare_edi_tax_details(filter_to_apply=lambda line, tax_values: self.env['account.tax'].browse([tax_values['id']]).l10n_it_pension_fund_type == 'TC07')
for detail in enasarco_details['tax_details_per_record'].values():
for subdetail in detail['tax_details'].values():
# Withholdings are removed from the total, we have to re-add them
document_total += abs(subdetail['tax_amount'])
line = subdetail['records'].pop()
enasarco_values[line.id] = {
'amount': subdetail['tax'].amount,
'tax_amount': abs(subdetail['tax_amount']),
}
# Update the template_values that will be read while rendering
template_values.update({
'withholding_values': withholding_values,
'pension_fund_values': pension_fund_values,
'enasarco_values': enasarco_values,
'document_total': document_total,
})
return template_values

View file

@ -0,0 +1,124 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
TAX_KIND_SELECTION = [
('vat', 'VAT tax'),
('withholding', 'Withholding tax'),
('pension_fund', 'Pension Fund tax'),
]
WITHHOLDING_TYPE_SELECTION = [
('RT01', '[RT01] Withholding for persons'),
('RT02', '[RT02] Withholding for personal businesses'),
('RT03', '[RT03] INPS Pension fund contribution'),
('RT04', '[RT04] ENASARCO pension fund contribution'),
('RT05', '[RT05] ENPAM pension fund contribution'),
('RT06', '[RT06] Other pension fund contribution'),
]
WITHHOLDING_REASON_SELECTION = [
('A', '[A] Autonomous work in the fields of art or profession'),
('B', '[B] Income from the use of intellectual properties or patents or processes, formulas and informations in the fields of science, commerce or science'),
('C', '[C] Income from work as part of association groups or other cooperation determined by contracts'),
('D', '[D] Income as partner or founder of a corporation'),
('E', '[E] Income from client-related bill protests made by town secretaries'),
('G', '[G] Compensation for the end of a professional sport career'),
('H', '[H] Compensation for the end of a societary career (excluded those earned before 31.12.2003) and already taxed'),
('I', '[I] Compensation for the end of a notary career'),
('K', '[K] Civil service checks, ref art. 16 D.lgs. n.40 6/03/2017'),
('L', '[L] Income from the use of intellectual properties or patents or processes, formulas and informations in the fields of science, commerce or science, but not made by the author/inventor'),
('L1', '[L1] Income from the use of intellectual properties or patents or processes, formulas and informations in the fields of science, commerce or science, from someone who actively bought the use rights'),
('M', '[M] Autonomous work which isn\'t part of usual professional/artistic duties, or incomes due for an obligation to act, not to act, or to allow'),
('M1', '[M1] Incomes due for an obligation to act, not to act, or to allow'),
('M2', '[M2] Autonomous work which isn\'t part of usual professional/artistic duties, or incomes due for an obligation to act, not to act, or to allow - that require being registered to the "Gestione separata"'),
('N', '[N] Compensation for travel, expenses, prizes, or other compensations for amateur sport activities'),
('O', '[O] Autonomous work which isn\'t part of usual professional/artistic duties, or incomes due for an obligation to act, not to act, or to allow - that do not require being registered to the "Gestione separata"'),
('O1', '[O1] Incomes due for an obligation to act, not to act, or to allow - that do not require being registered to the "Gestione Separata"'),
('P', '[P] Compensation for people residing abroad for continuous use or concession of industrial machinery, commercial or scientific tools that are on the Italian soil'),
('Q', '[Q] Provisions for exclusive agents or sales representatives\' work'),
('R', '[R] Provisions for non-exclusive agents or sales representatives\' work'),
('S', '[S] Provisions for commissioner work'),
('T', '[T] Provisions for mediator work'),
('U', '[U] Provisions for procurer work'),
('V', '[V] Provisions for door-to-door sales persons and newspaper selling in kiosks'),
('V1', '[V1] Income from unusual commercial activities (such as provisions for occasional work or sales representative, mediator, procurer)'),
('V2', '[V2] Income from unusual work activities from door-to-door sales representatives'),
('W', '[W] Income from 2015 tinders subject to law art. 25-ter D.P.R. 600/1973'),
('X', '[X] Income from 2014 for foreign companies or institutions subject to law art. 26-quater, c. 1, lett. a) and b) D.P.R. 600/1973'),
('Y', '[Y] Income from 1.01.2005 to 26.07.2005 from companies or institutions not included in the description above'),
('Z', '[Z] Deprecated'),
('ZO', '[ZO] Other reason'),
]
PENSION_FUND_TYPE_SELECTION = [
('TC01', 'National pension fund for lawyers and solicitors'),
('TC02', 'Pension fund for accountants with a degree'),
('TC03', 'Pension fund for surveyors'),
('TC04', 'National pension fund for associated engineers and architects'),
('TC05', 'National pension fund for notaries'),
('TC06', 'Pension fund for accountants without a degree and commercial experts'),
('TC07', 'ENASARCO pension fund for sales agents'),
('TC08', 'ENPACL pension fund for labor consultants'),
('TC09', 'ENPAM pension fund for doctors'),
('TC10', 'ENPAF pension fund for chemists'),
('TC11', 'ENPAV pension fund for veterinaries'),
('TC12', 'ENPAIA pension fund for people working in agriculture'),
('TC13', 'Pension fund for employees in delivery and marine agencies'),
('TC14', 'INPGI pension fund for journalists'),
('TC15', 'ONAOSI fund for sanitary orphans'),
('TC16', 'CASAGIT Additional pension fund for journalists'),
('TC17', 'EPPI pension fund for industrial experts'),
('TC18', 'EPAP pension fund'),
('TC19', 'ENPAB national pension fund for biologists'),
('TC20', 'ENPAPI national pension fund for nurses'),
('TC21', 'ENPAP national pension fund for psychologists'),
('TC22', 'INPS national pension fund'),
]
class AccountTaxTemplate(models.Model):
_inherit = 'account.tax.template'
l10n_it_withholding_type = fields.Selection(WITHHOLDING_TYPE_SELECTION, string="Withholding tax type (Italy)", help="Withholding tax type. Only for Italian accounting EDI.")
l10n_it_withholding_reason = fields.Selection(WITHHOLDING_REASON_SELECTION, string="Withholding tax reason (Italy)", help="Withholding tax reason. Only for Italian accounting EDI.")
l10n_it_pension_fund_type = fields.Selection(PENSION_FUND_TYPE_SELECTION, string="Pension fund type (Italy)", help="Pension Fund Type. Only for Italian accounting EDI.")
def _get_tax_vals(self, company, tax_template_to_tax):
values = super()._get_tax_vals(company, tax_template_to_tax)
values.update({
"l10n_it_withholding_type": self.l10n_it_withholding_type,
"l10n_it_withholding_reason": self.l10n_it_withholding_reason,
"l10n_it_pension_fund_type": self.l10n_it_pension_fund_type,
})
return values
class AccountTax(models.Model):
_inherit = 'account.tax'
l10n_it_withholding_type = fields.Selection(WITHHOLDING_TYPE_SELECTION, string="Withholding tax type (Italy)", help="Withholding tax type. Only for Italian accounting EDI.")
l10n_it_withholding_reason = fields.Selection(WITHHOLDING_REASON_SELECTION, string="Withholding tax reason (Italy)", help="Withholding tax reason. Only for Italian accounting EDI.")
l10n_it_pension_fund_type = fields.Selection(PENSION_FUND_TYPE_SELECTION, string="Pension fund type (Italy)", help="Pension Fund Type. Only for Italian accounting EDI.")
def _l10n_it_get_tax_kind(self):
return ((self.l10n_it_withholding_type and 'withholding')
or (self.l10n_it_pension_fund_type and 'pension_fund')
or 'vat')
def _l10n_it_filter_kind(self, kind):
""" Filters taxes depending on _l10n_it_get_tax_kind. """
return self.filtered(lambda tax: tax._l10n_it_get_tax_kind() == kind)
@api.constrains('amount', 'l10n_it_withholding_type', 'l10n_it_withholding_reason', 'l10n_it_pension_fund_type')
def _validate_withholding(self):
for tax in self:
if tax.l10n_it_withholding_type and tax.l10n_it_withholding_type != 'RT04' and tax.amount >= 0:
raise ValidationError(_("Tax '%s' has a withholding type so the amount must be negative.", tax.name))
if tax.l10n_it_withholding_type and not tax.l10n_it_withholding_reason:
raise ValidationError(_("Tax '%s' has a withholding type, so the withholding reason must also be specified", tax.name))
if tax.l10n_it_withholding_reason and not tax.l10n_it_withholding_type:
raise ValidationError(_("Tax '%s' has a withholding reason, so the withholding type must also be specified", tax.name))
if (tax.l10n_it_withholding_type or tax.l10n_it_withholding_reason) and tax.l10n_it_pension_fund_type:
raise ValidationError(_("Tax '%s' cannot be both a Withholding tax and a Pension fund tax. Please create two separate ones.", tax.name))

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import test_withholding

View file

@ -0,0 +1,154 @@
<?xml version="1.0"?>
<p:FatturaElettronica xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd" versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>2022030010</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>0000000</CodiceDestinatario>
<ContattiTrasmittente>
</ContattiTrasmittente>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00465840031</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>93026890017</CodiceFiscale>
<Anagrafica>
<Denominazione>Alessi</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Privata Alessi 6 </Indirizzo>
<CAP>28887</CAP>
<Comune>Milan</Comune>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>01234560157</CodiceFiscale>
<Anagrafica>
<Denominazione>company_2_data</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>1234 Test Street </Indirizzo>
<CAP>12345</CAP>
<Comune>Prova</Comune>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2022-03-24</Data>
<Numero>INV/2022/03/0010</Numero>
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>86.25</ImportoRitenuta>
<AliquotaRitenuta>23.00</AliquotaRitenuta>
<CausalePagamento>ZO</CausalePagamento>
</DatiRitenuta>
<ImportoTotaleDocumento>945.00</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>
Ordinary accounting service for the year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>350.000000</PrezzoUnitario>
<PrezzoTotale>350.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto>TC07 - ENASARCO (8.5%)</RiferimentoTesto>
<RiferimentoNumero>29.75</RiferimentoNumero>
<RiferimentoData/>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>
Balance deposit for the past year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>300.000000</PrezzoUnitario>
<PrezzoTotale>300.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto>TC07 - ENASARCO (8.5%)</RiferimentoTesto>
<RiferimentoNumero>25.50</RiferimentoNumero>
<RiferimentoData/>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<Descrizione>
Ordinary accounting service for the trimester
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto>TC07 - ENASARCO (8.5%)</RiferimentoTesto>
<RiferimentoNumero>4.25</RiferimentoNumero>
<RiferimentoData/>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>4</NumeroLinea>
<Descrizione>
Electronic invoices management
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto>TC07 - ENASARCO (8.5%)</RiferimentoTesto>
<RiferimentoNumero>4.25</RiferimentoNumero>
</AltriDatiGestionali>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>750.00</ImponibileImporto>
<Imposta>165.00</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP05</ModalitaPagamento>
<DataScadenzaPagamento>2022-03-24</DataScadenzaPagamento>
<ImportoPagamento>765.00</ImportoPagamento>
<CodicePagamento>INV/2022/03/0010</CodicePagamento>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</p:FatturaElettronica>

View file

@ -0,0 +1,134 @@
<?xml version='1.0' encoding='UTF-8'?>
<p:FatturaElettronica xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd" versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdTrasmittente>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>0000000</CodiceDestinatario>
<ContattiTrasmittente/>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>01234560157</CodiceFiscale>
<Anagrafica>
<Denominazione>company_2_data</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>1234 Test Street </Indirizzo>
<CAP>12345</CAP>
<Comune>Prova</Comune>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00465840031</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>93026890017</CodiceFiscale>
<Anagrafica>
<Denominazione>Alessi</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Privata Alessi 6</Indirizzo>
<CAP>28887</CAP>
<Comune>Milan</Comune>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>___ignore___</Data>
<Numero>___ignore___</Numero>
<DatiCassaPrevidenziale>
<TipoCassa>TC22</TipoCassa>
<AlCassa>4.00</AlCassa>
<ImportoContributoCassa>30.00</ImportoContributoCassa>
<ImponibileCassa>750.00</ImponibileCassa>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
<RiferimentoAmministrazione>4% Contributo INPS</RiferimentoAmministrazione>
</DatiCassaPrevidenziale>
<ImportoTotaleDocumento>780.00</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>
Ordinary accounting service for the year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>350.000000</PrezzoUnitario>
<PrezzoTotale>350.00</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>
Balance deposit for the past year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>300.000000</PrezzoUnitario>
<PrezzoTotale>300.00</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<Descrizione>
Ordinary accounting service for the trimester
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>4</NumeroLinea>
<Descrizione>
Electronic invoices management
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N2.2</Natura>
<ImponibileImporto>780.00</ImponibileImporto>
<Imposta>0.00</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
<RiferimentoNormativo>Fatture emesse o ricevute da contribuenti forfettari o minimi</RiferimentoNormativo>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP05</ModalitaPagamento>
<DataScadenzaPagamento>___ignore___</DataScadenzaPagamento>
<ImportoPagamento>780.00</ImportoPagamento>
<CodicePagamento>___ignore___</CodicePagamento>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</p:FatturaElettronica>

View file

@ -0,0 +1,138 @@
<?xml version="1.0"?>
<p:FatturaElettronica xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd" versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>2022030010</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>0000000</CodiceDestinatario>
<ContattiTrasmittente>
</ContattiTrasmittente>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00465840031</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Alessi</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Privata Alessi 6 </Indirizzo>
<CAP>28887</CAP>
<Comune>Milan</Comune>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>01234560157</CodiceFiscale>
<Anagrafica>
<Denominazione>company_2_data</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>1234 Test Street </Indirizzo>
<CAP>12345</CAP>
<Comune>Prova</Comune>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2022-03-24</Data>
<Numero>INV/2022/03/0010</Numero>
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>150.00</ImportoRitenuta>
<AliquotaRitenuta>20.00</AliquotaRitenuta>
<CausalePagamento>A</CausalePagamento>
</DatiRitenuta>
<DatiCassaPrevidenziale>
<TipoCassa>TC22</TipoCassa>
<AlCassa>4.00</AlCassa>
<ImportoContributoCassa>30.00</ImportoContributoCassa>
<ImponibileCassa>750.00</ImponibileCassa>
<AliquotaIVA>22.00</AliquotaIVA>
<RiferimentoAmministrazione>___ignore___</RiferimentoAmministrazione>
</DatiCassaPrevidenziale>
<ImportoTotaleDocumento>945.00</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>
Ordinary accounting service for the year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>350.000000</PrezzoUnitario>
<PrezzoTotale>350.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>
Balance deposit for the past year
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>300.000000</PrezzoUnitario>
<PrezzoTotale>300.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<Descrizione>
Ordinary accounting service for the trimester
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>4</NumeroLinea>
<Descrizione>
Electronic invoices management
</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>750.00</ImponibileImporto>
<Imposta>165.00</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP05</ModalitaPagamento>
<DataScadenzaPagamento>2022-03-24</DataScadenzaPagamento>
<ImportoPagamento>795.00</ImportoPagamento>
<CodicePagamento>INV/2022/03/0010</CodicePagamento>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</p:FatturaElettronica>

View file

@ -0,0 +1,123 @@
<?xml version="1.0"?>
<p:FatturaElettronica xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd" versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>___ignore___</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>0000000</CodiceDestinatario>
<ContattiTrasmittente>
</ContattiTrasmittente>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>00465840031</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Alessi</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Privata Alessi 6 </Indirizzo>
<CAP>28887</CAP>
<Comune>Milan</Comune>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>01234560157</IdCodice>
</IdFiscaleIVA>
<CodiceFiscale>01234560157</CodiceFiscale>
<Anagrafica>
<Denominazione>company_2_data</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>1234 Test Street </Indirizzo>
<CAP>12345</CAP>
<Comune>Prova</Comune>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2022-03-24</Data>
<Numero>___ignore___</Numero>
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>150.00</ImportoRitenuta>
<AliquotaRitenuta>20.00</AliquotaRitenuta>
<CausalePagamento>A</CausalePagamento>
</DatiRitenuta>
<ImportoTotaleDocumento>915.00</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>Ordinary accounting service for the year</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>350.000000</PrezzoUnitario>
<PrezzoTotale>350.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<Descrizione>Balance deposit for the past year</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>300.000000</PrezzoUnitario>
<PrezzoTotale>300.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<Descrizione>Ordinary accounting service for the trimester</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>4</NumeroLinea>
<Descrizione>Electronic invoices management</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>50.000000</PrezzoUnitario>
<PrezzoTotale>50.00</PrezzoTotale>
<Ritenuta>SI</Ritenuta>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>750.00</ImponibileImporto>
<Imposta>165.00</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP05</ModalitaPagamento>
<DataScadenzaPagamento>2022-03-24</DataScadenzaPagamento>
<ImportoPagamento>765.00</ImportoPagamento>
<CodicePagamento>___ignore___</CodicePagamento>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</p:FatturaElettronica>

View file

@ -0,0 +1,437 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import datetime
from lxml import etree
from collections import namedtuple
from odoo import tools
from odoo.tests import tagged
from odoo.exceptions import ValidationError
from odoo.addons.l10n_it_edi.tests.common import TestItEdi
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestWithholdingAndPensionFundTaxes(TestItEdi):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.purchase_journal = cls.company_data_2['default_journal_purchase']
def find_tax_by_ref(ref_name):
return cls.env.ref(f'l10n_it_edi_withholding.{cls.company.id}_{ref_name}')
cls.withholding_sale_tax = find_tax_by_ref('20vwc')
cls.withholding_sale_tax_23 = find_tax_by_ref('23vwo')
cls.pension_fund_sale_tax = find_tax_by_ref('4vcp')
cls.enasarco_sale_tax = find_tax_by_ref('enasarcov')
cls.withholding_purchase_tax_23 = find_tax_by_ref('23awo')
cls.enasarco_purchase_tax = find_tax_by_ref('enasarcoa')
cls.inps_tax = find_tax_by_ref('4vinps')
cls.zero_tax = cls.env['account.tax'].with_company(cls.company).create({
'name': 'ZeroTax',
'sequence': 31,
'type_tax_use': 'sale',
'amount': 0.0,
'amount_type': 'percent',
'l10n_it_has_exoneration': True,
'l10n_it_kind_exoneration': 'N2.2',
'l10n_it_law_reference': 'Fatture emesse o ricevute da contribuenti forfettari o minimi',
})
cls.withholding_sale_line = {
'name': 'withholding_line',
'quantity': 1,
'tax_ids': [(6, 0, [
cls.withholding_sale_tax.id,
cls.company.account_sale_tax_id.id,
])]
}
cls.pension_fund_sale_line = {
'name': 'pension_fund_line',
'quantity': 1,
'tax_ids': [(6, 0, [
cls.withholding_sale_tax.id,
cls.pension_fund_sale_tax.id,
cls.company.account_sale_tax_id.id,
])]
}
cls.enasarco_sale_line = {
'name': 'enasarco_line',
'quantity': 1,
'tax_ids': [(6, 0, [
cls.enasarco_sale_tax.id,
cls.withholding_sale_tax_23.id,
cls.company.account_sale_tax_id.id,
])]
}
cls.inps_sale_line = {
'name': 'inps_line',
'quantity': 1,
'tax_ids': [(6, 0, [cls.inps_tax.id, cls.zero_tax.id])]
}
invoice_data = cls.get_real_client_invoice_data()
cls.withholding_tax_invoice = cls.env['account.move'].with_company(cls.company).create({
'move_type': 'out_invoice',
'company_id': cls.company.id,
'partner_id': cls.italian_partner_a.id,
'invoice_date': datetime.date(2022, 3, 24),
'invoice_date_due': datetime.date(2022, 3, 24),
'invoice_line_ids': [
(0, 0, {
**cls.withholding_sale_line,
'name': name,
'price_unit': price,
}) for (name, price) in invoice_data.lines
],
})
cls.pension_fund_tax_invoice = cls.env['account.move'].with_company(cls.company).create({
'move_type': 'out_invoice',
'company_id': cls.company.id,
'partner_id': cls.italian_partner_a.id,
'invoice_date': datetime.date(2022, 3, 24),
'invoice_date_due': datetime.date(2022, 3, 24),
'invoice_line_ids': [
(0, 0, {
**cls.pension_fund_sale_line,
'name': name,
'price_unit': price,
}) for (name, price) in invoice_data.lines
]
})
cls.enasarco_tax_invoice = cls.env['account.move'].with_company(cls.company).create({
'move_type': 'out_invoice',
'company_id': cls.company.id,
'partner_id': cls.italian_partner_a.id,
'invoice_date': datetime.date(2022, 3, 24),
'invoice_date_due': datetime.date(2022, 3, 24),
'invoice_line_ids': [
(0, 0, {
**cls.enasarco_sale_line,
'name': name,
'price_unit': price,
}) for (name, price) in invoice_data.lines
]
})
cls.inps_tax_invoice = cls.env['account.move'].with_company(cls.company).create({
'move_type': 'out_invoice',
'company_id': cls.company.id,
'partner_id': cls.italian_partner_a.id,
'invoice_date': datetime.date(2022, 3, 24),
'invoice_date_due': datetime.date(2022, 3, 24),
'invoice_line_ids': [
(0, 0, {
**cls.inps_sale_line,
'name': name,
'price_unit': price,
}) for (name, price) in invoice_data.lines
]
})
cls.withholding_tax_invoice._post()
cls.pension_fund_tax_invoice._post()
cls.enasarco_tax_invoice._post()
cls.inps_tax_invoice._post()
cls.edi_withholding_tax_xml = cls._get_withholding_test_file_content('IT00470550013_withh.xml')
cls.edi_pension_fund_tax_xml = cls._get_withholding_test_file_content('IT00470550013_pfund.xml')
cls.edi_enasarco_tax_xml = cls._get_withholding_test_file_content('IT00470550013_enasa.xml')
cls.edi_inps_tax_xml = cls._get_withholding_test_file_content('IT00470550013_inps.xml')
@classmethod
def _get_withholding_test_file_content(cls, filename):
""" Get the content of a test file inside this module """
path = 'l10n_it_edi_withholding/tests/expected_xmls/' + filename
with tools.file_open(path, mode='rb') as test_file:
return test_file.read()
@classmethod
def get_real_client_invoice_data(cls):
data = {
'lines': [
('Ordinary accounting service for the year', 350.0),
('Balance deposit for the past year', 300.0),
('Ordinary accounting service for the trimester', 50.0),
('Electronic invoices management', 50.0),
],
'base': 750.0,
'tax_amount': 165.0,
'with_tax': 915.0,
'withholding_amount': 150.0,
'with_withholding': 765.0,
'pension_fund_amount': 30.0,
'with_pension_fund': 951.6,
'tax_amount_with_pension_fund': 171.6,
'payment_amount': 801.6,
}
return namedtuple('ClientInvoice', data.keys())(**data)
def test_withholding_tax_constraints(self):
with self.assertRaises(ValidationError):
self.withholding_sale_tax.amount = 10
with self.assertRaises(ValidationError):
self.withholding_sale_tax.l10n_it_withholding_type = False
with self.assertRaises(ValidationError):
self.withholding_sale_tax.l10n_it_withholding_reason = False
with self.assertRaises(ValidationError):
self.company.account_sale_tax_id.l10n_it_withholding_type = "RT02"
def test_withholding_taxes_export(self):
"""
Invoice
-------------------------------------------------------------
Ordinary accounting service for the year 350.00
Balance deposit for the past year 300.00
Ordinary accounting service for the trimester 50.00
Electronic invoices management 50.00
-------------------------------------------------------------
Total untaxed: 750.00
Withholding: 20% of Untaxed Amount -150.00
VAT: 22% of Untaxed Amount 165.00
Document total: Untaxed Amount + VAT 915.00
Payment amount: Document total - Withholding 765.00
"""
invoice_etree = etree.fromstring(self.edi_format._l10n_it_edi_export_invoice_as_xml(self.withholding_tax_invoice))
invoice_data = self.get_real_client_invoice_data()
expected_etree = self.with_applied_xpath(
etree.fromstring(self.edi_basis_xml),
'''
<xpath expr="//FatturaElettronicaBody//DatiBeniServizi" position="replace">
<DatiBeniServizi>
''' + ''.join(f'''
<DettaglioLinee>
<NumeroLinea>{n}</NumeroLinea>
<Descrizione>{name}</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>{price:.6f}</PrezzoUnitario>
<PrezzoTotale>{price:.2f}</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<Ritenuta>SI</Ritenuta>
</DettaglioLinee>
''' for n, (name, price) in enumerate(invoice_data.lines, 1)) + f'''
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>{invoice_data.base:.2f}</ImponibileImporto>
<Imposta>{invoice_data.tax_amount:.2f}</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
</xpath>
<xpath expr="//DettaglioPagamento//ImportoPagamento" position="inside">
{invoice_data.with_withholding:.2f}
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="before">
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>{invoice_data.withholding_amount:.2f}</ImportoRitenuta>
<AliquotaRitenuta>20.00</AliquotaRitenuta>
<CausalePagamento>A</CausalePagamento>
</DatiRitenuta>
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="inside">
{invoice_data.with_tax:.2f}
</xpath>
'''
)
invoice_etree = self.with_applied_xpath(invoice_etree, "<xpath expr='.//Allegati' position='replace'/>")
self.assertXmlTreeEqual(invoice_etree, expected_etree)
def test_withholding_taxes_import(self):
imported_etree = etree.fromstring(self.edi_withholding_tax_xml)
invoice = self.edi_format._create_invoice_from_xml_tree("IT00470550013_withh.xml", imported_etree, self.purchase_journal)
invoice_data = self.get_real_client_invoice_data()
for line in invoice.line_ids.filtered(lambda x: x.name in [data[0] for data in invoice_data.lines]):
withholding_taxes = line.tax_ids.filtered(lambda x: x.l10n_it_withholding_type)
pension_fund_taxes = line.tax_ids.filtered(lambda x: x.l10n_it_pension_fund_type)
vat_taxes = line.tax_ids - withholding_taxes - pension_fund_taxes
self.assertEqual([1, 1, 0], [len(x) for x in (vat_taxes, withholding_taxes, pension_fund_taxes)])
self.assertEqual(765.00, invoice.amount_total)
def test_pension_fund_taxes_export(self):
"""
Invoice
-------------------------------------------------------------
Ordinary accounting service for the year 350.00
Balance deposit for the past year 300.00
Ordinary accounting service for the trimester 50.00
Electronic invoices management 50.00
-------------------------------------------------------------
Total untaxed: 750.00
Pension fund: 4% of Untaxed Amount 30.00
Withholding: 20% of Untaxed Amount -150.00
VAT: 22% of Untaxed Amount + Pension fund 171.60
Document total: Taxed Amount 951.60
Payment amount: Document total - Withholding 801.60
"""
invoice_etree = etree.fromstring(self.edi_format._l10n_it_edi_export_invoice_as_xml(self.pension_fund_tax_invoice))
invoice_data = self.get_real_client_invoice_data()
expected_etree = self.with_applied_xpath(
etree.fromstring(self.edi_basis_xml),
'''
<xpath expr="//FatturaElettronicaBody//DatiBeniServizi" position="replace">
<DatiBeniServizi>
''' + ''.join(f'''
<DettaglioLinee>
<NumeroLinea>{n}</NumeroLinea>
<Descrizione>{name}</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>{price:.6f}</PrezzoUnitario>
<PrezzoTotale>{price:.2f}</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<Ritenuta>SI</Ritenuta>
</DettaglioLinee>
''' for n, (name, price) in enumerate(invoice_data.lines, 1)) + f'''
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>{invoice_data.base + invoice_data.pension_fund_amount:.2f}</ImponibileImporto>
<Imposta>{invoice_data.tax_amount_with_pension_fund :.2f}</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
</xpath>
<xpath expr="//DettaglioPagamento//ImportoPagamento" position="inside">
{invoice_data.payment_amount:.2f}
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="before">
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>{invoice_data.withholding_amount:.2f}</ImportoRitenuta>
<AliquotaRitenuta>20.00</AliquotaRitenuta>
<CausalePagamento>A</CausalePagamento>
</DatiRitenuta>
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="before">
<DatiCassaPrevidenziale>
<TipoCassa>TC01</TipoCassa>
<AlCassa>4.00</AlCassa>
<ImportoContributoCassa>{invoice_data.pension_fund_amount:.2f}</ImportoContributoCassa>
<ImponibileCassa>{invoice_data.base:.2f}</ImponibileCassa>
<AliquotaIVA>22.00</AliquotaIVA>
<RiferimentoAmministrazione>___ignore___</RiferimentoAmministrazione>
</DatiCassaPrevidenziale>
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="inside">
{invoice_data.with_pension_fund:.2f}
</xpath>
'''
)
invoice_etree = self.with_applied_xpath(invoice_etree, "<xpath expr='.//Allegati' position='replace'/>")
self.assertXmlTreeEqual(invoice_etree, expected_etree)
def test_pension_fund_taxes_import(self):
imported_etree = etree.fromstring(self.edi_pension_fund_tax_xml)
invoice = self.edi_format._create_invoice_from_xml_tree("IT00470550013_pfund.xml", imported_etree, self.purchase_journal)
invoice_data = self.get_real_client_invoice_data()
for line in invoice.line_ids.filtered(lambda x: x.name in [data[0] for data in invoice_data.lines]):
withholding_taxes = line.tax_ids.filtered(lambda x: x.l10n_it_withholding_type)
pension_fund_taxes = line.tax_ids.filtered(lambda x: x.l10n_it_pension_fund_type)
vat_taxes = line.tax_ids - withholding_taxes - pension_fund_taxes
self.assertEqual([1, 1, 1], [len(x) for x in (vat_taxes, withholding_taxes, pension_fund_taxes)])
self.assertEqual(795.60, invoice.amount_total)
def test_enasarco_tax_export(self):
"""
Invoice
-----------------------------------------------------------------
Ordinary accounting service for the year 350.00
Balance deposit for the past year 300.00
Ordinary accounting service for the trimester 50.00
Electronic invoices management 50.00
-----------------------------------------------------------------
Total untaxed: 750.00
VAT: 22% of Untaxed Amount 165.00
ENASARCO: 8.5% of Untaxed Amount -63.75
Withholding Tax: 23% on 50% of Untaxed Amount -86.25
Document total: Taxed Amount 915.00
Payment amount: Document total - Withholding - Enasarco 765.00
"""
invoice_etree = etree.fromstring(self.edi_format._l10n_it_edi_export_invoice_as_xml(self.enasarco_tax_invoice))
invoice_data = self.get_real_client_invoice_data()
expected_etree = self.with_applied_xpath(
etree.fromstring(self.edi_basis_xml),
'''
<xpath expr="//FatturaElettronicaBody//DatiBeniServizi" position="replace">
<DatiBeniServizi>
''' + ''.join(f'''
<DettaglioLinee>
<NumeroLinea>{n}</NumeroLinea>
<Descrizione>{name}</Descrizione>
<Quantita>1.00</Quantita>
<PrezzoUnitario>{price:.6f}</PrezzoUnitario>
<PrezzoTotale>{price:.2f}</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<Ritenuta>SI</Ritenuta>
<AltriDatiGestionali>
<TipoDato>CASSA-PREV</TipoDato>
<RiferimentoTesto>TC07 - ENASARCO (8.5%)</RiferimentoTesto>
<RiferimentoNumero>{price * 8.5 / 100:.2f}</RiferimentoNumero>
</AltriDatiGestionali>
</DettaglioLinee>
''' for n, (name, price) in enumerate(invoice_data.lines, 1)) + f'''
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>{invoice_data.base:.2f}</ImponibileImporto>
<Imposta>165.00</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
</DatiBeniServizi>
</xpath>
<xpath expr="//DettaglioPagamento//ImportoPagamento" position="inside">
765.00
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="before">
<DatiRitenuta>
<TipoRitenuta>RT02</TipoRitenuta>
<ImportoRitenuta>86.25</ImportoRitenuta>
<AliquotaRitenuta>23.00</AliquotaRitenuta>
<CausalePagamento>ZO</CausalePagamento>
</DatiRitenuta>
</xpath>
<xpath expr="//DatiGeneraliDocumento//ImportoTotaleDocumento" position="inside">
915.00
</xpath>
'''
)
invoice_etree = self.with_applied_xpath(invoice_etree, "<xpath expr='.//Allegati' position='replace'/>")
self.assertXmlTreeEqual(invoice_etree, expected_etree)
def test_enasarco_tax_import(self):
imported_etree = etree.fromstring(self.edi_enasarco_tax_xml)
invoice = self.edi_format._create_invoice_from_xml_tree("IT00470550013_enasa.xml", imported_etree, self.purchase_journal)
self.assertTrue(invoice)
invoice_data = self.get_real_client_invoice_data()
for line in invoice.line_ids.filtered(lambda x: x.name in [data[0] for data in invoice_data.lines]):
enasarco_imported_tax = line.tax_ids.filtered(lambda x: x.l10n_it_pension_fund_type == 'TC07')
self.assertEqual(self.enasarco_purchase_tax, enasarco_imported_tax)
self.assertEqual(-8.5, enasarco_imported_tax.amount)
self.assertEqual(self.withholding_purchase_tax_23, line.tax_ids.filtered(lambda x: x.l10n_it_withholding_reason == 'ZO'))
def test_inps_tax_export(self):
"""
Invoice
-----------------------------------------------------------------
Ordinary accounting service for the year 350.00
Balance deposit for the past year 300.00
Ordinary accounting service for the trimester 50.00
Electronic invoices management 50.00
-----------------------------------------------------------------
Total untaxed: 750.00
VAT: 0% of Untaxed Amount 0.00
INPS: 4% of Untaxed Amount 30.00
Document total: Taxed Amount 780.00
Payment amount: Document total 780.00
"""
content = self.edi_format._l10n_it_edi_export_invoice_as_xml(self.inps_tax_invoice)
expected_etree = etree.fromstring(self.edi_inps_tax_xml)
invoice_etree = self._cleanup_etree(content, None)
self.assertXmlTreeEqual(invoice_etree, expected_etree)

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="account_view_tax_form_l10n_it_edi_extended" model="ir.ui.view">
<field name="name">account.tax.form.l10n.it.edi.extended</field>
<field name="model">account.tax</field>
<field name="priority">20</field>
<field name="inherit_id" ref="l10n_it_edi.account_tax_form_l10n_it"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='advanced_options']" position="inside">
<group>
<field name="l10n_it_withholding_type" attrs="{'readonly': [('amount', '&gt;=', 0.0)]}"/>
<field name="l10n_it_withholding_reason" attrs="{'invisible': [('l10n_it_withholding_type', '=', False)]}"/>
<field name="l10n_it_pension_fund_type"/>
</group>
</xpath>
</field>
</record>
<record id="view_invoice_tree_l10n_it_edi_extended" model="ir.ui.view">
<field name="name">account.invoice.tree.l10n.it.edi.extended</field>
<field name="model">account.move</field>
<field name="priority">20</field>
<field name="inherit_id" ref="account.view_invoice_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='amount_untaxed_signed']" position="after">
<field name="l10n_it_amount_vat_signed" string="VAT" sum="Total" optional="hide"/>
<field name="l10n_it_amount_pension_fund_signed" string="Pension Fund" sum="Total" optional="hide"/>
<field name="l10n_it_amount_withholding_signed" string="Withholding" sum="Total" optional="hide"/>
<field name="l10n_it_amount_before_withholding_signed" string="All Taxes Included" sum="Total" optional="hide"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-ocb-l10n_it_edi_withholding"
version = "16.0.0"
description = "Italy - E-invoicing (Withholding) - Odoo addon"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-l10n_it_edi>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["l10n_it_edi_withholding"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]