OCA / l10n-italy

Odoo Italian localization
https://www.odoo-italia.org
GNU Affero General Public License v3.0
154 stars 305 forks source link

bug fattura verso privati [l10n_it_fatturapa_out] #2971

Closed matteoopenf closed 10 months ago

matteoopenf commented 2 years ago

Module

l10n_it_fatturapa_out

Describe the bug

Quando si esporta una fattura verso privati che hanno solo il codice fiscale. Odoo attualmente mette oltre il codice fiscale anche la partita IVA 99999999 come se il cliente fosse estero e poi viene scartata. image

To Reproduce

Steps to reproduce the behavior:

  1. creare un partner italiano con codice fiscale
  2. creare una fattura verso il partner creato sopra
  3. esportare la fattura si avà come lo screen sopra la partita iva che contiene IT99999999
  4. inviare la fattura allo SDI e viene scartata

Expected behavior Non vi sia la parte IT99999999 in caso di cliente privato

Additional context Add any other context about the problem here. (e.g. OS, Python version, ...)

TheMule71 commented 2 years ago

Ciao, qual è il codice di errore dello SdI?

matteoopenf commented 2 years ago

Ciao, qual è il codice di errore dello SdI?

cerco subito asp, sto anche per fare una PR

matteoopenf commented 2 years ago

@TheMule71 image Eccolo

TheMule71 commented 2 years ago

Ok se fai la PR occhio a https://github.com/OCA/l10n-italy/pull/2602

Il caso di cliente EU senza CF va preservato.

Il problema si pone solo per cliente IT, per il quale non va aggiunta la PIVA se presente il cod. fiscale.

matteoopenf commented 2 years ago

Ok se fai la PR occhio a #2602

Il caso di cliente EU senza CF va preservato.

Il problema si pone solo per cliente IT, per il quale non va aggiunta la PIVA se presente il cod. fiscale.

provo e mi dici che ne pensi ancora qualche minuto

matteoopenf commented 2 years ago

@TheMule71 pensavo di girare un attimo la cosa pensavo di controllare se il partner ha la vat allora metto il tag altrimenti no https://github.com/OCA/l10n-italy/pull/2973 ecco cosa intendo dimmi pure cosa ne pensi. Che ho testato in locale qualche XML e va, però dimmi pure

matteoopenf commented 2 years ago

ho inoltre pensato in questo modo perchè ci sono Aziende che hanno PIVA e Codice fiscale e essi sono diversi perchè fanno parte di gruppi IVA, quindi non posso solo vedere se hanno CF e allora non mettere la PIVA

TheMule71 commented 2 years ago

Per riassumere le regole:

Ciò permette di gestire il caso di sia assenza piva sia cf per l'estero inserendo IdCodice pari a un valore fittizio come XX99999999.

L'assenza di entrambi per IT è una casistica possibile? Da come la capisco io, no.

matteoopenf commented 2 years ago

Pensavo quindi di cambiare il metodo così def get_id_fiscale_iva(partner, prefer_fiscalcode=False): id_paese = partner.country_id.code

        if partner.vat:
            if id_paese == "IT" and partner.vat.startswith("IT"):
                id_codice = partner.vat[2:]
            else:
                id_codice = partner.vat
        elif id_paese == 'IT' and not partner.vat and partner.fiscalcode:
            id_codice = False
        else:
            id_codice = "99999999999"

        if prefer_fiscalcode and partner.fiscalcode:
            id_codice = partner.fiscalcode

        return {
            "id_paese": id_paese,
            "id_codice": id_codice,
        } 

e ti mettere il t-if sul template come mi hai indicato sulla PR

TheMule71 commented 2 years ago

Che dici di

def get_id_fiscale_iva(partner):
    id_paese = partner.country_id.code
    if partner.vat:
        if id_paese == "IT" and partner.vat.startswith("IT"):
            id_codice = partner.vat[2:]
        else:
            id_codice = partner.vat
    elif partner.fiscalcode or id_paese == "IT":
        id_codice = False
    else:
        id_codice = "99999999999"

    return {
        "id_paese": id_paese,
        "id_codice": id_codice,
    }
from typing import NamedTuple
class Country(NamedTuple):
    code: str

class Partner:
    def __init__(self, cc, piva=None, cf=None):
        self.country_id = Country(cc)
        self.vat = piva
        self.fiscalcode = cf

    def __str__(self):
        return "P({}, {}, {})".format(self.country_id.code, self.vat, self.fiscalcode)

def test_one(partner):
    print(partner)
    print(get_id_fiscale_iva(partner))
    print()

