Unverified Commit f37a8f42 authored by Almouhannad Hafez's avatar Almouhannad Hafez Committed by GitHub

Merge pull request #1 from Almouhannad/B_add-entities

B add entities
parents c417bc62 4b0c3296
......@@ -3,10 +3,57 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35208.52
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{26CA1441-8533-428E-9DD2-26F2FB428488}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{6FC36DEB-2BC3-4980-B46B-7E518DAF09BF}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{878AE2C9-3E34-4332-ACC0-E6B601085710}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{FDA56BCD-A53D-4BA1-A59D-3F44FA32DDD7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{B14D8AA9-67E7-400C-A833-D791681ABDF6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{CE41FA28-76D7-4DC0-A980-B953F87253F5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Presentation", "Presentation\Presentation.csproj", "{D04C0D6C-3FC9-4359-A017-DFCFA1475639}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Persistence", "Persistence\Persistence.csproj", "{2B5111ED-7AB8-46E2-90F8-AF0C70265618}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B14D8AA9-67E7-400C-A833-D791681ABDF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B14D8AA9-67E7-400C-A833-D791681ABDF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B14D8AA9-67E7-400C-A833-D791681ABDF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B14D8AA9-67E7-400C-A833-D791681ABDF6}.Release|Any CPU.Build.0 = Release|Any CPU
{CE41FA28-76D7-4DC0-A980-B953F87253F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE41FA28-76D7-4DC0-A980-B953F87253F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE41FA28-76D7-4DC0-A980-B953F87253F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE41FA28-76D7-4DC0-A980-B953F87253F5}.Release|Any CPU.Build.0 = Release|Any CPU
{D04C0D6C-3FC9-4359-A017-DFCFA1475639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D04C0D6C-3FC9-4359-A017-DFCFA1475639}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D04C0D6C-3FC9-4359-A017-DFCFA1475639}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D04C0D6C-3FC9-4359-A017-DFCFA1475639}.Release|Any CPU.Build.0 = Release|Any CPU
{2B5111ED-7AB8-46E2-90F8-AF0C70265618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2B5111ED-7AB8-46E2-90F8-AF0C70265618}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2B5111ED-7AB8-46E2-90F8-AF0C70265618}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2B5111ED-7AB8-46E2-90F8-AF0C70265618}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6FC36DEB-2BC3-4980-B46B-7E518DAF09BF} = {26CA1441-8533-428E-9DD2-26F2FB428488}
{878AE2C9-3E34-4332-ACC0-E6B601085710} = {26CA1441-8533-428E-9DD2-26F2FB428488}
{FDA56BCD-A53D-4BA1-A59D-3F44FA32DDD7} = {878AE2C9-3E34-4332-ACC0-E6B601085710}
{B14D8AA9-67E7-400C-A833-D791681ABDF6} = {6FC36DEB-2BC3-4980-B46B-7E518DAF09BF}
{CE41FA28-76D7-4DC0-A980-B953F87253F5} = {6FC36DEB-2BC3-4980-B46B-7E518DAF09BF}
{D04C0D6C-3FC9-4359-A017-DFCFA1475639} = {878AE2C9-3E34-4332-ACC0-E6B601085710}
{2B5111ED-7AB8-46E2-90F8-AF0C70265618} = {FDA56BCD-A53D-4BA1-A59D-3F44FA32DDD7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E9FC9252-1283-485F-8F84-3574CFA12633}
EndGlobalSection
......
using Domain.Entities.People.Patients.Relations.PatientDiseases;
using Domain.Primitives;
namespace Domain.Entities.Medicals.Diseases;
public sealed class Disease(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#region Navigations
public ICollection<PatientDisease> Patients { get; set; } = [];
#endregion
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.Medicals.Hospitals;
public sealed class Hospital(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.Medicals.MedicalImages;
public sealed class MedicalImage(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
public string? Description { get; set; }
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.Medicals.MedicalTests;
public sealed class MedicalTest(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
public string? Description { get; set; }
#endregion
}
using Domain.Entities.Medicals.Medicines.MedicineFormValues;
using Domain.Entities.People.Patients.Relations.PatientMedicines;
using Domain.Primitives;
namespace Domain.Entities.Medicals.Medicines;
// TODO: Convert Dosage to value object
public sealed class Medicine(int id) : Entity(id)
{
#region Properties
public MedicineForm MedicineForm { get; set; } = null!;
public string Name { get; set; } = null!;
public decimal Dosage { get; set; }
#region Navigations
public ICollection<PatientMedicine> Patients { get; set; } = [];
#endregion
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.Medicals.Medicines.MedicineFormValues;
public sealed class MedicineForm(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#endregion
}
namespace Domain.Entities.Medicals.Medicines.MedicineFormValues;
public static class MedicineForms
{
#region Constant id values
public static int Tablet => 1;
public static int Syrup => 2;
#endregion
}
using Domain.Entities.People.Doctors.Shared;
using Domain.Entities.People.Doctors.Shared.Constants.DoctorStatusValues;
using Domain.Entities.People.Shared;
using Domain.Primitives;
namespace Domain.Entities.People.Doctors;
public sealed class Doctor(int id) : Entity(id)
{
#region Properties
public PersonalInfo PersonalInfo { get; set; } = null!;
public DoctorStatus Status { get; set; } = null!;
#region Navigations
public ICollection<DoctorPhone> Phones { get; set; } = [];
#endregion
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Doctors.Shared.Constants.DoctorStatusValues;
public sealed class DoctorStatus(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#endregion
}
namespace Domain.Entities.People.Doctors.Shared.Constants.DoctorStatusValues;
public static class DoctorStatuses
{
#region Constant id values
public static int Available => 1;
public static int Working => 2;
public static int Busy => 3;
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Doctors.Shared;
// TODO: Convert phone property to a value object
public sealed class DoctorPhone(int id) : Entity(id)
{
#region Properties
public string? Name { get; set; }
public string Phone { get; set; } = null!;
#endregion
}
using Domain.Entities.People.Employees.Relations.EmployeeFamilyMembers;
using Domain.Entities.People.Employees.Shared;
using Domain.Entities.People.Patients;
using Domain.Primitives;
namespace Domain.Entities.People.Employees;
public sealed class Employee(int id) : Entity(id)
{
#region Properties
public Patient Patient { get; set; } = null!;
public EmployeeAdditionalInfo? AdditionalInfo { get; set; }
public string SerialNumber { get; set; } = null!;
public string CenterStatus { get; set; } = null!;
public bool IsMarried { get; set; } = false;
#region Navigations
public ICollection<EmployeeFamilyMember> FamilyMembers { get; set; } = [];
public ICollection<Employee> RelatedEmployees { get; set; } = [];
public ICollection<Employee> RelatedTo { get; set; } = [];
#endregion
#endregion
}
using Domain.Entities.People.Employees.Relations.EmployeeFamilyMembers.FamilyRoleValues;
using Domain.Entities.People.FamilyMembers;
using Domain.Primitives;
namespace Domain.Entities.People.Employees.Relations.EmployeeFamilyMembers;
public sealed class EmployeeFamilyMember(int id) : Entity(id)
{
#region Properties
#region Employee
public int EmployeeId { get; set; }
public Employee Employee { get; set; } = null!;
#endregion
#region Family member
public int FamilyMemberId { get; set; }
public FamilyMember FamilyMember { get; set; } = null!;
#endregion
#region Additional
public FamilyRole Role { get; set; } = null!;
#endregion
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Employees.Relations.EmployeeFamilyMembers.FamilyRoleValues;
public sealed class FamilyRole(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#endregion
}
namespace Domain.Entities.People.Employees.Relations.EmployeeFamilyMembers.FamilyRoleValues;
public static class FamilyRoles
{
#region Constant id values
public static int Husband => 1;
public static int Wife => 2;
public static int Son => 3;
public static int Daughter => 4;
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Employees.Shared;
// TODO: Convert to a value object containig value objects
public sealed class EmployeeAdditionalInfo(int id) : Entity(id)
{
#region Properties
public DateOnly? StartDate { get; set; }
public string? AcademicQualification { get; set; }
public string? WorkPhone { get; set; }
public string? Location { get; set; }
public string? Specialization { get; set; }
public string? JobStatus { get; set; }
public string? ImageUrl { get; set; }
#endregion
}
using Domain.Entities.People.Patients;
using Domain.Primitives;
namespace Domain.Entities.People.FamilyMembers;
public sealed class FamilyMember(int id) : Entity(id)
{
#region Properties
public Patient Patient { get; set; } = null!;
#endregion
}
using Domain.Entities.People.Patients.Relations.PatientDiseases;
using Domain.Entities.People.Patients.Relations.PatientMedicines;
using Domain.Entities.People.Shared;
using Domain.Entities.People.Shared.GenderValues;
using Domain.Entities.Visits;
using Domain.Primitives;
namespace Domain.Entities.People.Patients;
// TODO: Potential aggregate?
public sealed class Patient(int id) : Entity(id)
{
#region Properties
public PersonalInfo PersonalInfo { get; set; } = null!;
public DateOnly DateOfBirth { get; set; }
public Gender Gender { get; set; } = null!;
#region Navigations
public ICollection<PatientDisease> Diseases { get; set; } = [];
public ICollection<PatientMedicine> Medicines { get; set; } = [];
public ICollection<Visit> Visits { get; set; } = [];
#endregion
#endregion
}
using Domain.Entities.Medicals.Diseases;
using Domain.Primitives;
namespace Domain.Entities.People.Patients.Relations.PatientDiseases;
public sealed class PatientDisease(int id) : Entity(id)
{
#region Properties
#region Patient
public int PatientId { get; set; }
public Patient Patient { get; set; } = null!;
#endregion
#region Disease
public int DiseaseId { get; set; }
public Disease Disease { get; set; } = null!;
#endregion
#region Additional
#endregion
#endregion
}
using Domain.Entities.Medicals.Medicines;
using Domain.Primitives;
namespace Domain.Entities.People.Patients.Relations.PatientMedicines;
public sealed class PatientMedicine(int id) : Entity(id)
{
#region Properties
#region Patient
public int PatientId { get; set; }
public Patient Patient { get; set; } = null!;
#endregion
#region Medicine
public int MedicineId { get; set; }
public Medicine Medicine { get; set; } = null!;
#endregion
#region Additional
public int Number { get; set; }
#endregion
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Shared.GenderValues;
// TODO: Convert to a value object
public sealed class Gender(int id) : Entity(id)
{
#region Properties
public string Name { get; set; } = null!;
#endregion
}
namespace Domain.Entities.People.Shared.GenderValues;
public static class Genders
{
#region Constant id values
public static int Male => 1;
public static int Female => 2;
#endregion
}
using Domain.Primitives;
namespace Domain.Entities.People.Shared;
// TODO: Convert props to value objects
public sealed class PersonalInfo(int id) : Entity(id)
{
#region Properties
public string FirstName { get; set; } = null!;
public string MiddleName { get; set; } = null!;
public string LastName { get; set; } = null!;
#endregion
}
using Domain.Entities.Medicals.MedicalImages;
using Domain.Primitives;
namespace Domain.Entities.Visits.Relations.VisitMedicalImages;
// TODO: Convert result to a value object
public sealed class VisitMedicalImage(int id) : Entity(id)
{
#region Properties
#region Visit
public int VisitId { get; set; }
public Visit Visit { get; set; } = null!;
#endregion
#region Medical image
public int MedicalImageId { get; set; }
public MedicalImage MedicalImage { get; set; } = null!;
#endregion
#region Additional
public string? Result { get; set; }
#endregion
#endregion
}
using Domain.Entities.Medicals.MedicalTests;
using Domain.Primitives;
namespace Domain.Entities.Visits.Relations.VisitMedicalTests;
// TODO: Convert result to a value object
public sealed class VisitMedicalTest(int id) : Entity(id)
{
#region Properties
#region Visit
public int VisitId { get; set; }
public Visit Visit { get; set; } = null!;
#endregion
#region Medical test
public int MedicalTestId { get; set; }
public MedicalTest MedicalTest { get; set; } = null!;
#endregion
#region Additional
public string? Result { get; set; }
#endregion
#endregion
}
using Domain.Entities.Medicals.Medicines;
using Domain.Primitives;
namespace Domain.Entities.Visits.Relations.VisitMedicines;
public sealed class VisitMedicine(int id) : Entity(id)
{
#region Properties
#region Visit
public int VisitId { get; set; }
public Visit Visit { get; set; } = null!;
#endregion
#region Medicine
public int MedicineId { get; set; }
public Medicine Medicine { get; set; } = null!;
#endregion
#region Additional
public int Number { get; set; }
#endregion
#endregion
}
using Domain.Entities.Medicals.Hospitals;
using Domain.Entities.People.Doctors;
using Domain.Entities.People.Patients;
using Domain.Entities.Visits.Relations.VisitMedicalImages;
using Domain.Entities.Visits.Relations.VisitMedicalTests;
using Domain.Entities.Visits.Relations.VisitMedicines;
using Domain.Primitives;
namespace Domain.Entities.Visits;
public sealed class Visit(int id) : Entity(id)
{
#region Properties
public Patient Patient { get; set; } = null!;
public Doctor Doctor { get; set; } = null!;
public Hospital? Hospital { get; set; }
public DateOnly Date { get; set; }
public string Diagnosis { get; set; } = null!;
#region Navigations
public ICollection<VisitMedicalImage> MedicalImages { get; set; } = [];
public ICollection<VisitMedicalTest> MedicalTests { get; set; } = [];
public ICollection<VisitMedicine> Medicines { get; set; } = [];
#endregion
#endregion
}
using Domain.Entities.People.Doctors;
using Domain.Entities.People.Patients;
using Domain.Primitives;
namespace Domain.Entities.WaitingList;
public sealed class WaitingListRecord(int id) : Entity(id)
{
#region Properties
#region Patient
public int PatientId { get; set; }
public Patient Patient { get; set; } = null!;
#endregion
#region Doctor
public int? DoctorId { get; set; }
public Doctor? Doctor { get; set; }
#endregion
#region Additional
public bool IsServed { get; set; } = false;
#endregion
#endregion
}
namespace Domain.Primitives;
// To use nullable reference types within the file
#nullable enable
public class Entity
{
protected Entity(int id)
{
Id = id;
}
#region Properties
// Init is to ensure that Id is unchangable
public int Id { get; private init; }
#endregion
#region Equality by matching Id
public override bool Equals(object? obj)
{
if (InvalidType(obj))
{
return false;
}
if (obj is not Entity entity)
{
return false;
}
return entity.Id == Id;
}
public bool Equals(Entity other)
{
if (InvalidType(other))
{
return false;
}
return other.Id == Id;
}
public static bool operator ==(Entity? first, Entity? second)
{
return (first is not null) && (second is not null) && first.Equals(second);
}
public static bool operator !=(Entity? first, Entity? second)
{
return !(first == second);
}
private bool InvalidType(object? obj)
{
return (obj is null) || (obj.GetType() != this.GetType());
}
#endregion
#region Custom hash code for collections
// For dealing with collections
public override int GetHashCode()
{
// It's a best practice to mult by prime number when defining custom hash code
return Id.GetHashCode() * 41;
}
#endregion
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment