from django.db import models
from polymorphic.models import PolymorphicModel


# --------------- FINE PREFISSO TEMPLATE ---------------


class FatturaElettronica(models.Model):
    class Meta:
        verbose_name = 'fatturaelettronica'
        verbose_name_plural = 'fatturaelettronica'

    def __str__(self):
        return f"FatturaElettronica (id: {self.id})"

    xml_fattura = models.ForeignKey('XmlFatturaElettronica', on_delete=models.CASCADE,
                                    related_name="FatturaElettronica_da_XmlFatturaElettronica_xml_fattura")
    fattura_principale = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="FatturaElettronica_da_FatturaElettronica_fattura_principale")
    data = models.DateField()
    numero = models.CharField(max_length=20)
    dati_ritenuta = models.ForeignKey('DatiRitenuta', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="FatturaElettronica_da_DatiRitenuta_dati_ritenuta")
    importo_totale_documento = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    arrotondamento = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    causale = models.CharField(null=True, max_length=200)
    tipo_documento = models.ForeignKey('TipoDocumento', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="FatturaElettronica_da_TipoDocumento_tipo_documento")
    art73 = models.BooleanField(null=True, blank=True)
    divisa = models.ForeignKey('Valuta', on_delete=models.CASCADE, null=True,
                               blank=True, related_name="FatturaElettronica_da_Valuta_divisa")
    dati_cassa_previdenziale = models.ForeignKey('DatiCassaPrevidenziale', on_delete=models.CASCADE, null=True,
                                                 blank=True, related_name="FatturaElettronica_da_DatiCassaPrevidenziale_dati_cassa_previdenziale")
    sconto_maggiorazione = models.ForeignKey('ScontoMaggiorazione', on_delete=models.CASCADE, null=True,
                                             blank=True, related_name="FatturaElettronica_da_ScontoMaggiorazione_sconto_maggiorazione")
    dati_bollo = models.ForeignKey('DatiBollo', on_delete=models.CASCADE, null=True,
                                   blank=True, related_name="FatturaElettronica_da_DatiBollo_dati_bollo")
    dati_veicoli = models.ForeignKey('DatiVeicoli', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="FatturaElettronica_da_DatiVeicoli_dati_veicoli")


class RegimeFiscale(models.Model):
    class Meta:
        verbose_name = 'regimefiscale'
        verbose_name_plural = 'regimefiscale'

    def __str__(self):
        return f"RegimeFiscale (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class TipoCassa(models.Model):
    class Meta:
        verbose_name = 'tipocassa'
        verbose_name_plural = 'tipocassa'

    def __str__(self):
        return f"TipoCassa (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class ModalitaPagamento(models.Model):
    class Meta:
        verbose_name = 'modalitapagamento'
        verbose_name_plural = 'modalitapagamento'

    def __str__(self):
        return f"ModalitaPagamento (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class TipoDocumento(models.Model):
    class Meta:
        verbose_name = 'tipodocumento'
        verbose_name_plural = 'tipodocumento'

    def __str__(self):
        return f"TipoDocumento (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class Natura(models.Model):
    class Meta:
        verbose_name = 'natura'
        verbose_name_plural = 'natura'

    def __str__(self):
        return f"Natura (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class TipoRitenuta(models.Model):
    class Meta:
        verbose_name = 'tiporitenuta'
        verbose_name_plural = 'tiporitenuta'

    def __str__(self):
        return f"TipoRitenuta (id: {self.id})"

    codice = models.CharField(null=True, max_length=4)
    descrizione = models.CharField(null=True, max_length=250)


class XmlFatturaElettronica(models.Model):
    class Meta:
        verbose_name = 'xmlfatturaelettronica'
        verbose_name_plural = 'xmlfatturaelettronica'

    def __str__(self):
        return f"XmlFatturaElettronica (id: {self.id})"

    soggetti_fattura_elettronica = models.ForeignKey('SoggettiFatturaElettronica', on_delete=models.CASCADE,
                                                     related_name="XmlFatturaElettronica_da_SoggettiFatturaElettronica_soggetti_fattura_elettronica")
    progressivo_invio = models.CharField(max_length=10)
    path = models.CharField(null=True, max_length=128)


