From 6893b44b3d4c3b978d82fea91ab0655c90753457 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C2=A8Rafael?= <¨rafaelkaua97@gmail.com¨>
Date: Tue, 21 Oct 2025 22:12:59 -0300
Subject: [PATCH 01/27] FIN-43 adding Title entity
---
.../TitleCategories/Entities/TitleCategory.cs | 3 ++
.../Entities/TitleTitleCategory.cs | 12 +++++++
Fin.Domain/Titles/Entities/Title.cs | 31 +++++++++++++++++++
Fin.Domain/Titles/Enums/TitleType.cs | 7 +++++
Fin.Domain/Wallets/Entities/Wallet.cs | 2 ++
.../CreditCards/CreditCardConfiguration.cs | 6 ++--
.../TitleCategoryConfiguration.cs | 17 ++++++++++
.../Titles/TitleConfiguration.cs | 31 +++++++++++++++++++
Fin.Infrastructure/Database/FinDbContext.cs | 6 +++-
9 files changed, 111 insertions(+), 4 deletions(-)
create mode 100644 Fin.Domain/TitleCategories/Entities/TitleTitleCategory.cs
create mode 100644 Fin.Domain/Titles/Entities/Title.cs
create mode 100644 Fin.Domain/Titles/Enums/TitleType.cs
create mode 100644 Fin.Infrastructure/Database/Configurations/Titles/TitleConfiguration.cs
diff --git a/Fin.Domain/TitleCategories/Entities/TitleCategory.cs b/Fin.Domain/TitleCategories/Entities/TitleCategory.cs
index 605bbe2..d772ff8 100644
--- a/Fin.Domain/TitleCategories/Entities/TitleCategory.cs
+++ b/Fin.Domain/TitleCategories/Entities/TitleCategory.cs
@@ -1,6 +1,7 @@
using Fin.Domain.Global.Interfaces;
using Fin.Domain.TitleCategories.Dtos;
using Fin.Domain.TitleCategories.Enums;
+using Fin.Domain.Titles.Entities;
namespace Fin.Domain.TitleCategories.Entities;
@@ -19,6 +20,8 @@ public class TitleCategory: IAuditedTenantEntity
public DateTime UpdatedAt { get; set; }
public Guid TenantId { get; set; }
+ public virtual ICollection
Titles { get; set; }
+
public TitleCategory()
{
}
diff --git a/Fin.Domain/TitleCategories/Entities/TitleTitleCategory.cs b/Fin.Domain/TitleCategories/Entities/TitleTitleCategory.cs
new file mode 100644
index 0000000..99a99ae
--- /dev/null
+++ b/Fin.Domain/TitleCategories/Entities/TitleTitleCategory.cs
@@ -0,0 +1,12 @@
+using Fin.Domain.Titles.Entities;
+
+namespace Fin.Domain.TitleCategories.Entities;
+
+public class TitleTitleCategory
+{
+ public Guid TitleId { get; set; }
+ public virtual Title Title { get; set; }
+
+ public Guid TitleCategoryId { get; set; }
+ public virtual TitleCategory TitleCategory { get; set; }
+}
\ No newline at end of file
diff --git a/Fin.Domain/Titles/Entities/Title.cs b/Fin.Domain/Titles/Entities/Title.cs
new file mode 100644
index 0000000..2cb3b86
--- /dev/null
+++ b/Fin.Domain/Titles/Entities/Title.cs
@@ -0,0 +1,31 @@
+using Fin.Domain.Global.Interfaces;
+using Fin.Domain.TitleCategories.Entities;
+using Fin.Domain.Titles.Enums;
+using Fin.Domain.Wallets.Entities;
+
+namespace Fin.Domain.Titles.Entities;
+
+public class Title: IAuditedTenantEntity
+{
+ public decimal Value { get; set; }
+ public TitleType Type { get; set; }
+
+ public string Description { get; set; }
+ public decimal PreviousBalance { get; set; }
+ public DateTime Date { get; set; }
+ public Guid WalletId { get; set; }
+
+
+ public decimal ResultingBalance => PreviousBalance + (Value * (Type == TitleType.Expense ? -1 : 1));
+
+ public virtual Wallet Wallet { get; set; }
+ public virtual ICollection TitleCategories { get; set; }
+
+
+ public Guid Id { get; set; }
+ public Guid CreatedBy { get; set; }
+ public Guid UpdatedBy { get; set; }
+ public DateTime CreatedAt { get; set; }
+ public DateTime UpdatedAt { get; set; }
+ public Guid TenantId { get; set; }
+}
\ No newline at end of file
diff --git a/Fin.Domain/Titles/Enums/TitleType.cs b/Fin.Domain/Titles/Enums/TitleType.cs
new file mode 100644
index 0000000..6beb346
--- /dev/null
+++ b/Fin.Domain/Titles/Enums/TitleType.cs
@@ -0,0 +1,7 @@
+namespace Fin.Domain.Titles.Enums;
+
+public enum TitleType: byte
+{
+ Expense = 0,
+ Income = 1
+}
\ No newline at end of file
diff --git a/Fin.Domain/Wallets/Entities/Wallet.cs b/Fin.Domain/Wallets/Entities/Wallet.cs
index 613bdee..7c5224f 100644
--- a/Fin.Domain/Wallets/Entities/Wallet.cs
+++ b/Fin.Domain/Wallets/Entities/Wallet.cs
@@ -1,6 +1,7 @@
using Fin.Domain.CreditCards.Entities;
using Fin.Domain.FinancialInstitutions.Entities;
using Fin.Domain.Global.Interfaces;
+using Fin.Domain.Titles.Entities;
using Fin.Domain.Wallets.Dtos;
namespace Fin.Domain.Wallets.Entities;
@@ -27,6 +28,7 @@ public class Wallet: IAuditedTenantEntity
public virtual ICollection CreditCards { get; set; }
+ public virtual ICollection Titles { get; set; }
public Wallet()
{
diff --git a/Fin.Infrastructure/Database/Configurations/CreditCards/CreditCardConfiguration.cs b/Fin.Infrastructure/Database/Configurations/CreditCards/CreditCardConfiguration.cs
index 1ff6919..98fca65 100644
--- a/Fin.Infrastructure/Database/Configurations/CreditCards/CreditCardConfiguration.cs
+++ b/Fin.Infrastructure/Database/Configurations/CreditCards/CreditCardConfiguration.cs
@@ -25,21 +25,21 @@ public void Configure(EntityTypeBuilder builder)
.HasOne(creditCard => creditCard.FinancialInstitution)
.WithMany(financialInstitution => financialInstitution.CreditCards)
.HasForeignKey(creditCard => creditCard.FinancialInstitutionId)
- .IsRequired(false)
+ .IsRequired()
.OnDelete(DeleteBehavior.Restrict);
builder
.HasOne(creditCard => creditCard.CardBrand)
.WithMany(cardBrand => cardBrand.CreditCards)
.HasForeignKey(creditCard => creditCard.CardBrandId)
- .IsRequired(false)
+ .IsRequired()
.OnDelete(DeleteBehavior.Restrict);
builder
.HasOne(creditCard => creditCard.DebitWallet)
.WithMany(debitWallet => debitWallet.CreditCards)
.HasForeignKey(creditCard => creditCard.DebitWalletId)
- .IsRequired(false)
+ .IsRequired()
.OnDelete(DeleteBehavior.Restrict);
}
}
\ No newline at end of file
diff --git a/Fin.Infrastructure/Database/Configurations/TitleCategories/TitleCategoryConfiguration.cs b/Fin.Infrastructure/Database/Configurations/TitleCategories/TitleCategoryConfiguration.cs
index 1c91c66..bc04087 100644
--- a/Fin.Infrastructure/Database/Configurations/TitleCategories/TitleCategoryConfiguration.cs
+++ b/Fin.Infrastructure/Database/Configurations/TitleCategories/TitleCategoryConfiguration.cs
@@ -1,4 +1,5 @@
using Fin.Domain.TitleCategories.Entities;
+using Fin.Domain.Titles.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
@@ -15,5 +16,21 @@ public void Configure(EntityTypeBuilder builder)
builder.Property(x => x.Color).HasMaxLength(20).IsRequired();
builder.HasIndex(x => new {x.Name, x.TenantId}).IsUnique();
+
+ builder
+ .HasMany(x => x.Titles)
+ .WithMany(x => x.TitleCategories)
+ .UsingEntity(
+ l => l
+ .HasOne(ttc => ttc.Title)
+ .WithMany()
+ .HasForeignKey(e => e.TitleId)
+ .OnDelete(DeleteBehavior.Cascade),
+ r => r
+ .HasOne(ttc => ttc.TitleCategory)
+ .WithMany()
+ .HasForeignKey(e => e.TitleCategoryId)
+ .OnDelete(DeleteBehavior.Cascade)
+ );
}
}
\ No newline at end of file
diff --git a/Fin.Infrastructure/Database/Configurations/Titles/TitleConfiguration.cs b/Fin.Infrastructure/Database/Configurations/Titles/TitleConfiguration.cs
new file mode 100644
index 0000000..00f0d57
--- /dev/null
+++ b/Fin.Infrastructure/Database/Configurations/Titles/TitleConfiguration.cs
@@ -0,0 +1,31 @@
+using Fin.Domain.Titles.Entities;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Fin.Infrastructure.Database.Configurations.Titles;
+
+public class TitleConfiguration: IEntityTypeConfiguration
+{
+ public void Configure(EntityTypeBuilder builder)
+ {
+ builder.HasKey(x => x.Id);
+
+ builder.Property(x => x.Description).HasMaxLength(100).IsRequired();
+
+ builder
+ .Property(title => title.PreviousBalance)
+ .HasColumnType("numeric(19,4)")
+ .HasPrecision(19, 4);
+ builder
+ .Property(title => title.Value)
+ .HasColumnType("numeric(19,4)")
+ .HasPrecision(19, 4);
+
+ builder
+ .HasOne(title => title.Wallet)
+ .WithMany(wallet => wallet.Titles)
+ .HasForeignKey(title => title.WalletId)
+ .IsRequired()
+ .OnDelete(DeleteBehavior.Restrict);
+ }
+}
\ No newline at end of file
diff --git a/Fin.Infrastructure/Database/FinDbContext.cs b/Fin.Infrastructure/Database/FinDbContext.cs
index f45101a..c1c2d5e 100644
--- a/Fin.Infrastructure/Database/FinDbContext.cs
+++ b/Fin.Infrastructure/Database/FinDbContext.cs
@@ -6,6 +6,7 @@
using Fin.Domain.Notifications.Entities;
using Fin.Domain.Tenants.Entities;
using Fin.Domain.TitleCategories.Entities;
+using Fin.Domain.Titles.Entities;
using Fin.Domain.Users.Entities;
using Fin.Domain.Wallets.Entities;
using Fin.Infrastructure.AmbientDatas;
@@ -31,9 +32,12 @@ public class FinDbContext : DbContext
public DbSet