210 lines
6.4 KiB
Python
210 lines
6.4 KiB
Python
from django.db import models
|
|
from polymorphic.models import PolymorphicModel
|
|
from dati_geo_app.models import AbstractIndirizzo
|
|
|
|
|
|
class SoggettoContattabile(PolymorphicModel):
|
|
"""
|
|
Questa è una classe padre astratta. È utilizzata come base per tutti i soggetti contattabili.
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'soggetto contattabile'
|
|
verbose_name_plural = 'soggetti contattabili'
|
|
|
|
def __str__(self):
|
|
return str(getattr(self,self.polymorphic_ctype.model))
|
|
|
|
|
|
class Recapito(PolymorphicModel):
|
|
"""
|
|
Questo modello rappresenta i recapiti di contatto di un SoggettoContattabile,
|
|
come telefoni, email, fax, ecc.
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'recapito'
|
|
verbose_name_plural = 'recapiti'
|
|
|
|
soggetto = models.ForeignKey(SoggettoContattabile, on_delete=models.CASCADE, null=False,
|
|
blank=False, related_name="contatti")
|
|
|
|
class PersonaFisica(SoggettoContattabile):
|
|
"""
|
|
È child polimorfico, come PersonaGiuridica, di SoggettoContattabile e
|
|
rappresenta una persone giuridica. Ha, come PersonaGiuridica, campi specifici
|
|
per i dettagli dello specifico tipo di persona.
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'persona fisica'
|
|
verbose_name_plural = 'persone fisiche'
|
|
|
|
def __str__(self):
|
|
if self.nome:
|
|
out = str(self.nome).strip()
|
|
else:
|
|
out = ''
|
|
if self.cognome:
|
|
out = f'{out} {self.cognome}'.strip()
|
|
else:
|
|
out = ''
|
|
if not out:
|
|
out = f'Persona fisica senza nome #{self.id}'
|
|
if self.titolo:
|
|
out=f'{self.titolo} {out}'
|
|
return out
|
|
|
|
titolo = models.CharField(null=False,blank=True,default='', max_length=10)
|
|
nome = models.CharField(null=False,blank=False, max_length=60)
|
|
cognome = models.CharField(null=False,blank=False, max_length=60)
|
|
is_privato = models.BooleanField(null=False, blank=False, default=True)
|
|
|
|
|
|
class PersonaGiuridica(SoggettoContattabile):
|
|
"""
|
|
È child polimorfico, come PersonaFisica, di SoggettoContattabile e
|
|
rappresenta una persona fisica. Ha, come PersonaFisica, campi specifici
|
|
per i dettagli dello specifico tipo di persona.
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'persona giuridica'
|
|
verbose_name_plural = 'persone giuridiche'
|
|
|
|
def __str__(self):
|
|
if self.denominazione:
|
|
out = self.denominazione
|
|
else:
|
|
out = ''
|
|
if not out.strip:
|
|
out = 'Persona giuridica senza nome #{self.id}'
|
|
return out
|
|
|
|
denominazione = models.CharField(null=False,blank=False, max_length=80)
|
|
|
|
|
|
class Telefono(Recapito):
|
|
class Meta:
|
|
verbose_name = 'telefono'
|
|
verbose_name_plural = 'telefono'
|
|
|
|
def __str__(self):
|
|
if self.interno:
|
|
tel = f'{self.numero} (int.{self.interno})'
|
|
else:
|
|
tel = str(self.numero)
|
|
if self.note:
|
|
tel += ' (*)'
|
|
return tel
|
|
|
|
numero = models.CharField(null=False,blank=False,max_length=20)
|
|
interno = models.CharField(null=False,blank=True,default='', max_length=20)
|
|
note = models.CharField(null=False,blank=True,default='', max_length=64)
|
|
|
|
|
|
class Email(Recapito):
|
|
class Meta:
|
|
verbose_name = 'email'
|
|
verbose_name_plural = 'email'
|
|
|
|
def __str__(self):
|
|
eml = self.indirizzo_email
|
|
if self.note:
|
|
eml += ' (*)'
|
|
return eml
|
|
|
|
indirizzo_email = models.EmailField(null=False,blank=False,max_length=254)
|
|
note = models.CharField(null=False,blank=True,default='', max_length=64)
|
|
|
|
|
|
class Pec(Email):
|
|
class Meta:
|
|
verbose_name = 'pec'
|
|
verbose_name_plural = 'pec'
|
|
|
|
def __str__(self):
|
|
eml = self.indirizzo_email
|
|
if self.note:
|
|
eml += ' (*)'
|
|
return eml
|
|
|
|
|
|
|
|
class Fax(Recapito):
|
|
class Meta:
|
|
verbose_name = 'fax'
|
|
verbose_name_plural = 'fax'
|
|
|
|
def __str__(self):
|
|
out = self.numero
|
|
if self.note:
|
|
out += ' (*)'
|
|
return out.strip()
|
|
|
|
numero = models.CharField(null=False,blank=False, max_length=20)
|
|
note = models.CharField(null=False,blank=True,default='', max_length=64)
|
|
|
|
class Indirizzo(Recapito, AbstractIndirizzo):
|
|
"""
|
|
Questo modello rappresenta un indirizzo fisico associato a un soggetto contattabile.
|
|
Implementa AbstractIndirizzo, lo schema di indirizzi di django_geo_app.
|
|
"""
|
|
class Meta(AbstractIndirizzo.Meta):
|
|
pass
|
|
|
|
|
|
class Sede(Indirizzo):
|
|
"""
|
|
Questo modello rappresenta una sede fisica di un'azienda.
|
|
"""
|
|
class Meta:
|
|
verbose_name = 'sede'
|
|
verbose_name_plural = 'sedi'
|
|
|
|
def __str__(self):
|
|
out='Sede '
|
|
if self.is_legale:
|
|
out+='legale '
|
|
else:
|
|
out+='operativa '
|
|
out+=f'di {self.dug} {self.duf} {self.civico}, {self.cap} {self.comune.nome} {self.comune.provincia_id}'
|
|
return out
|
|
|
|
societa = models.ForeignKey('Societa', on_delete=models.CASCADE,
|
|
null=False, blank=False, related_name="sedi")
|
|
is_legale = models.BooleanField(null=False, blank=False, default=False)
|
|
|
|
|
|
class Societa(models.Model):
|
|
class Meta:
|
|
verbose_name = 'società'
|
|
verbose_name_plural = 'società'
|
|
|
|
def __str__(self):
|
|
if self.ragione_sociale:
|
|
out = self.ragione_sociale
|
|
else:
|
|
out = str(self.soggetto)
|
|
return out
|
|
|
|
soggetto = models.OneToOneField(SoggettoContattabile, on_delete=models.CASCADE, null=False,
|
|
blank=False, related_name="societa")
|
|
ragione_sociale = models.CharField(max_length=1024)
|
|
nazione = models.ForeignKey('dati_geo_app.Nazione', on_delete=models.CASCADE, null=True,
|
|
blank=True, related_name="societa")
|
|
|
|
|
|
class ContattoAziendale(models.Model):
|
|
class Meta:
|
|
verbose_name = 'Contatto aziendale'
|
|
verbose_name_plural = 'Contatti aziendali'
|
|
|
|
def __str__(self):
|
|
return f'{self.persona} per {self.azienda}'
|
|
|
|
persona = models.ForeignKey(PersonaFisica, on_delete=models.CASCADE, null=False,
|
|
blank=False, related_name='aziende_correlate')
|
|
azienda = models.ForeignKey(Societa, on_delete=models.CASCADE, null=False,
|
|
blank=False, related_name='contatti_azienda')
|
|
is_personale = models.BooleanField(null=False, blank=False, default=True)
|
|
|
|
|
|
# --------------- FINE PREFISSO TEMPLATE ---------------
|