class SoggettiFatturaElettronica(models.Model):
    class Meta:
        verbose_name = 'soggettifatturaelettronica'
        verbose_name_plural = 'soggettifatturaelettronica'

    def __str__(self):
        return f"SoggettiFatturaElettronica (id: {self.id})"

    formato_trasmissione = models.ForeignKey('FormatoTrasmissione', on_delete=models.CASCADE, null=True,
                                             blank=True, related_name="SoggettiFatturaElettronica_da_FormatoTrasmissione_formato_trasmissione")
    contatto_cedente_prestatore = models.ForeignKey('contatti_app.Recapito', on_delete=models.CASCADE, null=True,
                                                    blank=True, related_name="SoggettiFatturaElettronica_da_DatoDiContatto_contatto_cedente_prestatore")
    riferimento_amministrazione = models.CharField(null=True, max_length=20)
    trasmittente = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
                                     related_name="SoggettiFatturaElettronica_da_SoggettoFiscale_trasmittente")
    destinatario = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
                                     related_name="SoggettiFatturaElettronica_da_SoggettoFiscale_destinatario")
    cedente_prestatore = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
                                           related_name="SoggettiFatturaElettronica_da_SoggettoFiscale_cedente_prestatore")
    rappresentante_fiscale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
                                               blank=True, related_name="SoggettiFatturaElettronica_da_SoggettoFiscale_rappresentante_fiscale")
    cessionariocommittente = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
                                               related_name="SoggettiFatturaElettronica_da_SoggettoFiscale_cessionariocommittente")
    terzo_intermediario_o_soggetto_emittente = models.ForeignKey('TerzoIntermediarioOSoggettoEmittente', on_delete=models.CASCADE, null=True,
                                                                 blank=True, related_name="SoggettiFatturaElettronica_da_TerzoIntermediarioOSoggettoEmittente_terzo_intermediario_o_soggetto_emittente")


class SoggettoFiscale(PolymorphicModel):
    class Meta:
        verbose_name = 'soggettofiscale'
        verbose_name_plural = 'soggettofiscale'

    def __str__(self):
        return f"SoggettoFiscale (id: {self.id})"

    dati_di_contatto = models.OneToOneField('contatti_app.SoggettoContattabile',on_delete=models.CASCADE,null=False,blank=False,related_name='dati_fiscali') 
    indirizzo_pec = models.ForeignKey('contatti_app.Pec', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="SoggettoFiscale_da_Pec_indirizzo_pec")
    regime_fiscale = models.ForeignKey('RegimeFiscale', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="SoggettoFiscale_da_RegimeFiscale_regime_fiscale")
    codice_fiscale = models.ForeignKey('PartitaIvaCF', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="SoggettoFiscale_da_PartitaIvaCF_codice_fiscale")
    partita_iva = models.ForeignKey('PartitaIvaCF', on_delete=models.CASCADE, null=True,
                                    blank=True, related_name="SoggettoFiscale_da_PartitaIvaCF_partita_iva")
    codice_sdi = models.ForeignKey('CodiceDestinatario', on_delete=models.CASCADE, null=True,
                                   blank=True, related_name="SoggettoFiscale_da_CodiceDestinatario_codice_sdi")
    sede = models.ForeignKey('contatti_app.Indirizzo', on_delete=models.CASCADE, null=False,
                                   blank=False, related_name="SoggettoFiscale_da_Indirizzo")
    stabile_organizzazione = models.ForeignKey('contatti_app.Indirizzo',null=True, blank=True,on_delete=models.SET_NULL,related_name='stabile_organizzazione')
    cod_eori = models.CharField(null=True, max_length=17)
    nazione = models.ForeignKey('dati_geo_app.Nazione', on_delete=models.CASCADE, null=True,
                                blank=True, related_name="SoggettoFiscale_da_Nazione_nazione")
    numero_licenza_guida = models.CharField(null=True, max_length=20)
    iscrizione_rea = models.ForeignKey('IscrizioneREA', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="SoggettoFiscale_da_IscrizioneREA_iscrizione_rea")
    rimosso = models.BooleanField(null=True, blank=True)


