initial commit

This commit is contained in:
2026-07-21 15:36:49 +07:00
commit 77f66132bc
2640 changed files with 850901 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
namespace Domain.Common;
public class BaseEntity : IHasSequentialId, IHasIsDeleted, IHasAudit
{
public string Id { get; set; } = null!;
public bool IsDeleted { get; set; }
public DateTime? CreatedAtUtc { get; set; }
public string? CreatedById { get; set; }
public DateTime? UpdatedAtUtc { get; set; }
public string? UpdatedById { get; set; }
public BaseEntity()
{
Id = GenerateSequentialGuid();
IsDeleted = false;
}
private static readonly object _lock = new object();
private string GenerateSequentialGuid()
{
byte[] guidArray = Guid.NewGuid().ToByteArray();
DateTime baseDate = new DateTime(1900, 1, 1);
DateTime now = DateTime.UtcNow;
TimeSpan timeSpan = now - baseDate;
byte[] daysArray = BitConverter.GetBytes(timeSpan.Days);
byte[] msecsArray = BitConverter.GetBytes((long)(timeSpan.TotalMilliseconds % 86400000));
if (BitConverter.IsLittleEndian)
{
Array.Reverse(daysArray);
Array.Reverse(msecsArray);
}
lock (_lock)
{
Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);
}
return new Guid(guidArray).ToString();
}
}
+54
View File
@@ -0,0 +1,54 @@
namespace Domain.Common;
public static class Constants
{
public static class LengthConsts
{
public const int S = 50;
public const int M = 255;
public const int L = 2000;
public const int XL = 4000;
}
public static class NameConsts
{
public const int MinLength = 2;
public const int MaxLength = LengthConsts.M;
}
public static class CodeConsts
{
public const int MinLength = 1;
public const int MaxLength = LengthConsts.S;
}
public static class DescriptionConsts
{
public const int MaxLength = LengthConsts.XL;
}
public static class EmailConsts
{
public const int MinLength = 6;
public const int MaxLength = LengthConsts.M;
}
public static class IdConsts
{
public const int MaxLength = LengthConsts.S;
}
public static class PasswordConsts
{
public const int MinLength = 6;
public const int MaxLength = LengthConsts.M;
}
public static class PathConsts
{
public const int MaxLength = LengthConsts.M;
}
public static class TokenConsts
{
public const int MaxLength = LengthConsts.XL;
public const double ExpiryInDays = 30;
}
public static class UserIdConsts
{
public const int MaxLength = 450;
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace Domain.Common;
public interface IHasAudit
{
public DateTime? CreatedAtUtc { get; set; }
public string? CreatedById { get; set; }
public DateTime? UpdatedAtUtc { get; set; }
public string? UpdatedById { get; set; }
}
+7
View File
@@ -0,0 +1,7 @@
namespace Domain.Common;
public interface IHasIsDeleted
{
bool IsDeleted { get; }
}
+6
View File
@@ -0,0 +1,6 @@
namespace Domain.Common;
public interface IHasSequentialId
{
string Id { get; set; }
}
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+16
View File
@@ -0,0 +1,16 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class Budget : BaseEntity
{
public string? Number { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public DateTime? BudgetDate { get; set; }
public BudgetStatus? Status { get; set; }
public double? Amount { get; set; }
public string? CampaignId { get; set; }
public Campaign? Campaign { get; set; }
}
+20
View File
@@ -0,0 +1,20 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class Campaign : BaseEntity
{
public string? Number { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public double? 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> CampaignBudgetList { get; set; } = new List<Budget>();
public ICollection<Expense> CampaignExpenseList { get; set; } = new List<Expense>();
public ICollection<Lead> CampaignLeadList { get; set; } = new List<Lead>();
}
+19
View File
@@ -0,0 +1,19 @@
using Domain.Common;
namespace Domain.Entities;
public class Company : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? Currency { 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; }
}
+31
View File
@@ -0,0 +1,31 @@
using Domain.Common;
namespace Domain.Entities;
public class Customer : BaseEntity
{
public string? Name { get; set; }
public string? Number { 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>();
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class CustomerCategory : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Domain.Common;
namespace Domain.Entities;
public class CustomerContact : BaseEntity
{
public string? Name { get; set; }
public string? Number { 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; }
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class CustomerGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+17
View File
@@ -0,0 +1,17 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class Expense : BaseEntity
{
public string? Number { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public DateTime? ExpenseDate { get; set; }
public ExpenseStatus? Status { get; set; }
public double? Amount { get; set; }
public string? CampaignId { get; set; }
public Campaign? Campaign { get; set; }
}
+12
View File
@@ -0,0 +1,12 @@
using Domain.Common;
namespace Domain.Entities;
public class FileDocument : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? OriginalName { get; set; }
public string? GeneratedName { get; set; }
public string? Extension { get; set; }
public long? FileSize { get; set; }
}
+13
View File
@@ -0,0 +1,13 @@
using Domain.Common;
namespace Domain.Entities;
public class FileImage : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? OriginalName { get; set; }
public string? GeneratedName { get; set; }
public string? Extension { get; set; }
public long? FileSize { get; set; }
}
+46
View File
@@ -0,0 +1,46 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class Lead : BaseEntity
{
public string? Number { 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 double? AmountTargeted { get; set; }
public double? AmountClosed { get; set; }
public double? BudgetScore { get; set; }
public double? AuthorityScore { get; set; }
public double? NeedScore { get; set; }
public double? 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>();
}
+17
View File
@@ -0,0 +1,17 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class LeadActivity : BaseEntity
{
public string? LeadId { get; set; }
public Lead? Lead { get; set; }
public string? Number { 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; }
}
+28
View File
@@ -0,0 +1,28 @@
using Domain.Common;
namespace Domain.Entities;
public class LeadContact : BaseEntity
{
public string? LeadId { get; set; }
public Lead? Lead { get; set; }
public string? Number { 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; }
}
+12
View File
@@ -0,0 +1,12 @@
using Domain.Common;
namespace Domain.Entities;
public class NumberSequence : BaseEntity
{
public string? EntityName { get; set; }
public string? Prefix { get; set; }
public string? Suffix { get; set; }
public int? LastUsedCount { get; set; }
}
+16
View File
@@ -0,0 +1,16 @@
using Domain.Common;
namespace Domain.Entities;
public class Product : BaseEntity
{
public string? Name { get; set; }
public string? Number { get; set; }
public string? Description { get; set; }
public double? 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; }
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class ProductGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+20
View File
@@ -0,0 +1,20 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class PurchaseOrder : BaseEntity
{
public string? Number { 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 double? BeforeTaxAmount { get; set; }
public double? TaxAmount { get; set; }
public double? AfterTaxAmount { get; set; }
public ICollection<PurchaseOrderItem> PurchaseOrderItemList { get; set; } = new List<PurchaseOrderItem>();
}
+15
View File
@@ -0,0 +1,15 @@
using Domain.Common;
namespace Domain.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 double? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public double? Total { get; set; } = 0;
}
+20
View File
@@ -0,0 +1,20 @@
using Domain.Common;
using Domain.Enums;
namespace Domain.Entities;
public class SalesOrder : BaseEntity
{
public string? Number { 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 double? BeforeTaxAmount { get; set; }
public double? TaxAmount { get; set; }
public double? AfterTaxAmount { get; set; }
public ICollection<SalesOrderItem> SalesOrderItemList { get; set; } = new List<SalesOrderItem>();
}
+16
View File
@@ -0,0 +1,16 @@
using Domain.Common;
namespace Domain.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 double? UnitPrice { get; set; } = 0;
public double? Quantity { get; set; } = 1;
public double? Total { get; set; } = 0;
}
@@ -0,0 +1,17 @@
using Domain.Common;
namespace Domain.Entities;
public class SalesRepresentative : BaseEntity
{
public string? Name { get; set; }
public string? Number { 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; }
}
+10
View File
@@ -0,0 +1,10 @@
using Domain.Common;
namespace Domain.Entities;
public class SalesTeam : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public ICollection<SalesRepresentative> SalesRepresentativeList { get; set; } = new List<SalesRepresentative>();
}
+10
View File
@@ -0,0 +1,10 @@
using Domain.Common;
namespace Domain.Entities;
public class Tax : BaseEntity
{
public string? Name { get; set; }
public double? Percentage { get; set; }
public string? Description { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Domain.Common;
namespace Domain.Entities;
public class Todo : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public ICollection<TodoItem> TodoItemList { get; set; } = new List<TodoItem>();
}
+12
View File
@@ -0,0 +1,12 @@
using Domain.Common;
namespace Domain.Entities;
public class TodoItem : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? TodoId { get; set; }
public Todo? Todo { get; set; }
}
+10
View File
@@ -0,0 +1,10 @@
using Domain.Common;
namespace Domain.Entities;
public class Token : BaseEntity
{
public string? UserId { get; set; }
public string? RefreshToken { get; set; }
public DateTimeOffset ExpiryDate { get; set; }
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class UnitMeasure : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+31
View File
@@ -0,0 +1,31 @@
using Domain.Common;
namespace Domain.Entities;
public class Vendor : BaseEntity
{
public string? Name { get; set; }
public string? Number { 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>();
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class VendorCategory : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using Domain.Common;
namespace Domain.Entities;
public class VendorContact : BaseEntity
{
public string? Name { get; set; }
public string? Number { 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; }
}
+9
View File
@@ -0,0 +1,9 @@
using Domain.Common;
namespace Domain.Entities;
public class VendorGroup : BaseEntity
{
public string? Name { get; set; }
public string? Description { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Domain.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 Domain.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 Domain.Enums;
public enum ClosingStatus
{
[Description("ClosedLost")]
ClosedLost = 0,
[Description("ClosedWon")]
ClosedWon = 1,
[Description("OnProgress")]
OnProgress = 2
}
+15
View File
@@ -0,0 +1,15 @@
using System.ComponentModel;
namespace Domain.Enums;
public enum ExpenseStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+18
View File
@@ -0,0 +1,18 @@
using System.ComponentModel;
namespace Domain.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
}
+21
View File
@@ -0,0 +1,21 @@
using System.ComponentModel;
namespace Domain.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 Domain.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 Domain.Enums;
public enum SalesOrderStatus
{
[Description("Draft")]
Draft = 0,
[Description("Cancelled")]
Cancelled = 1,
[Description("Confirmed")]
Confirmed = 2,
[Description("Archived")]
Archived = 3
}
+13
View File
@@ -0,0 +1,13 @@
using System.ComponentModel;
namespace Domain.Enums;
public enum UserType
{
[Description("Internal")]
Internal = 0,
[Description("Customer")]
Customer = 1,
[Description("Vendor")]
Vendor = 2
}
@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v9.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v9.0": {
"Domain/1.0.0": {
"runtime": {
"Domain.dll": {}
}
}
}
},
"libraries": {
"Domain/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
Binary file not shown.
Binary file not shown.