Skip to content

Commit

Permalink
aggiunto livello importazione basato sul riepilogo, + test
Browse files Browse the repository at this point in the history
  • Loading branch information
labaggio committed Nov 13, 2020
1 parent b063233 commit 2b09e75
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 18 deletions.
6 changes: 3 additions & 3 deletions l10n_it_fatturapa_in/models/partner.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ class Partner(models.Model):
)
e_invoice_detail_level = fields.Selection([
('0', 'Minimum'),
# ('1', 'Aliquote'),
('1', 'Tax Rate'),
('2', 'Maximum'),
], string="E-bills Detail Level",
help="Minimum level: Bill is created with no lines; "
"User will have to create them, according to what specified in "
"the electronic bill.\n"
# "Livello Aliquote: viene creata una riga fattura per ogni "
# "aliquota presente nella fattura elettronica\n"
"Tax rate level: Rate level: an invoice line is created for each "
"rate present in the electronic invoice\n"
"Maximum level: every line contained in the electronic bill "
"will create a line in the bill.",
default='2', required=True
Expand Down
226 changes: 226 additions & 0 deletions l10n_it_fatturapa_in/tests/data/IT05979361218_ripilogoiva.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica versione="FPR12" 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">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>05979361218</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>00001</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>0000000</CodiceDestinatario>
<ContattiTrasmittente/>
</DatiTrasmissione>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>02780790107</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>SOCIETA' ALPHA SRL</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIALE ROMA 543</Indirizzo>
<CAP>07100</CAP>
<Comune>SASSARI</Comune>
<Provincia>SS</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<CodiceFiscale>03533590174</CodiceFiscale>
<Anagrafica>
<Denominazione>BETA GAMMA</Denominazione>
</Anagrafica>
</DatiAnagrafici>
<Sede>
<Indirizzo>VIA TORINO 38-B</Indirizzo>
<CAP>00145</CAP>
<Comune>ROMA</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</Sede>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2020-10-06</Data>
<Numero>GR20-900443E</Numero>
<ImportoTotaleDocumento>204.16</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
<DatiContratto>
<RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
<IdDocumento>GR20-900443E</IdDocumento>
<Data>2020-10-06</Data>
</DatiContratto>
<DatiConvenzione>
<IdDocumento>GR20-900443E</IdDocumento>
<Data>2020-10-06</Data>
</DatiConvenzione>
<DatiRicezione>
<IdDocumento>GR20-900443E</IdDocumento>
<Data>2020-10-06</Data>
</DatiRicezione>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Imposte</Descrizione>
<Quantita>905.00</Quantita>
<UnitaMisura>kWh</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>0.01249724</PrezzoUnitario>
<PrezzoTotale>11.31000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>2</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Spesa per trasporto, gestione contatore e oneri sistema</Descrizione>
<Quantita>4.900000</Quantita>
<UnitaMisura>kW</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>4.99795918</PrezzoUnitario>
<PrezzoTotale>24.49000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>3</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Spesa per trasporto, gestione contatore e oneri sistema</Descrizione>
<Quantita>905.00</Quantita>
<UnitaMisura>kWh</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>0.05601105</PrezzoUnitario>
<PrezzoTotale>50.69000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>4</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Spesa per trasporto, gestione contatore e oneri sistema</Descrizione>
<Quantita>1.00</Quantita>
<UnitaMisura>Mese</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>4.23000000</PrezzoUnitario>
<PrezzoTotale>4.23000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>5</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Spesa per la materia energia</Descrizione>
<Quantita>1.00</Quantita>
<UnitaMisura>Mese</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>0.01000000</PrezzoUnitario>
<PrezzoTotale>0.01000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>6</NumeroLinea>
<CodiceArticolo>
<CodiceTipo>POD</CodiceTipo>
<CodiceValore>IT001E14607435</CodiceValore>
</CodiceArticolo>
<Descrizione>Spesa per la materia energia</Descrizione>
<Quantita>905.00</Quantita>
<UnitaMisura>kWh</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>0.08146961</PrezzoUnitario>
<PrezzoTotale>73.73000000</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
<AltriDatiGestionali>
<TipoDato>Ind.POD</TipoDato>
<RiferimentoTesto>VIA TRIESTE, 47 - 21020 BUGUGGIATE (VA)</RiferimentoTesto>
</AltriDatiGestionali>
</DettaglioLinee>
<DettaglioLinee>
<NumeroLinea>7</NumeroLinea>
<Descrizione>Altre partite</Descrizione>
<Quantita>1.00</Quantita>
<UnitaMisura>Nr</UnitaMisura>
<DataInizioPeriodo>2020-09-01</DataInizioPeriodo>
<DataFinePeriodo>2020-09-30</DataFinePeriodo>
<PrezzoUnitario>3.52000000</PrezzoUnitario>
<PrezzoTotale>3.52000000</PrezzoTotale>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N1</Natura>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>164.46</ImponibileImporto>
<Imposta>36.18</Imposta>
<EsigibilitaIVA>I</EsigibilitaIVA>
</DatiRiepilogo>
<DatiRiepilogo>
<AliquotaIVA>0.00</AliquotaIVA>
<Natura>N1</Natura>
<ImponibileImporto>3.52</ImponibileImporto>
<Imposta>0.00</Imposta>
<RiferimentoNormativo>Escluso Art.15</RiferimentoNormativo>
</DatiRiepilogo>
</DatiBeniServizi>
<DatiPagamento>
<CondizioniPagamento>TP02</CondizioniPagamento>
<DettaglioPagamento>
<ModalitaPagamento>MP05</ModalitaPagamento>
<DataRiferimentoTerminiPagamento>2020-10-06</DataRiferimentoTerminiPagamento>
<GiorniTerminiPagamento>30</GiorniTerminiPagamento>
<DataScadenzaPagamento>2020-11-05</DataScadenzaPagamento>
<ImportoPagamento>204.16</ImportoPagamento>
<IstitutoFinanziario>Deutsche Bank</IstitutoFinanziario>
<IBAN>IT64C0310401600000000770885</IBAN>
</DettaglioPagamento>
</DatiPagamento>
</FatturaElettronicaBody>
</p:FatturaElettronica>
18 changes: 18 additions & 0 deletions l10n_it_fatturapa_in/tests/test_import_fatturapa_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,24 @@ def test_01_xml_zero_quantity_line(self):
self.assertEqual(invoice.invoice_line_ids[0].quantity, 0)
self.assertEqual(invoice.invoice_line_ids[1].quantity, 1)

def test_xml_import_summary_tax_rate(self):
# Invoice with positive total. Detail Level: '1' -- Tax Rate
supplier = self.env['res.partner'].search(
[('vat', '=', 'IT02780790107')])[0]
# in order to make the system create the invoice lines
supplier.e_invoice_detail_level = '1'
res = self.run_wizard('test_summary_tax_rate',
'IT05979361218_ripilogoiva.xml')
invoice_id = res.get('domain')[0][2][0]
invoice = self.invoice_model.browse(invoice_id)
self.assertEqual(invoice.amount_total, 204.16)
self.assertEqual(len(invoice.invoice_line_ids), 2)

self.assertEqual(invoice.invoice_line_ids[0].price_unit, 164.46)
self.assertEqual(invoice.invoice_line_ids[0].quantity, 1.0)
self.assertEqual(invoice.invoice_line_ids[1].price_unit, 3.52)
self.assertEqual(invoice.invoice_line_ids[1].quantity, 1.0)


class TestFatturaPAEnasarco(FatturapaCommon):

Expand Down
62 changes: 47 additions & 15 deletions l10n_it_fatturapa_in/wizard/wizard_import_fatturapa.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

import logging
from odoo import models, api, fields
from odoo.tools import float_is_zero
Expand All @@ -17,14 +16,14 @@ class WizardImportFatturapa(models.TransientModel):

e_invoice_detail_level = fields.Selection([
('0', 'Minimum'),
# ('1', 'Aliquote'),
('1', 'Tax rate'),
('2', 'Maximum'),
], string="E-bills Detail Level",
help="Minimum level: Bill is created with no lines; "
"User will have to create them, according to what specified in "
"the electronic bill.\n"
# "Livello Aliquote: viene creata una riga fattura per ogni "
# "aliquota presente nella fattura elettronica\n"
"Tax rate level: Rate level: an invoice line is created for each "
"rate present in the electronic invoice\n"
"Maximum level: every line contained in the electronic bill "
"will create a line in the bill.",
required=True
Expand Down Expand Up @@ -440,6 +439,21 @@ def adjust_accounting_data(self, product, line_vals):
line_vals['invoice_line_tax_ids'] = [
(6, 0, [new_tax.id])]

def _prepareInvoiceLineAliquota(self, credit_account_id, line, nline):
retLine = {}
account_taxes = self.get_account_taxes(line.AliquotaIVA, line.Natura)
if account_taxes:
retLine['invoice_line_tax_ids'] = [(6, 0, [account_taxes[0].id])]

retLine.update({
'name': 'Riepilogo Aliquota {}'.format(line.AliquotaIVA),
'sequence': nline,
'account_id': credit_account_id,
'price_unit': float(line.ImponibileImporto),
'quantity': 1.0
})
return retLine

def _prepareInvoiceLine(self, credit_account_id, line, wt_founds=False):
retLine = self._prepare_generic_line_data(line)
retLine.update({
Expand Down Expand Up @@ -1377,24 +1391,42 @@ def set_e_invoice_lines(self, FatturaBody, invoice_data):
if e_invoice_lines:
invoice_data['e_invoice_line_ids'] = [(6, 0, e_invoice_lines.ids)]

def _set_invoice_lines(self, product, invoice_line_data, invoice_lines,
invoice_line_model):

if product:
invoice_line_data['product_id'] = product.id
self.adjust_accounting_data(product, invoice_line_data)
invoice_line_id = invoice_line_model.create(
invoice_line_data).id
invoice_lines.append(invoice_line_id)

def set_invoice_line_ids(
self, FatturaBody, credit_account_id, partner, wt_founds,
invoice_data):
if not self.e_invoice_detail_level == '2':

if self.e_invoice_detail_level == '0':
return

invoice_lines = []
invoice_line_model = self.env['account.invoice.line']
for line in FatturaBody.DatiBeniServizi.DettaglioLinee:
invoice_line_data = self._prepareInvoiceLine(
credit_account_id, line, wt_founds)
product = self.get_line_product(line, partner)
if product:
invoice_line_data['product_id'] = product.id
self.adjust_accounting_data(product, invoice_line_data)
invoice_line_id = invoice_line_model.create(
invoice_line_data).id
invoice_lines.append(invoice_line_id)
if self.e_invoice_detail_level == '1':
for nline, line in enumerate(FatturaBody.DatiBeniServizi.DatiRiepilogo):
invoice_line_data = self._prepareInvoiceLineAliquota(
credit_account_id, line, nline)

product = partner.e_invoice_default_product_id
self._set_invoice_lines(product, invoice_line_data, invoice_lines,
invoice_line_model)

elif self.e_invoice_detail_level == '2':
for line in FatturaBody.DatiBeniServizi.DettaglioLinee:
invoice_line_data = self._prepareInvoiceLine(
credit_account_id, line, wt_founds)
product = self.get_line_product(line, partner)
self._set_invoice_lines(product, invoice_line_data, invoice_lines,
invoice_line_model)

invoice_data['invoice_line_ids'] = [(6, 0, invoice_lines)]

def check_invoice_amount(self, invoice, FatturaElettronicaBody):
Expand Down

0 comments on commit 2b09e75

Please sign in to comment.