def setDettaglioLinea(self, line_no, line, body, price_precision,
                       uom_precision):
     if not line.invoice_line_tax_ids:
         raise UserError(
             _("Invoice line %s does not have tax.") % line.name)
     if len(line.invoice_line_tax_ids) > 1:
         raise UserError(
             _("Too many taxes for invoice line %s.") % line.name)
     aliquota = line.invoice_line_tax_ids[0].amount
     AliquotaIVA = '%.2f' % float_round(aliquota, 2)
     line.ftpa_line_number = line_no
     prezzo_unitario = self._get_prezzo_unitario(line)
     DettaglioLinea = DettaglioLineeType(
         NumeroLinea=str(line_no),
         Descrizione=encode_for_export(line.name, 1000),
         PrezzoUnitario='{prezzo:.{precision}f}'.format(
             prezzo=prezzo_unitario, precision=price_precision),
         Quantita='{qta:.{precision}f}'.format(qta=line.quantity,
                                               precision=uom_precision),
         UnitaMisura=line.uom_id and (unidecode(line.uom_id.name)) or None,
         PrezzoTotale='%.2f' % float_round(line.price_subtotal, 2),
         AliquotaIVA=AliquotaIVA)
     DettaglioLinea.ScontoMaggiorazione.extend(
         self.setScontoMaggiorazione(line))
     if aliquota == 0.0:
         if not line.invoice_line_tax_ids[0].kind_id:
             raise UserError(
                 _("No 'nature' field for tax %s.") %
                 line.invoice_line_tax_ids[0].name)
         DettaglioLinea.Natura = line.invoice_line_tax_ids[0].kind_id.code
         if line.invoice_line_tax_ids[0].kind_id.code == 'N2.1' and \
                 line.invoice_id.partner_id.country_id.code in [
             'AT', 'BE', 'BG', 'CY', 'HR', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'IE',
             'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'CZ', 'RO', 'SK', 'SI',
             'ES', 'SE', 'HU'
         ]:
             dati_gestionali = AltriDatiGestionaliType()
             dati_gestionali.TipoDato = 'INVCONT'
             DettaglioLinea.AltriDatiGestionali.append(dati_gestionali)
     if line.admin_ref:
         DettaglioLinea.RiferimentoAmministrazione = line.admin_ref
     if line.product_id:
         product_code = line.product_id.default_code
         if product_code:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo=self.env['ir.config_parameter'].sudo().
                 get_param('fatturapa.codicetipo.odoo', 'ODOO'),
                 CodiceValore=product_code[:35],
             )
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
         product_barcode = line.product_id.barcode
         if product_barcode:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo='EAN',
                 CodiceValore=product_barcode[:35],
             )
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
     body.DatiBeniServizi.DettaglioLinee.append(DettaglioLinea)
     return DettaglioLinea
Esempio n. 2
0
 def setDettaglioLinea(
     self, line_no, line, body, price_precision, uom_precision
 ):
     if not line.invoice_line_tax_ids:
         raise UserError(
             _("Invoice line %s does not have tax.") % line.name)
     if len(line.invoice_line_tax_ids) > 1:
         raise UserError(
             _("Too many taxes for invoice line %s.") % line.name)
     aliquota = line.invoice_line_tax_ids[0].amount
     AliquotaIVA = '%.2f' % (aliquota)
     line.ftpa_line_number = line_no
     prezzo_unitario = self._get_prezzo_unitario(line)
     DettaglioLinea = DettaglioLineeType(
         NumeroLinea=str(line_no),
         # can't insert newline with pyxb
         # see https://tinyurl.com/ycem923t
         # and '
' would not be correctly visualized anyway
         # (for example firefox replaces '
' with space)
         Descrizione=line.name.replace('\n', ' ').replace('\t', ' ').
         replace('\r', ' ').encode('latin', 'ignore').decode('latin'),
         PrezzoUnitario='{prezzo:.{precision}f}'.format(
             prezzo=prezzo_unitario, precision=price_precision),
         Quantita='{qta:.{precision}f}'.format(
             qta=line.quantity, precision=uom_precision),
         UnitaMisura=line.uom_id and (
             unidecode(line.uom_id.name)) or None,
         PrezzoTotale='%.2f' % line.price_subtotal,
         AliquotaIVA=AliquotaIVA)
     DettaglioLinea.ScontoMaggiorazione.extend(
         self.setScontoMaggiorazione(line))
     if aliquota == 0.0:
         if not line.invoice_line_tax_ids[0].kind_id:
             raise UserError(
                 _("No 'nature' field for tax %s.") %
                 line.invoice_line_tax_ids[0].name)
         DettaglioLinea.Natura = line.invoice_line_tax_ids[
             0
         ].kind_id.code
     if line.admin_ref:
         DettaglioLinea.RiferimentoAmministrazione = line.admin_ref
     if line.product_id:
         if line.product_id.default_code:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo=self.env['ir.config_parameter'].sudo(
                 ).get_param('fatturapa.codicetipo.odoo', 'ODOO'),
                 CodiceValore=line.product_id.default_code
             )
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
         if line.product_id.barcode:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo='EAN',
                 CodiceValore=line.product_id.barcode
             )
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
     body.DatiBeniServizi.DettaglioLinee.append(DettaglioLinea)
     return True