class PartitaIvaCF(models.Model):
    class Meta:
        verbose_name = 'partitaivacf'
        verbose_name_plural = 'partitaivacf'

    def __str__(self):
        return f"PartitaIvaCF (id: {self.id})"

    codice = models.CharField(max_length=28)


class FormatoTrasmissione(models.Model):
    class Meta:
        verbose_name = 'formatotrasmissione'
        verbose_name_plural = 'formatotrasmissione'

    def __str__(self):
        return f"FormatoTrasmissione (id: {self.id})"

    codifica = models.CharField(max_length=5)
    descrizione = models.CharField(null=True, max_length=250)


class CodiceDestinatario(models.Model):
    class Meta:
        verbose_name = 'codicedestinatario'
        verbose_name_plural = 'codicedestinatario'

    def __str__(self):
        return f"CodiceDestinatario (id: {self.id})"

    codifica = models.CharField(max_length=7)
    descrizione = models.CharField(null=True, max_length=250)


class IscrizioneAlboProfessionale(models.Model):
    class Meta:
        verbose_name = 'iscrizionealboprofessionale'
        verbose_name_plural = 'iscrizionealboprofessionale'

    def __str__(self):
        return f"IscrizioneAlboProfessionale (id: {self.id})"

    albo_professionale = models.ForeignKey('AlboProfessionale', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="IscrizioneAlboProfessionale_da_AlboProfessionale_albo_professionale")
    numero_iscrizione_albo = models.CharField(null=True, max_length=60)
    data_iscrizione_albo = models.DateField(null=True, blank=True)
    persona_fisica = models.ForeignKey('contatti_app.PersonaFisica', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="IscrizioneAlboProfessionale_da_PersonaFisica_persona_fisica")


class IscrizioneREA(models.Model):
    class Meta:
        verbose_name = 'iscrizionerea'
        verbose_name_plural = 'iscrizionerea'

    def __str__(self):
        return f"IscrizioneREA (id: {self.id})"

    ufficio = models.ForeignKey(
        'dati_geo_app.Provincia', on_delete=models.PROTECT, related_name="IscrizioneREA_da_Provincia_ufficio")
    numero_r_e_a = models.CharField(max_length=20)
    capitale_sociale = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    socio_unico = models.ForeignKey('SocioUnico', on_delete=models.CASCADE, null=True,
                                    blank=True, related_name="IscrizioneREA_da_SocioUnico_socio_unico")
    stato_liquidazione = models.ForeignKey(
        'StatoLiquidazione', on_delete=models.CASCADE, related_name="IscrizioneREA_da_StatoLiquidazione_stato_liquidazione")


class SocioUnico(models.Model):
    class Meta:
        verbose_name = 'sociounico'
        verbose_name_plural = 'sociounico'

    def __str__(self):
        return f"SocioUnico (id: {self.id})"

    codifica = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=30)


class StatoLiquidazione(models.Model):
    class Meta:
        verbose_name = 'statoliquidazione'
        verbose_name_plural = 'statoliquidazione'

    def __str__(self):
        return f"StatoLiquidazione (id: {self.id})"

    codifica = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=30)


class TerzoIntermediarioOSoggettoEmittente(models.Model):
    class Meta:
        verbose_name = 'terzointermediarioosoggettoemittente'
        verbose_name_plural = 'terzointermediarioosoggettoemittente'

    def __str__(self):
        return f"TerzoIntermediarioOSoggettoEmittente (id: {self.id})"

    terzo_intermediario_o_soggetto_emittente = models.ForeignKey(
        'SoggettoFiscale', on_delete=models.CASCADE, related_name="TerzoIntermediarioOSoggettoEmittente_da_SoggettoFiscale_terzo_intermediario_o_soggetto_emittente")
    soggetto_emittente = models.ForeignKey('SoggettoEmittente', on_delete=models.CASCADE, null=True, blank=True,
                                           related_name="TerzoIntermediarioOSoggettoEmittente_da_SoggettoEmittente_soggetto_emittente")


class SoggettoEmittente(models.Model):
    class Meta:
        verbose_name = 'soggettoemittente'
        verbose_name_plural = 'soggettoemittente'

    def __str__(self):
        return f"SoggettoEmittente (id: {self.id})"

    codifica = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=30)


