initial commit

This commit is contained in:
2026-07-21 13:59:38 +07:00
commit c40792266a
1321 changed files with 100465 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Interfaces;
using Indotalent.Shared.Utils;
using System.ComponentModel.DataAnnotations;
namespace Indotalent.Data.Abstracts;
public abstract class BaseEntity : IHasAudit, IHasIsDeleted
{
[Key]
public string Id { get; set; } = SequentialGuidGenerator.NewSequentialId();
public DateTimeOffset? CreatedAt { get; set; }
public string? CreatedBy { get; set; }
public DateTimeOffset? UpdatedAt { get; set; }
public string? UpdatedBy { get; set; }
public bool IsDeleted { get; set; } = false;
}
+41
View File
@@ -0,0 +1,41 @@
using Indotalent.Data.Interfaces;
using Microsoft.AspNetCore.Identity;
namespace Indotalent.Data.Entities;
public class ApplicationUser : IdentityUser, IHasIsDeleted
{
public string? FullName { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? ShortBio { get; set; }
public string? JobTitle { get; set; }
public DateTime DateOfBirth { get; set; }
public string? StreetAddress { get; set; }
public string? City { get; set; }
public string? StateProvince { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string SocialMediaLinkedIn { get; set; } = string.Empty;
public string SocialMediaX { get; set; } = string.Empty;
public string SocialMediaFacebook { get; set; } = string.Empty;
public string SocialMediaInstagram { get; set; } = string.Empty;
public string SocialMediaTikTok { get; set; } = string.Empty;
public string OtherInformation1 { get; set; } = string.Empty;
public string OtherInformation2 { get; set; } = string.Empty;
public string OtherInformation3 { get; set; } = string.Empty;
public string? SsoIdFirebase { get; set; }
public string? SsoIdKeycloak { get; set; }
public string? SsoIdAzure { get; set; }
public string? SsoIdAws { get; set; }
public string? SsoIdOther1 { get; set; }
public string? SsoIdOther2 { get; set; }
public string? SsoIdOther3 { get; set; }
public DateTime CreatedAt { get; set; } = DateTime.Now;
public DateTime? LastLoginAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public bool IsActive { get; set; } = true;
public bool IsDeleted { get; set; } = false;
public string? AvatarFile { get; set; }
public string? RefreshToken { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Infrastructure.AutoNumberGenerator;
namespace Indotalent.Data.Entities;
public class AutoNumberSequence : BaseEntity, IAutoNumberGenerator
{
public string? EntityName { get; set; }
public int? Year { get; set; }
public int? Month { get; set; }
public long? CurrentSequence { get; set; }
public string? PrefixTemplate { get; set; }
public string? SuffixTemplate { get; set; }
public int? PaddingLength { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Bill : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? BillDate { get; set; }
public BillStatus BillStatus { get; set; }
public string? Description { get; set; }
public string? PurchaseOrderId { get; set; }
public PurchaseOrder? PurchaseOrder { get; set; }
}
+27
View File
@@ -0,0 +1,27 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Booking : BaseEntity, IHasAutoNumber
{
public string? Subject { get; set; }
public string? AutoNumber { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public string? StartTimezone { get; set; }
public string? EndTimezone { get; set; }
public string? Location { get; set; }
public string? Description { get; set; }
public bool? IsAllDay { get; set; }
public bool? IsReadOnly { get; set; }
public bool? IsBlock { get; set; }
public string? RecurrenceRule { get; set; }
public string? RecurrenceID { get; set; }
public string? FollowingID { get; set; }
public string? RecurrenceException { get; set; }
public BookingStatus Status { get; set; }
public string? BookingResourceId { get; set; }
public BookingResource? BookingResource { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class BookingGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+12
View File
@@ -0,0 +1,12 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class BookingResource : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? BookingGroupId { get; set; }
public BookingGroup? BookingGroup { get; set; }
}
+17
View File
@@ -0,0 +1,17 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Budget : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public DateTime? BudgetDate { get; set; }
public BudgetStatus Status { get; set; }
public decimal? Amount { get; set; }
public string? CampaignId { get; set; }
public Campaign? Campaign { get; set; }
}
+21
View File
@@ -0,0 +1,21 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Campaign : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public decimal? TargetRevenueAmount { get; set; }
public DateTime? CampaignDateStart { get; set; }
public DateTime? CampaignDateFinish { get; set; }
public CampaignStatus Status { get; set; }
public string? SalesTeamId { get; set; }
public SalesTeam? SalesTeam { get; set; }
public ICollection<Budget> BudgetList { get; set; } = new List<Budget>();
public ICollection<Expense> ExpenseList { get; set; } = new List<Expense>();
public ICollection<Lead> LeadList { get; set; } = new List<Lead>();
}
+31
View File
@@ -0,0 +1,31 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Company : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public bool IsDefault { get; set; } = false;
public string CurrencyId { get; set; } = string.Empty;
public Currency? Currency { get; set; }
public string TaxIdentification { get; set; } = string.Empty;
public string BusinessLicense { get; set; } = string.Empty;
public string CompanyLogo { get; set; } = string.Empty;
public string StreetAddress { get; set; } = string.Empty;
public string City { get; set; } = string.Empty;
public string StateProvince { get; set; } = string.Empty;
public string ZipCode { get; set; } = string.Empty;
public string Phone { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
public string SocialMediaLinkedIn { get; set; } = string.Empty;
public string SocialMediaX { get; set; } = string.Empty;
public string SocialMediaFacebook { get; set; } = string.Empty;
public string SocialMediaInstagram { get; set; } = string.Empty;
public string SocialMediaTikTok { get; set; } = string.Empty;
public string OtherInformation1 { get; set; } = string.Empty;
public string OtherInformation2 { get; set; } = string.Empty;
public string OtherInformation3 { get; set; } = string.Empty;
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class CreditNote : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? CreditNoteDate { get; set; }
public CreditNoteStatus CreditNoteStatus { get; set; }
public string? Description { get; set; }
public string? SalesReturnId { get; set; }
public SalesReturn? SalesReturn { get; set; }
}
+14
View File
@@ -0,0 +1,14 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Currency : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? Code { get; set; }
public string? Symbol { get; set; }
public string? CountryOwner { get; set; }
}
+31
View File
@@ -0,0 +1,31 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Customer : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? Description { get; set; }
public string? Street { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Instagram { get; set; }
public string? TwitterX { get; set; }
public string? TikTok { get; set; }
public string? CustomerGroupId { get; set; }
public CustomerGroup? CustomerGroup { get; set; }
public string? CustomerCategoryId { get; set; }
public CustomerCategory? CustomerCategory { get; set; }
public ICollection<CustomerContact> CustomerContactList { get; set; } = new List<CustomerContact>();
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class CustomerCategory : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class CustomerContact : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? JobTitle { get; set; }
public string? PhoneNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Description { get; set; }
public string? CustomerId { get; set; }
public Customer? Customer { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class CustomerGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class DebitNote : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? DebitNoteDate { get; set; }
public DebitNoteStatus DebitNoteStatus { get; set; }
public string? Description { get; set; }
public string? PurchaseReturnId { get; set; }
public PurchaseReturn? PurchaseReturn { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class DeliveryOrder : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? DeliveryDate { get; set; }
public DeliveryOrderStatus Status { get; set; }
public string? Description { get; set; }
public string? SalesOrderId { get; set; }
public SalesOrder? SalesOrder { get; set; }
}
+17
View File
@@ -0,0 +1,17 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Expense : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public DateTime? ExpenseDate { get; set; }
public ExpenseStatus Status { get; set; }
public decimal? Amount { get; set; }
public string? CampaignId { get; set; }
public Campaign? Campaign { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class GoodsReceive : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? ReceiveDate { get; set; }
public GoodsReceiveStatus Status { get; set; }
public string? Description { get; set; }
public string? PurchaseOrderId { get; set; }
public PurchaseOrder? PurchaseOrder { get; set; }
}
+30
View File
@@ -0,0 +1,30 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class InventoryTransaction : BaseEntity, IHasAutoNumber
{
public string? ModuleId { get; set; }
public string? ModuleName { get; set; }
public string? ModuleCode { get; set; }
public string? ModuleNumber { get; set; }
public DateTime? MovementDate { get; set; }
public InventoryTransactionStatus Status { get; set; }
public string? AutoNumber { get; set; }
public string? WarehouseId { get; set; }
public Warehouse? Warehouse { get; set; }
public string? ProductId { get; set; }
public Product? Product { get; set; }
public double? Movement { get; set; }
public InventoryTransType? TransType { get; set; }
public double? Stock { get; set; }
public string? WarehouseFromId { get; set; }
public Warehouse? WarehouseFrom { get; set; }
public string? WarehouseToId { get; set; }
public Warehouse? WarehouseTo { get; set; }
public double? QtySCSys { get; set; }
public double? QtySCCount { get; set; }
public double? QtySCDelta { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Invoice : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? InvoiceDate { get; set; }
public InvoiceStatus InvoiceStatus { get; set; }
public string? Description { get; set; }
public string? SalesOrderId { get; set; }
public SalesOrder? SalesOrder { get; set; }
}
+46
View File
@@ -0,0 +1,46 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Lead : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public string? CompanyName { get; set; }
public string? CompanyDescription { get; set; }
public string? CompanyAddressStreet { get; set; }
public string? CompanyAddressCity { get; set; }
public string? CompanyAddressState { get; set; }
public string? CompanyAddressZipCode { get; set; }
public string? CompanyAddressCountry { get; set; }
public string? CompanyPhoneNumber { get; set; }
public string? CompanyFaxNumber { get; set; }
public string? CompanyEmail { get; set; }
public string? CompanyWebsite { get; set; }
public string? CompanyWhatsApp { get; set; }
public string? CompanyLinkedIn { get; set; }
public string? CompanyFacebook { get; set; }
public string? CompanyInstagram { get; set; }
public string? CompanyTwitter { get; set; }
public DateTime? DateProspecting { get; set; }
public DateTime? DateClosingEstimation { get; set; }
public DateTime? DateClosingActual { get; set; }
public decimal? AmountTargeted { get; set; }
public decimal? AmountClosed { get; set; }
public decimal? BudgetScore { get; set; }
public decimal? AuthorityScore { get; set; }
public decimal? NeedScore { get; set; }
public decimal? TimelineScore { get; set; }
public PipelineStage PipelineStage { get; set; }
public ClosingStatus ClosingStatus { get; set; }
public string? ClosingNote { get; set; }
public string? CampaignId { get; set; }
public Campaign? Campaign { get; set; }
public string? SalesTeamId { get; set; }
public SalesTeam? SalesTeam { get; set; }
public ICollection<LeadContact> LeadContacts { get; set; } = new List<LeadContact>();
public ICollection<LeadActivity> LeadActivities { get; set; } = new List<LeadActivity>();
}
+18
View File
@@ -0,0 +1,18 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class LeadActivity : BaseEntity, IHasAutoNumber
{
public string? LeadId { get; set; }
public Lead? Lead { get; set; }
public string? AutoNumber { get; set; }
public string? Summary { get; set; }
public string? Description { get; set; }
public DateTime? FromDate { get; set; }
public DateTime? ToDate { get; set; }
public LeadActivityType Type { get; set; }
public string? AttachmentName { get; set; }
}
+29
View File
@@ -0,0 +1,29 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class LeadContact : BaseEntity, IHasAutoNumber
{
public string? LeadId { get; set; }
public Lead? Lead { get; set; }
public string? AutoNumber { get; set; }
public string? FullName { get; set; }
public string? Description { get; set; }
public string? AddressStreet { get; set; }
public string? AddressCity { get; set; }
public string? AddressState { get; set; }
public string? AddressZipCode { get; set; }
public string? AddressCountry { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? MobileNumber { get; set; }
public string? Email { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Twitter { get; set; }
public string? Instagram { get; set; }
public string? AvatarName { get; set; }
}
+13
View File
@@ -0,0 +1,13 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class NegativeAdjustment : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? AdjustmentDate { get; set; }
public AdjustmentStatus Status { get; set; }
public string? Description { get; set; }
}
+18
View File
@@ -0,0 +1,18 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class PaymentDisburse : BaseEntity, IHasAutoNumber
{
public string? BillId { get; set; }
public Bill? Bill { get; set; }
public string? AutoNumber { get; set; }
public string? Description { get; set; }
public DateTime? PaymentDate { get; set; }
public string? PaymentMethodId { get; set; }
public PaymentMethod? PaymentMethod { get; set; }
public decimal? PaymentAmount { get; set; }
public PaymentDisburseStatus Status { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class PaymentMethod : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+18
View File
@@ -0,0 +1,18 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class PaymentReceive : BaseEntity, IHasAutoNumber
{
public string? InvoiceId { get; set; }
public Invoice? Invoice { get; set; }
public string? AutoNumber { get; set; }
public string? Description { get; set; }
public DateTime? PaymentDate { get; set; }
public string? PaymentMethodId { get; set; }
public PaymentMethod? PaymentMethod { get; set; }
public decimal? PaymentAmount { get; set; }
public PaymentReceiveStatus Status { get; set; }
}
+13
View File
@@ -0,0 +1,13 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class PositiveAdjustment : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? AdjustmentDate { get; set; }
public AdjustmentStatus Status { get; set; }
public string? Description { get; set; }
}
+17
View File
@@ -0,0 +1,17 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Product : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? Description { get; set; }
public decimal? UnitPrice { get; set; }
public bool? Physical { get; set; } = true;
public string? UnitMeasureId { get; set; }
public UnitMeasure? UnitMeasure { get; set; }
public string? ProductGroupId { get; set; }
public ProductGroup? ProductGroup { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class ProductGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class ProgramManager : BaseEntity, IHasAutoNumber
{
public string? Title { get; set; }
public string? AutoNumber { get; set; }
public string? Summary { get; set; }
public ProgramManagerStatus Status { get; set; }
public ProgramManagerPriority Priority { get; set; }
public string? ProgramManagerResourceId { get; set; }
public ProgramManagerResource? ProgramManagerResource { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class ProgramManagerResource : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+22
View File
@@ -0,0 +1,22 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
using System.Numerics;
namespace Indotalent.Data.Entities;
public class PurchaseOrder : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? OrderDate { get; set; }
public PurchaseOrderStatus OrderStatus { get; set; }
public string? Description { get; set; }
public string? VendorId { get; set; }
public Vendor? Vendor { get; set; }
public string? TaxId { get; set; }
public Tax? Tax { get; set; }
public decimal? BeforeTaxAmount { get; set; }
public decimal? TaxAmount { get; set; }
public decimal? AfterTaxAmount { get; set; }
public ICollection<PurchaseOrderItem> PurchaseOrderItemList { get; set; } = new List<PurchaseOrderItem>();
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class PurchaseOrderItem : BaseEntity
{
public string? PurchaseOrderId { get; set; }
public PurchaseOrder? PurchaseOrder { get; set; }
public string? ProductId { get; set; }
public Product? Product { get; set; }
public string? Summary { get; set; }
public decimal? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public decimal? Total { get; set; } = 0;
}
+22
View File
@@ -0,0 +1,22 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
using System.Numerics;
namespace Indotalent.Data.Entities;
public class PurchaseRequisition : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? RequisitionDate { get; set; }
public PurchaseRequisitionStatus RequisitionStatus { get; set; }
public string? Description { get; set; }
public string? VendorId { get; set; }
public Vendor? Vendor { get; set; }
public string? TaxId { get; set; }
public Tax? Tax { get; set; }
public decimal? BeforeTaxAmount { get; set; }
public decimal? TaxAmount { get; set; }
public decimal? AfterTaxAmount { get; set; }
public ICollection<PurchaseRequisitionItem> PurchaseRequisitionItemList { get; set; } = new List<PurchaseRequisitionItem>();
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class PurchaseRequisitionItem : BaseEntity
{
public string? PurchaseRequisitionId { get; set; }
public PurchaseRequisition? PurchaseRequisition { get; set; }
public string? ProductId { get; set; }
public Product? Product { get; set; }
public string? Summary { get; set; }
public decimal? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public decimal? Total { get; set; } = 0;
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class PurchaseReturn : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? ReturnDate { get; set; }
public PurchaseReturnStatus Status { get; set; }
public string? Description { get; set; }
public string? GoodsReceiveId { get; set; }
public GoodsReceive? GoodsReceive { get; set; }
}
+21
View File
@@ -0,0 +1,21 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class SalesOrder : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? OrderDate { get; set; }
public SalesOrderStatus OrderStatus { get; set; }
public string? Description { get; set; }
public string? CustomerId { get; set; }
public Customer? Customer { get; set; }
public string? TaxId { get; set; }
public Tax? Tax { get; set; }
public decimal? BeforeTaxAmount { get; set; }
public decimal? TaxAmount { get; set; }
public decimal? AfterTaxAmount { get; set; }
public ICollection<SalesOrderItem> SalesOrderItemList { get; set; } = new List<SalesOrderItem>();
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class SalesOrderItem : BaseEntity
{
public string? SalesOrderId { get; set; }
public SalesOrder? SalesOrder { get; set; }
public string? ProductId { get; set; }
public Product? Product { get; set; }
public string? Summary { get; set; }
public decimal? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public decimal? Total { get; set; } = 0;
}
+21
View File
@@ -0,0 +1,21 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class SalesQuotation : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? QuotationDate { get; set; }
public SalesQuotationStatus QuotationStatus { get; set; }
public string? Description { get; set; }
public string? CustomerId { get; set; }
public Customer? Customer { get; set; }
public string? TaxId { get; set; }
public Tax? Tax { get; set; }
public decimal? BeforeTaxAmount { get; set; }
public decimal? TaxAmount { get; set; }
public decimal? AfterTaxAmount { get; set; }
public ICollection<SalesQuotationItem> SalesQuotationItemList { get; set; } = new List<SalesQuotationItem>();
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class SalesQuotationItem : BaseEntity
{
public string? SalesQuotationId { get; set; }
public SalesQuotation? SalesQuotation { get; set; }
public string? ProductId { get; set; }
public Product? Product { get; set; }
public string? Summary { get; set; }
public decimal? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public decimal? Total { get; set; } = 0;
}
+17
View File
@@ -0,0 +1,17 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class SalesRepresentative : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? JobTitle { get; set; }
public string? EmployeeNumber { get; set; }
public string? PhoneNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Description { get; set; }
public string? SalesTeamId { get; set; }
public SalesTeam? SalesTeam { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class SalesReturn : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? ReturnDate { get; set; }
public SalesReturnStatus Status { get; set; }
public string? Description { get; set; }
public string? DeliveryOrderId { get; set; }
public DeliveryOrder? DeliveryOrder { get; set; }
}
+11
View File
@@ -0,0 +1,11 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class SalesTeam : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public ICollection<SalesRepresentative> SalesRepresentativeList { get; set; } = new List<SalesRepresentative>();
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class Scrapping : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? ScrappingDate { get; set; }
public ScrappingStatus Status { get; set; }
public string? Description { get; set; }
public string? WarehouseId { get; set; }
public Warehouse? Warehouse { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
namespace Indotalent.Data.Entities;
public class SerilogLogs
{
[Key]
public int Id { get; set; }
public string? Message { get; set; }
public string? MessageTemplate { get; set; }
public string? Level { get; set; }
public DateTimeOffset TimeStamp { get; set; }
public string? Exception { get; set; }
public string? Properties { get; set; }
public string? LogEvent { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class StockCount : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? CountDate { get; set; }
public StockCountStatus Status { get; set; }
public string? Description { get; set; }
public string? WarehouseId { get; set; }
public Warehouse? Warehouse { get; set; }
}
+14
View File
@@ -0,0 +1,14 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Tax : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? Code { get; set; }
public decimal PercentageValue { get; set; }
public string? Category { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Todo : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public bool IsCompleted { get; set; }
public string? Description { get; set; }
public ICollection<TodoItem> TodoItemList { get; set; } = new List<TodoItem>();
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class TodoItem : BaseEntity
{
public string? Name { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public string? Description { get; set; }
public bool IsCompleted { get; set; }
public string? TodoId { get; set; }
public Todo? Todo { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class TransferIn : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? TransferReceiveDate { get; set; }
public TransferStatus Status { get; set; }
public string? Description { get; set; }
public string? TransferOutId { get; set; }
public TransferOut? TransferOut { get; set; }
}
+17
View File
@@ -0,0 +1,17 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
using Indotalent.Data.Enums;
namespace Indotalent.Data.Entities;
public class TransferOut : BaseEntity, IHasAutoNumber
{
public string? AutoNumber { get; set; }
public DateTime? TransferReleaseDate { get; set; }
public TransferStatus Status { get; set; }
public string? Description { get; set; }
public string? WarehouseFromId { get; set; }
public Warehouse? WarehouseFrom { get; set; }
public string? WarehouseToId { get; set; }
public Warehouse? WarehouseTo { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class UnitMeasure : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+31
View File
@@ -0,0 +1,31 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Vendor : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? Description { get; set; }
public string? Street { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Instagram { get; set; }
public string? TwitterX { get; set; }
public string? TikTok { get; set; }
public string? VendorGroupId { get; set; }
public VendorGroup? VendorGroup { get; set; }
public string? VendorCategoryId { get; set; }
public VendorCategory? VendorCategory { get; set; }
public ICollection<VendorContact> VendorContactList { get; set; } = new List<VendorContact>();
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class VendorCategory : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class VendorContact : BaseEntity, IHasAutoNumber
{
public string? Name { get; set; }
public string? AutoNumber { get; set; }
public string? JobTitle { get; set; }
public string? PhoneNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Description { get; set; }
public string? VendorId { get; set; }
public Vendor? Vendor { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class VendorGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+11
View File
@@ -0,0 +1,11 @@
using Indotalent.Data.Abstracts;
using Indotalent.Data.Interfaces;
namespace Indotalent.Data.Entities;
public class Warehouse : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public bool? SystemWarehouse { get; set; } = false;
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum AdjustmentStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+17
View File
@@ -0,0 +1,17 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum BillStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Partial Paid")]
PartialPaid = 3,
[Description("Full Paid")]
FullPaid = 4
}
+17
View File
@@ -0,0 +1,17 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum BookingStatus
{
[Description("Cancelled")]
Cancelled = 0,
[Description("Draft")]
Draft = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("OnProgress")]
OnProgress = 3,
[Description("Done")]
Done = 4
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum BudgetStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+21
View File
@@ -0,0 +1,21 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum CampaignStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("OnProgress")]
OnProgress = 3,
[Description("OnHold")]
OnHold = 4,
[Description("Finished")]
Finished = 5,
[Description("Archived")]
Archived = 6
}
+13
View File
@@ -0,0 +1,13 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum ClosingStatus
{
[Description("ClosedLost")]
ClosedLost = 0,
[Description("ClosedWon")]
ClosedWon = 1,
[Description("OnProgress")]
OnProgress = 2
}
+16
View File
@@ -0,0 +1,16 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum CreditNoteStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum DebitNoteStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum DeliveryOrderStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+16
View File
@@ -0,0 +1,16 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum ExpenseStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum GoodsReceiveStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+11
View File
@@ -0,0 +1,11 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum InventoryTransType
{
[Description("In")]
In = 1,
[Description("Out")]
Out = -1,
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum InventoryTransactionStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+17
View File
@@ -0,0 +1,17 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum InvoiceStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Partial Paid")]
PartialPaid = 3,
[Description("Full Paid")]
FullPaid = 4
}
+19
View File
@@ -0,0 +1,19 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum LeadActivityType
{
[Description("Other")]
Other = 0,
[Description("Phone")]
Phone = 1,
[Description("Email")]
Email = 2,
[Description("Social Media")]
SocialMedia = 3,
[Description("Meeting")]
Meeting = 4,
[Description("Event")]
Event = 5
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PaymentDisburseStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PaymentReceiveStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+21
View File
@@ -0,0 +1,21 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PipelineStage
{
[Description("1. Prospecting")]
Prospecting = 0,
[Description("2. Qualification")]
Qualification = 1,
[Description("3. NeedAnalysis")]
NeedAnalysis = 2,
[Description("4. Proposal")]
Proposal = 3,
[Description("5. Negotiation")]
Negotiation = 4,
[Description("6. DecisionMaking")]
DecisionMaking = 5,
[Description("7. Closed")]
Closed = 6
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum ProgramManagerPriority
{
[Description("Low")]
Low = 0,
[Description("High")]
High = 1,
[Description("Normal")]
Normal = 2,
[Description("Critical")]
Critical = 3
}
+17
View File
@@ -0,0 +1,17 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum ProgramManagerStatus
{
[Description("Cancelled")]
Cancelled = 0,
[Description("Draft")]
Draft = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("OnProgress")]
OnProgress = 3,
[Description("Done")]
Done = 4
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PurchaseOrderStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PurchaseRequisitionStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Ordered")]
Ordered = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum PurchaseReturnStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum SalesOrderStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum SalesQuotationStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Ordered")]
Ordered = 3
}
+16
View File
@@ -0,0 +1,16 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum SalesReturnStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum ScrappingStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum StockCountStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+16
View File
@@ -0,0 +1,16 @@
using System.ComponentModel;
namespace Indotalent.Data.Enums;
public enum TransferStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+9
View File
@@ -0,0 +1,9 @@
namespace Indotalent.Data.Interfaces;
public interface IHasAudit
{
DateTimeOffset? CreatedAt { get; set; }
string? CreatedBy { get; set; }
DateTimeOffset? UpdatedAt { get; set; }
string? UpdatedBy { get; set; }
}
+6
View File
@@ -0,0 +1,6 @@
namespace Indotalent.Data.Interfaces;
public interface IHasAutoNumber
{
string? AutoNumber { get; set; }
}
+6
View File
@@ -0,0 +1,6 @@
namespace Indotalent.Data.Interfaces;
public interface IHasIsDeleted
{
bool IsDeleted { get; set; }
}