diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 6b52506..d2aee0b 100644 Binary files a/config/__pycache__/settings.cpython-311.pyc and b/config/__pycache__/settings.cpython-311.pyc differ diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 480daeb..be37309 100644 Binary files a/config/__pycache__/urls.cpython-311.pyc and b/config/__pycache__/urls.cpython-311.pyc differ diff --git a/config/settings.py b/config/settings.py index a7247c1..71ccb26 100644 --- a/config/settings.py +++ b/config/settings.py @@ -33,7 +33,8 @@ ALLOWED_HOSTS = [ CSRF_TRUSTED_ORIGINS = [ origin for origin in [ os.getenv("HOST_FQDN", ""), - os.getenv("CSRF_TRUSTED_ORIGIN", "") + os.getenv("CSRF_TRUSTED_ORIGIN", ""), + "https://matteo-barresi.dev.flatlogic.app", ] if origin ] CSRF_TRUSTED_ORIGINS = [ @@ -53,7 +54,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'core', + 'core.apps.CoreConfig', ] MIDDLEWARE = [ diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 3b7774e..c23d5e3 100644 Binary files a/core/__pycache__/__init__.cpython-311.pyc and b/core/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 2bd112a..ccb577f 100644 Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6435d92..3841887 100644 Binary files a/core/__pycache__/apps.cpython-311.pyc and b/core/__pycache__/apps.cpython-311.pyc differ diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc deleted file mode 100644 index 56356eb..0000000 Binary files a/core/__pycache__/forms.cpython-311.pyc and /dev/null differ diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 2d874a7..75225d7 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index e9609bd..6ce520e 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 4b92fcd..1c7661a 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/admin.py b/core/admin.py index 3ebea38..16333c4 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,7 +1,4 @@ from django.contrib import admin -from .models import Cliente, Portafoglio, Attivita, Documento +from .models import Cliente -admin.site.register(Cliente) -admin.site.register(Portafoglio) -admin.site.register(Attivita) -admin.site.register(Documento) +admin.site.register(Cliente) \ No newline at end of file diff --git a/core/forms.py b/core/forms.py deleted file mode 100644 index 199bcaf..0000000 --- a/core/forms.py +++ /dev/null @@ -1,38 +0,0 @@ -from django import forms -from .models import Cliente, Portafoglio, Attivita, Documento - -class ClienteForm(forms.ModelForm): - class Meta: - model = Cliente - exclude = ('Importo_Portafoglio_Attuale',) - widgets = { - 'Data_di_Nascita': forms.DateInput(attrs={'type': 'date'}), - } - -class PortafoglioForm(forms.ModelForm): - class Meta: - model = Portafoglio - fields = '__all__' - widgets = { - 'Data_Inizio': forms.DateInput(attrs={'type': 'date'}), - 'cliente': forms.HiddenInput(), - } - -class AttivitaForm(forms.ModelForm): - class Meta: - model = Attivita - fields = '__all__' - widgets = { - 'Data': forms.DateInput(attrs={'type': 'date'}), - 'Ora': forms.TimeInput(attrs={'type': 'time'}), - 'cliente': forms.HiddenInput(), - } - -class DocumentoForm(forms.ModelForm): - class Meta: - model = Documento - fields = '__all__' - widgets = { - 'Data_di_Scadenza': forms.DateInput(attrs={'type': 'date'}), - 'cliente': forms.HiddenInput(), - } diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index c852421..903ee33 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.7 on 2025-10-25 16:24 +# Generated by Django 5.2.7 on 2025-10-25 19:20 from django.db import migrations, models @@ -15,18 +15,15 @@ class Migration(migrations.Migration): name='Cliente', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('Nome', models.CharField(max_length=100)), - ('Cognome', models.CharField(max_length=100)), - ('Codice_Fiscale', models.CharField(max_length=16, unique=True)), - ('Email', models.EmailField(max_length=254)), - ('Telefono', models.CharField(max_length=20)), - ('Data_di_Nascita', models.DateField()), - ('Lavoro', models.CharField(max_length=100)), - ('Stato', models.CharField(choices=[('Cliente', 'Cliente'), ('Prospect', 'Prospect'), ('Ex-Cliente', 'Ex-Cliente')], max_length=20)), - ('Categoria', models.CharField(choices=[('Privato', 'Privato'), ('Azienda', 'Azienda')], max_length=20)), - ('Importo_Portafoglio_Attuale', models.DecimalField(decimal_places=2, default=0.0, editable=False, max_digits=15)), - ('Scadenza_MIFID', models.DateField()), - ('Scadenza_Documento_Identita', models.DateField()), + ('nome', models.CharField(max_length=100, verbose_name='Nome')), + ('cognome', models.CharField(max_length=100, verbose_name='Cognome')), + ('codice_fiscale', models.CharField(max_length=16, unique=True, verbose_name='Codice Fiscale')), + ('email', models.EmailField(max_length=254, verbose_name='Email')), + ('telefono', models.CharField(max_length=20, verbose_name='Telefono')), + ('data_di_nascita', models.DateField(verbose_name='Data di Nascita')), + ('lavoro', models.CharField(max_length=100, verbose_name='Lavoro')), + ('stato', models.CharField(choices=[('Cliente', 'Cliente'), ('Prospect', 'Prospect'), ('Ex-Cliente', 'Ex-Cliente')], max_length=20, verbose_name='Stato')), + ('categoria', models.CharField(choices=[('Privato', 'Privato'), ('Azienda', 'Azienda')], max_length=20, verbose_name='Categoria')), ], ), ] diff --git a/core/migrations/0002_remove_cliente_scadenza_documento_identita_and_more.py b/core/migrations/0002_remove_cliente_scadenza_documento_identita_and_more.py deleted file mode 100644 index 2af4967..0000000 --- a/core/migrations/0002_remove_cliente_scadenza_documento_identita_and_more.py +++ /dev/null @@ -1,61 +0,0 @@ -# Generated by Django 5.2.7 on 2025-10-25 16:52 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='cliente', - name='Scadenza_Documento_Identita', - ), - migrations.RemoveField( - model_name='cliente', - name='Scadenza_MIFID', - ), - migrations.CreateModel( - name='Attivita', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('Data', models.DateField()), - ('Ora', models.TimeField(blank=True, null=True)), - ('Tipo', models.CharField(choices=[('Chiamata', 'Chiamata'), ('Riunione', 'Riunione'), ('Email', 'Email'), ('To-Do', 'To-Do'), ('Avviso Cedola', 'Avviso Cedola'), ('Scadenza Obbligazione', 'Scadenza Obbligazione'), ('Revisione Annuale', 'Revisione Annuale')], max_length=30)), - ('Stato', models.CharField(choices=[('Pianificato', 'Pianificato'), ('Completato', 'Completato')], default='Pianificato', max_length=20)), - ('Note', models.TextField(blank=True, null=True)), - ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attivita', to='core.cliente')), - ], - ), - migrations.CreateModel( - name='Documento', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('Nome_Documento', models.CharField(max_length=100)), - ('Tipo', models.CharField(choices=[('Contratto', 'Contratto'), ('KYC', 'KYC'), ('Report', 'Report'), ('Altro', 'Altro')], max_length=20)), - ('Data_Caricamento', models.DateField(auto_now_add=True)), - ('Data_di_Scadenza', models.DateField(blank=True, null=True)), - ('File', models.FileField(upload_to='documenti/')), - ('Condivisibile', models.BooleanField(default=False)), - ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documenti', to='core.cliente')), - ], - ), - migrations.CreateModel( - name='Portafoglio', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('Nome_Portafoglio', models.CharField(max_length=100)), - ('Profilo_di_Rischio', models.CharField(choices=[('Conservativo', 'Conservativo'), ('Bilanciato', 'Bilanciato'), ('Aggressivo', 'Aggressivo')], max_length=20)), - ('Composizione_Asset_Allocation', models.TextField(blank=True, null=True)), - ('Data_Inizio', models.DateField()), - ('Valore_Iniziale', models.DecimalField(decimal_places=2, max_digits=15)), - ('Valore_Corrente', models.DecimalField(decimal_places=2, max_digits=15)), - ('Note', models.TextField(blank=True, null=True)), - ('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='portafogli', to='core.cliente')), - ], - ), - ] diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc index 92357d7..f398691 100644 Binary files a/core/migrations/__pycache__/0001_initial.cpython-311.pyc and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0002_remove_cliente_scadenza_documento_identita_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_remove_cliente_scadenza_documento_identita_and_more.cpython-311.pyc deleted file mode 100644 index 446d7cc..0000000 Binary files a/core/migrations/__pycache__/0002_remove_cliente_scadenza_documento_identita_and_more.cpython-311.pyc and /dev/null differ diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 58b1c14..b0caae6 100644 Binary files a/core/migrations/__pycache__/__init__.cpython-311.pyc and b/core/migrations/__pycache__/__init__.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 69ef07e..f6c223c 100644 --- a/core/models.py +++ b/core/models.py @@ -11,76 +11,21 @@ class Cliente(models.Model): ('Azienda', 'Azienda'), ] - Nome = models.CharField(max_length=100) - Cognome = models.CharField(max_length=100) - Codice_Fiscale = models.CharField(max_length=16, unique=True) - Email = models.EmailField() - Telefono = models.CharField(max_length=20) - Data_di_Nascita = models.DateField() - Lavoro = models.CharField(max_length=100) - Stato = models.CharField(max_length=20, choices=STATO_CHOICES) - Categoria = models.CharField(max_length=20, choices=CATEGORIA_CHOICES) - Importo_Portafoglio_Attuale = models.DecimalField(max_digits=15, decimal_places=2, default=0.00, editable=False) + nome = models.CharField("Nome", max_length=100) + cognome = models.CharField("Cognome", max_length=100) + codice_fiscale = models.CharField("Codice Fiscale", max_length=16, unique=True) + email = models.EmailField("Email") + telefono = models.CharField("Telefono", max_length=20) + data_di_nascita = models.DateField("Data di Nascita") + lavoro = models.CharField("Lavoro", max_length=100) + stato = models.CharField("Stato", max_length=20, choices=STATO_CHOICES) + categoria = models.CharField("Categoria", max_length=20, choices=CATEGORIA_CHOICES) + + @property + def importo_portafoglio_attuale(self): + # This is a calculated field. + # The logic to calculate this value will be implemented later. + return 0.00 def __str__(self): - return f"{self.Nome} {self.Cognome}" - -class Portafoglio(models.Model): - PROFILO_RISCHIO_CHOICES = [ - ('Conservativo', 'Conservativo'), - ('Bilanciato', 'Bilanciato'), - ('Aggressivo', 'Aggressivo'), - ] - cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='portafogli') - Nome_Portafoglio = models.CharField(max_length=100) - Profilo_di_Rischio = models.CharField(max_length=20, choices=PROFILO_RISCHIO_CHOICES) - Composizione_Asset_Allocation = models.TextField(blank=True, null=True) - Data_Inizio = models.DateField() - Valore_Iniziale = models.DecimalField(max_digits=15, decimal_places=2) - Valore_Corrente = models.DecimalField(max_digits=15, decimal_places=2) - Note = models.TextField(blank=True, null=True) - - def __str__(self): - return f"{self.Nome_Portafoglio} ({self.cliente})" - -class Attivita(models.Model): - TIPO_CHOICES = [ - ('Chiamata', 'Chiamata'), - ('Riunione', 'Riunione'), - ('Email', 'Email'), - ('To-Do', 'To-Do'), - ('Avviso Cedola', 'Avviso Cedola'), - ('Scadenza Obbligazione', 'Scadenza Obbligazione'), - ('Revisione Annuale', 'Revisione Annuale'), - ] - STATO_CHOICES = [ - ('Pianificato', 'Pianificato'), - ('Completato', 'Completato'), - ] - cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='attivita') - Data = models.DateField() - Ora = models.TimeField(blank=True, null=True) - Tipo = models.CharField(max_length=30, choices=TIPO_CHOICES) - Stato = models.CharField(max_length=20, choices=STATO_CHOICES, default='Pianificato') - Note = models.TextField(blank=True, null=True) - - def __str__(self): - return f"{self.Tipo} - {self.Data} - {self.cliente}" - -class Documento(models.Model): - TIPO_CHOICES = [ - ('Contratto', 'Contratto'), - ('KYC', 'KYC'), - ('Report', 'Report'), - ('Altro', 'Altro'), - ] - cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='documenti') - Nome_Documento = models.CharField(max_length=100) - Tipo = models.CharField(max_length=20, choices=TIPO_CHOICES) - Data_Caricamento = models.DateField(auto_now_add=True) - Data_di_Scadenza = models.DateField(blank=True, null=True) - File = models.FileField(upload_to='documenti/') # Placeholder, will be configured for S3 - Condivisibile = models.BooleanField(default=False) - - def __str__(self): - return f"{self.Nome_Documento} ({self.cliente})" \ No newline at end of file + return f"{self.nome} {self.cognome}" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html deleted file mode 100644 index 2e81fe0..0000000 --- a/core/templates/base.html +++ /dev/null @@ -1,35 +0,0 @@ - - -
- -Codice Fiscale: {{ object.Codice_Fiscale }}
-Email: {{ object.Email }}
-Telefono: {{ object.Telefono }}
-Data di Nascita: {{ object.Data_di_Nascita }}
-Lavoro: {{ object.Lavoro }}
-Stato: {{ object.Stato }}
-Categoria: {{ object.Categoria }}
-Importo Portafoglio Attuale: € {{ object.Importo_Portafoglio_Attuale }}
-| Nome Portafoglio | -Profilo di Rischio | -Valore Iniziale | -Valore Corrente | -Data Inizio | -Azioni | -
|---|---|---|---|---|---|
| {{ portafoglio.Nome_Portafoglio }} | -{{ portafoglio.Profilo_di_Rischio }} | -€ {{ portafoglio.Valore_Iniziale }} | -€ {{ portafoglio.Valore_Corrente }} | -{{ portafoglio.Data_Inizio }} | -- Modifica - Elimina - | -
| Nessun portafoglio trovato. | -|||||
| Data | -Ora | -Tipo | -Stato | -Note | -Azioni | -
|---|---|---|---|---|---|
| {{ attivita_item.Data }} | -{{ attivita_item.Ora|default_if_none:'' }} | -{{ attivita_item.Tipo }} | -{{ attivita_item.Stato }} | -{{ attivita_item.Note }} | -- Modifica - Elimina - | -
| Nessuna attività trovata. | -|||||
| Nome Documento | -Tipo | -Data Caricamento | -Data di Scadenza | -File | -Azioni | -
|---|---|---|---|---|---|
| {{ documento.Nome_Documento }} | -{{ documento.Tipo }} | -{{ documento.Data_Caricamento }} | -{{ documento.Data_di_Scadenza|default_if_none:'' }} | -Scarica | -- Modifica - Elimina - | -
| Nessun documento trovato. | -|||||
Are you sure you want to delete {{ object.Nome }} {{ object.Cognome }}?
+Sei sicuro di voler eliminare il cliente "{{ object }}"?
-Codice Fiscale: {{ object.codice_fiscale }}
+Email: {{ object.email }}
+Telefono: {{ object.telefono }} (WhatsApp)
+Data di Nascita: {{ object.data_di_nascita }}
+Lavoro: {{ object.lavoro }}
+Stato: {{ object.stato }}
+Categoria: {{ object.categoria }}
+Importo Portafoglio Attuale: €{{ object.importo_portafoglio_attuale }}
+| Nome | +Cognome | +Stato | +Azioni | +|
|---|---|---|---|---|
| {{ cliente.nome }} | +{{ cliente.cognome }} | +{{ cliente.email }} | +{{ cliente.stato }} | ++ Dettagli + Modifica + Elimina + | +
| Nome | -Cognome | -Codice Fiscale | -Telefono | -Stato | -Categoria | -Actions | -|
|---|---|---|---|---|---|---|---|
| {{ cliente.Nome }} | -{{ cliente.Cognome }} | -{{ cliente.Codice_Fiscale }} | -{{ cliente.Email }} | -{{ cliente.Telefono }} | -{{ cliente.Stato }} | -{{ cliente.Categoria }} | -- Details - Edit - Delete - | -
Benvenuto nel tuo CRM. Gestisci clienti, portafogli e attività da un unico posto.
+