class AlboProfessionale(models.Model):
    class Meta:
        verbose_name = 'alboprofessionale'
        verbose_name_plural = 'alboprofessionale'

    def __str__(self):
        return f"AlboProfessionale (id: {self.id})"

    albo_professionale = models.CharField(null=True, max_length=60)
    provincia_albo = models.ForeignKey('dati_geo_app.Provincia', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="AlboProfessionale_da_Provincia_provincia_albo")


class Allegato(models.Model):
    class Meta:
        verbose_name = 'allegato'
        verbose_name_plural = 'allegato'

    def __str__(self):
        return f"Allegato (id: {self.id})"

    fattura_elettronica_body = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE,
                                                 null=True, blank=True, related_name="Allegato_da_FatturaElettronica_fattura_elettronica_body")
    nome_attachment = models.CharField(max_length=60)
    algoritmo_compressione = models.CharField(null=True, max_length=10)
    formato_attachment = models.CharField(null=True, max_length=10)
    descrizione_attachment = models.CharField(max_length=100)
    attachment = models.TextField()


class DatoPagamento(models.Model):
    class Meta:
        verbose_name = 'datopagamento'
        verbose_name_plural = 'datopagamento'

    def __str__(self):
        return f"DatoPagamento (id: {self.id})"

    fattura_body = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="DatoPagamento_da_FatturaElettronica_fattura_body")
    dettaglio_bancario = models.ForeignKey('DettaglioBancario', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="DatoPagamento_da_DettaglioBancario_dettaglio_bancario")
    data_riferimento_termini_pagamento = models.DateField(
        null=True, blank=True)
    giorni_termini_pagamento = models.IntegerField(null=True, blank=True)
    data_scadenza_pagamento = models.DateField(null=True, blank=True)
    importo_pagamento = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    sconto_pagamento_anticipato = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    data_limite_pagamento_anticipato = models.DateField(null=True, blank=True)
    penalita_pagamenti_ritardati = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    data_decorrenza_penale = models.DateField(null=True, blank=True)
    codice_pagamento = models.CharField(null=True, max_length=60)
    quietanzante = models.IntegerField(null=True, blank=True)
    condizione_pagamento = models.ForeignKey('CondizionePagamento', on_delete=models.CASCADE, null=True,
                                             blank=True, related_name="DatoPagamento_da_CondizionePagamento_condizione_pagamento")


class DatiVeicoli(models.Model):
    class Meta:
        verbose_name = 'dativeicoli'
        verbose_name_plural = 'dativeicoli'

    def __str__(self):
        return f"DatiVeicoli (id: {self.id})"

    data = models.DateField()
    totale_percorso = models.CharField(max_length=15)


class DatiDocumentali(models.Model):
    class Meta:
        verbose_name = 'datidocumentali'
        verbose_name_plural = 'datidocumentali'

    def __str__(self):
        return f"DatiDocumentali (id: {self.id})"

    codici_documentali = models.ForeignKey('CodiciDocumentali', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="DatiDocumentali_da_CodiciDocumentali_codici_documentali")
    dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="DatiDocumentali_da_FatturaElettronica_dati_generali")
    id_documento = models.CharField(max_length=20)
    data = models.DateField(null=True, blank=True)
    num_item = models.CharField(null=True, max_length=20)
    tipologia_documentale = models.ForeignKey('TipologiaDocumentale', on_delete=models.CASCADE, null=True,
                                              blank=True, related_name="DatiDocumentali_da_TipologiaDocumentale_tipologia_documentale")


class DatiFattureCollegate(models.Model):
    class Meta:
        verbose_name = 'datifatturecollegate'
        verbose_name_plural = 'datifatturecollegate'

    def __str__(self):
        return f"DatiFattureCollegate (id: {self.id})"

    dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="DatiFattureCollegate_da_FatturaElettronica_dati_generali")
    codici_documentali = models.ForeignKey('CodiciDocumentali', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="DatiFattureCollegate_da_CodiciDocumentali_codici_documentali")


