refactor: Migrate backend and frontend architecture from a module-based to an app-based structure.

This commit is contained in:
2025-12-05 22:08:52 +01:00
parent ad0ea0c7f8
commit 82d2680f5b
166 changed files with 6171 additions and 1211 deletions

View File

@@ -1,23 +1,23 @@
namespace Zentral.Domain.Entities;
/// <summary>
/// Rappresenta un modulo dell'applicazione (es. Magazzino, Acquisti, Vendite).
/// I moduli possono essere attivati/disattivati per gestire licenze e funzionalità.
/// Rappresenta un'applicazione (es. Magazzino, Acquisti, Vendite).
/// Le applicazioni possono essere attivate/disattivate per gestire licenze e funzionalità.
/// </summary>
public class AppModule : BaseEntity
public class App : BaseEntity
{
/// <summary>
/// Codice univoco del modulo (es. "warehouse", "purchases", "sales")
/// Codice univoco dell'applicazione (es. "warehouse", "purchases", "sales")
/// </summary>
public required string Code { get; set; }
/// <summary>
/// Nome visualizzato del modulo (es. "Magazzino", "Acquisti")
/// Nome visualizzato dell'applicazione (es. "Magazzino", "Acquisti")
/// </summary>
public required string Name { get; set; }
/// <summary>
/// Descrizione estesa delle funzionalità del modulo
/// Descrizione estesa delle funzionalità dell'applicazione
/// </summary>
public string? Description { get; set; }
@@ -27,7 +27,7 @@ public class AppModule : BaseEntity
public string? Icon { get; set; }
/// <summary>
/// Prezzo base annuale del modulo in EUR
/// Prezzo base annuale dell'applicazione in EUR
/// </summary>
public decimal BasePrice { get; set; }
@@ -42,30 +42,30 @@ public class AppModule : BaseEntity
public int SortOrder { get; set; }
/// <summary>
/// Se true, il modulo fa parte del core e non può essere disattivato
/// Se true, l'applicazione fa parte del core e non può essere disattivata
/// </summary>
public bool IsCore { get; set; }
/// <summary>
/// Lista di codici modulo prerequisiti separati da virgola (es. "warehouse,purchases")
/// Lista di codici applicazione prerequisiti separati da virgola (es. "warehouse,purchases")
/// </summary>
public string? Dependencies { get; set; }
/// <summary>
/// Path base per le route frontend del modulo (es. "/warehouse")
/// Path base per le route frontend dell'applicazione (es. "/warehouse")
/// </summary>
public string? RoutePath { get; set; }
/// <summary>
/// Se false, il modulo è nascosto e non disponibile per l'acquisto
/// Se false, l'applicazione è nascosta e non disponibile per l'acquisto
/// </summary>
public bool IsAvailable { get; set; } = true;
// Navigation property
public ModuleSubscription? Subscription { get; set; }
public AppSubscription? Subscription { get; set; }
/// <summary>
/// Restituisce la lista dei codici modulo prerequisiti
/// Restituisce la lista dei codici applicazione prerequisiti
/// </summary>
public IEnumerable<string> GetDependencies()
{

View File

@@ -1,7 +1,7 @@
namespace Zentral.Domain.Entities;
/// <summary>
/// Tipo di abbonamento per un modulo
/// Tipo di abbonamento per un'applicazione
/// </summary>
public enum SubscriptionType
{
@@ -14,18 +14,18 @@ public enum SubscriptionType
}
/// <summary>
/// Rappresenta lo stato di abbonamento/attivazione di un modulo per questa istanza dell'applicazione.
/// Ogni ModuleSubscription è collegata 1:1 con un AppModule.
/// Rappresenta lo stato di abbonamento/attivazione di un'applicazione.
/// Ogni AppSubscription è collegata 1:1 con un'App.
/// </summary>
public class ModuleSubscription : BaseEntity
public class AppSubscription : BaseEntity
{
/// <summary>
/// ID del modulo associato
/// ID dell'applicazione associata
/// </summary>
public int ModuleId { get; set; }
public int AppId { get; set; }
/// <summary>
/// Se true, il modulo è attualmente attivo e accessibile
/// Se true, l'applicazione è attualmente attiva e accessibile
/// </summary>
public bool IsEnabled { get; set; }
@@ -65,7 +65,7 @@ public class ModuleSubscription : BaseEntity
public decimal? PaidPrice { get; set; }
// Navigation property
public AppModule Module { get; set; } = null!;
public App App { get; set; } = null!;
/// <summary>
/// Verifica se l'abbonamento è attualmente valido (attivo e non scaduto)