diff --git a/django/contatti_app/admin.py b/django/contatti_app/admin.py
index 0f344fa..66f1e39 100644
--- a/django/contatti_app/admin.py
+++ b/django/contatti_app/admin.py
@@ -1,28 +1,28 @@
from import_export.admin import ImportExportModelAdmin
from django.contrib import admin
-# from django.core.cache import cache
-# from django.core.paginator import Paginator
+from django.core.cache import cache
+from django.core.paginator import Paginator
from . import models
from . import resources
+from dati_geo_app.admin import RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin
-
-# # Modified version of a GIST I found in a SO thread
-# # cfr. http://masnun.rocks/2017/03/20/django-admin-expensive-count-all-queries/
-# class CachingPaginator(Paginator):
-# def _get_count(self):
-# if not hasattr(self, "_count"):
-# self._count = None
-# if self._count is None:
-# try:
-# key = "adm:{0}:count".format(hash(self.object_list.query.__str__()))
-# self._count = cache.get(key, -1)
-# if self._count == -1:
-# self._count = super().count
-# cache.set(key, self._count, 60)
-# except:
-# self._count = len(self.object_list)
-# return self._count
-# count = property(_get_count)
+# Modified version of a GIST I found in a SO thread
+# cfr. http://masnun.rocks/2017/03/20/django-admin-expensive-count-all-queries/
+class CachingPaginator(Paginator):
+ def _get_count(self):
+ if not hasattr(self, "_count"):
+ self._count = None
+ if self._count is None:
+ try:
+ key = "adm:{0}:count".format(hash(self.object_list.query.__str__()))
+ self._count = cache.get(key, -1)
+ if self._count == -1:
+ self._count = super().count
+ cache.set(key, self._count, 60)
+ except:
+ self._count = len(self.object_list)
+ return self._count
+ count = property(_get_count)
# # Main reusable Admin class for only viewing
# class ViewAdminMixin(admin.ModelAdmin):
@@ -47,33 +47,6 @@ class PersonaContattoAziendaAdmin(ImportExportModelAdmin):
pass
-@admin.register(models.SoggettoFiscale)
-class SoggettoFiscaleAdmin(ImportExportModelAdmin):
- # resource = resources.SoggettoFiscaleResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.Nazione)
-class NazioneAdmin(ImportExportModelAdmin):
- # resource = resources.NazioneResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.DatoDiContatto)
-class DatoDiContattoAdmin(ImportExportModelAdmin):
- # resource = resources.DatoDiContattoResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
@admin.register(models.Telefono)
class TelefonoAdmin(ImportExportModelAdmin):
# resource = resources.TelefonoResource
@@ -135,3 +108,36 @@ class PecAdmin(ImportExportModelAdmin):
# paginator = CachingPaginator
# show_full_result_count = False
pass
+
+
+@admin.register(models.Indirizzo)
+class IndirizzoAdmin(RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin):
+ list_per_page = 15
+ paginator = CachingPaginator
+ show_full_result_count = False
+ fields=('dug','duf','civico','cap','comune','altro',)
+ search_fields = ('indirizzo','cap_id__exact',)
+ autocomplete_fields = ('dug','cap','comune',)
+ list_display = ('indirizzo', 'cap','comune','provincia','regione',)
+ ordering = ('comune_id','duf','civico',)
+ autocomplete_list_filter = ('comune',)
+ list_filter = ('comune__provincia__regione_id',)
+
+ def get_queryset(self, request):
+ queryset = super().get_queryset(request).select_related('comune__provincia__regione').annotate(indirizzo=Concat('dug_id',Value(' '),'duf',Value(' '),'civico'))
+ return queryset
+
+ def provincia(self, obj):
+ return obj.comune.provincia
+ provincia.short_description = 'Provincia'
+ provincia.admin_order_field = 'comune__provincia_id'
+
+ def regione(self, obj):
+ return obj.comune.provincia.regione_id
+ regione.short_description = 'Regione'
+ regione.admin_order_field = 'comune__provincia__regione_id'
+
+ def indirizzo(self, obj):
+ return obj.indirizzo
+ indirizzo.short_description = 'Indirizzo'
+ indirizzo.admin_order_field = ('comune_id','duf','civico',)
diff --git a/django/contatti_app/modello_database.xml b/django/contatti_app/modello_database.xml
index 9e24426..ad482ba 100644
--- a/django/contatti_app/modello_database.xml
+++ b/django/contatti_app/modello_database.xml
@@ -62,7 +62,7 @@
NULL
INTEGER
-NULL
+NULL
INTEGER
@@ -78,20 +78,6 @@
id
-
-
-INTEGER
-NULL
-
-CHAR(2)
-'NULL'
-
-VARCHAR(250)
-NULL
-
-id
-
-
INTEGER
diff --git a/django/contatti_app/models.py b/django/contatti_app/models.py
index 7c554c0..e40f5fd 100644
--- a/django/contatti_app/models.py
+++ b/django/contatti_app/models.py
@@ -1,9 +1,172 @@
from django.db import models
+from polymorphic.models import PolymorphicModel
+from dati_geo_app.models import AbstractIndirizzo
# --------------- FINE PREFISSO TEMPLATE ---------------
+class SoggettoContattabile(PolymorphicModel):
+ class Meta:
+ verbose_name = 'soggetto contattabile'
+ verbose_name_plural = 'soggetti contattabili'
-class PersonaContattoAzienda(models.Model):
+ rimosso = models.BooleanField(null=True, blank=True)
+
+class ContattoRubrica(PolymorphicModel):
+ class Meta:
+ verbose_name = 'contatto di rubrica'
+ verbose_name_plural = 'contatti di rubrica'
+
+ soggetto = models.ForeignKey(SoggettoContattabile, on_delete=models.CASCADE, null=False,
+ blank=False, related_name="societa")
+
+class PersonaFisica(SoggettoContattabile):
+ 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=True, max_length=10)
+ nome = models.CharField(null=True, max_length=60)
+ cognome = models.CharField(null=True, max_length=60)
+
+
+class PersonaGiuridica(SoggettoContattabile):
+ 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=True, max_length=80)
+
+
+class Telefono(ContattoRubrica):
+ 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(max_length=20)
+ interno = models.CharField(null=True, max_length=20)
+ note = models.CharField(null=True, max_length=64)
+
+
+class Email(ContattoRubrica):
+ class Meta:
+ verbose_name = 'email'
+ verbose_name_plural = 'email'
+
+ def __str__(self):
+ eml = self.indirizzo
+ if self.note:
+ eml += ' (!)'
+ return eml
+
+ indirizzo = models.CharField(max_length=30)
+ note = models.CharField(null=True, max_length=64)
+
+
+class Pec(Email):
+ class Meta:
+ verbose_name = 'pec'
+ verbose_name_plural = 'pec'
+
+ def __str__(self):
+ return f"Pec (id: {self.id})"
+
+
+class Fax(ContattoRubrica):
+ 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=True, max_length=20)
+ note = models.CharField(null=True, max_length=64)
+
+class Indirizzo(PolymorphicModel, AbstractIndirizzo):
+ class Meta(AbstractIndirizzo.Meta):
+ pass
+
+
+class Residenza(Indirizzo):
+ class Meta:
+ verbose_name = 'residenza'
+ verbose_name_plural = 'residenze'
+
+ def __str__(self):
+ return f"Residenza (id: {self.id})"
+
+ inquilino = models.ForeignKey(SoggettoContattabile, on_delete=models.CASCADE,
+ null=True, blank=True, related_name="residenze")
+
+class Sede(Residenza):
+ class Meta:
+ verbose_name = 'sede'
+ verbose_name_plural = 'sedi'
+
+ def __str__(self):
+ return f"Sede (id: {self.id})"
+
+ societa = models.ForeignKey('Societa', on_delete=models.CASCADE,
+ null=True, blank=True, related_name="sedi")
+ is_legale = models.BooleanField(null=True, blank=True)
+
+
+class Societa(models.Model):
+ class Meta:
+ verbose_name = 'societa'
+ verbose_name_plural = 'societa'
+
+ 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")
+ sede_legale = models.IntegerField()
+
+class PersonaContattoAzienda(PersonaFisica):
class Meta:
verbose_name = 'personacontattoazienda'
verbose_name_plural = 'personacontattoazienda'
@@ -11,118 +174,6 @@ class PersonaContattoAzienda(models.Model):
def __str__(self):
return f"PersonaContattoAzienda (id: {self.id})"
- azienda = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="PersonaContattoAzienda_da_SoggettoFiscale_azienda")
-
-
-class SoggettoFiscale(models.Model):
- class Meta:
- verbose_name = 'soggettofiscale'
- verbose_name_plural = 'soggettofiscale'
-
- def __str__(self):
- return f"SoggettoFiscale (id: {self.id})"
-
- indirizzo_pec = models.ForeignKey('Pec', on_delete=models.CASCADE, null=True,
- blank=True, related_name="SoggettoFiscale_da_Pec_indirizzo_pec")
- sede_legale = models.IntegerField()
- stabile_organizzazione = models.IntegerField(null=True, blank=True)
- nazione = models.ForeignKey('Nazione', on_delete=models.CASCADE, null=True,
- blank=True, related_name="SoggettoFiscale_da_Nazione_nazione")
- revisione_principale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="SoggettoFiscale_da_SoggettoFiscale_revisione_principale")
- rimosso = models.BooleanField(null=True, blank=True)
-
-
-class DatoDiContatto(models.Model):
- class Meta:
- verbose_name = 'datodicontatto'
- verbose_name_plural = 'datodicontatto'
-
- def __str__(self):
- return f"DatoDiContatto (id: {self.id})"
-
- soggetto_fiscale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="DatoDiContatto_da_SoggettoFiscale_soggetto_fiscale")
-
-
-class Telefono(models.Model):
- class Meta:
- verbose_name = 'telefono'
- verbose_name_plural = 'telefono'
-
- def __str__(self):
- return f"Telefono (id: {self.id})"
-
- numero = models.CharField(max_length=20)
- note = models.CharField(null=True, max_length=64)
-
-
-class Email(models.Model):
- class Meta:
- verbose_name = 'email'
- verbose_name_plural = 'email'
-
- def __str__(self):
- return f"Email (id: {self.id})"
-
- indirizzo = models.CharField(max_length=30)
- note = models.CharField(null=True, max_length=64)
-
-
-class PersonaFisica(models.Model):
- class Meta:
- verbose_name = 'personafisica'
- verbose_name_plural = 'personafisica'
-
- def __str__(self):
- return f"PersonaFisica (id: {self.id})"
-
- titolo = models.CharField(null=True, max_length=10)
- nome = models.CharField(null=True, max_length=60)
- cognome = models.CharField(null=True, max_length=60)
-
-
-class PersonaGiuridica(models.Model):
- class Meta:
- verbose_name = 'personagiuridica'
- verbose_name_plural = 'personagiuridica'
-
- def __str__(self):
- return f"PersonaGiuridica (id: {self.id})"
-
- denominazione = models.CharField(null=True, max_length=80)
-
-
-class Sede(models.Model):
- class Meta:
- verbose_name = 'sede'
- verbose_name_plural = 'sede'
-
- def __str__(self):
- return f"Sede (id: {self.id})"
-
- inquilino = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
- null=True, blank=True, related_name="Sede_da_SoggettoFiscale_inquilino")
- is_legale = models.BooleanField(null=True, blank=True)
-
-
-class Fax(models.Model):
- class Meta:
- verbose_name = 'fax'
- verbose_name_plural = 'fax'
-
- def __str__(self):
- return f"Fax (id: {self.id})"
-
- numero = models.CharField(null=True, max_length=20)
- note = models.CharField(null=True, max_length=64)
-
-
-class Pec(models.Model):
- class Meta:
- verbose_name = 'pec'
- verbose_name_plural = 'pec'
-
- def __str__(self):
- return f"Pec (id: {self.id})"
+ azienda = models.ForeignKey(Societa, on_delete=models.CASCADE, null=True,
+ blank=True, related_name='persone')
+ is_personale = models.BooleanField(null=True, blank=True)
diff --git a/django/contatti_app/resources.py b/django/contatti_app/resources.py
index e632d6d..b44a723 100644
--- a/django/contatti_app/resources.py
+++ b/django/contatti_app/resources.py
@@ -9,21 +9,6 @@ class PersonaContattoAziendaResource(resources.ModelResource):
model = models.PersonaContattoAzienda
-class SoggettoFiscaleResource(resources.ModelResource):
- class Meta:
- model = models.SoggettoFiscale
-
-
-class NazioneResource(resources.ModelResource):
- class Meta:
- model = models.Nazione
-
-
-class DatoDiContattoResource(resources.ModelResource):
- class Meta:
- model = models.DatoDiContatto
-
-
class TelefonoResource(resources.ModelResource):
class Meta:
model = models.Telefono
diff --git a/django/contatti_app/serializers.py b/django/contatti_app/serializers.py
index e7250be..bb74b05 100644
--- a/django/contatti_app/serializers.py
+++ b/django/contatti_app/serializers.py
@@ -17,12 +17,6 @@ class SoggettoFiscaleSerializer(serializers.ModelSerializer):
'nazione', 'revisione_principale', 'rimosso')
-class NazioneSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.Nazione
- fields = ('codifica', 'descrizione')
-
-
class DatoDiContattoSerializer(serializers.ModelSerializer):
class Meta:
model = models.DatoDiContatto
diff --git a/django/contatti_app/urls.py b/django/contatti_app/urls.py
index d92e5cf..00de52c 100644
--- a/django/contatti_app/urls.py
+++ b/django/contatti_app/urls.py
@@ -13,7 +13,6 @@ router = routers.DefaultRouter()
router.register(r'personacontattoazienda', views.PersonaContattoAzienda_View)
router.register(r'soggettofiscale', views.SoggettoFiscale_View)
-router.register(r'nazione', views.Nazione_View)
router.register(r'datodicontatto', views.DatoDiContatto_View)
router.register(r'telefono', views.Telefono_View)
router.register(r'email', views.Email_View)
diff --git a/django/contatti_app/views.py b/django/contatti_app/views.py
index 0d45504..5deb91a 100644
--- a/django/contatti_app/views.py
+++ b/django/contatti_app/views.py
@@ -35,14 +35,6 @@ class SoggettoFiscale_View(viewsets.ModelViewSet):
serializer_class = serializers.SoggettoFiscaleSerializer
-class Nazione_View(viewsets.ModelViewSet):
- # authentication_classes = [BasicAuthentication, SessionAuthentication, TokenAuthentication]
- # permission_classes = [DjangoModelPermissions]
-
- queryset = models.Nazione.objects.all()
- serializer_class = serializers.NazioneSerializer
-
-
class DatoDiContatto_View(viewsets.ModelViewSet):
# authentication_classes = [BasicAuthentication, SessionAuthentication, TokenAuthentication]
# permission_classes = [DjangoModelPermissions]
diff --git a/django/dati_geo_app/admin.py b/django/dati_geo_app/admin.py
index d535e72..9019974 100644
--- a/django/dati_geo_app/admin.py
+++ b/django/dati_geo_app/admin.py
@@ -291,34 +291,10 @@ class DUGAdmin(RicercaOrdinataMixin, admin.ModelAdmin):
ordering = ('nome',)
list_display = ('nome',)
-@admin.register(models.Indirizzo)
-class IndirizzoAdmin(RicercaOrdinataMixin, AjaxAutocompleteListFilterModelAdmin):
- list_per_page = 15
- paginator = CachingPaginator
- show_full_result_count = False
- fields=('dug','duf','civico','cap','comune','altro',)
- search_fields = ('indirizzo','cap_id__exact',)
- autocomplete_fields = ('dug','cap','comune',)
- list_display = ('indirizzo', 'cap','comune','provincia','regione',)
- ordering = ('comune_id','duf','civico',)
- autocomplete_list_filter = ('comune',)
- list_filter = ('comune__provincia__regione_id',)
-
- def get_queryset(self, request):
- queryset = super().get_queryset(request).select_related('comune__provincia__regione').annotate(indirizzo=Concat('dug_id',Value(' '),'duf',Value(' '),'civico'))
- return queryset
-
- def provincia(self, obj):
- return obj.comune.provincia
- provincia.short_description = 'Provincia'
- provincia.admin_order_field = 'comune__provincia_id'
-
- def regione(self, obj):
- return obj.comune.provincia.regione_id
- regione.short_description = 'Regione'
- regione.admin_order_field = 'comune__provincia__regione_id'
-
- def indirizzo(self, obj):
- return obj.indirizzo
- indirizzo.short_description = 'Indirizzo'
- indirizzo.admin_order_field = ('comune_id','duf','civico',)
+@admin.register(models.Nazione)
+class NazioneAdmin(admin.ModelAdmin):
+ # resource = resources.NazioneResource
+ # list_per_page = 15
+ # paginator = CachingPaginator
+ # show_full_result_count = False
+ pass
diff --git a/django/dati_geo_app/models.py b/django/dati_geo_app/models.py
index f20c276..0f22122 100644
--- a/django/dati_geo_app/models.py
+++ b/django/dati_geo_app/models.py
@@ -92,12 +92,15 @@ class DUG(models.Model):
nome = models.CharField(primary_key=True, max_length=40)
-class Indirizzo(models.Model):
+class AbstractIndirizzo(models.Model):
class Meta:
verbose_name = 'indirizzo'
verbose_name_plural = 'indirizzi'
+ abstract = True
+
def __str__(self):
return f"{self.dug} {self.duf} {self.civico}, {self.comune}"
+
dug = models.ForeignKey(DUG, blank=False, null=False, verbose_name='denominazione urbanistica generica', on_delete=models.PROTECT)
duf = models.CharField(max_length=256, blank=False, null=False, verbose_name="denominazione urbanistica ufficiale", help_text="Il nome della via/piazza/ecc...")
civico = models.CharField(max_length=256, blank=False, null=False)
diff --git a/django/fattura_elettronica_app/admin.py b/django/fattura_elettronica_app/admin.py
index 2d4df59..70b4275 100644
--- a/django/fattura_elettronica_app/admin.py
+++ b/django/fattura_elettronica_app/admin.py
@@ -155,15 +155,6 @@ class PartitaIvaCFAdmin(ImportExportModelAdmin):
pass
-@admin.register(models.Nazione)
-class NazioneAdmin(ImportExportModelAdmin):
- # resource = resources.NazioneResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
@admin.register(models.FormatoTrasmissione)
class FormatoTrasmissioneAdmin(ImportExportModelAdmin):
# resource = resources.FormatoTrasmissioneResource
@@ -182,33 +173,6 @@ class CodiceDestinatarioAdmin(ImportExportModelAdmin):
pass
-@admin.register(models.DatoDiContatto)
-class DatoDiContattoAdmin(ImportExportModelAdmin):
- # resource = resources.DatoDiContattoResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.Telefono)
-class TelefonoAdmin(ImportExportModelAdmin):
- # resource = resources.TelefonoResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.Email)
-class EmailAdmin(ImportExportModelAdmin):
- # resource = resources.EmailResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
@admin.register(models.IscrizioneAlboProfessionale)
class IscrizioneAlboProfessionaleAdmin(ImportExportModelAdmin):
# resource = resources.IscrizioneAlboProfessionaleResource
@@ -263,24 +227,6 @@ class SoggettoEmittenteAdmin(ImportExportModelAdmin):
pass
-@admin.register(models.PersonaFisica)
-class PersonaFisicaAdmin(ImportExportModelAdmin):
- # resource = resources.PersonaFisicaResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.PersonaGiuridica)
-class PersonaGiuridicaAdmin(ImportExportModelAdmin):
- # resource = resources.PersonaGiuridicaResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
@admin.register(models.AlboProfessionale)
class AlboProfessionaleAdmin(ImportExportModelAdmin):
# resource = resources.AlboProfessionaleResource
@@ -585,30 +531,3 @@ class DatiEstesiDettaglioFatturabileAdmin(ImportExportModelAdmin):
# paginator = CachingPaginator
# show_full_result_count = False
pass
-
-
-@admin.register(models.Sede)
-class SedeAdmin(ImportExportModelAdmin):
- # resource = resources.SedeResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.Fax)
-class FaxAdmin(ImportExportModelAdmin):
- # resource = resources.FaxResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
-
-
-@admin.register(models.Pec)
-class PecAdmin(ImportExportModelAdmin):
- # resource = resources.PecResource
- # list_per_page = 15
- # paginator = CachingPaginator
- # show_full_result_count = False
- pass
diff --git a/django/fattura_elettronica_app/models.py b/django/fattura_elettronica_app/models.py
index 2090138..42e8b8c 100644
--- a/django/fattura_elettronica_app/models.py
+++ b/django/fattura_elettronica_app/models.py
@@ -168,7 +168,7 @@ class SoggettiFatturaElettronica(models.Model):
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('DatoDiContatto', on_delete=models.CASCADE, null=True,
+ contatto_cedente_prestatore = models.ForeignKey('contatti_app.ContattoRubrica', 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,
@@ -193,7 +193,8 @@ class SoggettoFiscale(PolymorphicModel):
def __str__(self):
return f"SoggettoFiscale (id: {self.id})"
- indirizzo_pec = models.ForeignKey('Pec', on_delete=models.CASCADE, null=True,
+ 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")
@@ -204,54 +205,16 @@ class SoggettoFiscale(PolymorphicModel):
codice_sdi = models.ForeignKey('CodiceDestinatario', on_delete=models.CASCADE, null=True,
blank=True, related_name="SoggettoFiscale_da_CodiceDestinatario_codice_sdi")
sede_legale = models.IntegerField()
- stabile_organizzazione = models.IntegerField(null=True, blank=True)
+ 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('Nazione', on_delete=models.CASCADE, null=True,
+ 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")
- revisione_principale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="SoggettoFiscale_da_SoggettoFiscale_revisione_principale")
rimosso = models.BooleanField(null=True, blank=True)
-class PersonaFisica(models.Model):
- class Meta:
- verbose_name = 'personafisica'
- verbose_name_plural = 'personafisica'
-
- def __str__(self):
- return f"PersonaFisica (id: {self.id})"
-
- titolo = models.CharField(null=True, max_length=10)
- nome = models.CharField(null=True, max_length=60)
- cognome = models.CharField(null=True, max_length=60)
-
-
-class PersonaGiuridica(models.Model):
- class Meta:
- verbose_name = 'personagiuridica'
- verbose_name_plural = 'personagiuridica'
-
- def __str__(self):
- return f"PersonaGiuridica (id: {self.id})"
-
- denominazione = models.CharField(null=True, max_length=80)
-
-
-class PersonaContattoAzienda(models.Model):
- class Meta:
- verbose_name = 'personacontattoazienda'
- verbose_name_plural = 'personacontattoazienda'
-
- def __str__(self):
- return f"PersonaContattoAzienda (id: {self.id})"
-
- azienda = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="PersonaContattoAzienda_da_SoggettoFiscale")
-
-
class PartitaIvaCF(models.Model):
class Meta:
verbose_name = 'partitaivacf'
@@ -263,18 +226,6 @@ class PartitaIvaCF(models.Model):
codice = models.CharField(max_length=28)
-class Nazione(models.Model):
- class Meta:
- verbose_name = 'nazione'
- verbose_name_plural = 'nazione'
-
- def __str__(self):
- return f"{self.descrizione}"
-
- codifica = models.CharField(max_length=2)
- descrizione = models.CharField(null=True, max_length=250)
-
-
class FormatoTrasmissione(models.Model):
class Meta:
verbose_name = 'formatotrasmissione'
@@ -299,42 +250,6 @@ class CodiceDestinatario(models.Model):
descrizione = models.CharField(null=True, max_length=250)
-class DatoDiContatto(models.Model):
- class Meta:
- verbose_name = 'datodicontatto'
- verbose_name_plural = 'datodicontatto'
-
- def __str__(self):
- return f"DatoDiContatto (id: {self.id})"
-
- soggetto_fiscale = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE, null=True,
- blank=True, related_name="DatoDiContatto_da_SoggettoFiscale_soggetto_fiscale")
-
-
-class Telefono(models.Model):
- class Meta:
- verbose_name = 'telefono'
- verbose_name_plural = 'telefono'
-
- def __str__(self):
- return f"Telefono (id: {self.id})"
-
- numero = models.CharField(max_length=20)
- note = models.CharField(null=True, max_length=64)
-
-
-class Email(models.Model):
- class Meta:
- verbose_name = 'email'
- verbose_name_plural = 'email'
-
- def __str__(self):
- return f"Email (id: {self.id})"
-
- indirizzo = models.CharField(max_length=30)
- note = models.CharField(null=True, max_length=64)
-
-
class IscrizioneAlboProfessionale(models.Model):
class Meta:
verbose_name = 'iscrizionealboprofessionale'
@@ -347,7 +262,7 @@ class IscrizioneAlboProfessionale(models.Model):
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('PersonaFisica', on_delete=models.CASCADE, null=True,
+ persona_fisica = models.ForeignKey('contatti_app.PersonaFisica', on_delete=models.CASCADE, null=True,
blank=True, related_name="IscrizioneAlboProfessionale_da_PersonaFisica_persona_fisica")
@@ -562,7 +477,7 @@ class DatiTrasporto(models.Model):
dati_generali = models.ForeignKey('FatturaElettronica', on_delete=models.CASCADE, null=True,
blank=True, related_name="DatiTrasporto_da_FatturaElettronica_dati_generali")
- indirizzo_resa = models.ForeignKey('dati_geo_app.Indirizzo', on_delete=models.CASCADE, null=True,
+ 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)
@@ -937,39 +852,3 @@ class DatiEstesiDettaglioFatturabile(models.Model):
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)
-
-
-class Sede(models.Model):
- class Meta:
- verbose_name = 'sede'
- verbose_name_plural = 'sede'
-
- def __str__(self):
- return f"Sede (id: {self.id})"
-
- indirizzo = models.ForeignKey(
- 'dati_geo_app.Indirizzo', on_delete=models.CASCADE, null=True, blank=True)
- inquilino = models.ForeignKey('SoggettoFiscale', on_delete=models.CASCADE,
- null=True, blank=True, related_name="Sede_da_SoggettoFiscale_inquilino")
- is_legale = models.BooleanField(null=True, blank=True)
-
-
-class Fax(models.Model):
- class Meta:
- verbose_name = 'fax'
- verbose_name_plural = 'fax'
-
- def __str__(self):
- return f"Fax (id: {self.id})"
-
- numero = models.CharField(null=True, max_length=20)
- note = models.CharField(null=True, max_length=64)
-
-
-class Pec(models.Model):
- class Meta:
- verbose_name = 'pec'
- verbose_name_plural = 'pec'
-
- def __str__(self):
- return f"Pec (id: {self.id})"
diff --git a/django/fattura_elettronica_app/resources.py b/django/fattura_elettronica_app/resources.py
index cc52389..867bc52 100644
--- a/django/fattura_elettronica_app/resources.py
+++ b/django/fattura_elettronica_app/resources.py
@@ -69,11 +69,6 @@ class PartitaIvaCFResource(resources.ModelResource):
model = models.PartitaIvaCF
-class NazioneResource(resources.ModelResource):
- class Meta:
- model = models.Nazione
-
-
class FormatoTrasmissioneResource(resources.ModelResource):
class Meta:
model = models.FormatoTrasmissione
@@ -84,21 +79,6 @@ class CodiceDestinatarioResource(resources.ModelResource):
model = models.CodiceDestinatario
-class DatoDiContattoResource(resources.ModelResource):
- class Meta:
- model = models.DatoDiContatto
-
-
-class TelefonoResource(resources.ModelResource):
- class Meta:
- model = models.Telefono
-
-
-class EmailResource(resources.ModelResource):
- class Meta:
- model = models.Email
-
-
class IscrizioneAlboProfessionaleResource(resources.ModelResource):
class Meta:
model = models.IscrizioneAlboProfessionale
@@ -129,16 +109,6 @@ class SoggettoEmittenteResource(resources.ModelResource):
model = models.SoggettoEmittente
-class PersonaFisicaResource(resources.ModelResource):
- class Meta:
- model = models.PersonaFisica
-
-
-class PersonaGiuridicaResource(resources.ModelResource):
- class Meta:
- model = models.PersonaGiuridica
-
-
class AlboProfessionaleResource(resources.ModelResource):
class Meta:
model = models.AlboProfessionale
@@ -307,18 +277,3 @@ class TipologiaDocumentaleResource(resources.ModelResource):
class DatiEstesiDettaglioFatturabileResource(resources.ModelResource):
class Meta:
model = models.DatiEstesiDettaglioFatturabile
-
-
-class SedeResource(resources.ModelResource):
- class Meta:
- model = models.Sede
-
-
-class FaxResource(resources.ModelResource):
- class Meta:
- model = models.Fax
-
-
-class PecResource(resources.ModelResource):
- class Meta:
- model = models.Pec
diff --git a/django/fattura_elettronica_app/serializers.py b/django/fattura_elettronica_app/serializers.py
index a16a5af..153ae4f 100644
--- a/django/fattura_elettronica_app/serializers.py
+++ b/django/fattura_elettronica_app/serializers.py
@@ -86,12 +86,6 @@ class PartitaIvaCFSerializer(serializers.ModelSerializer):
fields = ('codice')
-class NazioneSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.Nazione
- fields = ('codifica', 'descrizione')
-
-
class FormatoTrasmissioneSerializer(serializers.ModelSerializer):
class Meta:
model = models.FormatoTrasmissione
diff --git a/django/fattura_elettronica_app/urls.py b/django/fattura_elettronica_app/urls.py
index 32e85c2..eb76735 100644
--- a/django/fattura_elettronica_app/urls.py
+++ b/django/fattura_elettronica_app/urls.py
@@ -25,7 +25,6 @@ router.register(r'soggettifatturaelettronica',
views.SoggettiFatturaElettronica_View)
router.register(r'soggettofiscale', views.SoggettoFiscale_View)
router.register(r'partitaivacf', views.PartitaIvaCF_View)
-router.register(r'nazione', views.Nazione_View)
router.register(r'formatotrasmissione', views.FormatoTrasmissione_View)
router.register(r'codicedestinatario', views.CodiceDestinatario_View)
router.register(r'datodicontatto', views.DatoDiContatto_View)
diff --git a/django/sangue_app/models.py b/django/sangue_app/models.py
index f93dfb2..056a5ca 100644
--- a/django/sangue_app/models.py
+++ b/django/sangue_app/models.py
@@ -14,8 +14,8 @@ class DestinatarioOfferta(models.Model):
destinazione = models.ForeignKey('Sede', on_delete=models.CASCADE, null=True,
blank=True, related_name="DestinatarioOfferta_da_Sede_destinazione")
- intestatario = models.ForeignKey('fattura_elettronica_app.PersonaContattoAzienda', on_delete=models.CASCADE, null=True,
- blank=True, related_name="DestinatarioOfferta_da_PersonaContattoAzienda_intestatario")
+ intestatario = models.ForeignKey('contatti_app.PersonaContattoAzienda', on_delete=models.CASCADE, null=True,
+ blank=True, related_name="DestinatarioOfferta_da_contatti_appPersonaContattoAzienda_intestatario")
class GruppoOfferte(models.Model):
diff --git a/django/sangue_django/settings.py b/django/sangue_django/settings.py
index 51063aa..0e588e1 100644
--- a/django/sangue_django/settings.py
+++ b/django/sangue_django/settings.py
@@ -136,6 +136,7 @@ INSTALLED_APPS = [
'sangue_app.apps.SangueAppConfig',
'dati_geo_app.apps.DatiGeograficiAppConfig',
'fattura_elettronica_app.apps.FatturaElettronicaAppConfig',
+ 'contatti_app.apps.ContattiAppConfig',
'djaa_list_filter',
'rest_framework',
# 'rest_framework.authtoken',