class DatiSAL(models.Model):
    class Meta:
        verbose_name = 'datisal'
        verbose_name_plural = 'datisal'

    def __str__(self):
        return f"DatiSAL (id: {self.id})"

    dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE,
                                      null=True, blank=True, related_name="DatiSAL_da_FatturaElettronica_dati_generali")
    riferimento_fase = models.IntegerField()


class DatiDDT(models.Model):
    class Meta:
        verbose_name = 'datiddt'
        verbose_name_plural = 'datiddt'

    def __str__(self):
        return f"DatiDDT (id: {self.id})"

    dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE,
                                      null=True, blank=True, related_name="DatiDDT_da_FatturaElettronica_dati_generali")
    numero = models.CharField(max_length=20)
    data = models.DateField()


class DatiTrasporto(models.Model):
    class Meta:
        verbose_name = 'datitrasporto'
        verbose_name_plural = 'datitrasporto'

    def __str__(self):
        return f"DatiTrasporto (id: {self.id})"

    dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="DatiTrasporto_da_FatturaElettronica_dati_generali")
    indirizzo_resa = models.ForeignKey('contatti_app.Indirizzo', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="DatiTrasporto_da_Indirizzo_indirizzo_resa")
    mezzo_trasporto = models.CharField(null=True, max_length=80)
    numero_colli = models.IntegerField(null=True, blank=True)
    descrizione = models.CharField(null=True, max_length=100)
    peso_lordo = models.DecimalField(
        null=True, blank=True, max_digits=7, decimal_places=3)
    peso_netto = models.DecimalField(
        null=True, blank=True, max_digits=7, decimal_places=3)
    data_ora_rititro = models.DateTimeField(null=True, blank=True)
    data_inizio_trasporto = models.DateField(null=True, blank=True)
    tipo_resa = models.ForeignKey('TipoResa', on_delete=models.CASCADE, null=True,
                                  blank=True, related_name="DatiTrasporto_da_TipoResa_tipo_resa")
    data_ora_consegna = models.DateTimeField(null=True, blank=True)
    dati_vettore = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="DatiTrasporto_da_SoggettoFiscale_dati_vettore")
    unita_misura_peso = models.ForeignKey('UnitaMisura', on_delete=models.CASCADE, null=True,
                                          blank=True, related_name="DatiTrasporto_da_UnitaMisura_unita_misura_peso")


class Valuta(models.Model):
    class Meta:
        verbose_name = 'valuta'
        verbose_name_plural = 'valuta'

    def __str__(self):
        return f"Valuta (id: {self.id})"

    codifica = models.CharField(max_length=3)
    descrizione = models.CharField(null=True, max_length=250)


class DatiRitenuta(models.Model):
    class Meta:
        verbose_name = 'datiritenuta'
        verbose_name_plural = 'datiritenuta'

    def __str__(self):
        return f"DatiRitenuta (id: {self.id})"

    tipo_ritenuta = models.ForeignKey('TipoRitenuta', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="DatiRitenuta_da_TipoRitenuta_tipo_ritenuta")
    importo_ritenuta = models.DecimalField(max_digits=15, decimal_places=2)
    aliquota_ritenuta = models.DecimalField(max_digits=6, decimal_places=2)
    causale_pagamento = models.ForeignKey('CausalePagamento', on_delete=models.CASCADE, null=True,
                                          blank=True, related_name="DatiRitenuta_da_CausalePagamento_causale_pagamento")


class CausalePagamento(models.Model):
    class Meta:
        verbose_name = 'causalepagamento'
        verbose_name_plural = 'causalepagamento'

    def __str__(self):
        return f"CausalePagamento (id: {self.id})"

    codice = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=20)


class DatiBollo(models.Model):
    class Meta:
        verbose_name = 'datibollo'
        verbose_name_plural = 'datibollo'

    def __str__(self):
        return f"DatiBollo (id: {self.id})"

    importo_bollo = models.DecimalField(max_digits=15, decimal_places=2)


