feat: Real data integration - Repository pattern, DTOs, REST services, dashboard metrics

This commit is contained in:
dahoud
2025-12-06 23:48:42 +00:00
parent a5206eb7d9
commit f95d44d343
23 changed files with 1885 additions and 2100 deletions

View File

@@ -21,20 +21,16 @@ import java.util.List;
*/
@Entity
@Table(name = "clients", indexes = {
@Index(name = "idx_clients_user_id", columnList = "user_id", unique = true),
@Index(name = "idx_clients_company", columnList = "company_name"),
@Index(name = "idx_clients_status", columnList = "status"),
@Index(name = "idx_clients_deleted", columnList = "deleted")
@Index(name = "idx_clients_user_id", columnList = "user_id", unique = true),
@Index(name = "idx_clients_company", columnList = "company_name"),
@Index(name = "idx_clients_status", columnList = "status"),
@Index(name = "idx_clients_deleted", columnList = "deleted")
})
@NamedQueries({
@NamedQuery(name = "Client.findByUserId",
query = "SELECT c FROM Client c WHERE c.user.id = :userId AND c.deleted = false"),
@NamedQuery(name = "Client.findByStatus",
query = "SELECT c FROM Client c WHERE c.status = :status AND c.deleted = false"),
@NamedQuery(name = "Client.findByCompanyName",
query = "SELECT c FROM Client c WHERE LOWER(c.companyName) LIKE LOWER(:companyName) AND c.deleted = false"),
@NamedQuery(name = "Client.findActiveClients",
query = "SELECT c FROM Client c WHERE c.status = 'ACTIVE' AND c.deleted = false")
@NamedQuery(name = "Client.findByUserId", query = "SELECT c FROM Client c WHERE c.user.id = :userId AND c.deleted = false"),
@NamedQuery(name = "Client.findByStatus", query = "SELECT c FROM Client c WHERE c.status = :status AND c.deleted = false"),
@NamedQuery(name = "Client.findByCompanyName", query = "SELECT c FROM Client c WHERE LOWER(c.companyName) LIKE LOWER(:companyName) AND c.deleted = false"),
@NamedQuery(name = "Client.findActiveClients", query = "SELECT c FROM Client c WHERE c.status = 'ACTIVE' AND c.deleted = false")
})
public class Client extends BaseEntity {
@@ -50,8 +46,7 @@ public class Client extends BaseEntity {
* Relation one-to-one obligatoire.
*/
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", nullable = false, unique = true,
foreignKey = @ForeignKey(name = "fk_clients_user_id"))
@JoinColumn(name = "user_id", nullable = false, unique = true, foreignKey = @ForeignKey(name = "fk_clients_user_id"))
@NotNull(message = "L'utilisateur associé est obligatoire")
private User user;
@@ -82,6 +77,20 @@ public class Client extends BaseEntity {
@Column(name = "annual_revenue", precision = 15, scale = 2)
private BigDecimal annualRevenue;
/**
* Devise du chiffre d'affaires.
*/
@Column(name = "revenue_currency", length = 3)
@Size(min = 3, max = 3, message = "Le code devise doit faire 3 caractères")
private String revenueCurrency = "USD";
/**
* Locale préférée.
*/
@Column(name = "preferred_locale", length = 20)
@Size(max = 20, message = "La locale ne peut pas dépasser 20 caractères")
private String preferredLocale = "fr-FR";
/**
* Adresse de l'entreprise - ligne 1.
*/
@@ -199,7 +208,7 @@ public class Client extends BaseEntity {
/**
* Constructeur avec les champs obligatoires.
*
* @param user l'utilisateur associé
* @param user l'utilisateur associé
* @param companyName le nom de l'entreprise
*/
public Client(User user, String companyName) {
@@ -251,36 +260,41 @@ public class Client extends BaseEntity {
*/
public String getFullAddress() {
StringBuilder address = new StringBuilder();
if (addressLine1 != null && !addressLine1.trim().isEmpty()) {
address.append(addressLine1);
}
if (addressLine2 != null && !addressLine2.trim().isEmpty()) {
if (address.length() > 0) address.append(", ");
if (address.length() > 0)
address.append(", ");
address.append(addressLine2);
}
if (city != null && !city.trim().isEmpty()) {
if (address.length() > 0) address.append(", ");
if (address.length() > 0)
address.append(", ");
address.append(city);
}
if (state != null && !state.trim().isEmpty()) {
if (address.length() > 0) address.append(", ");
if (address.length() > 0)
address.append(", ");
address.append(state);
}
if (postalCode != null && !postalCode.trim().isEmpty()) {
if (address.length() > 0) address.append(" ");
if (address.length() > 0)
address.append(" ");
address.append(postalCode);
}
if (country != null && !country.trim().isEmpty()) {
if (address.length() > 0) address.append(", ");
if (address.length() > 0)
address.append(", ");
address.append(country);
}
return address.toString();
}
@@ -392,6 +406,22 @@ public class Client extends BaseEntity {
this.annualRevenue = annualRevenue;
}
public String getRevenueCurrency() {
return revenueCurrency;
}
public void setRevenueCurrency(String revenueCurrency) {
this.revenueCurrency = revenueCurrency;
}
public String getPreferredLocale() {
return preferredLocale;
}
public void setPreferredLocale(String preferredLocale) {
this.preferredLocale = preferredLocale;
}
public String getAddressLine1() {
return addressLine1;
}