test_one(Partner("GB", "IX06363391001", "06363391001"))
test_one(Partner("GB", "IX06363391001"))
test_one(Partner("GB", None, "06363391001"))
test_one(Partner("GB"))
test_one(Partner("IT", "IT06363391001", "06363391001"))
test_one(Partner("IT", "IT06363391001"))
test_one(Partner("IT", None, "06363391001"))
test_one(Partner("IT"))
P(GB, IX06363391001, 06363391001)
{'id_paese': 'GB', 'id_codice': 'IX06363391001'}

P(GB, IX06363391001, None)
{'id_paese': 'GB', 'id_codice': 'IX06363391001'}

P(GB, None, 06363391001)
{'id_paese': 'GB', 'id_codice': False}

P(GB, None, None)
{'id_paese': 'GB', 'id_codice': '99999999999'}

P(IT, IT06363391001, 06363391001)
{'id_paese': 'IT', 'id_codice': '06363391001'}

P(IT, IT06363391001, None)
{'id_paese': 'IT', 'id_codice': '06363391001'}

P(IT, None, 06363391001)
{'id_paese': 'IT', 'id_codice': False}

P(IT, None, None)
{'id_paese': 'IT', 'id_codice': False}

In pratica, se c'è la piva, la restituisce, strippando IT se è il caso. Se non c'è la piva, e c'è il c.f., restituisce False Se non ci sono né la piva né il c.f. restiutisce 99999999999 per l'estero, False per IT.

L'ultimo caso, False per IT darebbe un XML non valido ma non è un problema è una cosa gestita (o da gestire) molto prima di arrivare al template, tipo preventive_checks, oppure res_partner rende obbligatatoria la piva per le aziende e il cf per i privati in IT.

mmaridev commented 2 years ago

Pensate riusciremo ad avere una fix mergiata per la fine del mese? Questo è un bug di modesta entità, a mio avviso.

scigghia commented 1 year ago

Scusate tutti ma questa situazione ha bisogno di essere risolta, non possiamo tenere bloccate istanze con questo problema. Propongo di unmergiare la https://github.com/OCA/l10n-italy/pull/2602 e continuare la discussione per poi mergiare solo nel momento in cui si coprono tutte le casistiche.

@tafaRU @TheMule71 @matteoopenf @mmaridev

matteoopenf commented 1 year ago

Scusate tutti ma questa situazione ha bisogno di essere risolta, non possiamo tenere bloccate istanze con questo problema. Propongo di unmergiare la #2602 e continuare la discussione per poi mergiare solo nel momento in cui si coprono tutte le casistiche.

@tafaRU @TheMule71 @matteoopenf @mmaridev

Se comunque mettiamo preferfiscalcode = False sul parametro iniziale i test passano e poi possiamo dedicarci a tutto il resto

scigghia commented 1 year ago

Scusate tutti ma questa situazione ha bisogno di essere risolta, non possiamo tenere bloccate istanze con questo problema. Propongo di unmergiare la #2602 e continuare la discussione per poi mergiare solo nel momento in cui si coprono tutte le casistiche. @tafaRU @TheMule71 @matteoopenf @mmaridev

Se comunque mettiamo preferfiscalcode = False sul parametro iniziale i test passano e poi possiamo dedicarci a tutto il resto

puoi procedere tu ?

matteoopenf commented 1 year ago

Scusate tutti ma questa situazione ha bisogno di essere risolta, non possiamo tenere bloccate istanze con questo problema. Propongo di unmergiare la #2602 e continuare la discussione per poi mergiare solo nel momento in cui si coprono tutte le casistiche. @tafaRU @TheMule71 @matteoopenf @mmaridev

Se comunque mettiamo preferfiscalcode = False sul parametro iniziale i test passano e poi possiamo dedicarci a tutto il resto

puoi procedere tu ?

Ho in programma di farlo, perchè appunto abbiamo il problema interno, pr per i vari casi e cerco anche di esporre al meglio il mio punto di vista nei prossimi giorni

TheMule71 commented 1 year ago

Per cortesia, riportate se il problema specifico di questa issue è risolto che la chiudiamo. Altri problemi sarebbe meglio affrontarli in una issue dedicata.

matteoopenf commented 1 year ago

Per cortesia, riportate se il problema specifico di questa issue è risolto che la chiudiamo.

Altri problemi sarebbe meglio affrontarli in una issue dedicata.

Va bene

TheMule71 commented 1 year ago

Riapro per via di https://discord.com/channels/753902328494424064/806815905006223411/1135923114837033001