class DatiCassaPrevidenziale(models.Model):
    class Meta:
        verbose_name = 'daticassaprevidenziale'
        verbose_name_plural = 'daticassaprevidenziale'

    def __str__(self):
        return f"DatiCassaPrevidenziale (id: {self.id})"

    tipo_cassa = models.ForeignKey('TipoCassa', on_delete=models.CASCADE, null=True,
                                   blank=True, related_name="DatiCassaPrevidenziale_da_TipoCassa_tipo_cassa")
    al_cassa = models.DecimalField(
        null=True, blank=True, max_digits=6, decimal_places=2)
    importo_contributo_cassa = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    imponibile_cassa = models.DecimalField(
        null=True, blank=True, max_digits=15, decimal_places=2)
    ritenuta = models.BooleanField()
    riferimento_amministrazione = models.CharField(null=True, max_length=20)
    aliquota_iva = models.ForeignKey('AliquotaIva', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="DatiCassaPrevidenziale_da_AliquotaIva_aliquota_iva")


class ScontoMaggiorazione(models.Model):
    class Meta:
        verbose_name = 'scontomaggiorazione'
        verbose_name_plural = 'scontomaggiorazione'

    def __str__(self):
        return f"ScontoMaggiorazione (id: {self.id})"

    tipo = models.ForeignKey('TipoScontoMaggiorazione', on_delete=models.CASCADE,
                             related_name="ScontoMaggiorazione_da_TipoScontoMaggiorazione_tipo")
    percentuale = models.DecimalField(
        null=True, blank=True, max_digits=6, decimal_places=2)
    importo = models.DecimalField(
        null=True, blank=True, max_digits=6, decimal_places=2)


class TipoScontoMaggiorazione(models.Model):
    class Meta:
        verbose_name = 'tiposcontomaggiorazione'
        verbose_name_plural = 'tiposcontomaggiorazione'

    def __str__(self):
        return f"TipoScontoMaggiorazione (id: {self.id})"

    tipo = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=20)


class AliquotaIva(models.Model):
    class Meta:
        verbose_name = 'aliquotaiva'
        verbose_name_plural = 'aliquotaiva'

    def __str__(self):
        return f"AliquotaIva (id: {self.id})"

    aliquota_i_v_a = models.DecimalField(max_digits=6, decimal_places=2)
    natura = models.ForeignKey('Natura', on_delete=models.CASCADE,
                               null=True, blank=True, related_name="AliquotaIva_da_Natura_natura")
    descrizione = models.CharField(null=True, max_length=50)


class ContoBancario(models.Model):
    class Meta:
        verbose_name = 'contobancario'
        verbose_name_plural = 'contobancario'

    def __str__(self):
        return f"ContoBancario (id: {self.id})"

    soggetto_fiscale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
                                         blank=True, related_name="ContoBancario_da_SoggettoFiscale_soggetto_fiscale")
    beneficiario = models.CharField(null=True, max_length=200)
    istituto_finanziario = models.ForeignKey('IstitutoFinanziario', on_delete=models.CASCADE, null=True,
                                             blank=True, related_name="ContoBancario_da_IstitutoFinanziario_istituto_finanziario")
    iban = models.CharField(null=True, max_length=34)


class IstitutoFinanziario(models.Model):
    class Meta:
        verbose_name = 'istitutofinanziario'
        verbose_name_plural = 'istitutofinanziario'

    def __str__(self):
        return f"IstitutoFinanziario (id: {self.id})"

    nome = models.CharField(max_length=50)
    abi = models.CharField(null=True, max_length=5)
    cab = models.CharField(null=True, max_length=5)
    bic = models.CharField(null=True, max_length=11)


class DettaglioBancario(models.Model):
    class Meta:
        verbose_name = 'dettagliobancario'
        verbose_name_plural = 'dettagliobancario'

    def __str__(self):
        return f"DettaglioBancario (id: {self.id})"

    conto_bancario = models.ForeignKey('ContoBancario', on_delete=models.CASCADE, null=True,
                                       blank=True, related_name="DettaglioBancario_da_ContoBancario_conto_bancario")
    modalita_pagamento = models.ForeignKey('ModalitaPagamento', on_delete=models.CASCADE, null=True,
                                           blank=True, related_name="DettaglioBancario_da_ModalitaPagamento_modalita_pagamento")