Esempio n. 3
0
 def setDettaglioLinea(self, line_no, line, body, price_precision,
                       uom_precision):
     if not line.invoice_line_tax_ids:
         raise UserError(
             _("Invoice line %s does not have tax.") % line.name)
     if len(line.invoice_line_tax_ids) > 1:
         raise UserError(
             _("Too many taxes for invoice line %s.") % line.name)
     aliquota = line.invoice_line_tax_ids[0].amount
     AliquotaIVA = '%.2f' % float_round(aliquota, 2)
     line.ftpa_line_number = line_no
     prezzo_unitario = self._get_prezzo_unitario(line)
     DettaglioLinea = DettaglioLineeType(
         NumeroLinea=str(line_no),
         Descrizione=encode_for_export(line.name, 1000),
         PrezzoUnitario='{prezzo:.{precision}f}'.format(
             prezzo=prezzo_unitario, precision=price_precision),
         Quantita='{qta:.{precision}f}'.format(qta=line.quantity,
                                               precision=uom_precision),
         UnitaMisura=line.uom_id and (unidecode(line.uom_id.name)) or None,
         PrezzoTotale='%.2f' % float_round(line.price_subtotal, 2),
         AliquotaIVA=AliquotaIVA)
     DettaglioLinea.ScontoMaggiorazione.extend(
         self.setScontoMaggiorazione(line))
     if aliquota == 0.0:
         if not line.invoice_line_tax_ids[0].kind_id:
             raise UserError(
                 _("No 'nature' field for tax %s.") %
                 line.invoice_line_tax_ids[0].name)
         DettaglioLinea.Natura = line.invoice_line_tax_ids[0].kind_id.code
     if line.admin_ref:
         DettaglioLinea.RiferimentoAmministrazione = line.admin_ref
     if line.product_id:
         if line.product_id.default_code:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo=self.env['ir.config_parameter'].sudo(
                 ).get_param('fatturapa.codicetipo.odoo', 'ODOO'),
                 CodiceValore=encode_for_export(
                     line.product_id.default_code, 35, 'ascii'))
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
         if line.product_id.barcode:
             CodiceArticolo = CodiceArticoloType(
                 CodiceTipo='EAN',
                 CodiceValore=encode_for_export(line.product_id.barcode, 35,
                                                'ascii'))
             DettaglioLinea.CodiceArticolo.append(CodiceArticolo)
     body.DatiBeniServizi.DettaglioLinee.append(DettaglioLinea)
     return DettaglioLinea
    def setDettaglioLinee(self, invoice, body):
        super().setDettaglioLinee(invoice, body)

        force_dichiarazione_intento_ids = invoice.dichiarazione_intento_ids.browse(
        )
        line_no = 1
        for line in invoice.invoice_line_ids:
            if line.force_dichiarazione_intento_id:
                force_dichiarazione_intento_ids |= line.force_dichiarazione_intento_id
            line_no += 1
        to_add = invoice.dichiarazione_intento_ids - force_dichiarazione_intento_ids
        if not to_add:
            return
        DettaglioLinea = DettaglioLineeType(
            NumeroLinea=str(line_no),
            Descrizione=encode_for_export("Altre lettere d'intento", 1000),
            PrezzoUnitario="0.00",
            PrezzoTotale="0.00",
            AliquotaIVA="0.00",
            Natura="N1",
        )
        for dec in to_add:
            dati_gestionali = AltriDatiGestionaliType(
                TipoDato="INTENTO",
                RiferimentoTesto=encode_for_export(dec.telematic_protocol, 60),
                RiferimentoData=dec.date)
            DettaglioLinea.AltriDatiGestionali.append(dati_gestionali)
        body.DatiBeniServizi.DettaglioLinee.append(DettaglioLinea)