class CondizionePagamento(models.Model):
    class Meta:
        verbose_name = 'condizionepagamento'
        verbose_name_plural = 'condizionepagamento'

    def __str__(self):
        return f"CondizionePagamento (id: {self.id})"

    codifica = models.CharField(max_length=4)
    descrizione = models.CharField(null=True, max_length=50)


class DettaglioLinee(models.Model):
    class Meta:
        verbose_name = 'dettagliolinee'
        verbose_name_plural = 'dettagliolinee'

    def __str__(self):
        return f"DettaglioLinee (id: {self.id})"

    fattura_elettronica_body = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
                                                 blank=True, related_name="DettaglioLinee_da_FatturaElettronica_fattura_elettronica_body")
    numero_linea = models.IntegerField(null=True, blank=True)
    sconto_maggiorazione = models.ForeignKey('ScontoMaggiorazione', on_delete=models.CASCADE, null=True,
                                             blank=True, related_name="DettaglioLinee_da_ScontoMaggiorazione_sconto_maggiorazione")
    aliquota_iva = models.ForeignKey('AliquotaIva', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="DettaglioLinee_da_AliquotaIva_aliquota_iva")
    riferimento_amministrazione = models.CharField(null=True, max_length=20)
    tipo_cessione_prestazione = models.ForeignKey('TipoCessionePrestazione', on_delete=models.CASCADE, null=True,
                                                  blank=True, related_name="DettaglioLinee_da_TipoCessionePrestazione_tipo_cessione_prestazione")
    riferimento_oggetto_fattura = models.ForeignKey('OggettoDaFatturare', on_delete=models.CASCADE, null=True,
                                    blank=True, related_name="DettaglioLinee_da_DatiEstesiDettaglioFatturabile_riferimento_oggetto_fattura")


class altroDatoGestionale(models.Model):
    class Meta:
        verbose_name = 'altrodatogestionale'
        verbose_name_plural = 'altrodatogestionale'

    def __str__(self):
        return f"altroDatoGestionale (id: {self.id})"

    linea_fattura = models.ForeignKey('DettaglioLinee', on_delete=models.CASCADE, null=True,
                                      blank=True, related_name="altroDatoGestionale_da_DettaglioLinee_linea_fattura")
    tipo_dato = models.CharField(max_length=10)
    riferimento_testo = models.CharField(null=True, max_length=60)
    riferimento_numero = models.DecimalField(
        null=True, blank=True, max_digits=21, decimal_places=4)
    riferimento_data = models.DateField(null=True, blank=True)


class TipoCessionePrestazione(models.Model):
    class Meta:
        verbose_name = 'tipocessioneprestazione'
        verbose_name_plural = 'tipocessioneprestazione'

    def __str__(self):
        return f"TipoCessionePrestazione (id: {self.id})"

    codifica = models.CharField(max_length=2)
    descrizione = models.CharField(null=True, max_length=50)


class CodiceArticolo(models.Model):
    class Meta:
        verbose_name = 'codicearticolo'
        verbose_name_plural = 'codicearticolo'

    def __str__(self):
        return f"CodiceArticolo (id: {self.id})"

    codice_tipo = models.ForeignKey('TipoCodiceArticolo', on_delete=models.CASCADE, null=True,
                                    blank=True, related_name="CodiceArticolo_da_TipoCodiceArticolo_codice_tipo")
    codice_valore = models.CharField(null=True, max_length=35)


class TipoCodiceArticolo(models.Model):
    class Meta:
        verbose_name = 'tipocodicearticolo'
        verbose_name_plural = 'tipocodicearticolo'

    def __str__(self):
        return f"TipoCodiceArticolo (id: {self.id})"

    codifica = models.CharField(max_length=35)
    descrizione = models.CharField(null=True, max_length=250)


class ArticoloLinea(models.Model):
    class Meta:
        verbose_name = 'articololinea'
        verbose_name_plural = 'articololinea'

    def __str__(self):
        return f"ArticoloLinea (id: {self.id})"

    codice_articolo = models.ForeignKey('CodiceArticolo', on_delete=models.CASCADE, null=True,
                                        blank=True, related_name="ArticoloLinea_da_CodiceArticolo_codice_articolo")
    dettaglio_linee = models.ForeignKey('DettaglioLinee', on_delete=models.CASCADE, null=True,
                                        blank=True, related_name="ArticoloLinea_da_DettaglioLinee_dettaglio_linee")


class UnitaMisura(models.Model):
    class Meta:
        verbose_name = 'unitamisura'
        verbose_name_plural = 'unitamisura'

    def __str__(self):
        return f"UnitaMisura (id: {self.id})"

    codifica = models.CharField(max_length=10)
    descrizione = models.CharField(null=True, max_length=40)


class TipoResa(models.Model):
    class Meta:
        verbose_name = 'tiporesa'
        verbose_name_plural = 'tiporesa'

    def __str__(self):
        return f"TipoResa (id: {self.id})"

    codifica = models.CharField(max_length=3)
    descrizione = models.CharField(null=True, max_length=50)


class RiferimentoDDTNumeroLinea(models.Model):
    class Meta:
        verbose_name = 'riferimentoddtnumerolinea'
        verbose_name_plural = 'riferimentoddtnumerolinea'

    def __str__(self):
        return f"RiferimentoDDTNumeroLinea (id: {self.id})"

    dati_d_d_t = models.ForeignKey('DatiDDT', on_delete=models.CASCADE, null=True,
                                   blank=True, related_name="RiferimentoDDTNumeroLinea_da_DatiDDT_dati_d_d_t")
    dettaglio_linee = models.ForeignKey('DettaglioLinee', on_delete=models.CASCADE, null=True,
                                        blank=True, related_name="RiferimentoDDTNumeroLinea_da_DettaglioLinee_dettaglio_linee")


class RiferimentoOrdineAcquistoNumeroLinea(models.Model):
    class Meta:
        verbose_name = 'riferimentoordineacquistonumerolinea'
        verbose_name_plural = 'riferimentoordineacquistonumerolinea'

    def __str__(self):
        return f"RiferimentoOrdineAcquistoNumeroLinea (id: {self.id})"

    dati_ordine_acquisto = models.ForeignKey('DatiDocumentali', on_delete=models.CASCADE, null=True, blank=True,
                                             related_name="RiferimentoOrdineAcquistoNumeroLinea_da_DatiDocumentali_dati_ordine_acquisto")
    dettaglio_linee = models.ForeignKey('DettaglioLinee', on_delete=models.CASCADE, null=True, blank=True,
                                        related_name="RiferimentoOrdineAcquistoNumeroLinea_da_DettaglioLinee_dettaglio_linee")


class CodiciDocumentali(models.Model):
    class Meta:
        verbose_name = 'codicidocumentali'
        verbose_name_plural = 'codicidocumentali'

    def __str__(self):
        return f"CodiciDocumentali (id: {self.id})"

    codice_commessa_convenzione = models.CharField(null=True, max_length=100)
    codice_c_u_p = models.CharField(null=True, max_length=15)
    codice_c_i_g = models.CharField(null=True, max_length=15)


class TipologiaDocumentale(models.Model):
    class Meta:
        verbose_name = 'tipologiadocumentale'
        verbose_name_plural = 'tipologiadocumentale'

    def __str__(self):
        return f"TipologiaDocumentale (id: {self.id})"

    codifica = models.CharField(max_length=50)
    descrizione = models.CharField(null=True, max_length=100)


class OggettoDaFatturare(models.Model):
    class Meta:
        verbose_name = 'OggettoDaFatturare'
        verbose_name_plural = 'OggettoDaFatturare'

    def __str__(self):
        return f"OggettoDaFatturare (id: {self.id})"

    unita_misura = models.ForeignKey('UnitaMisura', on_delete=models.CASCADE, null=True,
                                     blank=True, related_name="DatiEstesiDettaglioFatturabile_da_UnitaMisura_unita_misura")
    descrizione = models.CharField(null=True, max_length=1000)
    quantita = models.DecimalField(
        null=True, blank=True, max_digits=21, decimal_places=4)
    prezzo_unitario = models.DecimalField(
        null=True, blank=True, max_digits=21, decimal_places=2)
    data_inizio = models.DateField(null=True, blank=True)
    data_fine = models.DateField(null=True, blank=True)
