diff --git a/SaPatMgrCore/Core/Bus/SpmAdmission.cs b/SaPatMgrCore/Core/Bus/SpmAdmission.cs
index ea3f908..4f91f16 100644
--- a/SaPatMgrCore/Core/Bus/SpmAdmission.cs
+++ b/SaPatMgrCore/Core/Bus/SpmAdmission.cs
@@ -144,75 +144,432 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId FacilityId { get; set; } = new SysId();
+ public SysId FacilityTemplateId { get; set; } = new SysId();
+ public DateTime AdmissionFrom { get; set; } = DateTime.MinValue;
+ public DateTime AdmissionTo { get; set; } = DateTime.MinValue;
+ public DateTime ToComeIn { get; set; } = DateTime.MinValue;
+ public bool RequiresSeq () { return RequiresSeq(/*AdmissionType*/); }
+ public ushort Seq { get; set; } = 0;
+ public Spm.AdmissionType AdmissionType { get; set; } = Spm.AdmissionType.Unknown;
+ public Spm.AdmissionOccupancy Occupancy { get; set; } = Spm.AdmissionOccupancy.Unknown;
+ public DateTime DecisionToReferOn { get; set; } = DateTime.MinValue;
+ public DateTime ReferredOn { get; set; } = DateTime.MinValue;
+ public DateTime DecisionToAdmitOn { get; set; } = DateTime.MinValue;
+ public DateTime BreechOn { get; set; } = DateTime.MinValue;
+ public SysId PatientId { get; set; } = new SysId();
+ public String PatientNo { get; set; } = "";
+ public String NhsNumber { get; set; } = "";
+ public String Title { get; set; } = "";
+ public String Forename { get; set; } = "";
+ public String Surname { get; set; } = "";
+ public Spm.Gender Gender { get; set; } = Spm.Gender.Unknown;
+ public DateTime BirthOn { get; set; } = DateTime.MinValue;
+ public String Age { get; set; } = "";
+ public DateTime AgeOn { get; set; } = DateTime.MinValue;
+ public SysId FacilityIdWard { get; set; } = new SysId();
+ public String Ward { get; set; } = "";
+ public SysId ProcedureId { get; set; } = new SysId();
+ public String SpecialityCode { get; set; } = "";
+ public String ProcedureDesc { get; set; } = "";
+ public String ComplexityCode { get; set; } = "";
+ public String ProcedureIndication { get; set; } = "";
+ public String PatientHistory { get; set; } = "";
+ public String GestationPeriod { get; set; } = "";
+ public String SystemRef { get; set; } = "";
+ public ushort DurationExp { get; set; } = 0;
+ public ushort DurationAct { get; set; } = 0;
+ public decimal UnitsExp { get; set; } = 0.0m;
+ public decimal UnitsAct { get; set; } = 0.0m;
+ public String Anaesthetic { get; set; } = "";
+ public String Position { get; set; } = "";
+ public String SpecialEquipment { get; set; } = "";
+ public Spm.AttendanceType AttendanceType { get; set; } = Spm.AttendanceType.Unknown;
+ public String AttendanceStatus { get; set; } = "";
+ public String ComfortScore { get; set; } = "";
+
+ // Admission times.
+ public DateTime TimeCalled { get; set; } = DateTime.MinValue;
+ public DateTime TimeArrived { get; set; } = DateTime.MinValue;
+ public DateTime TimeAnaesStart { get; set; } = DateTime.MinValue;
+ public DateTime TimeProcStart { get; set; } = DateTime.MinValue;
+ public DateTime TimeProcEnd { get; set; } = DateTime.MinValue;
+ public DateTime TimeInRecovery { get; set; } = DateTime.MinValue;
+ public DateTime TimeInformDest { get; set; } = DateTime.MinValue;
+ public DateTime TimeLeave { get; set; } = DateTime.MinValue;
+
+ // Cancellation.
+ public static bool IsCancelled (Spm.AdmissionCancelType cancel) { return (cancel != Spm.AdmissionCancelType.None); }
+ public bool IsCancelled () { return IsCancelled(/*CancelType*/); }
+ public Spm.AdmissionCancelType CancelType { get; set; }
+ public DateTime CancelDate { get; set; } = DateTime.MinValue;
+ public ushort CancelCount { get; set; } = 0;
+ public String CancelCode { get; set; } = "";
+ public String CancelReason { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
public Data()
{
//Status = AdmissionStatus;
}
- public SysId FacilityId { get; set; }
- public SysId FacilityTemplateId { get; set; }
- public DateTime AdmissionFrom { get; set; }
- public DateTime AdmissionTo { get; set; }
- public DateTime ToComeIn { get; set; }
- public bool RequiresSeq() { return RequiresSeq(/*AdmissionType*/); }
- public ushort Seq { get; set; }
- public Spm.AdmissionType AdmissionType { get; set; }
- public Spm.AdmissionOccupancy Occupancy { get; set; }
- public DateTime DecisionToReferOn { get; set; }
- public DateTime ReferredOn { get; set; }
- public DateTime DecisionToAdmitOn { get; set; }
- public DateTime BreechOn { get; set; }
- public SysId PatientId { get; set; }
- public String PatientNo { get; set; }
- public String NhsNumber { get; set; }
- public String Title { get; set; }
- public String Forename { get; set; }
- public String Surname { get; set; }
- public Spm.Gender Gender { get; set; }
- public DateTime BirthOn { get; set; }
- public String Age { get; set; }
- public DateTime AgeOn { get; set; }
- public SysId FacilityIdWard { get; set; }
- public String Ward { get; set; }
- public SysId ProcedureId { get; set; }
- public String SpecialityCode { get; set; }
- public String ProcedureDesc { get; set; }
- public String ComplexityCode { get; set; }
- public String ProcedureIndication { get; set; }
- public String PatientHistory { get; set; }
- public String GestationPeriod { get; set; }
- public String SystemRef { get; set; }
- public ushort DurationExp { get; set; }
- public ushort DurationAct { get; set; }
- public decimal UnitsExp { get; set; }
- public decimal UnitsAct { get; set; }
- public String Anaesthetic { get; set; }
- public String Position { get; set; }
- public String SpecialEquipment { get; set; }
- public Spm.AttendanceType AttendanceType { get; set; }
- public String AttendanceStatus { get; set; }
- public String ComfortScore { get; set; }
-
- // Admission times.
- public DateTime TimeCalled { get; set; }
- public DateTime TimeArrived { get; set; }
- public DateTime TimeAnaesStart { get; set; }
- public DateTime TimeProcStart { get; set; }
- public DateTime TimeProcEnd { get; set; }
- public DateTime TimeInRecovery { get; set; }
- public DateTime TimeInformDest { get; set; }
- public DateTime TimeLeave { get; set; }
+ public SysId FacilityId
+ {
+ get { return data.FacilityId; }
+ set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ }
+ public SysId FacilityTemplateId
+ {
+ get { return data.FacilityTemplateId; }
+ set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ }
+ public DateTime AdmissionFrom
+ {
+ get { return data.AdmissionFrom; }
+ set { CheckChanged(data.AdmissionFrom, value); data.AdmissionFrom = value; }
+ }
+ public DateTime AdmissionTo
+ {
+ get { return data.AdmissionTo; }
+ set { CheckChanged(data.AdmissionTo, value); data.AdmissionTo = value; }
+ }
+ public DateTime ToComeIn
+ {
+ get { return data.ToComeIn; }
+ set { CheckChanged(data.ToComeIn, value); data.ToComeIn = value; }
+ }
+ public static bool RequiresSeq (Spm.AdmissionType admissionType)
+ {
+ switch (admissionType)
+ {
+ // Ward and clinic admission do not require a sequence.
+ case Spm.AdmissionType.WardAdmission:
+ case Spm.AdmissionType.WardReservation:
+ case Spm.AdmissionType.ClinicBooking:
+ return false;
+ }
+ return true;
+ }
+ public ushort Seq
+ {
+ get { return data.Seq; }
+ set { CheckChanged(data.Seq, value); data.Seq = value; }
+ }
+ public Spm.AdmissionType AdmissionType
+ {
+ get { return data.AdmissionType; }
+ set { CheckChanged((int)data.AdmissionType, (int)value); data.AdmissionType = value; }
+ }
+ public Spm.AdmissionOccupancy Occupancy
+ {
+ get { return data.Occupancy; }
+ set { CheckChanged((int)data.Occupancy, (int)value); data.Occupancy = value; }
+ }
+ public bool IsTheatreAdmission ()
+ {
+ switch (AdmissionType)
+ {
+ case Spm.AdmissionType.TheatreDayCase:
+ case Spm.AdmissionType.TheatreInPatientElective:
+ case Spm.AdmissionType.TheatreEmergency:
+ return true;
+ }
+ return false;
+ }
+ public bool IsClinicAdmission ()
+ {
+ switch (AdmissionType)
+ {
+ case Spm.AdmissionType.ClinicBooking:
+ return true;
+ }
+ return false;
+ }
+ public bool IsWardAdmission ()
+ {
+ switch (AdmissionType)
+ {
+ case Spm.AdmissionType.WardAdmission:
+ case Spm.AdmissionType.WardReservation:
+ return true;
+ }
+ return false;
+ }
+ public DateTime DecisionToReferOn
+ {
+ get { return data.DecisionToReferOn; }
+ set { CheckChanged(data.DecisionToReferOn, value); data.DecisionToReferOn = value; }
+ }
+ public DateTime ReferredOn
+ {
+ get { return data.ReferredOn; }
+ set { CheckChanged(data.ReferredOn, value); data.ReferredOn = value; }
+ }
+ public DateTime DecisionToAdmitOn
+ {
+ get { return data.DecisionToAdmitOn; }
+ set { CheckChanged(data.DecisionToAdmitOn, value); data.DecisionToAdmitOn = value; }
+ }
+ public DateTime BreechOn
+ {
+ get { return data.BreechOn; }
+ set { CheckChanged(data.BreechOn, value); data.BreechOn = value; }
+ }
+ public SysId PatientId
+ {
+ get { return data.PatientId; }
+ set { CheckChanged(data.PatientId, value); data.PatientId = value; }
+ }
+ public String PatientNo
+ {
+ get { return data.PatientNo; }
+ set { CheckChanged(data.PatientNo, value); data.PatientNo = value; }
+ }
+ public String NhsNumber
+ {
+ get { return data.NhsNumber; }
+ set { CheckChanged(data.NhsNumber, value); data.NhsNumber = value; }
+ }
+ public String Title
+ {
+ get { return data.Title; }
+ set { CheckChanged(data.Title, value); data.Title = value; }
+ }
+ public String Forename
+ {
+ get { return data.Forename; }
+ set { CheckChanged(data.Forename, value); data.Forename = value; }
+ }
+ public String Surname
+ {
+ get { return data.Surname; }
+ set { CheckChanged(data.Surname, value); data.Surname = value; }
+ }
+ public static String GetDisplayName (String surname, String forename, bool upperSurname = true)
+ {
+ String name = surname;
+ if (upperSurname)
+ name.ToUpper();
+ if (!StringUtil.IsEmpty(surname) && !StringUtil.IsEmpty(forename))
+ name += ", ";
+ name += forename;
+ return name;
+ }
+ public String GetDisplayName (bool upperSurname = true)
+ {
+ return GetDisplayName(Surname, Forename, upperSurname);
+ }
+ public Spm.Gender Gender
+ {
+ get { return data.Gender; }
+ set { CheckChanged((int)data.Gender, (int)value); data.Gender = value; }
+ }
+ public DateTime BirthOn
+ {
+ get { return data.BirthOn; }
+ set { CheckChanged(data.BirthOn, value); data.BirthOn = value; }
+ }
+ public String Age
+ {
+ get { return data.Age; }
+ set { CheckChanged(data.Age, value); data.Age = value; }
+ }
+ public DateTime AgeOn
+ {
+ get { return data.AgeOn; }
+ set { CheckChanged(data.AgeOn, value); data.AgeOn = value; }
+ }
+ public String GetPatientAge (DateTime dob, DateTime ageOn)
+ {
+ String patientAge = "";
+ if (DateUtil.IsValid(dob) && DateUtil.IsValid(ageOn) && dob < ageOn)
+ {
+ /*ushort age = Date::CalculateAge(dob, ageOn);
+ ushort ageMonths = Date::CalculateAgeMonths(dob, ageOn);
+ if (age >= 2) patientAge = age.ToString();
+ else if (ageMonths > 0) patientAge = ageMonths.ToString() + "M";*/
+ }
+ return patientAge;
+ }
+ public SysId FacilityIdWard
+ {
+ get { return data.FacilityIdWard; }
+ set { CheckChanged(data.FacilityIdWard, value); data.FacilityIdWard = value; }
+ }
+ public String Ward
+ {
+ get { return data.Ward; }
+ set { CheckChanged(data.Ward, value); data.Ward = value; }
+ }
+ public SysId ProcedureId
+ {
+ get { return data.ProcedureId; }
+ set { CheckChanged(data.ProcedureId, value); data.ProcedureId = value; }
+ }
+ public String SpecialityCode
+ {
+ get { return data.SpecialityCode; }
+ set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ }
+ public String ProcedureDesc
+ {
+ get { return data.ProcedureDesc; }
+ set { CheckChanged(data.ProcedureDesc, value); data.ProcedureDesc = value; }
+ }
+ public String ComplexityCode
+ {
+ get { return data.ComplexityCode; }
+ set { CheckChanged(data.ComplexityCode, value); data.ComplexityCode = value; }
+ }
+ public String ProcedureIndication
+ {
+ get { return data.ProcedureIndication; }
+ set { CheckChanged(data.ProcedureIndication, value); data.ProcedureIndication = value; }
+ }
+ public String PatientHistory
+ {
+ get { return data.PatientHistory; }
+ set { CheckChanged(data.PatientHistory, value); data.PatientHistory = value; }
+ }
+ public String GestationPeriod
+ {
+ get { return data.GestationPeriod; }
+ set { CheckChanged(data.GestationPeriod, value); data.GestationPeriod = value; }
+ }
+ public String SystemRef
+ {
+ get { return data.SystemRef; }
+ set { CheckChanged(data.SystemRef, value); data.SystemRef = value; }
+ }
+ public ushort DurationExp
+ {
+ get { return data.DurationExp; }
+ set { CheckChanged(data.DurationExp, value); data.DurationExp = value; }
+ }
+ public ushort DurationAct
+ {
+ get { return data.DurationAct; }
+ set { CheckChanged(data.DurationAct, value); data.DurationAct = value; }
+ }
+ public decimal UnitsExp
+ {
+ get { return data.UnitsExp; }
+ set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ }
+ public decimal UnitsAct
+ {
+ get { return data.UnitsAct; }
+ set { CheckChanged(data.UnitsAct, value); data.UnitsAct = value; }
+ }
+ public String Anaesthetic
+ {
+ get { return data.Anaesthetic; }
+ set { CheckChanged(data.Anaesthetic, value); data.Anaesthetic = value; }
+ }
+ public String Position
+ {
+ get { return data.Position; }
+ set { CheckChanged(data.Position, value); data.Position = value; }
+ }
+ public String SpecialEquipment
+ {
+ get { return data.SpecialEquipment; }
+ set { CheckChanged(data.SpecialEquipment, value); data.SpecialEquipment = value; }
+ }
+ public Spm.AttendanceType AttendanceType
+ {
+ get { return data.AttendanceType; }
+ set { CheckChanged((int)data.AttendanceType, (int)value); data.AttendanceType = value; }
+ }
+ public String AttendanceStatus
+ {
+ get { return data.AttendanceStatus; }
+ set { CheckChanged(data.AttendanceStatus, value); data.AttendanceStatus = value; }
+ }
+ public String ComfortScore
+ {
+ get { return data.ComfortScore; }
+ set { CheckChanged(data.ComfortScore, value); data.ComfortScore = value; }
+ }
+ //-------------------------------------------------------------------
+ // Admission time.
+ public DateTime TimeCalled
+ {
+ get { return data.TimeCalled; }
+ set { CheckChanged(data.TimeCalled, value); data.TimeCalled = value; }
+ }
+ public DateTime TimeArrived
+ {
+ get { return data.TimeArrived; }
+ set { CheckChanged(data.TimeArrived, value); data.TimeArrived = value; }
+ }
+ public DateTime TimeAnaesStart
+ {
+ get { return data.TimeAnaesStart; }
+ set { CheckChanged(data.TimeAnaesStart, value); data.TimeAnaesStart = value; }
+ }
+ public DateTime TimeProcStart
+ {
+ get { return data.TimeProcStart; }
+ set { CheckChanged(data.TimeProcStart, value); data.TimeProcStart = value; }
+ }
+ public DateTime TimeProcEnd
+ {
+ get { return data.TimeProcEnd; }
+ set { CheckChanged(data.TimeProcEnd, value); data.TimeProcEnd = value; }
+ }
+ public DateTime TimeInRecovery
+ {
+ get { return data.TimeInRecovery; }
+ set { CheckChanged(data.TimeInRecovery, value); data.TimeInRecovery = value; }
+ }
+ public DateTime TimeInformDest
+ {
+ get { return data.TimeInformDest; }
+ set { CheckChanged(data.TimeInformDest, value); data.TimeInformDest = value; }
+ }
+ public DateTime TimeLeave
+ {
+ get { return data.TimeLeave; }
+ set { CheckChanged(data.TimeLeave, value); data.TimeLeave = value; }
+ }
+ //-------------------------------------------------------------------
// Cancellation.
- public static bool IsCancelled(Spm.AdmissionCancelType cancel) { return (cancel != Spm.AdmissionCancelType.None); }
- public bool IsCancelled() { return IsCancelled(/*CancelType*/); }
- public Spm.AdmissionCancelType CancelType { get; set; }
- public DateTime CancelDate { get; set; }
- public ushort CancelCount { get; set; }
- public String CancelCode { get; set; }
- public String CancelReason { get; set; }
+ public Spm.AdmissionCancelType CancelType
+ {
+ get { return data.CancelType; }
+ set { CheckChanged((int)data.CancelType, (int)value); data.CancelType = value; }
+ }
+ public DateTime CancelDate
+ {
+ get { return data.CancelDate; }
+ set { CheckChanged(data.CancelDate, value); data.CancelDate = value; }
+ }
+ public ushort CancelCount
+ {
+ get { return data.CancelCount; }
+ set { CheckChanged(data.CancelCount, value); data.CancelCount = value; }
+ }
+ public String CancelCode
+ {
+ get { return data.CancelCode; }
+ set { CheckChanged(data.CancelCode, value); data.CancelCode = value; }
+ }
+ public String CancelReason
+ {
+ get { return data.CancelReason; }
+ set { CheckChanged(data.CancelReason, value); data.CancelReason = value; }
+ }
// Flags.
@@ -399,27 +756,27 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId FacilityId
{
get { return data.FacilityId; }
- set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ set { data.FacilityId = value; }
}
public SysId FacilityTemplateId
{
get { return data.FacilityTemplateId; }
- set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ set { data.FacilityTemplateId = value; }
}
public DateTime AdmissionFrom
{
get { return data.AdmissionFrom; }
- set { CheckChanged(data.AdmissionFrom, value); data.AdmissionFrom = value; }
+ set { data.AdmissionFrom = value; }
}
public DateTime AdmissionTo
{
get { return data.AdmissionTo; }
- set { CheckChanged(data.AdmissionTo, value); data.AdmissionTo = value; }
+ set { data.AdmissionTo = value; }
}
public DateTime ToComeIn
{
get { return data.ToComeIn; }
- set { CheckChanged(data.ToComeIn, value); data.ToComeIn = value; }
+ set { data.ToComeIn = value; }
}
public static bool RequiresSeq(Spm.AdmissionType admissionType)
{
@@ -436,17 +793,17 @@ namespace Sarand.PatientMgr.Core.Bus
public ushort Seq
{
get { return data.Seq; }
- set { CheckChanged(data.Seq, value); data.Seq = value; }
+ set { data.Seq = value; }
}
public Spm.AdmissionType AdmissionType
{
get { return data.AdmissionType; }
- set { CheckChanged((int)data.AdmissionType, (int)value); data.AdmissionType = value; }
+ set {data.AdmissionType = value; }
}
public Spm.AdmissionOccupancy Occupancy
{
get { return data.Occupancy; }
- set { CheckChanged((int)data.Occupancy, (int)value); data.Occupancy = value; }
+ set { data.Occupancy = value; }
}
public bool IsTheatreAdmission()
@@ -482,52 +839,52 @@ namespace Sarand.PatientMgr.Core.Bus
public DateTime DecisionToReferOn
{
get { return data.DecisionToReferOn; }
- set { CheckChanged(data.DecisionToReferOn, value); data.DecisionToReferOn = value; }
+ set { data.DecisionToReferOn = value; }
}
public DateTime ReferredOn
{
get { return data.ReferredOn; }
- set { CheckChanged(data.ReferredOn, value); data.ReferredOn = value; }
+ set { data.ReferredOn = value; }
}
public DateTime DecisionToAdmitOn
{
get { return data.DecisionToAdmitOn; }
- set { CheckChanged(data.DecisionToAdmitOn, value); data.DecisionToAdmitOn = value; }
+ set { data.DecisionToAdmitOn = value; }
}
public DateTime BreechOn
{
get { return data.BreechOn; }
- set { CheckChanged(data.BreechOn, value); data.BreechOn = value; }
+ set { data.BreechOn = value; }
}
public SysId PatientId
{
get { return data.PatientId; }
- set { CheckChanged(data.PatientId, value); data.PatientId = value; }
+ set { data.PatientId = value; }
}
public String PatientNo
{
get { return data.PatientNo; }
- set { CheckChanged(data.PatientNo, value); data.PatientNo = value; }
+ set { data.PatientNo = value; }
}
public String NhsNumber
{
get { return data.NhsNumber; }
- set { CheckChanged(data.NhsNumber, value); data.NhsNumber = value; }
+ set { data.NhsNumber = value; }
}
public String Title
{
get { return data.Title; }
- set { CheckChanged(data.Title, value); data.Title = value; }
+ set { data.Title = value; }
}
public String Forename
{
get { return data.Forename; }
- set { CheckChanged(data.Forename, value); data.Forename = value; }
+ set { data.Forename = value; }
}
public String Surname
{
get { return data.Surname; }
- set { CheckChanged(data.Surname, value); data.Surname = value; }
+ set { data.Surname = value; }
}
public static String GetDisplayName(String surname, String forename, bool upperSurname = true)
{
@@ -546,22 +903,22 @@ namespace Sarand.PatientMgr.Core.Bus
public Spm.Gender Gender
{
get { return data.Gender; }
- set { CheckChanged((int)data.Gender, (int)value); data.Gender = value; }
+ set { data.Gender = value; }
}
public DateTime BirthOn
{
get { return data.BirthOn; }
- set { CheckChanged(data.BirthOn, value); data.BirthOn = value; }
+ set { data.BirthOn = value; }
}
public String Age
{
get { return data.Age; }
- set { CheckChanged(data.Age, value); data.Age = value; }
+ set { data.Age = value; }
}
public DateTime AgeOn
{
get { return data.AgeOn; }
- set { CheckChanged(data.AgeOn, value); data.AgeOn = value; }
+ set { data.AgeOn = value; }
}
public String GetPatientAge(DateTime dob, DateTime ageOn)
{
@@ -578,87 +935,87 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId FacilityIdWard
{
get { return data.FacilityIdWard; }
- set { CheckChanged(data.FacilityIdWard, value); data.FacilityIdWard = value; }
+ set { data.FacilityIdWard = value; }
}
public String Ward
{
get { return data.Ward; }
- set { CheckChanged(data.Ward, value); data.Ward = value; }
+ set { data.Ward = value; }
}
public SysId ProcedureId
{
get { return data.ProcedureId; }
- set { CheckChanged(data.ProcedureId, value); data.ProcedureId = value; }
+ set { data.ProcedureId = value; }
}
public String SpecialityCode
{
get { return data.SpecialityCode; }
- set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ set { data.SpecialityCode = value; }
}
public String ProcedureDesc
{
get { return data.ProcedureDesc; }
- set { CheckChanged(data.ProcedureDesc, value); data.ProcedureDesc = value; }
+ set { data.ProcedureDesc = value; }
}
public String ComplexityCode
{
get { return data.ComplexityCode; }
- set { CheckChanged(data.ComplexityCode, value); data.ComplexityCode = value; }
+ set { data.ComplexityCode = value; }
}
public String ProcedureIndication
{
get { return data.ProcedureIndication; }
- set { CheckChanged(data.ProcedureIndication, value); data.ProcedureIndication = value; }
+ set { data.ProcedureIndication = value; }
}
public String PatientHistory
{
get { return data.PatientHistory; }
- set { CheckChanged(data.PatientHistory, value); data.PatientHistory = value; }
+ set { data.PatientHistory = value; }
}
public String GestationPeriod
{
get { return data.GestationPeriod; }
- set { CheckChanged(data.GestationPeriod, value); data.GestationPeriod = value; }
+ set { data.GestationPeriod = value; }
}
public String SystemRef
{
get { return data.SystemRef; }
- set { CheckChanged(data.SystemRef, value); data.SystemRef = value; }
+ set { data.SystemRef = value; }
}
public ushort DurationExp
{
get { return data.DurationExp; }
- set { CheckChanged(data.DurationExp, value); data.DurationExp = value; }
+ set { data.DurationExp = value; }
}
public ushort DurationAct
{
get { return data.DurationAct; }
- set { CheckChanged(data.DurationAct, value); data.DurationAct = value; }
+ set { data.DurationAct = value; }
}
public decimal UnitsExp
{
get { return data.UnitsExp; }
- set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ set { data.UnitsExp = value; }
}
public decimal UnitsAct
{
get { return data.UnitsAct; }
- set { CheckChanged(data.UnitsAct, value); data.UnitsAct = value; }
+ set { data.UnitsAct = value; }
}
public String Anaesthetic
{
get { return data.Anaesthetic; }
- set { CheckChanged(data.Anaesthetic, value); data.Anaesthetic = value; }
+ set { data.Anaesthetic = value; }
}
public String Position
{
get { return data.Position; }
- set { CheckChanged(data.Position, value); data.Position = value; }
+ set { data.Position = value; }
}
public String SpecialEquipment
{
get { return data.SpecialEquipment; }
- set { CheckChanged(data.SpecialEquipment, value); data.SpecialEquipment = value; }
+ set { data.SpecialEquipment = value; }
}
public Spm.AttendanceType AttendanceType
{
@@ -668,12 +1025,12 @@ namespace Sarand.PatientMgr.Core.Bus
public String AttendanceStatus
{
get { return data.AttendanceStatus; }
- set { CheckChanged(data.AttendanceStatus, value); data.AttendanceStatus = value; }
+ set { data.AttendanceStatus = value; }
}
public String ComfortScore
{
get { return data.ComfortScore; }
- set { CheckChanged(data.ComfortScore, value); data.ComfortScore = value; }
+ set { data.ComfortScore = value; }
}
//-------------------------------------------------------------------
// Admission time.
diff --git a/SaPatMgrCore/Core/Bus/SpmAdmissionAction.cs b/SaPatMgrCore/Core/Bus/SpmAdmissionAction.cs
index b5f008c..0e0e3c3 100644
--- a/SaPatMgrCore/Core/Bus/SpmAdmissionAction.cs
+++ b/SaPatMgrCore/Core/Bus/SpmAdmissionAction.cs
@@ -64,20 +64,64 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId AdmissionId { get; set; } = new SysId();
+ public Spm.AdmissionActionType AdmissionActionType { get; set; } = Spm.AdmissionActionType.Unknown;
+ public DateTime Raised { get; set; } = DateTime.MinValue;
+ public SysId EmployeeIdRaised { get; set; } = new SysId();
+ public DateTime Completed { get; set; } = DateTime.MinValue;
+ public SysId EmployeeIdCompleted { get; set; } = new SysId();
+ public String ActionData { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = AdmissionActionStatus;
}
- public SysId AdmissionId { get; set; }
- public Spm.AdmissionActionType AdmissionActionType { get; set; }
- public DateTime Raised { get; set; }
- public SysId EmployeeIdRaised { get; set; }
- public DateTime Completed { get; set; }
- public SysId EmployeeIdCompleted { get; set; }
- public String ActionData { get; set; }
+ public SysId AdmissionId
+ {
+ get { return data.AdmissionId; }
+ set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ }
+ public Spm.AdmissionActionType AdmissionActionType
+ {
+ get { return data.AdmissionActionType; }
+ set { CheckChanged((int)data.AdmissionActionType, (int)value); data.AdmissionActionType = value; }
+ }
+ public DateTime Raised
+ {
+ get { return data.Raised; }
+ set { CheckChanged(data.Raised, value); data.Raised = value; }
+ }
+ public SysId EmployeeIdRaised
+ {
+ get { return data.EmployeeIdRaised; }
+ set { CheckChanged(data.EmployeeIdRaised, value); data.EmployeeIdRaised = value; }
+ }
+ public DateTime Completed
+ {
+ get { return data.Completed; }
+ set { CheckChanged(data.Completed, value); data.Completed = value; }
+ }
+ public SysId EmployeeIdCompleted
+ {
+ get { return data.EmployeeIdCompleted; }
+ set { CheckChanged(data.EmployeeIdCompleted, value); data.EmployeeIdCompleted = value; }
+ }
+ public String ActionData
+ {
+ get { return data.ActionData; }
+ set { CheckChanged(data.ActionData, value); data.ActionData = value; }
+ }
internal void PopulateFrom(Data data)
{
AdmissionId = data.AdmissionId;
@@ -187,37 +231,37 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId AdmissionId
{
get { return data.AdmissionId; }
- set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ set { data.AdmissionId = value; }
}
public Spm.AdmissionActionType AdmissionActionType
{
get { return data.AdmissionActionType; }
- set { CheckChanged((int)data.AdmissionActionType, (int)value); data.AdmissionActionType = value; }
+ set { data.AdmissionActionType = value; }
}
public DateTime Raised
{
get { return data.Raised; }
- set { CheckChanged(data.Raised, value); data.Raised = value; }
+ set { data.Raised = value; }
}
public SysId EmployeeIdRaised
{
get { return data.EmployeeIdRaised; }
- set { CheckChanged(data.EmployeeIdRaised, value); data.EmployeeIdRaised = value; }
+ set { data.EmployeeIdRaised = value; }
}
public DateTime Completed
{
get { return data.Completed; }
- set { CheckChanged(data.Completed, value); data.Completed = value; }
+ set { data.Completed = value; }
}
public SysId EmployeeIdCompleted
{
get { return data.EmployeeIdCompleted; }
- set { CheckChanged(data.EmployeeIdCompleted, value); data.EmployeeIdCompleted = value; }
+ set { data.EmployeeIdCompleted = value; }
}
public String ActionData
{
get { return data.ActionData; }
- set { CheckChanged(data.ActionData, value); data.ActionData = value; }
+ set { data.ActionData = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmAdmissionData.cs b/SaPatMgrCore/Core/Bus/SpmAdmissionData.cs
index a743967..5e96835 100644
--- a/SaPatMgrCore/Core/Bus/SpmAdmissionData.cs
+++ b/SaPatMgrCore/Core/Bus/SpmAdmissionData.cs
@@ -33,16 +33,40 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId AdmissionId { get; set; } = new SysId();
+ public Spm.AdmissionDataType AdmissionDataType { get; set; } = Spm.AdmissionDataType.Unknown;
+ public String AdmissionData { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = AdmissionDataStatus;
}
- public SysId AdmissionId { get; set; }
- public Spm.AdmissionDataType AdmissionDataType { get; set; }
- public String AdmissionData { get; set; }
+ public SysId AdmissionId
+ {
+ get { return data.AdmissionId; }
+ set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ }
+ public Spm.AdmissionDataType AdmissionDataType
+ {
+ get { return data.AdmissionDataType; }
+ set { CheckChanged((int)data.AdmissionDataType, (int)value); data.AdmissionDataType = value; }
+ }
+ public String AdmissionData
+ {
+ get { return data.AdmissionData; }
+ set { CheckChanged(data.AdmissionData, value); data.AdmissionData = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -121,17 +145,17 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId AdmissionId
{
get { return data.AdmissionId; }
- set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ set { data.AdmissionId = value; }
}
public Spm.AdmissionDataType AdmissionDataType
{
get { return data.AdmissionDataType; }
- set { CheckChanged((int)data.AdmissionDataType, (int)value); data.AdmissionDataType = value; }
+ set { data.AdmissionDataType = value; }
}
public String AdmissionData
{
get { return data.AdmissionData; }
- set { CheckChanged(data.AdmissionData, value); data.AdmissionData = value; }
+ set { data.AdmissionData = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmAdmissionRole.cs b/SaPatMgrCore/Core/Bus/SpmAdmissionRole.cs
index a0616ba..8a3da3e 100644
--- a/SaPatMgrCore/Core/Bus/SpmAdmissionRole.cs
+++ b/SaPatMgrCore/Core/Bus/SpmAdmissionRole.cs
@@ -35,19 +35,58 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId AdmissionId { get; set; } = new SysId();
+ public Spm.EmployeeRole EmployeeRole { get; set; } = Spm.EmployeeRole.Unknown;
+ public Spm.EmployeeRoleCategory EmployeeRoleCategory { get; set; } = Spm.EmployeeRoleCategory.Unknown;
+ public ushort Seq { get; set; } = 0;
+ public SysId EmployeeRoleId { get; set; } = new SysId();
+ public String EmployeeCode { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = AdmissionRoleStatus;
}
- public SysId AdmissionId { get; set; }
- public Spm.EmployeeRole EmployeeRole { get; set; }
- public Spm.EmployeeRoleCategory EmployeeRoleCategory { get; set; }
- public ushort Seq { get; set; }
- public SysId EmployeeRoleId { get; set; }
- public String EmployeeCode { get; set; }
+ public SysId AdmissionId
+ {
+ get { return data.AdmissionId; }
+ set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ }
+ public Spm.EmployeeRole EmployeeRole
+ {
+ get { return data.EmployeeRole; }
+ set { CheckChanged((int)data.EmployeeRole, (int)value); data.EmployeeRole = value; }
+ }
+ public Spm.EmployeeRoleCategory EmployeeRoleCategory
+ {
+ get { return data.EmployeeRoleCategory; }
+ set { CheckChanged((int)data.EmployeeRoleCategory, (int)value); data.EmployeeRoleCategory = value; }
+ }
+ public ushort Seq
+ {
+ get { return data.Seq; }
+ set { CheckChanged(data.Seq, value); data.Seq = value; }
+ }
+ public SysId EmployeeRoleId
+ {
+ get { return data.EmployeeRoleId; }
+ set { CheckChanged(data.EmployeeRoleId, value); data.EmployeeRoleId = value; }
+ }
+ public String EmployeeCode
+ {
+ get { return data.EmployeeCode; }
+ set { CheckChanged(data.EmployeeCode, value); data.EmployeeCode = value; }
+ }
internal void PopulateFrom(Data data)
{
AdmissionId = data.AdmissionId;
@@ -132,32 +171,32 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId AdmissionId
{
get { return data.AdmissionId; }
- set { CheckChanged(data.AdmissionId, value); data.AdmissionId = value; }
+ set { data.AdmissionId = value; }
}
public Spm.EmployeeRole EmployeeRole
{
get { return data.EmployeeRole; }
- set { CheckChanged((int)data.EmployeeRole, (int)value); data.EmployeeRole = value; }
+ set { data.EmployeeRole = value; }
}
public Spm.EmployeeRoleCategory EmployeeRoleCategory
{
get { return data.EmployeeRoleCategory; }
- set { CheckChanged((int)data.EmployeeRoleCategory, (int)value); data.EmployeeRoleCategory = value; }
+ set { data.EmployeeRoleCategory = value; }
}
public ushort Seq
{
get { return data.Seq; }
- set { CheckChanged(data.Seq, value); data.Seq = value; }
+ set { data.Seq = value; }
}
public SysId EmployeeRoleId
{
get { return data.EmployeeRoleId; }
- set { CheckChanged(data.EmployeeRoleId, value); data.EmployeeRoleId = value; }
+ set { data.EmployeeRoleId = value; }
}
public String EmployeeCode
{
get { return data.EmployeeCode; }
- set { CheckChanged(data.EmployeeCode, value); data.EmployeeCode = value; }
+ set { data.EmployeeCode = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmDepartment.cs b/SaPatMgrCore/Core/Bus/SpmDepartment.cs
index 1a6ad1a..696caed 100644
--- a/SaPatMgrCore/Core/Bus/SpmDepartment.cs
+++ b/SaPatMgrCore/Core/Bus/SpmDepartment.cs
@@ -33,13 +33,9 @@ namespace Sarand.PatientMgr.Core.Bus
}
//-------------------------------------------------------------------
- // Data.
- public new class Data : SacsHierarchyItem.Data
+ /// Properties other than common.
+ public class DataProperties
{
- public Data ()
- {
- Status = SpmDepartment.DefaultStatus;
- }
public SysId InstitutionId { get; set; }
public String Name { get; set; }
public uint FacilityTypes { get; set; } = 0;
@@ -58,6 +54,84 @@ namespace Sarand.PatientMgr.Core.Bus
}
public DateTime ApplicableFrom { get; set; }
public DateTime ApplicableTo { get; set; }
+ }
+
+ //-------------------------------------------------------------------
+ // Data.
+ public new class Data : SacsHierarchyItem.Data
+ {
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
+ {
+ Status = SpmDepartment.DefaultStatus;
+ }
+ public SysId InstitutionId
+ {
+ get { return data.InstitutionId; }
+ set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ }
+ public String Name
+ {
+ get { return data.Name; }
+ set { CheckChanged(data.Name, value); data.Name = value; }
+ }
+ // Facility types.
+ public uint FacilityTypes { get { return data.FacilityTypes; } set { data.FacilityTypes = value; } }
+ public static int GetFacilityTypeBit (Spm.FacilityType facilityType)
+ {
+ // Map facility types to their position in the bit mapped value:
+ if (facilityType == Spm.FacilityType.Theatre) return 0;
+ if (facilityType == Spm.FacilityType.Clinic) return 1;
+ if (facilityType == Spm.FacilityType.Ward) return 2;
+ if (facilityType == Spm.FacilityType.Apparatus) return 3;
+ return -1;
+ }
+ public static bool HasFacilityType (uint facilityTypes, Spm.FacilityType facilityType)
+ {
+ int facilityTypeBit = GetFacilityTypeBit(facilityType);
+ if (facilityTypeBit >= 0 && facilityTypeBit < 32)
+ return (facilityTypes & (((uint)1) << facilityTypeBit)) > 0;
+ return false;
+ }
+ public bool HasFacilityType (Spm.FacilityType facilityType)
+ {
+ return HasFacilityType(data.FacilityTypes, facilityType);
+ }
+ // Allow any facility.
+ public uint AllowAnyFacilities { get { return data.AllowAnyFacilities; } set { data.AllowAnyFacilities = value; } }
+ public static bool AllowAnyFacility (uint allowAnyFacilities, Spm.FacilityType facilityType)
+ {
+ int facilityTypeBit = GetFacilityTypeBit(facilityType);
+ if (facilityTypeBit >= 0 && facilityTypeBit < 32)
+ return (allowAnyFacilities & (((uint)1) << facilityTypeBit)) > 0;
+ return false;
+ }
+ public bool AllowAnyFacility (Spm.FacilityType facilityType)
+ {
+ return AllowAnyFacility(data.AllowAnyFacilities, facilityType);
+ }
+ // Cancel re-book limit.
+ public static ushort GetCancelReBookLimit (String cancelReBookLimit, Spm.FacilityType facilityType)
+ {
+ if (facilityType == Spm.FacilityType.Theatre) return 28;
+ return 0;
+ }
+ public ushort GetCancelReBookLimit (Spm.FacilityType facilityType)
+ {
+ return GetCancelReBookLimit("", facilityType);
+ }
+ public DateTime ApplicableFrom
+ {
+ get { return data.ApplicableFrom; }
+ set { CheckChanged(data.ApplicableFrom, value); data.ApplicableFrom = value; }
+ }
+ public DateTime ApplicableTo
+ {
+ get { return data.ApplicableTo; }
+ set { CheckChanged(data.ApplicableTo, value); data.ApplicableTo = value; }
+ }
internal void PopulateFrom (Data data)
{
InstitutionId = data.InstitutionId;
@@ -137,12 +211,12 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId InstitutionId
{
get { return data.InstitutionId; }
- protected set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ protected set { data.InstitutionId = value; }
}
public String Name
{
get { return data.Name; }
- set { CheckChanged(data.Name, value); data.Name = value; }
+ set { data.Name = value; }
}
// Facility types.
public uint FacilityTypes { get { return data.FacilityTypes; } set { data.FacilityTypes = value; } }
@@ -192,12 +266,12 @@ namespace Sarand.PatientMgr.Core.Bus
public DateTime ApplicableFrom
{
get { return data.ApplicableFrom; }
- set { CheckChanged(data.ApplicableFrom, value); data.ApplicableFrom = value; }
+ set { data.ApplicableFrom = value; }
}
public DateTime ApplicableTo
{
get { return data.ApplicableTo; }
- set { CheckChanged(data.ApplicableTo, value); data.ApplicableTo = value; }
+ set { data.ApplicableTo = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmEmployee.cs b/SaPatMgrCore/Core/Bus/SpmEmployee.cs
index 6dd07c7..c67fb70 100644
--- a/SaPatMgrCore/Core/Bus/SpmEmployee.cs
+++ b/SaPatMgrCore/Core/Bus/SpmEmployee.cs
@@ -35,20 +35,78 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId InstitutionId { get; set; } = new SysId();
+ public String EmployeeNo { get; set; } = "";
+ public String Code { get; set; } = "";
+ public String Initials { get; set; } = "";
+ public String Title { get; set; } = "";
+ public String Forename { get; set; } = "";
+ public String Surname { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
public Data()
{
//Status = EmployeeStatus;
}
- public SysId InstitutionId { get; set; }
- public String EmployeeNo { get; set; }
- public String Code { get; set; }
- public String Initials { get; set; }
- public String Title { get; set; }
- public String Forename { get; set; }
- public String Surname { get; set; }
+ public SysId InstitutionId
+ {
+ get { return data.InstitutionId; }
+ set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ }
+ public String EmployeeNo
+ {
+ get { return data.EmployeeNo; }
+ set { CheckChanged(data.EmployeeNo, value); data.EmployeeNo = value; }
+ }
+ public String Code
+ {
+ get { return data.Code; }
+ set { CheckChanged(data.Code, value); data.Code = value; }
+ }
+ public String Initials
+ {
+ get { return data.Initials; }
+ set { CheckChanged(data.Initials, value); data.Initials = value; }
+ }
+ public String Title
+ {
+ get { return data.Title; }
+ set { CheckChanged(data.Title, value); data.Title = value; }
+ }
+ public String Forename
+ {
+ get { return data.Forename; }
+ set { CheckChanged(data.Forename, value); data.Forename = value; }
+ }
+ public String Surname
+ {
+ get { return data.Surname; }
+ set { CheckChanged(data.Surname, value); data.Surname = value; }
+ }
+ public static String GetDisplayName (String surname, String forename, bool upperSurname = true)
+ {
+ String name = surname;
+ if (upperSurname)
+ name.ToUpper();
+ if (!StringUtil.IsEmpty(surname) && !StringUtil.IsEmpty(forename))
+ name += ", ";
+ name += forename;
+ return name;
+ }
+ public String GetDisplayName (bool upperSurname = true)
+ {
+ return GetDisplayName(Surname, Forename, upperSurname);
+ }
internal void PopulateFrom(Data data)
{
InstitutionId = data.InstitutionId;
@@ -133,37 +191,37 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId InstitutionId
{
get { return data.InstitutionId; }
- set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ set { data.InstitutionId = value; }
}
public String EmployeeNo
{
get { return data.EmployeeNo; }
- set { CheckChanged(data.EmployeeNo, value); data.EmployeeNo = value; }
+ set { data.EmployeeNo = value; }
}
public String Code
{
get { return data.Code; }
- set { CheckChanged(data.Code, value); data.Code = value; }
+ set { data.Code = value; }
}
public String Initials
{
get { return data.Initials; }
- set { CheckChanged(data.Initials, value); data.Initials = value; }
+ set { data.Initials = value; }
}
public String Title
{
get { return data.Title; }
- set { CheckChanged(data.Title, value); data.Title = value; }
+ set { data.Title = value; }
}
public String Forename
{
get { return data.Forename; }
- set { CheckChanged(data.Forename, value); data.Forename = value; }
+ set { data.Forename = value; }
}
public String Surname
{
get { return data.Surname; }
- set { CheckChanged(data.Surname, value); data.Surname = value; }
+ set { data.Surname = value; }
}
public static String GetDisplayName(String surname, String forename, bool upperSurname = true)
{
diff --git a/SaPatMgrCore/Core/Bus/SpmEmployeeRole.cs b/SaPatMgrCore/Core/Bus/SpmEmployeeRole.cs
index 7644e91..efb596f 100644
--- a/SaPatMgrCore/Core/Bus/SpmEmployeeRole.cs
+++ b/SaPatMgrCore/Core/Bus/SpmEmployeeRole.cs
@@ -34,18 +34,52 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId DepartmentId { get; set; } = new SysId();
+ public SysId EmployeeId { get; set; } = new SysId();
+ public Spm.EmployeeRole EmployeeRole { get; set; } = Spm.EmployeeRole.Unknown;
+ public DateTime ApplicationFrom { get; set; } = DateTime.MinValue;
+ public DateTime ApplicationTo { get; set; } = DateTime.MinValue;
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = EmployeeRoleStatus;
}
- public SysId DepartmentId { get; set; }
- public SysId EmployeeId { get; set; }
- public Spm.EmployeeRole EmployeeRole { get; set; }
- public DateTime ApplicationFrom { get; set; }
- public DateTime ApplicationTo { get; set; }
+ public SysId DepartmentId
+ {
+ get { return data.DepartmentId; }
+ set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ }
+ public SysId EmployeeId
+ {
+ get { return data.EmployeeId; }
+ set { CheckChanged(data.EmployeeId, value); data.EmployeeId = value; }
+ }
+ public Spm.EmployeeRole EmployeeRole
+ {
+ get { return data.EmployeeRole; }
+ set { CheckChanged((int)data.EmployeeRole, (int)value); data.EmployeeRole = value; }
+ }
+ public DateTime ApplicationFrom
+ {
+ get { return data.ApplicationFrom; }
+ set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ }
+ public DateTime ApplicationTo
+ {
+ get { return data.ApplicationTo; }
+ set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -129,27 +163,27 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId DepartmentId
{
get { return data.DepartmentId; }
- set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ set { data.DepartmentId = value; }
}
public SysId EmployeeId
{
get { return data.EmployeeId; }
- set { CheckChanged(data.EmployeeId, value); data.EmployeeId = value; }
+ set { data.EmployeeId = value; }
}
public Spm.EmployeeRole EmployeeRole
{
get { return data.EmployeeRole; }
- set { CheckChanged((int)data.EmployeeRole, (int)value); data.EmployeeRole = value; }
+ set { data.EmployeeRole = value; }
}
public DateTime ApplicationFrom
{
get { return data.ApplicationFrom; }
- set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ set { data.ApplicationFrom = value; }
}
public DateTime ApplicationTo
{
get { return data.ApplicationTo; }
- set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ set { data.ApplicationTo = value; }
}
diff --git a/SaPatMgrCore/Core/Bus/SpmFacility.cs b/SaPatMgrCore/Core/Bus/SpmFacility.cs
index 43583f8..fe47048 100644
--- a/SaPatMgrCore/Core/Bus/SpmFacility.cs
+++ b/SaPatMgrCore/Core/Bus/SpmFacility.cs
@@ -41,24 +41,88 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId DepartmentId { get; set; } = new SysId();
+ public Spm.FacilityType FacilityType { get; set; } = Spm.FacilityType.Unknown;
+ public String Name { get; set; } = "";
+ public String SortCode { get; set; } = "";
+ public String Desc { get; set; } = "";
+ public Spm.FacilityTemplateMapType TemplateMapType { get; set; } = Spm.FacilityTemplateMapType.Unknown;
+ public Spm.ScheduleFreezeType ScheduleFreezeType { get; set; } = Spm.ScheduleFreezeType.Unknown;
+ public DateTime ScheduleFreezeAtTime { get; set; } = DateTime.MinValue;
+ public String ScheduleFreezeData { get; set; } = "";
+ public DateTime ApplicationFrom { get; set; } = DateTime.MinValue;
+ public DateTime ApplicationTo { get; set; } = DateTime.MinValue;
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = FacilityStatus;
}
- public SysId DepartmentId { get; set; }
- public Spm.FacilityType FacilityType { get; set; }
- public String Name { get; set; }
- public String SortCode { get; set; }
- public String Desc { get; set; }
- public Spm.FacilityTemplateMapType TemplateMapType { get; set; }
- public Spm.ScheduleFreezeType ScheduleFreezeType { get; set; }
- public DateTime ScheduleFreezeAtTime { get; set; }
- public String ScheduleFreezeData { get; set; }
- public DateTime ApplicationFrom { get; set; }
- public DateTime ApplicationTo { get; set; }
+ public SysId DepartmentId
+ {
+ get { return data.DepartmentId; }
+ set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ }
+ public Spm.FacilityType FacilityType
+ {
+ get { return data.FacilityType; }
+ set { CheckChanged((int)data.FacilityType, (int)value); data.FacilityType = value; }
+ }
+ public String Name
+ {
+ get { return data.Name; }
+ set { CheckChanged(data.Name, value); data.Name = value; }
+ }
+ public String SortCode
+ {
+ get { return data.SortCode; }
+ set { CheckChanged(data.SortCode, value); data.SortCode = value; }
+ }
+ public String Desc
+ {
+ get { return data.Desc; }
+ set { CheckChanged(data.Desc, value); data.Desc = value; }
+ }
+ public Spm.FacilityTemplateMapType TemplateMapType
+ {
+ get { return data.TemplateMapType; }
+ set { CheckChanged((int)data.TemplateMapType, (int)value); data.TemplateMapType = value; }
+ }
+ public Spm.ScheduleFreezeType ScheduleFreezeType
+ {
+ get { return data.ScheduleFreezeType; }
+ set { CheckChanged((int)data.ScheduleFreezeType, (int)value); data.ScheduleFreezeType = value; }
+ }
+ public DateTime ScheduleFreezeAtTime
+ {
+ get { return data.ScheduleFreezeAtTime; }
+ set { CheckChanged(data.ScheduleFreezeAtTime, value); data.ScheduleFreezeAtTime = value; }
+ }
+ public String ScheduleFreezeData
+ {
+ get { return data.ScheduleFreezeData; }
+ set { CheckChanged(data.ScheduleFreezeData, value); data.ScheduleFreezeData = value; }
+ }
+ public DateTime ApplicationFrom
+ {
+ get { return data.ApplicationFrom; }
+ set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ }
+ public DateTime ApplicationTo
+ {
+ get { return data.ApplicationTo; }
+ set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ }
internal void PopulateFrom(Data data)
{
DepartmentId = data.DepartmentId;
@@ -136,23 +200,23 @@ namespace Sarand.PatientMgr.Core.Bus
//-------------------------------------------------------------------
// Utilities.
public Spm.WardAdmissionMode GetBookingMode()
-{
- // Based on 'Booking to Facility' flag etc.
- if (FacilityType == Spm.FacilityType.Ward && IsBookingToFacility)
- return Spm.WardAdmissionMode.ByWard;
- return Spm.WardAdmissionMode.ByResource;
-}
+ {
+ // Based on 'Booking to Facility' flag etc.
+ if (FacilityType == Spm.FacilityType.Ward && IsBookingToFacility)
+ return Spm.WardAdmissionMode.ByWard;
+ return Spm.WardAdmissionMode.ByResource;
+ }
- public bool IsTemplateRequiredForBooking()
-{
- if (GetBookingMode() == Spm.WardAdmissionMode.ByWard)
- return false;
- return true;
-}
+ public bool IsTemplateRequiredForBooking()
+ {
+ if (GetBookingMode() == Spm.WardAdmissionMode.ByWard)
+ return false;
+ return true;
+ }
-//-------------------------------------------------------------------
-// Properties.
-public Data GetData() { return data.Clone(); }
+ //-------------------------------------------------------------------
+ // Properties.
+ public Data GetData() { return data.Clone(); }
public void SetData(Data data)
{
String fn = GetType().Name + ".SetData";
@@ -167,57 +231,57 @@ public Data GetData() { return data.Clone(); }
public SysId DepartmentId
{
get { return data.DepartmentId; }
- set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ set { data.DepartmentId = value; }
}
public Spm.FacilityType FacilityType
{
get { return data.FacilityType; }
- set { CheckChanged((int)data.FacilityType, (int)value); data.FacilityType = value; }
+ set { data.FacilityType = value; }
}
public String Name
{
get { return data.Name; }
- set { CheckChanged(data.Name, value); data.Name = value; }
+ set { data.Name = value; }
}
public String SortCode
{
get { return data.SortCode; }
- set { CheckChanged(data.SortCode, value); data.SortCode = value; }
+ set { data.SortCode = value; }
}
public String Desc
{
get { return data.Desc; }
- set { CheckChanged(data.Desc, value); data.Desc = value; }
+ set { data.Desc = value; }
}
public Spm.FacilityTemplateMapType TemplateMapType
{
get { return data.TemplateMapType; }
- set { CheckChanged((int)data.TemplateMapType, (int)value); data.TemplateMapType = value; }
+ set { data.TemplateMapType = value; }
}
public Spm.ScheduleFreezeType ScheduleFreezeType
{
get { return data.ScheduleFreezeType; }
- set { CheckChanged((int)data.ScheduleFreezeType, (int)value); data.ScheduleFreezeType = value; }
+ set { data.ScheduleFreezeType = value; }
}
public DateTime ScheduleFreezeAtTime
{
get { return data.ScheduleFreezeAtTime; }
- set { CheckChanged(data.ScheduleFreezeAtTime, value); data.ScheduleFreezeAtTime = value; }
+ set { data.ScheduleFreezeAtTime = value; }
}
public String ScheduleFreezeData
{
get { return data.ScheduleFreezeData; }
- set { CheckChanged(data.ScheduleFreezeData, value); data.ScheduleFreezeData = value; }
+ set { data.ScheduleFreezeData = value; }
}
public DateTime ApplicationFrom
{
get { return data.ApplicationFrom; }
- set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ set { data.ApplicationFrom = value; }
}
public DateTime ApplicationTo
{
get { return data.ApplicationTo; }
- set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ set { data.ApplicationTo = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmFacilitySession.cs b/SaPatMgrCore/Core/Bus/SpmFacilitySession.cs
index 836cee2..c3eb8c6 100644
--- a/SaPatMgrCore/Core/Bus/SpmFacilitySession.cs
+++ b/SaPatMgrCore/Core/Bus/SpmFacilitySession.cs
@@ -106,35 +106,148 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId FacilityId { get; set; } = new SysId();
+ public SysId FacilityTemplateId { get; set; } = new SysId();
+ public DateTime SessionDate { get; set; } = DateTime.MinValue;
+ public Spm.TemplateType TemplateType { get; set; } = Spm.TemplateType.Unknown;
+ public String Name { get; set; } = "";
+ public String Desc { get; set; } = "";
+ public String SessionCode { get; set; } = "";
+ public DateTime StartTime { get; set; } = DateTime.MinValue;
+ public DateTime FinishTime { get; set; } = DateTime.MinValue;
+ // Ward resources & Clinic sessions.
+ public Spm.ResourceCapacityType ResourceCapacityType { get; set; } = Spm.ResourceCapacityType.Unknown;
+ public short CapacityMin { get; set; } = 0;
+ public short CapacityMax { get; set; } = 0;
+ public decimal UnitsExp { get; set; } = 0.0m;
+ public short DurationInterval { get; set; } = 0;
+ public short DurationMin { get; set; } = 0;
+ public short DurationMax { get; set; } = 0;
+ public short DurationBreaks { get; set; } = 0;
+ // Theatre & Clinic sessions.
+ public SysId ConsultantId { get; set; } = new SysId();
+ public String ConsultantCode { get; set; } = "";
+ public String SpecialityCode { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = FacilitySessionStatus;
}
- public SysId FacilityId{ get; set; }
- public SysId FacilityTemplateId{ get; set; }
- public DateTime SessionDate{ get; set; }
- public Spm.TemplateType TemplateType { get; set; }
- public String Name { get; set; }
- public String Desc { get; set; }
- public String SessionCode{ get; set; }
- public DateTime StartTime { get; set; }
- public DateTime FinishTime { get; set; }
- // Ward resources & Clinic sessions.
- public Spm.ResourceCapacityType ResourceCapacityType { get; set; }
- public short CapacityMin { get; set; }
- public short CapacityMax { get; set; }
- public decimal UnitsExp { get; set; }
- public short DurationInterval { get; set; }
- public short DurationMin { get; set; }
- public short DurationMax { get; set; }
- public short DurationBreaks { get; set; }
- // Theatre & Clinic sessions.
- public SysId ConsultantId{ get; set; }
- public String ConsultantCode{ get; set; }
- public String SpecialityCode{ get; set; }
+ public SysId FacilityId
+ {
+ get { return data.FacilityId; }
+ set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ }
+ public SysId FacilityTemplateId
+ {
+ get { return data.FacilityTemplateId; }
+ set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ }
+ public DateTime SessionDate
+ {
+ get { return data.SessionDate; }
+ set { CheckChanged(data.SessionDate, value); data.SessionDate = value; }
+ }
+ public Spm.TemplateType TemplateType
+ {
+ get { return data.TemplateType; }
+ set { CheckChanged((int)data.TemplateType, (int)value); data.TemplateType = value; }
+ }
+ public String Name
+ {
+ get { return data.Name; }
+ set { CheckChanged(data.Name, value); data.Name = value; }
+ }
+ public String Description
+ {
+ get { return data.Desc; }
+ set { CheckChanged(data.Desc, value); data.Desc = value; }
+ }
+ public String SessionCode
+ {
+ get { return data.SessionCode; }
+ set { CheckChanged(data.SessionCode, value); data.SessionCode = value; }
+ }
+ public DateTime StartTime
+ {
+ get { return data.StartTime; }
+ set { CheckChanged(data.StartTime, value); data.StartTime = value; }
+ }
+ public DateTime FinishTime
+ {
+ get { return data.FinishTime; }
+ set { CheckChanged(data.FinishTime, value); data.FinishTime = value; }
+ }
+ public Spm.ResourceCapacityType ResourceCapacityType
+ {
+ get { return data.ResourceCapacityType; }
+ set { CheckChanged((int)data.ResourceCapacityType, (int)value); data.ResourceCapacityType = value; }
+ }
+ public short CapacityMin
+ {
+ get { return data.CapacityMin; }
+ set { CheckChanged(data.CapacityMin, value); data.CapacityMin = value; }
+ }
+ public short CapacityMax
+ {
+ get { return data.CapacityMax; }
+ set { CheckChanged(data.CapacityMax, value); data.CapacityMax = value; }
+ }
+ public decimal UnitsExp
+ {
+ get { return data.UnitsExp; }
+ set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ }
+ public static ushort GetDurationIntervalDefault ()
+ {
+ return 15;
+ }
+ public short DurationInterval
+ {
+ get { return data.DurationInterval; }
+ set { CheckChanged(data.DurationInterval, value); data.DurationInterval = value; }
+ }
+ public short DurationMin
+ {
+ get { return data.DurationMin; }
+ set { CheckChanged(data.DurationMin, value); data.DurationMin = value; }
+ }
+ public short DurationMax
+ {
+ get { return data.DurationMax; }
+ set { CheckChanged(data.DurationMax, value); data.DurationMax = value; }
+ }
+ public short DurationBreaks
+ {
+ get { return data.DurationBreaks; }
+ set { CheckChanged(data.DurationBreaks, value); data.DurationBreaks = value; }
+ }
+ public SysId ConsultantId
+ {
+ get { return data.ConsultantId; }
+ set { CheckChanged(data.ConsultantId, value); data.ConsultantId = value; }
+ }
+ public String ConsultantCode
+ {
+ get { return data.ConsultantCode; }
+ set { CheckChanged(data.ConsultantCode, value); data.ConsultantCode = value; }
+ }
+ public String SpecialityCode
+ {
+ get { return data.SpecialityCode; }
+ set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -143,7 +256,7 @@ namespace Sarand.PatientMgr.Core.Bus
SessionDate = data.SessionDate;
TemplateType = data.TemplateType;
Name = data.Name;
- Desc = data.Desc;
+ Description = data.Description;
SessionCode = data.SessionCode;
StartTime = data.StartTime;
FinishTime = data.FinishTime;
@@ -252,67 +365,67 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId FacilityId
{
get { return data.FacilityId; }
- set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ set { data.FacilityId = value; }
}
public SysId FacilityTemplateId
{
get { return data.FacilityTemplateId; }
- set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ set { data.FacilityTemplateId = value; }
}
public DateTime SessionDate
{
get { return data.SessionDate; }
- set { CheckChanged(data.SessionDate, value); data.SessionDate = value; }
+ set { data.SessionDate = value; }
}
public Spm.TemplateType TemplateType
{
get { return data.TemplateType; }
- set { CheckChanged((int)data.TemplateType, (int)value); data.TemplateType = value; }
+ set { data.TemplateType = value; }
}
public String Name
{
get { return data.Name; }
- set { CheckChanged(data.Name, value); data.Name = value; }
+ set { data.Name = value; }
}
public String Description
{
- get { return data.Desc; }
- set { CheckChanged(data.Desc, value); data.Desc = value; }
+ get { return data.Description; }
+ set { data.Description = value; }
}
public String SessionCode
{
get { return data.SessionCode; }
- set { CheckChanged(data.SessionCode, value); data.SessionCode = value; }
+ set { data.SessionCode = value; }
}
public DateTime StartTime
{
get { return data.StartTime; }
- set { CheckChanged(data.StartTime, value); data.StartTime = value; }
+ set { data.StartTime = value; }
}
public DateTime FinishTime
{
get { return data.FinishTime; }
- set { CheckChanged(data.FinishTime, value); data.FinishTime = value; }
+ set { data.FinishTime = value; }
}
public Spm.ResourceCapacityType ResourceCapacityType
{
get { return data.ResourceCapacityType; }
- set { CheckChanged((int)data.ResourceCapacityType, (int)value); data.ResourceCapacityType = value; }
+ set { data.ResourceCapacityType = value; }
}
public short CapacityMin
{
get { return data.CapacityMin; }
- set { CheckChanged(data.CapacityMin, value); data.CapacityMin = value; }
+ set { data.CapacityMin = value; }
}
public short CapacityMax
{
get { return data.CapacityMax; }
- set { CheckChanged(data.CapacityMax, value); data.CapacityMax = value; }
+ set { data.CapacityMax = value; }
}
public decimal UnitsExp
{
get { return data.UnitsExp; }
- set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ set { data.UnitsExp = value; }
}
public static ushort GetDurationIntervalDefault()
{
@@ -321,37 +434,37 @@ namespace Sarand.PatientMgr.Core.Bus
public short DurationInterval
{
get { return data.DurationInterval; }
- set { CheckChanged(data.DurationInterval, value); data.DurationInterval = value; }
+ set { data.DurationInterval = value; }
}
public short DurationMin
{
get { return data.DurationMin; }
- set { CheckChanged(data.DurationMin, value); data.DurationMin = value; }
+ set { data.DurationMin = value; }
}
public short DurationMax
{
get { return data.DurationMax; }
- set { CheckChanged(data.DurationMax, value); data.DurationMax = value; }
+ set { data.DurationMax = value; }
}
public short DurationBreaks
{
get { return data.DurationBreaks; }
- set { CheckChanged(data.DurationBreaks, value); data.DurationBreaks = value; }
+ set { data.DurationBreaks = value; }
}
public SysId ConsultantId
{
get { return data.ConsultantId; }
- set { CheckChanged(data.ConsultantId, value); data.ConsultantId = value; }
+ set { data.ConsultantId = value; }
}
public String ConsultantCode
{
get { return data.ConsultantCode; }
- set { CheckChanged(data.ConsultantCode, value); data.ConsultantCode = value; }
+ set { data.ConsultantCode = value; }
}
public String SpecialityCode
{
get { return data.SpecialityCode; }
- set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ set { data.SpecialityCode = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmFacilityTemplate.cs b/SaPatMgrCore/Core/Bus/SpmFacilityTemplate.cs
index 33a9ab6..baa02ba 100644
--- a/SaPatMgrCore/Core/Bus/SpmFacilityTemplate.cs
+++ b/SaPatMgrCore/Core/Bus/SpmFacilityTemplate.cs
@@ -55,40 +55,180 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId FacilityId { get; set; } = new SysId();
+ public Spm.ResourceCategory ResourceCategory { get; set; } = Spm.ResourceCategory.Unknown;
+ public Spm.TemplateType TemplateType { get; set; } = Spm.TemplateType.Unknown;
+ public String Name { get; set; } = "";
+ public String SortCode { get; set; } = "";
+ public String Desc { get; set; } = "";
+ public String SessionCode { get; set; } = "";
+ public String Group { get; set; } = "";
+ // Ward resources & Clinic sessions.
+ public Spm.ResourceCapacityType ResourceCapacityType { get; set; } = Spm.ResourceCapacityType.Unknown;
+ public ushort CapacityMin { get; set; } = 0;
+ public ushort CapacityMax { get; set; } = 0;
+ public decimal UnitsExp { get; set; } = 0.0m;
+ public ushort DurationInterval { get; set; } = 0;
+ public ushort DurationMin { get; set; } = 0;
+ public ushort DurationMax { get; set; } = 0;
+ public ushort DurationBreaks { get; set; } = 0;
+ // Theatre & Clinic sessions.
+ public ushort WeekOfMonth { get; set; } = 0;
+ public ushort DayOfWeek { get; set; } = 0;
+ public SysId ConsultantId { get; set; } = new SysId(); // Employee role.
+ public String ConsultantCode { get; set; } = "";
+ public String SpecialityCode { get; set; } = "";
+ public DateTime StartTime { get; set; } = DateTime.MinValue;
+ public DateTime FinishTime { get; set; } = DateTime.MinValue;
+ public DateTime ApplicationFrom { get; set; } = DateTime.MinValue;
+ public DateTime ApplicationTo { get; set; } = DateTime.MinValue;
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = FacilityTemplateStatus;
}
- public SysId FacilityId { get; set; }
- public Spm.ResourceCategory ResourceCategory { get; set; }
- public Spm.TemplateType TemplateType { get; set; }
- public String Name { get; set; }
- public String SortCode { get; set; }
- public String Desc { get; set; }
- public String SessionCode { get; set; }
- public String Group { get; set; }
+ public SysId FacilityId
+ {
+ get { return data.FacilityId; }
+ set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ }
+ public Spm.ResourceCategory ResourceCategory
+ {
+ get { return data.ResourceCategory; }
+ set { CheckChanged((int)data.ResourceCategory, (int)value); data.ResourceCategory = value; }
+ }
+ public Spm.TemplateType TemplateType
+ {
+ get { return data.TemplateType; }
+ set { CheckChanged((int)data.TemplateType, (int)value); data.TemplateType = value; }
+ }
+ public String Name
+ {
+ get { return data.Name; }
+ set { CheckChanged(data.Name, value); data.Name = value; }
+ }
+ public String SortCode
+ {
+ get { return data.SortCode; }
+ set { CheckChanged(data.SortCode, value); data.SortCode = value; }
+ }
+ public String Desc
+ {
+ get { return data.Desc; }
+ set { CheckChanged(data.Desc, value); data.Desc = value; }
+ }
+ public String SessionCode
+ {
+ get { return data.SessionCode; }
+ set { CheckChanged(data.SessionCode, value); data.SessionCode = value; }
+ }
+ public String Group
+ {
+ get { return data.Group; }
+ set { CheckChanged(data.Group, value); data.Group = value; }
+ }
// Ward resources & Clinic sessions.
- public Spm.ResourceCapacityType ResourceCapacityType { get; set; }
- public ushort CapacityMin { get; set; }
- public ushort CapacityMax { get; set; }
- public decimal UnitsExp { get; set; }
- public ushort DurationInterval { get; set; }
- public ushort DurationMin { get; set; }
- public ushort DurationMax { get; set; }
- public ushort DurationBreaks { get; set; }
+ public Spm.ResourceCapacityType ResourceCapacityType
+ {
+ get { return data.ResourceCapacityType; }
+ set { CheckChanged((int)data.ResourceCapacityType, (int)value); data.ResourceCapacityType = value; }
+ }
+ public ushort CapacityMin
+ {
+ get { return data.CapacityMin; }
+ set { CheckChanged(data.CapacityMin, value); data.CapacityMin = value; }
+ }
+ public ushort CapacityMax
+ {
+ get { return data.CapacityMax; }
+ set { CheckChanged(data.CapacityMax, value); data.CapacityMax = value; }
+ }
+ public decimal UnitsExp
+ {
+ get { return data.UnitsExp; }
+ set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ }
+ public static ushort GetDurationIntervalDefault ()
+ {
+ return 15;
+ }
+ public ushort DurationInterval
+ {
+ get { return data.DurationInterval; }
+ set { CheckChanged(data.DurationInterval, value); data.DurationInterval = value; }
+ }
+ public ushort DurationMin
+ {
+ get { return data.DurationMin; }
+ set { CheckChanged(data.DurationMin, value); data.DurationMin = value; }
+ }
+ public ushort DurationMax
+ {
+ get { return data.DurationMax; }
+ set { CheckChanged(data.DurationMax, value); data.DurationMax = value; }
+ }
+ public ushort DurationBreaks
+ {
+ get { return data.DurationBreaks; }
+ set { CheckChanged(data.DurationBreaks, value); data.DurationBreaks = value; }
+ }
// Theatre & Clinic sessions.
- public ushort WeekOfMonth { get; set; }
- public ushort DayOfWeek { get; set; }
- public SysId ConsultantId { get; set; } // Employee role.
- public String ConsultantCode { get; set; }
- public String SpecialityCode { get; set; }
- public DateTime StartTime { get; set; }
- public DateTime FinishTime { get; set; }
- public DateTime ApplicationFrom { get; set; }
- public DateTime ApplicationTo { get; set; }
+ public ushort WeekOfMonth
+ {
+ get { return data.WeekOfMonth; }
+ set { CheckChanged(data.WeekOfMonth, value); data.WeekOfMonth = value; }
+ }
+ public ushort DayOfWeek
+ {
+ get { return data.DayOfWeek; }
+ set { CheckChanged(data.DayOfWeek, value); data.DayOfWeek = value; }
+ }
+ public SysId ConsultantId
+ {
+ get { return data.ConsultantId; }
+ set { CheckChanged(data.ConsultantId, value); data.ConsultantId = value; }
+ }
+ public String ConsultantCode
+ {
+ get { return data.ConsultantCode; }
+ set { CheckChanged(data.ConsultantCode, value); data.ConsultantCode = value; }
+ }
+ public String SpecialityCode
+ {
+ get { return data.SpecialityCode; }
+ set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ }
+ public DateTime StartTime
+ {
+ get { return data.StartTime; }
+ set { CheckChanged(data.StartTime, value); data.StartTime = value; }
+ }
+ public DateTime FinishTime
+ {
+ get { return data.FinishTime; }
+ set { CheckChanged(data.FinishTime, value); data.FinishTime = value; }
+ }
+ public DateTime ApplicationFrom
+ {
+ get { return data.ApplicationFrom; }
+ set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ }
+ public DateTime ApplicationTo
+ {
+ get { return data.ApplicationTo; }
+ set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -214,63 +354,63 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId FacilityId
{
get { return data.FacilityId; }
- set { CheckChanged(data.FacilityId, value); data.FacilityId = value; }
+ set { data.FacilityId = value; }
}
public Spm.ResourceCategory ResourceCategory
{
get { return data.ResourceCategory; }
- set { CheckChanged((int)data.ResourceCategory, (int)value); data.ResourceCategory = value; }
+ set { data.ResourceCategory = value; }
}
public Spm.TemplateType TemplateType
{
get { return data.TemplateType; }
- set { CheckChanged((int)data.TemplateType, (int)value); data.TemplateType = value; }
+ set { data.TemplateType = value; }
}
public String Name
{
get { return data.Name; }
- set { CheckChanged(data.Name, value); data.Name = value; }
+ set { data.Name = value; }
}
public String SortCode
{
get { return data.SortCode; }
- set { CheckChanged(data.SortCode, value); data.SortCode = value; }
+ set { data.SortCode = value; }
}
public String Desc
{
get { return data.Desc; }
- set { CheckChanged(data.Desc, value); data.Desc = value; }
+ set { data.Desc = value; }
}
public String SessionCode
{
get { return data.SessionCode; }
- set { CheckChanged(data.SessionCode, value); data.SessionCode = value; }
+ set { data.SessionCode = value; }
}
public String Group
{
get { return data.Group; }
- set { CheckChanged(data.Group, value); data.Group = value; }
+ set { data.Group = value; }
}
// Ward resources & Clinic sessions.
public Spm.ResourceCapacityType ResourceCapacityType
{
get { return data.ResourceCapacityType; }
- set { CheckChanged((int)data.ResourceCapacityType, (int)value); data.ResourceCapacityType = value; }
+ set { data.ResourceCapacityType = value; }
}
public ushort CapacityMin
{
get { return data.CapacityMin; }
- set { CheckChanged(data.CapacityMin, value); data.CapacityMin = value; }
+ set { data.CapacityMin = value; }
}
public ushort CapacityMax
{
get { return data.CapacityMax; }
- set { CheckChanged(data.CapacityMax, value); data.CapacityMax = value; }
+ set { data.CapacityMax = value; }
}
public decimal UnitsExp
{
get { return data.UnitsExp; }
- set { CheckChanged(data.UnitsExp, value); data.UnitsExp = value; }
+ set { data.UnitsExp = value; }
}
public static ushort GetDurationIntervalDefault()
{
@@ -279,68 +419,68 @@ namespace Sarand.PatientMgr.Core.Bus
public ushort DurationInterval
{
get { return data.DurationInterval; }
- set { CheckChanged(data.DurationInterval, value); data.DurationInterval = value; }
+ set { data.DurationInterval = value; }
}
public ushort DurationMin
{
get { return data.DurationMin; }
- set { CheckChanged(data.DurationMin, value); data.DurationMin = value; }
+ set { data.DurationMin = value; }
}
public ushort DurationMax
{
get { return data.DurationMax; }
- set { CheckChanged(data.DurationMax, value); data.DurationMax = value; }
+ set { data.DurationMax = value; }
}
public ushort DurationBreaks
{
get { return data.DurationBreaks; }
- set { CheckChanged(data.DurationBreaks, value); data.DurationBreaks = value; }
+ set { data.DurationBreaks = value; }
}
// Theatre & Clinic sessions.
public ushort WeekOfMonth
{
get { return data.WeekOfMonth; }
- set { CheckChanged(data.WeekOfMonth, value); data.WeekOfMonth = value; }
+ set { data.WeekOfMonth = value; }
}
public ushort DayOfWeek
{
get { return data.DayOfWeek; }
- set { CheckChanged(data.DayOfWeek, value); data.DayOfWeek = value; }
+ set { data.DayOfWeek = value; }
}
public SysId ConsultantId
{
get { return data.ConsultantId; }
- set { CheckChanged(data.ConsultantId, value); data.ConsultantId = value; }
+ set { data.ConsultantId = value; }
}
public String ConsultantCode
{
get { return data.ConsultantCode; }
- set { CheckChanged(data.ConsultantCode, value); data.ConsultantCode = value; }
+ set { data.ConsultantCode = value; }
}
public String SpecialityCode
{
get { return data.SpecialityCode; }
- set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ set { data.SpecialityCode = value; }
}
public DateTime StartTime
{
get { return data.StartTime; }
- set { CheckChanged(data.StartTime, value); data.StartTime = value; }
+ set { data.StartTime = value; }
}
public DateTime FinishTime
{
get { return data.FinishTime; }
- set { CheckChanged(data.FinishTime, value); data.FinishTime = value; }
+ set { data.FinishTime = value; }
}
public DateTime ApplicationFrom
{
get { return data.ApplicationFrom; }
- set { CheckChanged(data.ApplicationFrom, value); data.ApplicationFrom = value; }
+ set { data.ApplicationFrom = value; }
}
public DateTime ApplicationTo
{
get { return data.ApplicationTo; }
- set { CheckChanged(data.ApplicationTo, value); data.ApplicationTo = value; }
+ set { data.ApplicationTo = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmInstitution.cs b/SaPatMgrCore/Core/Bus/SpmInstitution.cs
index fa03ce2..e17449a 100644
--- a/SaPatMgrCore/Core/Bus/SpmInstitution.cs
+++ b/SaPatMgrCore/Core/Bus/SpmInstitution.cs
@@ -29,14 +29,28 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public String Name { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = InstitutionStatus;
}
- public String Name { get; set; }
+ public String Name
+ {
+ get { return data.Name; }
+ set { CheckChanged(data.Name, value); data.Name = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -109,7 +123,7 @@ namespace Sarand.PatientMgr.Core.Bus
public String Name
{
get { return data.Name; }
- set { CheckChanged(data.Name, value); data.Name = value; }
+ set { data.Name = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmOperation.cs b/SaPatMgrCore/Core/Bus/SpmOperation.cs
index 4bdae67..973c077 100644
--- a/SaPatMgrCore/Core/Bus/SpmOperation.cs
+++ b/SaPatMgrCore/Core/Bus/SpmOperation.cs
@@ -31,16 +31,40 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId InstitutionId { get; set; } = new SysId();
+ public String Code { get; set; } = "";
+ public String Description { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = OperationStatus;
}
- public SysId InstitutionId { get; set; }
- public String Code { get; set; }
- public String Description { get; set; }
+ public SysId InstitutionId
+ {
+ get { return data.InstitutionId; }
+ set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ }
+ public String Code
+ {
+ get { return data.Code; }
+ set { CheckChanged(data.Code, value); data.Code = value; }
+ }
+ public String Description
+ {
+ get { return data.Description; }
+ set { CheckChanged(data.Description, value); data.Description = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -118,17 +142,17 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId InstitutionId
{
get { return data.InstitutionId; }
- set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ set { data.InstitutionId = value; }
}
public String Code
{
get { return data.Code; }
- set { CheckChanged(data.Code, value); data.Code = value; }
+ set { data.Code = value; }
}
public String Description
{
get { return data.Description; }
- set { CheckChanged(data.Description, value); data.Description = value; }
+ set { data.Description = value; }
}
diff --git a/SaPatMgrCore/Core/Bus/SpmPatient.cs b/SaPatMgrCore/Core/Bus/SpmPatient.cs
index 9142aa7..56e6e3d 100644
--- a/SaPatMgrCore/Core/Bus/SpmPatient.cs
+++ b/SaPatMgrCore/Core/Bus/SpmPatient.cs
@@ -38,23 +38,96 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId InstitutionId { get; set; } = new SysId();
+ public String PatientNo { get; set; } = "";
+ public String NhsNumber { get; set; } = "";
+ public String Title { get; set; } = "";
+ public String Forename { get; set; } = "";
+ public String Surname { get; set; } = "";
+ public Spm.Gender Gender { get; set; } = Spm.Gender.Unknown;
+ public DateTime BirthOn { get; set; } = DateTime.MinValue;
+ public String Age { get; set; } = "";
+ public DateTime AgeOn { get; set; } = DateTime.MinValue;
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = PatientStatus;
}
- public SysId InstitutionId { get; set; }
- public String PatientNo { get; set; }
- public String NhsNumber { get; set; }
- public String Title { get; set; }
- public String Forename { get; set; }
- public String Surname { get; set; }
- public Spm.Gender Gender { get; set; }
- public DateTime BirthOn { get; set; }
- public String Age { get; set; }
- public DateTime AgeOn { get; set; }
+ public SysId InstitutionId
+ {
+ get { return data.InstitutionId; }
+ set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ }
+ public String PatientNo
+ {
+ get { return data.PatientNo; }
+ set { CheckChanged(data.PatientNo, value); data.PatientNo = value; }
+ }
+ public String NhsNumber
+ {
+ get { return data.NhsNumber; }
+ set { CheckChanged(data.NhsNumber, value); data.NhsNumber = value; }
+ }
+ public String Title
+ {
+ get { return data.Title; }
+ set { CheckChanged(data.Title, value); data.Title = value; }
+ }
+ public String Forename
+ {
+ get { return data.Forename; }
+ set { CheckChanged(data.Forename, value); data.Forename = value; }
+ }
+ public String Surname
+ {
+ get { return data.Surname; }
+ set { CheckChanged(data.Surname, value); data.Surname = value; }
+ }
+ public static String GetDisplayName (String surname, String forename, bool upperSurname = true)
+ {
+ String name = surname;
+ if (upperSurname)
+ name.ToUpper();
+ if (!StringUtil.IsEmpty(surname) && !StringUtil.IsEmpty(forename))
+ name += ", ";
+ name += forename;
+ return name;
+ }
+ public String GetDisplayName (bool upperSurname = true)
+ {
+ return GetDisplayName(Surname, Forename, upperSurname);
+ }
+ public Spm.Gender Gender
+ {
+ get { return data.Gender; }
+ set { CheckChanged((int)data.Gender, (int)value); data.Gender = value; }
+ }
+ public DateTime BirthOn
+ {
+ get { return data.BirthOn; }
+ set { CheckChanged(data.BirthOn, value); data.BirthOn = value; }
+ }
+ public String Age
+ {
+ get { return data.Age; }
+ set { CheckChanged(data.Age, value); data.Age = value; }
+ }
+ public DateTime AgeOn
+ {
+ get { return data.AgeOn; }
+ set { CheckChanged(data.AgeOn, value); data.AgeOn = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -146,32 +219,32 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId InstitutionId
{
get { return data.InstitutionId; }
- set { CheckChanged(data.InstitutionId, value); data.InstitutionId = value; }
+ set { data.InstitutionId = value; }
}
public String PatientNo
{
get { return data.PatientNo; }
- set { CheckChanged(data.PatientNo, value); data.PatientNo = value; }
+ set { data.PatientNo = value; }
}
public String NhsNumber
{
get { return data.NhsNumber; }
- set { CheckChanged(data.NhsNumber, value); data.NhsNumber = value; }
+ set { data.NhsNumber = value; }
}
public String Title
{
get { return data.Title; }
- set { CheckChanged(data.Title, value); data.Title = value; }
+ set { data.Title = value; }
}
public String Forename
{
get { return data.Forename; }
- set { CheckChanged(data.Forename, value); data.Forename = value; }
+ set { data.Forename = value; }
}
public String Surname
{
get { return data.Surname; }
- set { CheckChanged(data.Surname, value); data.Surname = value; }
+ set { data.Surname = value; }
}
public static String GetDisplayName(String surname, String forename, bool upperSurname = true)
{
@@ -190,25 +263,24 @@ namespace Sarand.PatientMgr.Core.Bus
public Spm.Gender Gender
{
get { return data.Gender; }
- set { CheckChanged((int)data.Gender, (int)value); data.Gender = value; }
+ set { data.Gender = value; }
}
public DateTime BirthOn
{
get { return data.BirthOn; }
- set { CheckChanged(data.BirthOn, value); data.BirthOn = value; }
+ set { data.BirthOn = value; }
}
public String Age
{
get { return data.Age; }
- set { CheckChanged(data.Age, value); data.Age = value; }
+ set { data.Age = value; }
}
public DateTime AgeOn
{
get { return data.AgeOn; }
- set { CheckChanged(data.AgeOn, value); data.AgeOn = value; }
+ set { data.AgeOn = value; }
}
-
//-------------------------------------------------------------------
// Flags.
diff --git a/SaPatMgrCore/Core/Bus/SpmProcedure.cs b/SaPatMgrCore/Core/Bus/SpmProcedure.cs
index b931243..1c11539 100644
--- a/SaPatMgrCore/Core/Bus/SpmProcedure.cs
+++ b/SaPatMgrCore/Core/Bus/SpmProcedure.cs
@@ -36,23 +36,82 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId DepartmentId { get; set; } = new SysId(); // Department.
+ public SysId OperationId { get; set; } = new SysId(); // Operation Id.
+ public String OperationCode { get; set; } = ""; // Operation code.
+ public String Description { get; set; } = "";
+ public String SpecialityCode { get; set; } = "";
+ public String ComplexityCode { get; set; } = "";
+ public short Duration { get; set; } = 0; // Minutes.
+ public short DurationTraining { get; set; } = 0; // Minutes.
+ public decimal Units { get; set; } = 0.0m;
+ public decimal UnitsTraining { get; set; } = 0.0m;
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = ProcedureStatus;
}
- public SysId DepartmentId { get; set; } // Department.
- public SysId OperationId { get; set; } // Operation Id.
- public String OperationCode { get; set; } // Operation code.
- public String Description { get; set; }
- public String SpecialityCode { get; set; }
- public String ComplexityCode { get; set; }
- public short Duration { get; set; } // Minutes.
- public short DurationTraining { get; set; } // Minutes.
- public decimal Units { get; set; }
- public decimal UnitsTraining { get; set; }
+ public SysId DepartmentId
+ {
+ get { return data.DepartmentId; }
+ set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ }
+ public SysId OperationId
+ {
+ get { return data.OperationId; }
+ set { CheckChanged(data.OperationId, value); data.OperationId = value; }
+ }
+ public String OperationCode
+ {
+ get { return data.OperationCode; }
+ set { CheckChanged(data.OperationCode, value); data.OperationCode = value; }
+ }
+ public String Description
+ {
+ get { return data.Description; }
+ set { CheckChanged(data.Description, value); data.Description = value; }
+ }
+ public String SpecialityCode
+ {
+ get { return data.SpecialityCode; }
+ set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ }
+ public String ComplexityCode
+ {
+ get { return data.ComplexityCode; }
+ set { CheckChanged(data.ComplexityCode, value); data.ComplexityCode = value; }
+ }
+ public short Duration
+ {
+ get { return data.Duration; }
+ set { CheckChanged(data.Duration, value); data.Duration = value; }
+ }
+ public short DurationTraining
+ {
+ get { return data.DurationTraining; }
+ set { CheckChanged(data.DurationTraining, value); data.DurationTraining = value; }
+ }
+ public decimal Units
+ {
+ get { return data.Units; }
+ set { CheckChanged(data.Units, value); data.Units = value; }
+ }
+ public decimal UnitsTraining
+ {
+ get { return data.UnitsTraining; }
+ set { CheckChanged(data.UnitsTraining, value); data.UnitsTraining = value; }
+ }
internal void PopulateFrom(Data data)
{
@@ -144,52 +203,52 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId DepartmentId
{
get { return data.DepartmentId; }
- set { CheckChanged(data.DepartmentId, value); data.DepartmentId = value; }
+ set { data.DepartmentId = value; }
}
public SysId OperationId
{
get { return data.OperationId; }
- set { CheckChanged(data.OperationId, value); data.OperationId = value; }
+ set { data.OperationId = value; }
}
public String OperationCode
{
get { return data.OperationCode; }
- set { CheckChanged(data.OperationCode, value); data.OperationCode = value; }
+ set { data.OperationCode = value; }
}
public String Description
{
get { return data.Description; }
- set { CheckChanged(data.Description, value); data.Description = value; }
+ set { data.Description = value; }
}
public String SpecialityCode
{
get { return data.SpecialityCode; }
- set { CheckChanged(data.SpecialityCode, value); data.SpecialityCode = value; }
+ set { data.SpecialityCode = value; }
}
public String ComplexityCode
{
get { return data.ComplexityCode; }
- set { CheckChanged(data.ComplexityCode, value); data.ComplexityCode = value; }
+ set { data.ComplexityCode = value; }
}
public short Duration
{
get { return data.Duration; }
- set { CheckChanged(data.Duration, value); data.Duration = value; }
+ set { data.Duration = value; }
}
public short DurationTraining
{
get { return data.DurationTraining; }
- set { CheckChanged(data.DurationTraining, value); data.DurationTraining = value; }
+ set { data.DurationTraining = value; }
}
public decimal Units
{
get { return data.Units; }
- set { CheckChanged(data.Units, value); data.Units = value; }
+ set { data.Units = value; }
}
public decimal UnitsTraining
{
get { return data.UnitsTraining; }
- set { CheckChanged(data.UnitsTraining, value); data.UnitsTraining = value; }
+ set { data.UnitsTraining = value; }
}
//-------------------------------------------------------------------
diff --git a/SaPatMgrCore/Core/Bus/SpmTemplateData.cs b/SaPatMgrCore/Core/Bus/SpmTemplateData.cs
index 74069d2..3eb99e0 100644
--- a/SaPatMgrCore/Core/Bus/SpmTemplateData.cs
+++ b/SaPatMgrCore/Core/Bus/SpmTemplateData.cs
@@ -32,18 +32,52 @@ namespace Sarand.PatientMgr.Core.Bus
UpdateOn_Date,
}
+ //-------------------------------------------------------------------
+ /// Properties other than common.
+ public class DataProperties
+ {
+ public SysId FacilityTemplateId { get; set; } = new SysId();
+ public Spm.TemplateDataType TemplateDataType { get; set; } = Spm.TemplateDataType.Unknown;
+ public short Seq { get; set; } = 0;
+ public String Identifier { get; set; } = "";
+ public String Value { get; set; } = "";
+ }
+
// Data.
public new class Data : SacsHierarchyItem.Data
{
- public Data()
+ // Data members.
+ private readonly DataProperties data = new DataProperties();
+ // Construction.
+ public Data ()
{
//Status = TemplateDataStatus;
}
- public SysId FacilityTemplateId { get; set; }
- public Spm.TemplateDataType TemplateDataType { get; set; }
- public short Seq { get; set; }
- public String Identifier { get; set; }
- public String Value { get; set; }
+ public SysId FacilityTemplateId
+ {
+ get { return data.FacilityTemplateId; }
+ set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ }
+ public Spm.TemplateDataType TemplateDataType
+ {
+ get { return data.TemplateDataType; }
+ set { CheckChanged((int)data.TemplateDataType, (int)value); data.TemplateDataType = value; }
+ }
+ public short Seq
+ {
+ get { return data.Seq; }
+ set { CheckChanged(data.Seq, value); data.Seq = value; }
+ }
+ public String Identifier
+ {
+ get { return data.Identifier; }
+ set { CheckChanged(data.Identifier, value); data.Identifier = value; }
+ }
+ public String Value
+ {
+ get { return data.Value; }
+ set { CheckChanged(data.Value, value); data.Value = value; }
+ }
internal void PopulateFrom(Data data)
{
FacilityTemplateId = FacilityTemplateId;
@@ -123,27 +157,27 @@ namespace Sarand.PatientMgr.Core.Bus
public SysId FacilityTemplateId
{
get { return data.FacilityTemplateId; }
- set { CheckChanged(data.FacilityTemplateId, value); data.FacilityTemplateId = value; }
+ set { data.FacilityTemplateId = value; }
}
public Spm.TemplateDataType TemplateDataType
{
get { return data.TemplateDataType; }
- set { CheckChanged((int)data.TemplateDataType, (int)value); data.TemplateDataType = value; }
+ set { data.TemplateDataType = value; }
}
public short Seq
{
get { return data.Seq; }
- set { CheckChanged(data.Seq, value); data.Seq = value; }
+ set { data.Seq = value; }
}
public String Identifier
{
get { return data.Identifier; }
- set { CheckChanged(data.Identifier, value); data.Identifier = value; }
+ set { data.Identifier = value; }
}
public String Value
{
get { return data.Value; }
- set { CheckChanged(data.Value, value); data.Value = value; }
+ set { data.Value = value; }
}
diff --git a/SaPatMgrCore/Core/Data/SpmWindowsServiceCrypter.cs b/SaPatMgrCore/Core/Data/SpmWindowsServiceCrypter.cs
new file mode 100644
index 0000000..48e6ad7
--- /dev/null
+++ b/SaPatMgrCore/Core/Data/SpmWindowsServiceCrypter.cs
@@ -0,0 +1,71 @@
+using Sarand.Core.Base;
+using Sarand.Core.Data;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Sarand.PatientMgr.Core.Data
+{
+ //=======================================================================
+ public static class SpmWindowsServiceCrypter
+ {
+ //-------------------------------------------------------------------
+ // Data members.
+ ///
+ /// Encryption is shared between Windows Service app and mobile
+ ///
+ private static readonly String requestDataKey = "~{PatientMgr}#[WindowsService]&/DataCryption/*|RequestData|";
+ private static readonly String responseDataKey = "{Sarand}+(PatientMgr)%\\WindowsService/=@:Response:";
+
+ //-------------------------------------------------------------------
+ // R e q u e s t D a t a
+ //-------------------------------------------------------------------
+ /// Encrypt request data
+ public static String EncryptRequestData (String value)
+ {
+ try
+ {
+ return SacsAesIvCrypter.Encrypt(value, requestDataKey);
+ }
+ catch (Exception exc) { Logger.Debug("EncryptRequestData " + exc.GetType().Name + ": " + exc.Message); }
+ return value;
+ }
+ /// Decrypt request data
+ public static String DecryptRequestData (String value)
+ {
+ try
+ {
+ return SacsAesIvCrypter.Decrypt(value, requestDataKey);
+ }
+ catch (Exception exc) { Logger.Debug("DecryptRequestData " + exc.GetType().Name + ": " + exc.Message); }
+ return value;
+ }
+
+ //-------------------------------------------------------------------
+ // R e s p o n s e D a t a
+ //-------------------------------------------------------------------
+ /// Encrypt response data
+ public static String EncryptResponseData (String value)
+ {
+ try
+ {
+ return SacsAesIvCrypter.Encrypt(value, responseDataKey);
+ }
+ catch (Exception exc) { Logger.Debug("EncryptResponseData " + exc.GetType().Name + ": " + exc.Message); }
+ return value;
+ }
+ /// Decrypt response data
+ public static String DecryptResponseData (String value)
+ {
+ try
+ {
+ return SacsAesIvCrypter.Decrypt(value, responseDataKey);
+ }
+ catch (Exception exc) { Logger.Debug("DecryptResponseData " + exc.GetType().Name + ": " + exc.Message); }
+ return value;
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/Mgr/SpmDepartmentMgr_FacilitySession.cs b/SaPatMgrCore/Core/Mgr/SpmDepartmentMgr_FacilitySession.cs
index 187467c..72249b5 100644
--- a/SaPatMgrCore/Core/Mgr/SpmDepartmentMgr_FacilitySession.cs
+++ b/SaPatMgrCore/Core/Mgr/SpmDepartmentMgr_FacilitySession.cs
@@ -65,7 +65,7 @@ namespace Sarand.PatientMgr.Core.Mgr
errField.Name = SacsHierarchyItem.ValidValue.Invalid;
return false;
}
- if (errField.Desc != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Desc, "Description", (long)SpmDbDfn.GetColTextLen(SpmDbDfn.ColumnIdx.SwmFacilitySession_Description), true))
+ if (errField.Desc != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Description, "Description", (long)SpmDbDfn.GetColTextLen(SpmDbDfn.ColumnIdx.SwmFacilitySession_Description), true))
{
errField.Desc = SacsHierarchyItem.ValidValue.Invalid;
return false;
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceClient.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceClient.cs
new file mode 100644
index 0000000..8b758d4
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceClient.cs
@@ -0,0 +1,432 @@
+using Sarand.Core.App;
+using Sarand.Core.Base;
+using Sarand.Core.Data;
+using Sarand.Core.Net;
+using Sarand.Core.Tasks;
+using Sarand.Core.Xml;
+using Sarand.PatientMgr.Core.Data;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Net;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ // Patient Web Service Client
+ // Make requests to PatientMgr Web Service hosted by Windows Service application.
+ //-----------------------------------------------------------------------
+ // Threading:
+ // Ref. https://blog.xamarin.com/getting-started-with-async-await/
+ //=======================================================================
+ public class SpmWebServiceClient
+ {
+ //-------------------------------------------------------------------
+ // Definitions.
+ public class RequestData : SacsTaskData
+ {
+ ///
+ /// Web Service Request data.
+ /// Cancellation token can optionally be supplied if available higher up the chain.
+ ///
+ public RequestData (SpmWebServiceInstanceDefinition instanceDefinition, CancellationToken? cancellationToken = null) :
+ base(cancellationToken)
+ {
+ InstanceDefinition = instanceDefinition;
+ }
+ public SpmWebServiceInstanceDefinition InstanceDefinition { get; }
+ public String Data { get; set; } = "";
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceClient ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+
+ //-------------------------------------------------------------------
+ // I s A l i v e
+ //-------------------------------------------------------------------
+ public async Task RequestIsAlive (SpmWebServiceInstanceDefinition instanceDefinition)
+ {
+ String fn = GetType().Name + ".IsAlive";
+ try
+ {
+ RequestData requestData = new RequestData(instanceDefinition);
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+ if (serviceResponse.ResponseData.EqualsCI(SpmWebServiceDfn.IsAliveResponse))
+ return true;
+ }
+ catch (Exception exc) { Logger.Warn(fn + " " + exc.GetLogMessage()); }
+ return false;
+ }
+
+ //-------------------------------------------------------------------
+ // I t e m C o u n t R e q u e s t
+ //-------------------------------------------------------------------
+ public class ItemCountResponseData : SpmWebServiceResponse
+ {
+ public ItemCountResponseData (SpmWebServiceResponse serviceResponse) : base(serviceResponse) { }
+ public long ItemCount { get; set; }
+ }
+ public async Task RequestItemCount (SpmWebServiceRequest.Config configRequest, Dictionary filters, SacsTaskData taskData)
+ {
+ String fn = GetType().Name + ".GetItemCount";
+ if (SacsSystem.DebugMode && configRequest.RequestType != SpmWebServiceRequest.RequestType.Count) Debugger.Break();
+
+ // Service Request.
+ SpmWebServiceRequest serviceRequestData = new SpmWebServiceRequest(configRequest);
+ serviceRequestData.Filters.AddRange(filters);
+
+ // Configure Web Service and make Request.
+ RequestData requestData = new RequestData(configRequest.Context.InstanceDefinition, taskData.CancellationToken) { Debug = taskData.Debug };
+ requestData.Data = serviceRequestData.GenerateRequestData();
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+ ItemCountResponseData responseData = new ItemCountResponseData(serviceResponse);
+ bool itemCountFound = false;
+
+ // Interpret response.
+ if (serviceResponse.ResponseElement != null && !taskData.IsCancellationRequested)
+ {
+ foreach (XElement responseChildElement in serviceResponse.ResponseElement.Elements())
+ {
+ if (responseChildElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Data))
+ {
+ foreach (XElement dataElement in responseChildElement.Elements())
+ {
+ if (dataElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Count))
+ {
+ itemCountFound = true;
+ responseData.ItemCount = StringUtil.ToLong(dataElement.Value);
+ break;
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (itemCountFound || taskData.IsCancellationRequested) break;
+ }
+ }
+ if (!itemCountFound) responseData.ErrorStateMessage = "Incomplete item count";
+ if (taskData.IsCancellationRequested) responseData.TaskCancelled = true;
+ return responseData;
+ }
+
+ //-------------------------------------------------------------------
+ // Q u e r y L i s t R e q u e s t
+ //-------------------------------------------------------------------
+ public class QueryListResponseData : SpmWebServiceResponse
+ {
+ public QueryListResponseData (SpmWebServiceResponse serviceResponse) : base(serviceResponse) { }
+ public List Items { get; } = new List();
+ public int Count { get; set; }
+ public int Total { get; set; }
+ public uint PageNo { get; set; }
+ public ushort PageLength { get; set; }
+ }
+ public async Task RequestQueryList (SpmWebServiceRequest.Config configRequest, Dictionary filters, List columns, List sortColumns, SacsTaskData taskData)
+ {
+ String fn = GetType().Name + ".GetItemList";
+ if (SacsSystem.DebugMode && configRequest.RequestType != SpmWebServiceRequest.RequestType.QueryList) Debugger.Break();
+
+ // Service Request.
+ SpmWebServiceRequest serviceRequestData = new SpmWebServiceRequest(configRequest);
+ serviceRequestData.Filters.AddRange(filters);
+ serviceRequestData.Columns.AddRange(columns);
+ if (sortColumns != null) serviceRequestData.SortColumns.AddRange(sortColumns);
+
+ // Configure Web Service and make Request.
+ RequestData requestData = new RequestData(configRequest.Context.InstanceDefinition, taskData.CancellationToken) { Debug = taskData.Debug };
+ requestData.Data = serviceRequestData.GenerateRequestData();
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+ QueryListResponseData responseData = new QueryListResponseData(serviceResponse);
+ //if (SacsSystem.DebugMode && responseData.ResponseElement != null) Logger.Debug(fn + " Response:\n\n" + responseData.ResponseElement.FormatXml() + "\n");
+
+ // Interpret response.
+ if (serviceResponse.ResponseElement != null && !taskData.IsCancellationRequested)
+ {
+ foreach (XElement responseChildElement in serviceResponse.ResponseElement.Elements())
+ {
+ if (responseChildElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Data))
+ {
+ foreach (XElement dataElement in responseChildElement.Elements())
+ {
+ if (dataElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.List))
+ {
+ // Paging info.
+ //
+ responseData.Count = StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Count));
+ responseData.Total = StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Total));
+ responseData.PageNo = (uint)StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.PageNo));
+ responseData.PageLength = (ushort)StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.PageLength));
+ // Extract items.
+ foreach (XElement listElement in dataElement.Elements())
+ {
+ taskData.ThrowIfCancellationRequested();
+ if (listElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Item))
+ {
+ SpmWebServiceItemData itemData = new SpmWebServiceItemData("");
+ List fields = SacsCsvHandler.ParseCsvRecord(listElement.Value);
+ for (int fieldIdx = 0; fieldIdx < fields.Count && fieldIdx < columns.Count; fieldIdx++)
+ {
+ String column = columns[fieldIdx];
+ String field = fields[fieldIdx];
+ itemData.AddValue(column, field);
+ }
+ responseData.Items.Add(itemData);
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) responseData.TaskCancelled = true;
+ return responseData;
+ }
+
+ //-------------------------------------------------------------------
+ // I t e m L i s t R e q u e s t
+ //-------------------------------------------------------------------
+ public class ItemListResponseData : SpmWebServiceResponse
+ {
+ public ItemListResponseData (SpmWebServiceResponse serviceResponse) : base(serviceResponse) { }
+ public List Items { get; } = new List();
+ public int Count { get; set; }
+ public int Total { get; set; }
+ public uint PageNo { get; set; }
+ public ushort PageLength { get; set; }
+ }
+ public async Task RequestItemList (SpmWebServiceRequest.Config configRequest, Dictionary filters, List sortColumns, SacsTaskData taskData)
+ {
+ String fn = GetType().Name + ".GetItemList";
+ if (SacsSystem.DebugMode && configRequest.RequestType != SpmWebServiceRequest.RequestType.ItemList) Debugger.Break();
+
+ // Service Request.
+ SpmWebServiceRequest serviceRequestData = new SpmWebServiceRequest(configRequest);
+ serviceRequestData.Filters.AddRange(filters);
+ if (sortColumns != null) serviceRequestData.SortColumns.AddRange(sortColumns);
+
+ // Configure Web Service and make Request.
+ RequestData requestData = new RequestData(configRequest.Context.InstanceDefinition, taskData.CancellationToken) { Debug = taskData.Debug };
+ requestData.Data = serviceRequestData.GenerateRequestData();
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+ ItemListResponseData responseData = new ItemListResponseData(serviceResponse);
+ //if (SacsSystem.DebugMode && responseData.ResponseElement != null) Logger.Debug(fn + " Response:\n\n" + responseData.ResponseElement.FormatXml() + "\n");
+
+ // Interpret response.
+ if (serviceResponse.ResponseElement != null && !taskData.IsCancellationRequested)
+ {
+ foreach (XElement responseChildElement in serviceResponse.ResponseElement.Elements())
+ {
+ if (responseChildElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Data))
+ {
+ foreach (XElement dataElement in responseChildElement.Elements())
+ {
+ if (dataElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.List))
+ {
+ // Paging info.
+ //
+ responseData.Count = StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Count));
+ responseData.Total = StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Total));
+ responseData.PageNo = (uint)StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.PageNo));
+ responseData.PageLength = (ushort)StringUtil.ToInt(dataElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.PageLength));
+ // Extract items.
+ foreach (XElement listElement in dataElement.Elements())
+ {
+ taskData.ThrowIfCancellationRequested();
+ if (listElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Item))
+ responseData.Items.Add(ExtractItemData(listElement, taskData));
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) responseData.TaskCancelled = true;
+ return responseData;
+ }
+
+ //-------------------------------------------------------------------
+ // I t e m D a t a R e q u e s t
+ //-------------------------------------------------------------------
+ public class ItemDataResponseData : SpmWebServiceResponse
+ {
+ public ItemDataResponseData (SpmWebServiceResponse serviceResponse) : base(serviceResponse) { }
+ public XElement DataElement => (ResponseElement?.GetFirstChildElement(SpmWebServiceDfn.ElementName.Data) ?? null);
+ public XElement ItemElement => (DataElement?.GetFirstChildElement(SpmWebServiceDfn.ElementName.Item) ?? null);
+ public SpmWebServiceItemData Item { get; set; }
+ }
+ public async Task RequestItemData (SpmWebServiceRequest.Config configRequest, Dictionary filters, SacsTaskData taskData)
+ {
+ String fn = GetType().Name + ".GetItemData";
+ if (SacsSystem.DebugMode && configRequest.RequestType != SpmWebServiceRequest.RequestType.Item) Debugger.Break();
+
+ // Service Request.
+ SpmWebServiceRequest serviceRequestData = new SpmWebServiceRequest(configRequest);
+ serviceRequestData.Filters.AddRange(filters);
+
+ // Configure Web Service and make Request.
+ RequestData requestData = new RequestData(configRequest.Context.InstanceDefinition, taskData.CancellationToken) { Debug = taskData.Debug };
+ requestData.Data = serviceRequestData.GenerateRequestData();
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+ ItemDataResponseData responseData = new ItemDataResponseData(serviceResponse);
+ //if (SacsSystem.DebugMode && responseData.ResponseElement != null) Logger.Debug("Response:\n\n" + responseData.ResponseElement.FormatXml()+"\n");
+
+ // Extract item properties.
+ if (serviceResponse.ResponseElement != null && !taskData.IsCancellationRequested)
+ {
+ foreach (XElement responseChildElement in serviceResponse.ResponseElement.Elements())
+ {
+ requestData.ThrowIfCancellationRequested();
+ if (responseChildElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Data))
+ {
+ foreach (XElement dataElement in responseChildElement.Elements())
+ {
+ requestData.ThrowIfCancellationRequested();
+ if (dataElement.Name.LocalName.EqualsCI(SpmWebServiceDfn.ElementName.Item))
+ responseData.Item = ExtractItemData(dataElement, taskData);
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) responseData.TaskCancelled = true;
+ return responseData;
+ }
+
+ //-------------------------------------------------------------------
+ // E x t r a c t I t e m
+ //-------------------------------------------------------------------
+ private SpmWebServiceItemData ExtractItemData (XElement itemElement, SacsTaskData taskData)
+ {
+ SpmWebServiceItemData itemData = new SpmWebServiceItemData(itemElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.ItemType));
+ foreach (XElement itemDataElement in itemElement.Elements())
+ {
+ if (!itemDataElement.HasElements)
+ {
+ // No child elements - treat as item property.
+ itemData.AddValue(itemDataElement.Name.LocalName, itemDataElement.Value);
+ }
+ else if (itemDataElement.Name.LocalName.Length > 4 && itemDataElement.Name.LocalName.EndsWithCI("List"))
+ {
+ // Data elements has children and is a list of child items.
+ String childItemType = itemDataElement.Name.LocalName;
+ if (!itemData.ChildItems.ContainsKey(childItemType))
+ itemData.ChildItems[childItemType] = new List();
+ foreach (XElement childItemElement in itemDataElement.Elements())
+ {
+ itemData.ChildItems[childItemType].Add(ExtractItemData(childItemElement, taskData));
+ if (taskData.IsCancellationRequested) break;
+ }
+ }
+ if (taskData.IsCancellationRequested) break;
+ }
+ return itemData;
+ }
+
+ //-------------------------------------------------------------------
+ // S t o r e I t e m R e q u e s t
+ //-------------------------------------------------------------------
+ public class StoreItemResponseData : SpmWebServiceResponse
+ {
+ public StoreItemResponseData (SpmWebServiceResponse serviceResponse) : base(serviceResponse) { }
+ public XElement DataElement => (ResponseElement?.GetFirstChildElement("Item") ?? null);
+ }
+ public async Task StoreItem (SpmWebServiceRequest.Config configRequest, XElement itemElement, SacsTaskData taskData)
+ {
+ String fn = GetType().Name + ".StoreItem";
+ if (SacsSystem.DebugMode && configRequest.RequestType != SpmWebServiceRequest.RequestType.Store) Debugger.Break();
+
+ // Service Request.
+ SpmWebServiceRequest serviceRequestData = new SpmWebServiceRequest(configRequest);
+ serviceRequestData.ItemElement = itemElement;
+
+ // Configure Web Service and make Request.
+ RequestData requestData = new RequestData(configRequest.Context.InstanceDefinition, taskData.CancellationToken) { Debug = taskData.Debug };
+ requestData.Data = serviceRequestData.GenerateRequestData();
+ SpmWebServiceResponse serviceResponse = await DoWebServiceRequest(requestData);
+
+ // Return result.
+ return new StoreItemResponseData(serviceResponse);
+ }
+
+ //-------------------------------------------------------------------
+ // W e b S e r v i c e R e q u e s t
+ //-------------------------------------------------------------------
+ ///
+ /// Execute the web service request.
+ /// Request data is encrypted and response data is decrypted automatically.
+ ///
+ public async Task DoWebServiceRequest (RequestData requestData)
+ {
+ String fn = GetType().Name + ".DoWebServiceRequest";
+ SpmWebServiceResponse serviceResponse = null;
+ // Throw canceled exception if task has been cancelled - invoke at regular intervals.
+ requestData.ThrowIfCancellationRequested();
+
+ // Log request.
+ if (SacsSystem.DebugMode) Logger.Debug(fn + " Request URL:" + requestData.InstanceDefinition.URL);
+ if (requestData.Debug)
+ {
+ if (requestData.Data.Length < 512)
+ Logger.Debug(fn + " Request:\n\t" + requestData.Data);
+ else Logger.Debug(fn + " Request length:" + requestData.Data.Length);
+ }
+
+ // Configure the request.
+ SacsHttpRequestData httpRequestData = new SacsHttpRequestData(requestData.CancellationToken)
+ {
+ Url = requestData.InstanceDefinition.URL,
+ TimeoutSecs = 1,
+ PostData = SpmWindowsServiceCrypter.EncryptRequestData(requestData.Data)
+ };
+
+ // Make the request.
+ DateTime started = DateTime.Now;
+ requestData.InstanceDefinition.LastRequestAt = started;
+ SacsHttpResponseData httpResponseData = await SacsHttpClient.DoRequest(httpRequestData);
+
+ // Construct the response.
+ SpmWebServiceResponse.Config serviceResponseConfig = new SpmWebServiceResponse.Config()
+ {
+ RequestStarted = started,
+ RequestCompleted = DateTime.Now,
+ HttpResponseData = httpResponseData
+ };
+ serviceResponse = new SpmWebServiceResponse(serviceResponseConfig);
+
+ // Note if request was successful.
+ if (httpResponseData.Success)
+ requestData.InstanceDefinition.LastSuccessfulRequestAt = serviceResponseConfig.RequestCompleted;
+
+ // Log response.
+ if (requestData.Debug)
+ {
+ if (serviceResponse.ResponseData.Length < 1024)
+ Logger.Debug(fn + " Response: " + serviceResponse.ResponseData);
+ else Logger.Debug(fn + " Response size: " + serviceResponse.ResponseData.Length);
+ }
+ return serviceResponse;
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceDfn.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceDfn.cs
new file mode 100644
index 0000000..b5eb715
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceDfn.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public static class SpmWebServiceDfn
+ {
+ //-------------------------------------------------------------------
+ // Web Service XML element names.
+ public class ElementNameData
+ {
+ // Common.
+ public String Data { get; } = "Data";
+ public String List { get; } = "List";
+ public String Item { get; } = "Item";
+ public String Filter { get; } = "Filter";
+ public String Property { get; } = "Property";
+ public String Columns { get; } = "Columns";
+ public String SortColumns { get; } = "SortColumns";
+ public String SortColumn { get; } = "SortColumn";
+ // Request.
+ public String Config { get; } = "Config";
+ public String Context { get; } = "Context";
+ public String Site { get; } = "Site";
+ public String Host { get; } = "Host";
+ public String User { get; } = "User";
+ public String Email { get; } = "Email";
+ public String AffiliateIdOrganisation { get; } = "AffiliateIdOrganisation";
+ public String Debug { get; } = "Debug";
+ // Response.
+ public String SpmResponse { get; } = "SpmResponse";
+ public String Status { get; } = "Status";
+ public String Messages { get; } = "Messages";
+ public String Message { get; } = "Message";
+ public String Count { get; } = "Count";
+ // Item.
+ public String Id { get; } = "Id";
+ public String Code { get; } = "Code";
+ public String Notes { get; } = "Notes";
+ public String Flags { get; } = "Flags";
+ public String CreatedOn { get; } = "CreatedOn";
+ public String UpdatedOn { get; } = "UpdatedOn";
+ }
+ public static ElementNameData ElementName { get; } = new ElementNameData();
+
+ //-------------------------------------------------------------------
+ // Web Service XML attribute names.
+ public class AttributeNameData
+ {
+ // Common.
+ public String ItemType { get; } = "ItemType";
+ public String Name { get; } = "Name";
+ public String Value { get; } = "Value";
+ public String Code { get; } = "Code";
+ public String Debug { get; } = "Debug";
+ // Messages.
+ public String Context { get; } = "Context";
+ public String Level { get; } = "Level";
+ // Item list.
+ public String Total { get; } = "Total";
+ public String Count { get; } = "Count";
+ public String PageNo { get; } = "PageNo";
+ public String PageLength { get; } = "PageLength";
+ }
+ public static AttributeNameData AttributeName { get; } = new AttributeNameData();
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public static String IsAliveResponse { get; } = "Hello";
+ public static String StatusSuccess { get; } = "OK";
+ public static String StatusFatal { get; } = "Fatal";
+ public static String StatusError { get; } = "Error";
+ public static String StatusWarning { get; } = "Warning";
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceInstanceDefinition.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceInstanceDefinition.cs
new file mode 100644
index 0000000..5e60769
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceInstanceDefinition.cs
@@ -0,0 +1,37 @@
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Core.App;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public class SpmWebServiceInstanceDefinition
+ {
+ //-------------------------------------------------------------------
+ // Definitions.
+
+ //-------------------------------------------------------------------
+ // Data members.
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceInstanceDefinition (String caption, String url)
+ {
+ Caption = caption;
+ URL = url;
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public String Caption { get; }
+ public String URL { get; }
+ public DateTime LastRequestAt { get; set; }
+ public DateTime LastSuccessfulRequestAt { get; set; }
+ public bool Valid { get { return (!StringUtil.IsEmpty(URL)); } }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceItemData.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceItemData.cs
new file mode 100644
index 0000000..281b6b0
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceItemData.cs
@@ -0,0 +1,129 @@
+using Sarand.Core.Base;
+using Sarand.Core.Bus;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public class SpmWebServiceItemData
+ {
+ //-------------------------------------------------------------------
+ // Data members.
+ private readonly Dictionary values = new Dictionary();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceItemData (String itemType)
+ {
+ ItemType = itemType;
+ }
+ // Copy construction.
+ public SpmWebServiceItemData (SpmWebServiceItemData itemData)
+ {
+ values.AddRange(itemData.values);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public String ItemType { get; }
+ ///
+ /// Child items.
+ /// Dictionary key identifies type of item.
+ ///
+ public Dictionary> ChildItems { get; } = new Dictionary>();
+
+ //-------------------------------------------------------------------
+ // Population.
+ public void AddValue (String name, String value)
+ {
+ values[name] = value;
+ }
+
+ //-------------------------------------------------------------------
+ // Value exists.
+ public bool HasValue (T name)
+ {
+ return HasValue(name.ToString());
+ }
+ public bool HasValue (string name)
+ {
+ return values.ContainsKey(name);
+ }
+
+ //-------------------------------------------------------------------
+ // String value.
+ public String GetValue (T name)
+ {
+ return GetValue(name.ToString());
+ }
+ public String GetValue (string name)
+ {
+ return values.GetValue(name, "");
+ }
+
+ //-------------------------------------------------------------------
+ // SysId value.
+ public SysId GetIdValue (T name)
+ {
+ return GetIdValue(name.ToString());
+ }
+ public SysId GetIdValue (string name)
+ {
+ return new SysId(StringUtil.ToInt(GetValue(name)));
+ }
+
+ //-------------------------------------------------------------------
+ // Bool value.
+ public bool GetBoolValue (T name)
+ {
+ return GetBoolValue(name.ToString());
+ }
+ public bool GetBoolValue (string name)
+ {
+ return StringUtil.ToBool(GetValue(name));
+ }
+ // Int value.
+ public int GetIntValue (T name)
+ {
+ return GetIntValue(name.ToString());
+ }
+ public int GetIntValue (string name)
+ {
+ return StringUtil.ToInt(GetValue(name));
+ }
+ // Decimal value.
+ public decimal GetDecimalValue (T name)
+ {
+ return GetDecimalValue(name.ToString());
+ }
+ public decimal GetDecimalValue (string name)
+ {
+ return StringUtil.ToDecimal(GetValue(name));
+ }
+
+ //-------------------------------------------------------------------
+ // Date value.
+ public DateTime GetDateValue (T name)
+ {
+ return GetDateValue(name.ToString());
+ }
+ public DateTime GetDateValue (string name)
+ {
+ return DateUtil.ParseXmlDate(GetValue(name));
+ }
+ // DateTime value.
+ public DateTime GetDateTimeValue (T name)
+ {
+ return GetDateTimeValue(name.ToString());
+ }
+ public DateTime GetDateTimeValue (string name)
+ {
+ return DateUtil.ParseXmlDateTime(GetValue(name));
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceMessage.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceMessage.cs
new file mode 100644
index 0000000..7257a70
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceMessage.cs
@@ -0,0 +1,46 @@
+using Sarand.Core.Base;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public class SpmWebServiceMessage
+ {
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceMessage (String context, String code, String message, SaMessageLevel level = SaMessageLevel.Info)
+ {
+ Level = level;
+ Context = context;
+ Code = code;
+ Message = message;
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public SaMessageLevel Level { get; }
+ public string Context { get; }
+ public string Code { get; }
+ public string Message { get; }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmWebServiceMessageList
+ {
+ public static bool HasMessagesOfLevel (this IEnumerable messages, SaMessageLevel level)
+ {
+ return messages.Any(msg => msg.Level == level);
+ }
+ public static List GetMessagesOfLevel (this IEnumerable messages, SaMessageLevel level)
+ {
+ return messages.Where(msg => msg.Level == level).ToList();
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceRequest.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceRequest.cs
new file mode 100644
index 0000000..ac1d27d
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceRequest.cs
@@ -0,0 +1,219 @@
+using Sarand.Core.Base;
+using Sarand.Core.Xml;
+using Sarand.PatientMgr.Core.App;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Linq;
+using Sarand.Core.Bus;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public class SpmWebServiceRequest
+ {
+ //-------------------------------------------------------------------
+ // Definitions.
+ public enum RequestType
+ {
+ Unknown,
+ IsAlive,
+ /// Item count
+ Count,
+ /// Query list - specific columns, compressed (csv etc) response data
+ QueryList,
+ /// Item list - full xml for each item with optional associated items.
+ ItemList,
+ /// Single Item with optional associated items.
+ Item,
+ /// Validate item properties without update.
+ Validate,
+ /// Validate properties and store (insert/update) item.
+ Store,
+ /// Delete item.
+ Delete,
+ /// List - as per Query List
+ [Obsolete("Deprecated. Use QueryList instead.", true)]
+ List,
+ /// Single Item with optional associated items.
+ [Obsolete("Deprecated. Use Item instead.", true)]
+ Data,
+ }
+ public enum DataType
+ {
+ Unknown,
+ // Security.
+ UserProfile,
+ // Reference data.
+ CodeType,
+ Code,
+ // Admission.
+ Admission,
+ AdmissionAction,
+ AdmissionData,
+ AdmissionRole,
+ // Department.
+ Department,
+ EmployeeRole,
+ Facility,
+ FacilitySession,
+ FacilityTemplate,
+ Procedure,
+ TemplateData,
+ // Institution.
+ Employee,
+ Institution,
+ Operation,
+ Patient
+ }
+
+ //-------------------------------------------------------------------
+ ///
+ /// Sort column identified by column name with ascending flag.
+ ///
+ public class SortColumnData
+ {
+ public SortColumnData (String columnName, bool ascending)
+ {
+ ColumnName = columnName;
+ Ascending = ascending;
+ }
+ public String ColumnName { get; }
+ public bool Ascending { get; }
+ }
+
+ //-------------------------------------------------------------------
+ // Configuration.
+ public class Config
+ {
+ public bool SoapEnvelope { get; set; }
+ public String SoapPrefix { get; set; }
+ public DataType DataType { get; set; }
+ public RequestType RequestType { get; set; }
+ public class ContextProperties
+ {
+ public SpmWebServiceInstanceDefinition InstanceDefinition { get; set; }
+ public String Url { get; set; }
+ public String User { get; set; }
+ public String Email { get; set; }
+ public SysId AffiliateIdOrganisation { get; set; }
+ public bool Commit { get; set; }
+ public bool Debug { get; set; }
+ }
+ public ContextProperties Context { get; } = new ContextProperties();
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private readonly Config config;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceRequest (Config config)
+ {
+ this.config = config;
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public Dictionary Filters { get; } = new Dictionary();
+ public List Columns { get; } = new List();
+ public List SortColumns { get; } = new List();
+ public XElement ItemElement { get; set; }
+
+ //-------------------------------------------------------------------
+ // D a t a G e n e r a t i o n
+ //-------------------------------------------------------------------
+ public String GetRequestName ()
+ {
+ if (config.RequestType == RequestType.IsAlive) return "";
+ String requestName = "";
+ if (config.DataType > 0)
+ requestName += config.DataType.ToString();
+ if (config.RequestType > 0)
+ requestName += config.RequestType.ToString();
+ return requestName + "Request";
+ }
+ public String GenerateRequestData (bool formatted = false)
+ {
+ if (config.RequestType == RequestType.IsAlive) return "";
+
+ // Request document.
+ XDocument requestDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
+ // Request root.
+ XElement requestElement = null;
+ if (config.SoapEnvelope)
+ {
+ XElement envelopeElement = null;
+ XElement headerElement = null;
+ XElement bodyElement = null;
+ if (!StringUtil.IsEmpty(config.SoapPrefix))
+ {
+ XNamespace soapNamespace = SacsSoapUtils.GetSoapNamespace(SoapNamespaceType.Soap_1_1);
+ envelopeElement = requestDoc.AppendElement(soapNamespace, SacsSoapUtils.GetElementName(SoapElementType.Envelope));
+ envelopeElement.SetAttributeValue(XNamespace.Xmlns + config.SoapPrefix, soapNamespace);
+ headerElement = envelopeElement.AppendElement(soapNamespace, SacsSoapUtils.GetElementName(SoapElementType.Header));
+ bodyElement = envelopeElement.AppendElement(soapNamespace, SacsSoapUtils.GetElementName(SoapElementType.Body));
+ }
+ else
+ {
+ // No namespace.
+ envelopeElement = requestDoc.AppendElement(SacsSoapUtils.GetElementName(SoapElementType.Envelope));
+ headerElement = envelopeElement.AppendElement(SacsSoapUtils.GetElementName(SoapElementType.Header));
+ bodyElement = envelopeElement.AppendElement(SacsSoapUtils.GetElementName(SoapElementType.Body));
+ }
+ requestElement = bodyElement.AppendElement(GetRequestName());
+ }
+ else
+ {
+ // Otherwise add the request directly to the document.
+ requestElement = requestDoc.AppendElement(GetRequestName());
+ }
+
+ // Config.
+ XElement configElement = requestElement.AppendElement("Config");
+
+ // Context.
+ XElement contextElement = configElement.AppendElement("Context");
+ if (!StringUtil.IsEmpty(config.Context.User)) contextElement.AppendElement("User", config.Context.User);
+ if (!StringUtil.IsEmpty(config.Context.Email)) contextElement.AppendElement("Email", config.Context.Email);
+ if (SysId.IsValid(config.Context.AffiliateIdOrganisation)) contextElement.AppendElement("AffiliateIdOrganisation", SysId.ToString(config.Context.AffiliateIdOrganisation));
+ if (config.Context.Commit) contextElement.AppendElement("Commit", "1");
+ if (config.Context.Debug) contextElement.AppendElement("Debug", "1");
+
+ // Filter.
+ if (Filters.Count > 0)
+ {
+ XElement filterElement = configElement.AppendElement("Filter");
+ foreach (String name in Filters.Keys)
+ filterElement.AppendElement(name, Filters[name]);
+ }
+
+ // Columns.
+ if (Columns.Count > 0)
+ {
+ XElement columnsElement = configElement.AppendElement("Columns", Columns.Concat(",", "", ""));
+ }
+
+ // Sort columns.
+ if (SortColumns.Count > 0)
+ {
+ XElement sortColumnsElement = configElement.AppendElement("SortColumns", SortColumns.Concat(",", "", ""));
+ }
+
+ // Item.
+ if (ItemElement != null)
+ {
+ XElement dataElement = requestElement.AppendElement("Data");
+ dataElement.AppendElement(ItemElement);
+ }
+
+ if (formatted)
+ return requestDoc.FormatXml();
+ return requestDoc.GetXml();
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/Core/WebService/SpmWebServiceResponse.cs b/SaPatMgrCore/Core/WebService/SpmWebServiceResponse.cs
new file mode 100644
index 0000000..0a9a75d
--- /dev/null
+++ b/SaPatMgrCore/Core/WebService/SpmWebServiceResponse.cs
@@ -0,0 +1,126 @@
+using Sarand.Core.App;
+using Sarand.Core.Base;
+using Sarand.Core.Net;
+using Sarand.Core.Xml;
+using Sarand.PatientMgr.Core.Data;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Linq;
+
+namespace Sarand.PatientMgr.Core.WebService
+{
+ //=======================================================================
+ public class SpmWebServiceResponse
+ {
+ //-------------------------------------------------------------------
+ // Definitions.
+
+ //-------------------------------------------------------------------
+ // Configuration.
+ public class Config
+ {
+ public DateTime RequestStarted { get; set; } = DateTime.Now;
+ public DateTime RequestCompleted { get; set; }
+ public SacsHttpResponseData HttpResponseData { get; set; }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ protected readonly Config config;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmWebServiceResponse (Config config)
+ {
+ this.config = config;
+ ResponseData = SpmWindowsServiceCrypter.DecryptResponseData(config.HttpResponseData.Data);
+
+ try
+ {
+ // Identify the response element in the xml data.
+ ResponseDoc = XDocument.Parse(ResponseData, LoadOptions.None);
+ XElement rootElement = ResponseDoc.Root;
+ if (rootElement.Name.LocalName.EndsWithCI("Response"))
+ ResponseElement = rootElement;
+ else if (rootElement.Name.LocalName.EqualsCI(SacsSoapUtils.GetElementName(SoapElementType.Envelope)))
+ {
+ SoapEnvelope = true;
+ SoapPrefix = rootElement.GetNamespacePrefix();
+ foreach (XElement soapElement in rootElement.Elements())
+ {
+ if (soapElement.Name.LocalName.EqualsCI(SacsSoapUtils.GetElementName(SoapElementType.Body)))
+ {
+ foreach (XElement bodyElement in soapElement.Elements())
+ {
+ if (bodyElement.Name.LocalName.EndsWithCI("Response"))
+ {
+ ResponseElement = bodyElement;
+ }
+ }
+ }
+ }
+ }
+ if (ResponseElement != null)
+ {
+ // Extract status code.
+ XElement statusElement = ResponseElement.GetFirstChildElement(SpmWebServiceDfn.ElementName.Status);
+ if (statusElement != null)
+ {
+ StatusCode = statusElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Code);
+ // Extract messages.
+ XElement messagesElement = statusElement.GetFirstChildElement(SpmWebServiceDfn.ElementName.Messages);
+ if (messagesElement != null)
+ {
+ foreach (XElement messageElement in messagesElement.GetChildElements(SpmWebServiceDfn.ElementName.Message))
+ {
+ String context = messageElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Context);
+ String code = messageElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Code);
+ SaMessageLevel level = SacsSystem.GetMessageLevelFromCode(messageElement.GetAttributeValue(SpmWebServiceDfn.AttributeName.Level));
+ SpmWebServiceMessage message = new SpmWebServiceMessage(context, code, messageElement.Value, level);
+ Messages.Add(message);
+ }
+ }
+ }
+ }
+ }
+ catch (Exception) { }
+ }
+ public SpmWebServiceResponse (SpmWebServiceResponse serviceResponse)
+ {
+ // Copied from another service reponse - don't re-intrepert properties.
+ this.config = serviceResponse.config;
+ // Structure.
+ SoapEnvelope = serviceResponse.SoapEnvelope;
+ SoapPrefix = serviceResponse.SoapPrefix;
+ // Response.
+ ResponseData = serviceResponse.ResponseData;
+ ResponseDoc = serviceResponse.ResponseDoc;
+ ResponseElement = serviceResponse.ResponseElement;
+ // Status.
+ StatusCode = serviceResponse.StatusCode;
+ Messages = serviceResponse.Messages;
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ public DateTime RequestStarted { get { return config.RequestStarted; } }
+ public DateTime RequestCompleted { get { return config.RequestCompleted; } }
+ public SacsHttpResponseData HttpResponseData { get { return config.HttpResponseData; } }
+ // Structure.
+ public bool SoapEnvelope { get; }
+ public String SoapPrefix { get; } = "";
+ // Response.
+ public String ResponseData { get; }
+ public XDocument ResponseDoc { get; }
+ public XElement ResponseElement { get; }
+ // Status.
+ public bool TaskCancelled { get; set; }
+ public String StatusCode { get; } = "";
+ public List Messages { get; } = new List();
+ public String ErrorStateMessage { get; set; }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrCore/SaPatMgrCore.csproj b/SaPatMgrCore/SaPatMgrCore.csproj
index 6a0780c..6df9fe0 100644
--- a/SaPatMgrCore/SaPatMgrCore.csproj
+++ b/SaPatMgrCore/SaPatMgrCore.csproj
@@ -23,9 +23,7 @@
-
-
diff --git a/SaPatMgrWinForms/SaPatMgrWinForms.csproj b/SaPatMgrWinForms/SaPatMgrWinForms.csproj
index bd1125c..c46c88e 100644
--- a/SaPatMgrWinForms/SaPatMgrWinForms.csproj
+++ b/SaPatMgrWinForms/SaPatMgrWinForms.csproj
@@ -285,6 +285,12 @@
SpmPanel.cs
+
+ Form
+
+
+ SpmForm_Institution.cs
+
Form
@@ -387,6 +393,30 @@
SpmForm_Department.cs
+
+ UserControl
+
+
+ SpmPanel_Patients.cs
+
+
+ UserControl
+
+
+ SpmPanel_Operations.cs
+
+
+ UserControl
+
+
+ SpmPanel_Institutions.cs
+
+
+ UserControl
+
+
+ SpmPanel_Employees.cs
+
UserControl
@@ -435,6 +465,48 @@
SpmPanel_UpdateStamp.cs
+
+ Component
+
+
+ SpmTabPage_EmployeeRole.cs
+
+
+ Component
+
+
+ SpmTabPage_TemplateData.cs
+
+
+ Component
+
+
+ SpmTabPage_Operation.cs
+
+
+ Component
+
+
+ SpmTabPage_Patient.cs
+
+
+ Component
+
+
+ SpmTabPage_Procedure.cs
+
+
+ Component
+
+
+ SpmTabPage_Institution.cs
+
+
+ Component
+
+
+ SpmTabPage_Employee.cs
+
Component
@@ -551,6 +623,9 @@
SpmItemListFilter_Admission.cs
+
+ SpmForm_Institution.cs
+
SpmForm_Admission.cs
@@ -596,6 +671,18 @@
SpmForm_Department.cs
+
+ SpmPanel_Patients.cs
+
+
+ SpmPanel_Operations.cs
+
+
+ SpmPanel_Institutions.cs
+
+
+ SpmPanel_Employees.cs
+
SpmPanel_Departments.cs
diff --git a/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.Designer.cs b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.Designer.cs
new file mode 100644
index 0000000..feccc69
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.Designer.cs
@@ -0,0 +1,124 @@
+namespace Sarand.PatientMgr.Win.Forms.Maint
+{
+ partial class SpmForm_Institution
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.buttonOk = new Sarand.Win.Forms.Controls.SacsButton();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.buttonCancel = new Sarand.Win.Forms.Controls.SacsButton();
+ this.groupBoxProperties = new Sarand.Win.Forms.Controls.SacsGroupBox();
+ this.tabControl.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // buttonOk
+ //
+ this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonOk.Location = new System.Drawing.Point(411, 441);
+ this.buttonOk.Margin = new System.Windows.Forms.Padding(4);
+ this.buttonOk.Name = "buttonOk";
+ this.buttonOk.Size = new System.Drawing.Size(100, 28);
+ this.buttonOk.TabIndex = 6;
+ this.buttonOk.Text = "OK";
+ this.buttonOk.UseVisualStyleBackColor = true;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 25);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage1.Size = new System.Drawing.Size(600, 197);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "tabPage1";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 25);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(600, 68);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "tabPage2";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.tabPage1);
+ this.tabControl.Controls.Add(this.tabPage2);
+ this.tabControl.Location = new System.Drawing.Point(12, 208);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(608, 226);
+ this.tabControl.TabIndex = 5;
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCancel.Location = new System.Drawing.Point(519, 441);
+ this.buttonCancel.Margin = new System.Windows.Forms.Padding(4);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(100, 28);
+ this.buttonCancel.TabIndex = 7;
+ this.buttonCancel.Text = "Cancel";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ //
+ // groupBoxProperties
+ //
+ this.groupBoxProperties.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.groupBoxProperties.BorderColour = System.Drawing.Color.Gray;
+ this.groupBoxProperties.Location = new System.Drawing.Point(12, 12);
+ this.groupBoxProperties.Name = "groupBoxProperties";
+ this.groupBoxProperties.Size = new System.Drawing.Size(608, 190);
+ this.groupBoxProperties.TabIndex = 4;
+ this.groupBoxProperties.TabStop = false;
+ this.groupBoxProperties.Text = "Properties";
+ //
+ // SpmForm_Institution
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(632, 482);
+ this.ControlBox = false;
+ this.Controls.Add(this.buttonOk);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.groupBoxProperties);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(650, 500);
+ this.Name = "SpmForm_Institution";
+ this.ShowIcon = false;
+ this.Text = "Update Institution";
+ this.tabControl.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Sarand.Win.Forms.Controls.SacsButton buttonOk;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.TabControl tabControl;
+ private Sarand.Win.Forms.Controls.SacsButton buttonCancel;
+ private Sarand.Win.Forms.Controls.SacsGroupBox groupBoxProperties;
+ }
+}
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.cs b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.cs
new file mode 100644
index 0000000..fe302d5
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.cs
@@ -0,0 +1,162 @@
+using Sarand.PatientMgr.Core.App;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.Win.Forms.Utils;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Sarand.PatientMgr.Win.Forms.Maint
+{
+ //=======================================================================
+ public partial class SpmForm_Institution : SpmForm_Item
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public new class Config : SpmForm_Item.Config
+ {
+ public SpmInstitution InstitutionToUpdate { internal get; set; } = null;
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmForm_Institution() : this(new Config()) { }
+ public SpmForm_Institution(Config config) : base(config)
+ {
+ this.config = config;
+ if (SpmGlobals.System != null)
+ {
+ }
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ [Browsable(false)]
+ protected override String DefaultMessageTitle { get { return "Institution"; } }
+
+ //-------------------------------------------------------------------
+ // S h o w D i a l o g
+ //-------------------------------------------------------------------
+ public new DialogResult ShowDialog()
+ {
+ return base.ShowDialog();
+ }
+ // Validate configuration to ensure that form can be opened correctly.
+ private bool ValidateConfiguration()
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // I n i t i a l i s a t i o n
+ //-------------------------------------------------------------------
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Complete dialog initialisation.
+ PositionControls();
+ AcceptChanges();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ protected override void OnShown(EventArgs e)
+ {
+ base.OnShown(e);
+ // Initial focus.
+ }
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ // PopulateToControls.
+ private void PopulateToControls(SpmInstitution.Data data)
+ {
+ // Populate item properties to controls.
+
+ AcceptChanges();
+ }
+
+ //-------------------------------------------------------------------
+ // Validate properties.
+ public bool IsDataValid(SpmInstitution.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // PopulateFromControls.
+ private void PopulateFromControls(SpmInstitution.Data data)
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // UpdatedAssociated Data.
+ public bool UpdateAssociatedData()
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C l o s e F o r m
+ //-------------------------------------------------------------------
+ private void buttonOk_Click(object sender, EventArgs e)
+ {
+ }
+ private void buttonCancel_Click(object sender, EventArgs e)
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected override void SetControlActivity()
+ {
+ SetControlsReadOnly();
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ if (ReadOnly) return true;
+
+ return false;
+ }
+ protected override void SetControlsReadOnly()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // P o s i t i o n C o n t r o l s
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // F o r m E v e n t s
+ //-------------------------------------------------------------------
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.resx b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Maint/SpmForm_Institution.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.Designer.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.Designer.cs
new file mode 100644
index 0000000..82b0bd8
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.Designer.cs
@@ -0,0 +1,186 @@
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ partial class SpmPanel_Employees
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.listFilterEmployee = new Sarand.PatientMgr.Win.Forms.Filters.SpmItemListFilter_Employee();
+ this.listViewEmployee = new Sarand.PatientMgr.Win.Forms.Controls.SpmItemListView_Employee();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.buttonRemove = new System.Windows.Forms.Button();
+ this.buttonUpdate = new System.Windows.Forms.Button();
+ this.buttonCreate = new System.Windows.Forms.Button();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonOk = new System.Windows.Forms.Button();
+ this.tabControl.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // listFilterEmployee
+ //
+ this.listFilterEmployee.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listFilterEmployee.Location = new System.Drawing.Point(0, 2);
+ this.listFilterEmployee.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.listFilterEmployee.Name = "listFilterEmployee";
+ this.listFilterEmployee.Size = new System.Drawing.Size(400, 30);
+ this.listFilterEmployee.TabIndex = 0;
+ this.listFilterEmployee.FilterChanged += new System.EventHandler(this.listFilterEmployee_FilterChanged);
+ //
+ // listViewEmployee
+ //
+ this.listViewEmployee.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listViewEmployee.FullRowSelect = true;
+ this.listViewEmployee.HideSelection = false;
+ this.listViewEmployee.Location = new System.Drawing.Point(0, 37);
+ this.listViewEmployee.Margin = new System.Windows.Forms.Padding(2);
+ this.listViewEmployee.Name = "listViewEmployee";
+ this.listViewEmployee.OwnerDraw = true;
+ this.listViewEmployee.Size = new System.Drawing.Size(317, 155);
+ this.listViewEmployee.TabIndex = 1;
+ this.listViewEmployee.UseCompatibleStateImageBehavior = false;
+ this.listViewEmployee.ItemCountChanged += new System.EventHandler(this.listViewEmployee_ItemCountChanged);
+ this.listViewEmployee.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewEmployee_ColumnClick);
+ this.listViewEmployee.SelectedIndexChanged += new System.EventHandler(this.listViewEmployee_SelectedIndexChanged);
+ this.listViewEmployee.DoubleClick += new System.EventHandler(this.listViewEmployee_DoubleClick);
+ this.listViewEmployee.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listViewEmployee_MouseUp);
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.tabPage1);
+ this.tabControl.Controls.Add(this.tabPage2);
+ this.tabControl.Location = new System.Drawing.Point(2, 196);
+ this.tabControl.Margin = new System.Windows.Forms.Padding(2);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(398, 154);
+ this.tabControl.TabIndex = 6;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Size = new System.Drawing.Size(390, 128);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "tabPage1";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Size = new System.Drawing.Size(390, 128);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "tabPage2";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // buttonRemove
+ //
+ this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonRemove.Location = new System.Drawing.Point(322, 95);
+ this.buttonRemove.Name = "buttonRemove";
+ this.buttonRemove.Size = new System.Drawing.Size(75, 23);
+ this.buttonRemove.TabIndex = 15;
+ this.buttonRemove.Text = "Remove";
+ this.buttonRemove.UseVisualStyleBackColor = true;
+ this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
+ //
+ // buttonUpdate
+ //
+ this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonUpdate.Location = new System.Drawing.Point(322, 66);
+ this.buttonUpdate.Name = "buttonUpdate";
+ this.buttonUpdate.Size = new System.Drawing.Size(75, 23);
+ this.buttonUpdate.TabIndex = 14;
+ this.buttonUpdate.Text = "Update";
+ this.buttonUpdate.UseVisualStyleBackColor = true;
+ this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
+ //
+ // buttonCreate
+ //
+ this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCreate.Location = new System.Drawing.Point(322, 37);
+ this.buttonCreate.Name = "buttonCreate";
+ this.buttonCreate.Size = new System.Drawing.Size(75, 23);
+ this.buttonCreate.TabIndex = 13;
+ this.buttonCreate.Text = "Create";
+ this.buttonCreate.UseVisualStyleBackColor = true;
+ this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCancel.Location = new System.Drawing.Point(322, 168);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this.buttonCancel.TabIndex = 15;
+ this.buttonCancel.Text = "Cancel";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
+ //
+ // buttonOk
+ //
+ this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonOk.Location = new System.Drawing.Point(322, 139);
+ this.buttonOk.Name = "buttonOk";
+ this.buttonOk.Size = new System.Drawing.Size(75, 23);
+ this.buttonOk.TabIndex = 15;
+ this.buttonOk.Text = "OK";
+ this.buttonOk.UseVisualStyleBackColor = true;
+ this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);
+ //
+ // SpmPanel_Employees
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.buttonOk);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.buttonRemove);
+ this.Controls.Add(this.buttonUpdate);
+ this.Controls.Add(this.buttonCreate);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.listViewEmployee);
+ this.Controls.Add(this.listFilterEmployee);
+ this.Margin = new System.Windows.Forms.Padding(2);
+ this.MinimumSize = new System.Drawing.Size(400, 350);
+ this.Name = "SpmPanel_Employees";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.tabControl.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Filters.SpmItemListFilter_Employee listFilterEmployee;
+ private Controls.SpmItemListView_Employee listViewEmployee;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Button buttonRemove;
+ private System.Windows.Forms.Button buttonUpdate;
+ private System.Windows.Forms.Button buttonCreate;
+ private System.Windows.Forms.Button buttonCancel;
+ private System.Windows.Forms.Button buttonOk;
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.cs
new file mode 100644
index 0000000..8f7b070
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.cs
@@ -0,0 +1,604 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.Core.Bus;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Win.Forms.Utils;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Core.App;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.TabPages;
+using Sarand.PatientMgr.Win.Forms.Filters;
+using Sarand.PatientMgr.Win.Forms.Base;
+
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ //=======================================================================
+ public partial class SpmPanel_Employees : SpmPanel_Items
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelMode
+ {
+ Search,
+ Maintain,
+ }
+ public new class Config : SpmPanel_Items.Config
+ {
+ public Config (PanelMode mode)
+ {
+ Mode = mode;
+ // Defaults based on mode.
+ DisplayFilter = false; // Mode == PanelMode.Maintain || Mode == PanelMode.Search;
+ DisplayTabs = Mode == PanelMode.Maintain;
+ DisplayActionButtons = Mode == PanelMode.Maintain;
+ DisplayNavigationButtons = Mode == PanelMode.Search;
+ }
+ public PanelMode Mode { get; } = PanelMode.Maintain;
+ public SpmForm SearchForm { get; set; }
+ // Display options.
+ public bool DisplayFilter { get; set; } = false;
+ public bool DisplayContextMenu { get; set; } = true;
+ public bool DisplayActionButtons { get; set; } = false;
+ public bool DisplayNavigationButtons { get; set; } = false;
+ public bool DisplayTabs { get; set; } = false;
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config(PanelMode.Search);
+ private readonly List tabPages = new List();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ private SpmPanel_Employees () : this(new Config(PanelMode.Search)) { }
+ public SpmPanel_Employees (Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose (bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ protected override String DefaultMessageTitle { get { return "Employee"; } }
+ public override int ItemTotal { get { return listViewEmployee.ItemTotal; } }
+ public override int ItemCount { get { return listViewEmployee.ItemCount; } }
+ public override int SelectedItemCount { get { return listViewEmployee.SelectedItemCount; } }
+ public SysId SelectedItemId { get { return listViewEmployee.SelectedItemId; } }
+ public List SelectedItemIds { get { return listViewEmployee.SelectedItemIds; } }
+ public SpmEmployee SelectedEmployee { get { return listViewEmployee.SelectedEmployee; } }
+
+ //-------------------------------------------------------------------
+ // Configure.
+ public void SetConfig (Config config)
+ {
+ base.SetConfig(config);
+ this.config = config;
+ ConfigurePanel();
+ }
+
+ //-------------------------------------------------------------------
+ // I n i t i a l i s a t i o n
+ //-------------------------------------------------------------------
+ protected override void OnCreateControl ()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ ConfigurePanel();
+ }
+
+ private void ConfigurePanel ()
+ {
+ if (!Created || this.IsDesignerHosted()) return;
+
+ // Configure filter.
+ if (config.DisplayFilter)
+ {
+ SpmItemListFilter_Employee.Config configFilter = new SpmItemListFilter_Employee.Config();
+ configFilter.Internals = Internals;
+ listFilterEmployee.SetConfig(configFilter);
+ }
+ listFilterEmployee.Visible = config.DisplayFilter;
+
+ // Configure list.
+ SpmItemListView_Employee.Config configList = new SpmItemListView_Employee.Config();
+ configList.Internals = Internals;
+ configList.Mode = SpmItemListView_Employee.ListMode.General;
+ listViewEmployee.SetConfig(configList);
+
+ // Tabs.
+ tabControl.TabPages.Clear();
+ tabControl.Visible = config.DisplayTabs;
+ RefreshTabs();
+
+ // Configure buttons.
+ buttonCreate.Visible = config.DisplayActionButtons && SecurityProfile.Admin.CanManageConfig();
+ buttonUpdate.Visible = config.DisplayActionButtons;
+ buttonRemove.Visible = config.DisplayActionButtons && buttonCreate.Visible;
+ buttonOk.Visible = config.DisplayNavigationButtons && config.Mode == PanelMode.Search;
+ buttonCancel.Visible = config.DisplayNavigationButtons;
+
+ // Complete form initialisation.
+ RefreshDataItems();
+ SetControlActivity();
+ PositionControls();
+ }
+
+ //-------------------------------------------------------------------
+ // Initialise tabs.
+ private void InitTabs ()
+ {
+ String fn = GetType().Name + ".InitTabs";
+ tabControl.TabPages.Clear();
+ tabPages.Clear();
+ if (!config.DisplayTabs)
+ {
+ tabPages.Clear();
+ tabControl.TabPages.Clear();
+ tabControl.Visible = false;
+ return;
+ }
+
+ // Selected Employee.
+ SpmEmployee employee = SelectedEmployee;
+
+ // Updates.
+ List panelTypes_Updates = new List();
+ panelTypes_Updates.Add(SpmTabPage_Employee.PanelType.Updates);
+ if (panelTypes_Updates.Count > 0)
+ {
+ SpmTabPage_Employee.Config configTabPage = new SpmTabPage_Employee.Config();
+ configTabPage.Internals = Internals;
+ configTabPage.ReadOnly = ReadOnly;
+ configTabPage.PanelTypes.AddRange(panelTypes_Updates);
+ SpmTabPage_Employee tabPage = new SpmTabPage_Employee(configTabPage) { Text = "Updates" };
+ tabPages.Add(tabPage);
+ }
+
+ // Populate tab pages.
+ tabControl.Visible = tabPages.Count > 0;
+ foreach (var tabPage in tabPages)
+ tabControl.TabPages.Add(tabPage);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l I n t e r f a c e
+ //-------------------------------------------------------------------
+ private String previouslySelectedTabPageText = "";
+ private void RefreshTabs ()
+ {
+ if (tabControl.SelectedTab != null)
+ previouslySelectedTabPageText = tabControl.SelectedTab.Text;
+
+ // Reinitialise tabs whenever the selection changes in case the set of tab pages displayed needs to be changed.
+ InitTabs();
+
+ // Select previous tab page if still present.
+ if (!StringUtil.IsEmpty(previouslySelectedTabPageText))
+ {
+ foreach (TabPage tabPage in tabControl.TabPages)
+ {
+ if (tabPage.Text.Equals(previouslySelectedTabPageText))
+ {
+ tabControl.SelectTab(tabPage);
+ break;
+ }
+ }
+ }
+ RefreshTabPages();
+
+ SetControlActivity();
+ PositionControls();
+ }
+ private void RefreshTabPages ()
+ {
+ // Selected Employee - populated when needed.
+ SpmEmployee employee = null;
+
+ // Refresh tabs.
+ if (tabControl.Visible)
+ {
+ if (employee == null) employee = SelectedEmployee;
+ SpmEmployee.Data employeeData = employee != null ? employee.GetData() : new SpmEmployee.Data();
+ tabPages.PopulateToControls(employeeData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // F i l t e r
+ //-------------------------------------------------------------------
+ public bool ParamsAreValid (SpmEmployee.Params prmEmployee)
+ {
+ return true;
+ }
+ public SpmEmployee.Params GetParams ()
+ {
+ SpmEmployee.Params prmEmployee = new SpmEmployee.Params();
+
+ // Sort columns.
+ prmEmployee.SortColumns.AddRange(listViewEmployee.GetSortColumns());
+ return prmEmployee;
+ }
+
+ //-------------------------------------------------------------------
+ // A c t i o n s
+ //-------------------------------------------------------------------
+ // Refresh.
+ public override void RefreshDataItems ()
+ {
+ SpmEmployee.Params prmEmployee = GetParams();
+ if (!ParamsAreValid(prmEmployee)) prmEmployee = null;
+ listViewEmployee.RefreshEmployees(prmEmployee);
+ }
+ public override void RefreshDataItem (SysId id)
+ {
+ listViewEmployee.RefreshEmployee(id);
+ }
+ public override void RemoveDataItem (SysId id)
+ {
+ listViewEmployee.RemoveItemById(id);
+ }
+
+ //-------------------------------------------------------------------
+ // Create item.
+ public override bool CanCreateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void CreateItem ()
+ {
+ if (!CanCreateItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ // Create new Employee.
+ SpmForm_Employee.Config configEmployee = new SpmForm_Employee.Config();
+ using (var form = new SpmForm_Employee(configEmployee))
+ {
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ RefreshDataItem(form.NewItemId);
+ InvokeItemCreatedEvent(Spm.DataItemType.Employee, form.NewItemId);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // View/Update item.
+ public override bool CanViewItem ()
+ {
+ return true;
+ }
+ public override bool CanUpdateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void UpdateItem (bool updateItem = true)
+ {
+ if (config.Mode == PanelMode.Search) return;
+ SpmEmployee employee = SelectedEmployee;
+ if (SelectedItemCount != 1) return;
+ if (!CanUpdateItem() && !CanViewItem()) return;
+ if (!CanUpdateItem()) updateItem = false;
+ if (employee == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve selected item");
+ return;
+ }
+ SpmForm_Employee.Config configEmployee = new SpmForm_Employee.Config();
+ configEmployee.EmployeeToUpdate = employee;
+ configEmployee.ReadOnly = (config.ReadOnly || !updateItem);
+ using (SpmForm_Employee formEmployee = new SpmForm_Employee(configEmployee))
+ {
+ // Perform the update.
+ if (formEmployee.ShowDialog() == DialogResult.OK)
+ {
+ // Employee has been updated.
+ RefreshDataItem(employee.Id);
+ listViewEmployee.RefreshEmployee(employee.Id);
+ InvokeItemUpdatedEvent(Spm.DataItemType.Employee, employee.Id);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Delete item.
+ public override bool CanDeleteItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void DeleteItem ()
+ {
+ if (!CanDeleteItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ if (SelectedItemCount != 1) return;
+ SpmEmployee employee = SelectedEmployee;
+ if (employee == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve item for deletion.");
+ return;
+ }
+ if (!InstitutionMgr.EmployeeCanBeDeleted(employee))
+ {
+ MessageConsole.ShowMessageError("Unable to remove employee - " + InstitutionMgr.ErrorStateMessage + ".");
+ return;
+ }
+ if (MessageConsole.ShowMessageConfirm("Are you sure that this employee should be removed from the system?"))
+ {
+ if (InstitutionMgr.DeleteEmployee(employee, DbUpdateInfo))
+ {
+ int selectIdx = listViewEmployee.SelectedIndex;
+ listViewEmployee.RemoveItemById(employee.Id.ToString());
+ if (selectIdx >= listViewEmployee.ItemCount - 1) selectIdx--;
+ listViewEmployee.SelectedIndices.Clear();
+ listViewEmployee.SelectedIndices.Add(selectIdx);
+ }
+ else MessageConsole.ShowMessageError("Failed to remove employee - " + InstitutionMgr.ErrorStateMessage + ".");
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Import data.
+ public override bool CanImportData ()
+ {
+ return false;
+ }
+ public override void ImportData ()
+ {
+ if (!CanImportData()) return;
+ }
+
+ //-------------------------------------------------------------------
+ // Export data.
+ public override bool CanExportData ()
+ {
+ return false;
+ }
+ public override void ExportData ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t e x t M e n u
+ //-------------------------------------------------------------------
+ private SpmContextMenuStrip contextMenuStrip = new SpmContextMenuStrip();
+ private void RefreshContextMenu ()
+ {
+ contextMenuStrip.Name = "Employee";
+ contextMenuStrip.Items.Clear();
+ if (CanCreateItem())
+ contextMenuStrip.Items.Add("Create", null, CreateItem);
+ if (SysId.IsValid(listViewEmployee.SelectedItemId))
+ {
+ SpmEmployee employee = SelectedEmployee;
+ if (employee != null)
+ {
+ if (CanUpdateItem() || CanDeleteItem())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ contextMenuStrip.Items.Add(CanUpdateItem() ? "Update" : "View", null, UpdateItem);
+ if (CanDeleteItem())
+ contextMenuStrip.Items.Add("Remove", null, DeleteItem);
+ }
+ }
+ }
+ if (CanExportData() || CanImportData())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ if (CanImportData())
+ contextMenuStrip.Items.Add("Import", null, ImportData);
+ if (CanExportData())
+ contextMenuStrip.Items.Add("Export", null, ExportData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected override void SetControlActivity ()
+ {
+ SetControlsReadOnly();
+ bool itemSelected = SysId.IsValid(SelectedItemId);
+
+ listViewEmployee.Enabled = Enabled;
+ buttonCreate.Enabled = Enabled;
+ buttonUpdate.Enabled = Enabled && itemSelected;
+ buttonRemove.Enabled = Enabled && itemSelected;
+ buttonOk.Enabled = Enabled;
+ buttonCancel.Enabled = Enabled;
+ }
+ protected override void SetControlsReadOnly ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // P o s i t i o n C o n t r o l s
+ //-------------------------------------------------------------------
+ protected override void PositionControls ()
+ {
+ if (this.IsDesignerHosted() || !Created) return;
+ Rectangle clientRect = ClientRectangle;
+
+ //---------------------------------------------------------------
+ // Filter panel.
+ if (listFilterEmployee.Visible)
+ {
+ listFilterEmployee.PositionAtTopLeftOf(this);
+ listFilterEmployee.SetFullWidthOf(this);
+ listFilterEmployee.ResizeToBottomControl();
+ listViewEmployee.PositionBelow(listFilterEmployee);
+ }
+ else
+ {
+ listViewEmployee.PositionAtTopLeftOf(this);
+ }
+
+ //---------------------------------------------------------------
+ // List view.
+ int buttonLeft = clientRect.Width - buttonCreate.Width - buttonCreate.Margin.Right - Padding.Right;
+ listViewEmployee.Left = listViewEmployee.Margin.Left;
+ listViewEmployee.Width = buttonLeft - buttonCreate.Margin.Left - listViewEmployee.Left - listViewEmployee.Margin.Right;
+ if (!(buttonCreate.Visible || buttonUpdate.Visible || buttonRemove.Visible || buttonOk.Visible || buttonCancel.Visible))
+ listViewEmployee.Width = clientRect.Width - Padding.Right - listViewEmployee.Left - listViewEmployee.Margin.Right;
+
+ //---------------------------------------------------------------
+ // Tab control.
+ if (tabControl.Visible)
+ {
+ tabControl.Left = listViewEmployee.Left;
+ tabControl.Width = clientRect.Width - (tabControl.Left * 2);
+ listViewEmployee.Height = (int)((clientRect.Height - listViewEmployee.Top) * 0.40);
+ tabControl.Top = listViewEmployee.Bottom + listViewEmployee.Margin.Bottom + tabControl.Margin.Top;
+ tabControl.Height = clientRect.Height - tabControl.Top - tabControl.Margin.Bottom - Padding.Bottom;
+ }
+ else
+ {
+ listViewEmployee.Height = clientRect.Height - listViewEmployee.Top - listViewEmployee.Margin.Bottom - Padding.Bottom;
+ }
+
+ //---------------------------------------------------------------
+ // Create button.
+ int buttonTop = listViewEmployee.Top + listViewEmployee.HeaderHeight;
+ buttonCreate.Top = buttonTop;
+ buttonCreate.Left = buttonLeft;
+ if (buttonCreate.Visible)
+ buttonTop += buttonCreate.Height + buttonCreate.Margin.Bottom;
+
+ // Update button.
+ buttonUpdate.Top = buttonTop;
+ buttonUpdate.Left = buttonLeft;
+ if (buttonUpdate.Visible)
+ buttonTop += buttonUpdate.Height + buttonUpdate.Margin.Bottom;
+
+ // Remove button.
+ buttonRemove.Top = buttonTop;
+ buttonRemove.Left = buttonLeft;
+ if (buttonRemove.Visible)
+ buttonTop += buttonRemove.Height + buttonRemove.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ // Navigation buttons.
+ // Cancel button.
+ buttonCancel.Top = clientRect.Bottom - Padding.Bottom - buttonCancel.Margin.Bottom - buttonCancel.Height;
+ buttonCancel.Left = buttonLeft;
+
+ // OK button.
+ buttonOk.Top = buttonCancel.Top - buttonOk.Height - buttonCancel.Padding.Top - buttonCancel.Margin.Bottom;
+ buttonOk.Left = buttonLeft;
+ if (buttonOk.Visible)
+ buttonTop += buttonOk.Height + buttonOk.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ // Filter.
+ private void listFilterEmployee_FilterChanged (object sender, EventArgs e)
+ {
+ RefreshDataItems();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Item list.
+ private void listViewEmployee_ColumnClick (object sender, ColumnClickEventArgs e)
+ {
+ RefreshDataItems();
+ }
+ private void listViewEmployee_ItemCountChanged (object sender, Sarand.Win.Forms.Controls.SacsListView.ItemCountChangedEventArgs e)
+ {
+ InvokeItemCountChangedEvent(e);
+ }
+ private void listViewEmployee_SelectedIndexChanged (object sender, EventArgs e)
+ {
+ RefreshTabs();
+ InvokeItemSelectionChangedEvent(e);
+ SetControlActivity();
+ }
+ private void listViewEmployee_DoubleClick (object sender, EventArgs e)
+ {
+ if (config.Mode == PanelMode.Search)
+ {
+ //if (config.SearchForm != null) config.SearchForm.OnOK();
+ }
+ else
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void listViewEmployee_MouseUp (object sender, MouseEventArgs e)
+ {
+ switch (e.Button)
+ {
+ case MouseButtons.Right:
+ // Refresh the context menu and display at pointer position.
+ RefreshContextMenu();
+ contextMenuStrip.Show(listViewEmployee, new Point(e.X, e.Y), ToolStripDropDownDirection.Default);
+ break;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Actions.
+ private void buttonCreate_Click (object sender, EventArgs e)
+ {
+ CreateItem();
+ SetControlActivity();
+ }
+ private void buttonUpdate_Click (object sender, EventArgs e)
+ {
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void buttonRemove_Click (object sender, EventArgs e)
+ {
+ DeleteItem();
+ SetControlActivity();
+ }
+ private void buttonOk_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnOK();
+ return;
+ }
+ SetControlActivity();
+ }
+ private void buttonCancel_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnCancel();
+ return;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.resx b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Employees.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.Designer.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.Designer.cs
new file mode 100644
index 0000000..a24eefd
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.Designer.cs
@@ -0,0 +1,186 @@
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ partial class SpmPanel_Institutions
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent ()
+ {
+ this.listFilterInstitution = new Sarand.PatientMgr.Win.Forms.Filters.SpmItemListFilter_Institution();
+ this.listViewInstitution = new Sarand.PatientMgr.Win.Forms.Controls.SpmItemListView_Institution();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.buttonRemove = new System.Windows.Forms.Button();
+ this.buttonUpdate = new System.Windows.Forms.Button();
+ this.buttonCreate = new System.Windows.Forms.Button();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonOk = new System.Windows.Forms.Button();
+ this.tabControl.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // listFilterInstitution
+ //
+ this.listFilterInstitution.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listFilterInstitution.Location = new System.Drawing.Point(0, 2);
+ this.listFilterInstitution.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.listFilterInstitution.Name = "listFilterInstitution";
+ this.listFilterInstitution.Size = new System.Drawing.Size(400, 30);
+ this.listFilterInstitution.TabIndex = 0;
+ this.listFilterInstitution.FilterChanged += new System.EventHandler(this.listFilterInstitution_FilterChanged);
+ //
+ // listViewInstitution
+ //
+ this.listViewInstitution.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listViewInstitution.FullRowSelect = true;
+ this.listViewInstitution.HideSelection = false;
+ this.listViewInstitution.Location = new System.Drawing.Point(0, 37);
+ this.listViewInstitution.Margin = new System.Windows.Forms.Padding(2);
+ this.listViewInstitution.Name = "listViewInstitution";
+ this.listViewInstitution.OwnerDraw = true;
+ this.listViewInstitution.Size = new System.Drawing.Size(317, 155);
+ this.listViewInstitution.TabIndex = 1;
+ this.listViewInstitution.UseCompatibleStateImageBehavior = false;
+ this.listViewInstitution.ItemCountChanged += new System.EventHandler(this.listViewInstitution_ItemCountChanged);
+ this.listViewInstitution.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewInstitution_ColumnClick);
+ this.listViewInstitution.SelectedIndexChanged += new System.EventHandler(this.listViewInstitution_SelectedIndexChanged);
+ this.listViewInstitution.DoubleClick += new System.EventHandler(this.listViewInstitution_DoubleClick);
+ this.listViewInstitution.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listViewInstitution_MouseUp);
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.tabPage1);
+ this.tabControl.Controls.Add(this.tabPage2);
+ this.tabControl.Location = new System.Drawing.Point(2, 196);
+ this.tabControl.Margin = new System.Windows.Forms.Padding(2);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(398, 154);
+ this.tabControl.TabIndex = 6;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Size = new System.Drawing.Size(390, 128);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "tabPage1";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Size = new System.Drawing.Size(390, 128);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "tabPage2";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // buttonRemove
+ //
+ this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonRemove.Location = new System.Drawing.Point(322, 95);
+ this.buttonRemove.Name = "buttonRemove";
+ this.buttonRemove.Size = new System.Drawing.Size(75, 23);
+ this.buttonRemove.TabIndex = 15;
+ this.buttonRemove.Text = "Remove";
+ this.buttonRemove.UseVisualStyleBackColor = true;
+ this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
+ //
+ // buttonUpdate
+ //
+ this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonUpdate.Location = new System.Drawing.Point(322, 66);
+ this.buttonUpdate.Name = "buttonUpdate";
+ this.buttonUpdate.Size = new System.Drawing.Size(75, 23);
+ this.buttonUpdate.TabIndex = 14;
+ this.buttonUpdate.Text = "Update";
+ this.buttonUpdate.UseVisualStyleBackColor = true;
+ this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
+ //
+ // buttonCreate
+ //
+ this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCreate.Location = new System.Drawing.Point(322, 37);
+ this.buttonCreate.Name = "buttonCreate";
+ this.buttonCreate.Size = new System.Drawing.Size(75, 23);
+ this.buttonCreate.TabIndex = 13;
+ this.buttonCreate.Text = "Create";
+ this.buttonCreate.UseVisualStyleBackColor = true;
+ this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCancel.Location = new System.Drawing.Point(322, 168);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this.buttonCancel.TabIndex = 15;
+ this.buttonCancel.Text = "Cancel";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
+ //
+ // buttonOk
+ //
+ this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonOk.Location = new System.Drawing.Point(322, 139);
+ this.buttonOk.Name = "buttonOk";
+ this.buttonOk.Size = new System.Drawing.Size(75, 23);
+ this.buttonOk.TabIndex = 15;
+ this.buttonOk.Text = "OK";
+ this.buttonOk.UseVisualStyleBackColor = true;
+ this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);
+ //
+ // SpmPanel_Institutions
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.buttonOk);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.buttonRemove);
+ this.Controls.Add(this.buttonUpdate);
+ this.Controls.Add(this.buttonCreate);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.listViewInstitution);
+ this.Controls.Add(this.listFilterInstitution);
+ this.Margin = new System.Windows.Forms.Padding(2);
+ this.MinimumSize = new System.Drawing.Size(400, 350);
+ this.Name = "SpmPanel_Institutions";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.tabControl.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Filters.SpmItemListFilter_Institution listFilterInstitution;
+ private Controls.SpmItemListView_Institution listViewInstitution;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Button buttonRemove;
+ private System.Windows.Forms.Button buttonUpdate;
+ private System.Windows.Forms.Button buttonCreate;
+ private System.Windows.Forms.Button buttonCancel;
+ private System.Windows.Forms.Button buttonOk;
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.cs
new file mode 100644
index 0000000..cf48fb5
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.cs
@@ -0,0 +1,604 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.Core.Bus;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Win.Forms.Utils;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Core.App;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.TabPages;
+using Sarand.PatientMgr.Win.Forms.Filters;
+using Sarand.PatientMgr.Win.Forms.Base;
+
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ //=======================================================================
+ public partial class SpmPanel_Institutions : SpmPanel_Items
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelMode
+ {
+ Search,
+ Maintain,
+ }
+ public new class Config : SpmPanel_Items.Config
+ {
+ public Config (PanelMode mode)
+ {
+ Mode = mode;
+ // Defaults based on mode.
+ DisplayFilter = false; // Mode == PanelMode.Maintain || Mode == PanelMode.Search;
+ DisplayTabs = Mode == PanelMode.Maintain;
+ DisplayActionButtons = Mode == PanelMode.Maintain;
+ DisplayNavigationButtons = Mode == PanelMode.Search;
+ }
+ public PanelMode Mode { get; } = PanelMode.Maintain;
+ public SpmForm SearchForm { get; set; }
+ // Display options.
+ public bool DisplayFilter { get; set; } = false;
+ public bool DisplayContextMenu { get; set; } = true;
+ public bool DisplayActionButtons { get; set; } = false;
+ public bool DisplayNavigationButtons { get; set; } = false;
+ public bool DisplayTabs { get; set; } = false;
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config(PanelMode.Search);
+ private readonly List tabPages = new List();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ private SpmPanel_Institutions () : this(new Config(PanelMode.Search)) { }
+ public SpmPanel_Institutions (Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose (bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ protected override String DefaultMessageTitle { get { return "Institution"; } }
+ public override int ItemTotal { get { return listViewInstitution.ItemTotal; } }
+ public override int ItemCount { get { return listViewInstitution.ItemCount; } }
+ public override int SelectedItemCount { get { return listViewInstitution.SelectedItemCount; } }
+ public SysId SelectedItemId { get { return listViewInstitution.SelectedItemId; } }
+ public List SelectedItemIds { get { return listViewInstitution.SelectedItemIds; } }
+ public SpmInstitution SelectedInstitution { get { return listViewInstitution.SelectedInstitution; } }
+
+ //-------------------------------------------------------------------
+ // Configure.
+ public void SetConfig (Config config)
+ {
+ base.SetConfig(config);
+ this.config = config;
+ ConfigurePanel();
+ }
+
+ //-------------------------------------------------------------------
+ // I n i t i a l i s a t i o n
+ //-------------------------------------------------------------------
+ protected override void OnCreateControl ()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ ConfigurePanel();
+ }
+
+ private void ConfigurePanel ()
+ {
+ if (!Created || this.IsDesignerHosted()) return;
+
+ // Configure filter.
+ if (config.DisplayFilter)
+ {
+ SpmItemListFilter_Institution.Config configFilter = new SpmItemListFilter_Institution.Config();
+ configFilter.Internals = Internals;
+ listFilterInstitution.SetConfig(configFilter);
+ }
+ listFilterInstitution.Visible = config.DisplayFilter;
+
+ // Configure list.
+ SpmItemListView_Institution.Config configList = new SpmItemListView_Institution.Config();
+ configList.Internals = Internals;
+ configList.Mode = SpmItemListView_Institution.ListMode.General;
+ listViewInstitution.SetConfig(configList);
+
+ // Tabs.
+ tabControl.TabPages.Clear();
+ tabControl.Visible = config.DisplayTabs;
+ RefreshTabs();
+
+ // Configure buttons.
+ buttonCreate.Visible = config.DisplayActionButtons && SecurityProfile.Admin.CanManageConfig();
+ buttonUpdate.Visible = config.DisplayActionButtons;
+ buttonRemove.Visible = config.DisplayActionButtons && buttonCreate.Visible;
+ buttonOk.Visible = config.DisplayNavigationButtons && config.Mode == PanelMode.Search;
+ buttonCancel.Visible = config.DisplayNavigationButtons;
+
+ // Complete form initialisation.
+ RefreshDataItems();
+ SetControlActivity();
+ PositionControls();
+ }
+
+ //-------------------------------------------------------------------
+ // Initialise tabs.
+ private void InitTabs ()
+ {
+ String fn = GetType().Name + ".InitTabs";
+ tabControl.TabPages.Clear();
+ tabPages.Clear();
+ if (!config.DisplayTabs)
+ {
+ tabPages.Clear();
+ tabControl.TabPages.Clear();
+ tabControl.Visible = false;
+ return;
+ }
+
+ // Selected Institution.
+ SpmInstitution institution = SelectedInstitution;
+
+ // Updates.
+ List panelTypes_Updates = new List();
+ panelTypes_Updates.Add(SpmTabPage_Institution.PanelType.Updates);
+ if (panelTypes_Updates.Count > 0)
+ {
+ SpmTabPage_Institution.Config configTabPage = new SpmTabPage_Institution.Config();
+ configTabPage.Internals = Internals;
+ configTabPage.ReadOnly = ReadOnly;
+ configTabPage.PanelTypes.AddRange(panelTypes_Updates);
+ SpmTabPage_Institution tabPage = new SpmTabPage_Institution(configTabPage) { Text = "Updates" };
+ tabPages.Add(tabPage);
+ }
+
+ // Populate tab pages.
+ tabControl.Visible = tabPages.Count > 0;
+ foreach (var tabPage in tabPages)
+ tabControl.TabPages.Add(tabPage);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l I n t e r f a c e
+ //-------------------------------------------------------------------
+ private String previouslySelectedTabPageText = "";
+ private void RefreshTabs ()
+ {
+ if (tabControl.SelectedTab != null)
+ previouslySelectedTabPageText = tabControl.SelectedTab.Text;
+
+ // Reinitialise tabs whenever the selection changes in case the set of tab pages displayed needs to be changed.
+ InitTabs();
+
+ // Select previous tab page if still present.
+ if (!StringUtil.IsEmpty(previouslySelectedTabPageText))
+ {
+ foreach (TabPage tabPage in tabControl.TabPages)
+ {
+ if (tabPage.Text.Equals(previouslySelectedTabPageText))
+ {
+ tabControl.SelectTab(tabPage);
+ break;
+ }
+ }
+ }
+ RefreshTabPages();
+
+ SetControlActivity();
+ PositionControls();
+ }
+ private void RefreshTabPages ()
+ {
+ // Selected Institution - populated when needed.
+ SpmInstitution institution = null;
+
+ // Refresh tabs.
+ if (tabControl.Visible)
+ {
+ if (institution == null) institution = SelectedInstitution;
+ SpmInstitution.Data institutionData = institution != null ? institution.GetData() : new SpmInstitution.Data();
+ tabPages.PopulateToControls(institutionData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // F i l t e r
+ //-------------------------------------------------------------------
+ public bool ParamsAreValid (SpmInstitution.Params prmInstitution)
+ {
+ return true;
+ }
+ public SpmInstitution.Params GetParams ()
+ {
+ SpmInstitution.Params prmInstitution = new SpmInstitution.Params();
+
+ // Sort columns.
+ prmInstitution.SortColumns.AddRange(listViewInstitution.GetSortColumns());
+ return prmInstitution;
+ }
+
+ //-------------------------------------------------------------------
+ // A c t i o n s
+ //-------------------------------------------------------------------
+ // Refresh.
+ public override void RefreshDataItems ()
+ {
+ SpmInstitution.Params prmInstitution = GetParams();
+ if (!ParamsAreValid(prmInstitution)) prmInstitution = null;
+ listViewInstitution.RefreshInstitutions(prmInstitution);
+ }
+ public override void RefreshDataItem (SysId id)
+ {
+ listViewInstitution.RefreshInstitution(id);
+ }
+ public override void RemoveDataItem (SysId id)
+ {
+ listViewInstitution.RemoveItemById(id);
+ }
+
+ //-------------------------------------------------------------------
+ // Create item.
+ public override bool CanCreateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void CreateItem ()
+ {
+ if (!CanCreateItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ // Create new Institution.
+ SpmForm_Institution.Config configInstitution = new SpmForm_Institution.Config();
+ using (var form = new SpmForm_Institution(configInstitution))
+ {
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ RefreshDataItem(form.NewItemId);
+ InvokeItemCreatedEvent(Spm.DataItemType.Institution, form.NewItemId);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // View/Update item.
+ public override bool CanViewItem ()
+ {
+ return true;
+ }
+ public override bool CanUpdateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void UpdateItem (bool updateItem = true)
+ {
+ if (config.Mode == PanelMode.Search) return;
+ SpmInstitution institution = SelectedInstitution;
+ if (SelectedItemCount != 1) return;
+ if (!CanUpdateItem() && !CanViewItem()) return;
+ if (!CanUpdateItem()) updateItem = false;
+ if (institution == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve selected item");
+ return;
+ }
+ SpmForm_Institution.Config configInstitution = new SpmForm_Institution.Config();
+ configInstitution.InstitutionToUpdate = institution;
+ configInstitution.ReadOnly = (config.ReadOnly || !updateItem);
+ using (SpmForm_Institution formInstitution = new SpmForm_Institution(configInstitution))
+ {
+ // Perform the update.
+ if (formInstitution.ShowDialog() == DialogResult.OK)
+ {
+ // Institution has been updated.
+ RefreshDataItem(institution.Id);
+ listViewInstitution.RefreshInstitution(institution.Id);
+ InvokeItemUpdatedEvent(Spm.DataItemType.Institution, institution.Id);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Delete item.
+ public override bool CanDeleteItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void DeleteItem ()
+ {
+ if (!CanDeleteItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ if (SelectedItemCount != 1) return;
+ SpmInstitution institution = SelectedInstitution;
+ if (institution == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve item for deletion.");
+ return;
+ }
+ if (!InstitutionMgr.InstitutionCanBeDeleted(institution))
+ {
+ MessageConsole.ShowMessageError("Unable to remove institution - " + InstitutionMgr.ErrorStateMessage + ".");
+ return;
+ }
+ if (MessageConsole.ShowMessageConfirm("Are you sure that this institution should be removed from the system?"))
+ {
+ if (InstitutionMgr.DeleteInstitution(institution, DbUpdateInfo))
+ {
+ int selectIdx = listViewInstitution.SelectedIndex;
+ listViewInstitution.RemoveItemById(institution.Id.ToString());
+ if (selectIdx >= listViewInstitution.ItemCount - 1) selectIdx--;
+ listViewInstitution.SelectedIndices.Clear();
+ listViewInstitution.SelectedIndices.Add(selectIdx);
+ }
+ else MessageConsole.ShowMessageError("Failed to remove institution - " + InstitutionMgr.ErrorStateMessage + ".");
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Import data.
+ public override bool CanImportData ()
+ {
+ return false;
+ }
+ public override void ImportData ()
+ {
+ if (!CanImportData()) return;
+ }
+
+ //-------------------------------------------------------------------
+ // Export data.
+ public override bool CanExportData ()
+ {
+ return false;
+ }
+ public override void ExportData ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t e x t M e n u
+ //-------------------------------------------------------------------
+ private SpmContextMenuStrip contextMenuStrip = new SpmContextMenuStrip();
+ private void RefreshContextMenu ()
+ {
+ contextMenuStrip.Name = "Institution";
+ contextMenuStrip.Items.Clear();
+ if (CanCreateItem())
+ contextMenuStrip.Items.Add("Create", null, CreateItem);
+ if (SysId.IsValid(listViewInstitution.SelectedItemId))
+ {
+ SpmInstitution institution = SelectedInstitution;
+ if (institution != null)
+ {
+ if (CanUpdateItem() || CanDeleteItem())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ contextMenuStrip.Items.Add(CanUpdateItem() ? "Update" : "View", null, UpdateItem);
+ if (CanDeleteItem())
+ contextMenuStrip.Items.Add("Remove", null, DeleteItem);
+ }
+ }
+ }
+ if (CanExportData() || CanImportData())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ if (CanImportData())
+ contextMenuStrip.Items.Add("Import", null, ImportData);
+ if (CanExportData())
+ contextMenuStrip.Items.Add("Export", null, ExportData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected override void SetControlActivity ()
+ {
+ SetControlsReadOnly();
+ bool itemSelected = SysId.IsValid(SelectedItemId);
+
+ listViewInstitution.Enabled = Enabled;
+ buttonCreate.Enabled = Enabled;
+ buttonUpdate.Enabled = Enabled && itemSelected;
+ buttonRemove.Enabled = Enabled && itemSelected;
+ buttonOk.Enabled = Enabled;
+ buttonCancel.Enabled = Enabled;
+ }
+ protected override void SetControlsReadOnly ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // P o s i t i o n C o n t r o l s
+ //-------------------------------------------------------------------
+ protected override void PositionControls ()
+ {
+ if (this.IsDesignerHosted() || !Created) return;
+ Rectangle clientRect = ClientRectangle;
+
+ //---------------------------------------------------------------
+ // Filter panel.
+ if (listFilterInstitution.Visible)
+ {
+ listFilterInstitution.PositionAtTopLeftOf(this);
+ listFilterInstitution.SetFullWidthOf(this);
+ listFilterInstitution.ResizeToBottomControl();
+ listViewInstitution.PositionBelow(listFilterInstitution);
+ }
+ else
+ {
+ listViewInstitution.PositionAtTopLeftOf(this);
+ }
+
+ //---------------------------------------------------------------
+ // List view.
+ int buttonLeft = clientRect.Width - buttonCreate.Width - buttonCreate.Margin.Right - Padding.Right;
+ listViewInstitution.Left = listViewInstitution.Margin.Left;
+ listViewInstitution.Width = buttonLeft - buttonCreate.Margin.Left - listViewInstitution.Left - listViewInstitution.Margin.Right;
+ if (!(buttonCreate.Visible || buttonUpdate.Visible || buttonRemove.Visible || buttonOk.Visible || buttonCancel.Visible))
+ listViewInstitution.Width = clientRect.Width - Padding.Right - listViewInstitution.Left - listViewInstitution.Margin.Right;
+
+ //---------------------------------------------------------------
+ // Tab control.
+ if (tabControl.Visible)
+ {
+ tabControl.Left = listViewInstitution.Left;
+ tabControl.Width = clientRect.Width - (tabControl.Left * 2);
+ listViewInstitution.Height = (int)((clientRect.Height - listViewInstitution.Top) * 0.40);
+ tabControl.Top = listViewInstitution.Bottom + listViewInstitution.Margin.Bottom + tabControl.Margin.Top;
+ tabControl.Height = clientRect.Height - tabControl.Top - tabControl.Margin.Bottom - Padding.Bottom;
+ }
+ else
+ {
+ listViewInstitution.Height = clientRect.Height - listViewInstitution.Top - listViewInstitution.Margin.Bottom - Padding.Bottom;
+ }
+
+ //---------------------------------------------------------------
+ // Create button.
+ int buttonTop = listViewInstitution.Top + listViewInstitution.HeaderHeight;
+ buttonCreate.Top = buttonTop;
+ buttonCreate.Left = buttonLeft;
+ if (buttonCreate.Visible)
+ buttonTop += buttonCreate.Height + buttonCreate.Margin.Bottom;
+
+ // Update button.
+ buttonUpdate.Top = buttonTop;
+ buttonUpdate.Left = buttonLeft;
+ if (buttonUpdate.Visible)
+ buttonTop += buttonUpdate.Height + buttonUpdate.Margin.Bottom;
+
+ // Remove button.
+ buttonRemove.Top = buttonTop;
+ buttonRemove.Left = buttonLeft;
+ if (buttonRemove.Visible)
+ buttonTop += buttonRemove.Height + buttonRemove.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ // Navigation buttons.
+ // Cancel button.
+ buttonCancel.Top = clientRect.Bottom - Padding.Bottom - buttonCancel.Margin.Bottom - buttonCancel.Height;
+ buttonCancel.Left = buttonLeft;
+
+ // OK button.
+ buttonOk.Top = buttonCancel.Top - buttonOk.Height - buttonCancel.Padding.Top - buttonCancel.Margin.Bottom;
+ buttonOk.Left = buttonLeft;
+ if (buttonOk.Visible)
+ buttonTop += buttonOk.Height + buttonOk.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ // Filter.
+ private void listFilterInstitution_FilterChanged (object sender, EventArgs e)
+ {
+ RefreshDataItems();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Item list.
+ private void listViewInstitution_ColumnClick (object sender, ColumnClickEventArgs e)
+ {
+ RefreshDataItems();
+ }
+ private void listViewInstitution_ItemCountChanged (object sender, Sarand.Win.Forms.Controls.SacsListView.ItemCountChangedEventArgs e)
+ {
+ InvokeItemCountChangedEvent(e);
+ }
+ private void listViewInstitution_SelectedIndexChanged (object sender, EventArgs e)
+ {
+ RefreshTabs();
+ InvokeItemSelectionChangedEvent(e);
+ SetControlActivity();
+ }
+ private void listViewInstitution_DoubleClick (object sender, EventArgs e)
+ {
+ if (config.Mode == PanelMode.Search)
+ {
+ //if (config.SearchForm != null) config.SearchForm.OnOK();
+ }
+ else
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void listViewInstitution_MouseUp (object sender, MouseEventArgs e)
+ {
+ switch (e.Button)
+ {
+ case MouseButtons.Right:
+ // Refresh the context menu and display at pointer position.
+ RefreshContextMenu();
+ contextMenuStrip.Show(listViewInstitution, new Point(e.X, e.Y), ToolStripDropDownDirection.Default);
+ break;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Actions.
+ private void buttonCreate_Click (object sender, EventArgs e)
+ {
+ CreateItem();
+ SetControlActivity();
+ }
+ private void buttonUpdate_Click (object sender, EventArgs e)
+ {
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void buttonRemove_Click (object sender, EventArgs e)
+ {
+ DeleteItem();
+ SetControlActivity();
+ }
+ private void buttonOk_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnOK();
+ return;
+ }
+ SetControlActivity();
+ }
+ private void buttonCancel_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnCancel();
+ return;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.resx b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Institutions.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.Designer.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.Designer.cs
new file mode 100644
index 0000000..3825544
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.Designer.cs
@@ -0,0 +1,186 @@
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ partial class SpmPanel_Operations
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.listFilterOperation = new Sarand.PatientMgr.Win.Forms.Filters.SpmItemListFilter_Operation();
+ this.listViewOperation = new Sarand.PatientMgr.Win.Forms.Controls.SpmItemListView_Operation();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.buttonRemove = new System.Windows.Forms.Button();
+ this.buttonUpdate = new System.Windows.Forms.Button();
+ this.buttonCreate = new System.Windows.Forms.Button();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonOk = new System.Windows.Forms.Button();
+ this.tabControl.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // listFilterOperation
+ //
+ this.listFilterOperation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listFilterOperation.Location = new System.Drawing.Point(0, 2);
+ this.listFilterOperation.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.listFilterOperation.Name = "listFilterOperation";
+ this.listFilterOperation.Size = new System.Drawing.Size(400, 30);
+ this.listFilterOperation.TabIndex = 0;
+ this.listFilterOperation.FilterChanged += new System.EventHandler(this.listFilterOperation_FilterChanged);
+ //
+ // listViewOperation
+ //
+ this.listViewOperation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listViewOperation.FullRowSelect = true;
+ this.listViewOperation.HideSelection = false;
+ this.listViewOperation.Location = new System.Drawing.Point(0, 37);
+ this.listViewOperation.Margin = new System.Windows.Forms.Padding(2);
+ this.listViewOperation.Name = "listViewOperation";
+ this.listViewOperation.OwnerDraw = true;
+ this.listViewOperation.Size = new System.Drawing.Size(317, 155);
+ this.listViewOperation.TabIndex = 1;
+ this.listViewOperation.UseCompatibleStateImageBehavior = false;
+ this.listViewOperation.ItemCountChanged += new System.EventHandler(this.listViewOperation_ItemCountChanged);
+ this.listViewOperation.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewOperation_ColumnClick);
+ this.listViewOperation.SelectedIndexChanged += new System.EventHandler(this.listViewOperation_SelectedIndexChanged);
+ this.listViewOperation.DoubleClick += new System.EventHandler(this.listViewOperation_DoubleClick);
+ this.listViewOperation.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listViewOperation_MouseUp);
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.tabPage1);
+ this.tabControl.Controls.Add(this.tabPage2);
+ this.tabControl.Location = new System.Drawing.Point(2, 196);
+ this.tabControl.Margin = new System.Windows.Forms.Padding(2);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(398, 154);
+ this.tabControl.TabIndex = 6;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Size = new System.Drawing.Size(390, 128);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "tabPage1";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Size = new System.Drawing.Size(390, 128);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "tabPage2";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // buttonRemove
+ //
+ this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonRemove.Location = new System.Drawing.Point(322, 95);
+ this.buttonRemove.Name = "buttonRemove";
+ this.buttonRemove.Size = new System.Drawing.Size(75, 23);
+ this.buttonRemove.TabIndex = 15;
+ this.buttonRemove.Text = "Remove";
+ this.buttonRemove.UseVisualStyleBackColor = true;
+ this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
+ //
+ // buttonUpdate
+ //
+ this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonUpdate.Location = new System.Drawing.Point(322, 66);
+ this.buttonUpdate.Name = "buttonUpdate";
+ this.buttonUpdate.Size = new System.Drawing.Size(75, 23);
+ this.buttonUpdate.TabIndex = 14;
+ this.buttonUpdate.Text = "Update";
+ this.buttonUpdate.UseVisualStyleBackColor = true;
+ this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
+ //
+ // buttonCreate
+ //
+ this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCreate.Location = new System.Drawing.Point(322, 37);
+ this.buttonCreate.Name = "buttonCreate";
+ this.buttonCreate.Size = new System.Drawing.Size(75, 23);
+ this.buttonCreate.TabIndex = 13;
+ this.buttonCreate.Text = "Create";
+ this.buttonCreate.UseVisualStyleBackColor = true;
+ this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCancel.Location = new System.Drawing.Point(322, 168);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this.buttonCancel.TabIndex = 15;
+ this.buttonCancel.Text = "Cancel";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
+ //
+ // buttonOk
+ //
+ this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonOk.Location = new System.Drawing.Point(322, 139);
+ this.buttonOk.Name = "buttonOk";
+ this.buttonOk.Size = new System.Drawing.Size(75, 23);
+ this.buttonOk.TabIndex = 15;
+ this.buttonOk.Text = "OK";
+ this.buttonOk.UseVisualStyleBackColor = true;
+ this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);
+ //
+ // SpmPanel_Operations
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.buttonOk);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.buttonRemove);
+ this.Controls.Add(this.buttonUpdate);
+ this.Controls.Add(this.buttonCreate);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.listViewOperation);
+ this.Controls.Add(this.listFilterOperation);
+ this.Margin = new System.Windows.Forms.Padding(2);
+ this.MinimumSize = new System.Drawing.Size(400, 350);
+ this.Name = "SpmPanel_Operations";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.tabControl.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Filters.SpmItemListFilter_Operation listFilterOperation;
+ private Controls.SpmItemListView_Operation listViewOperation;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Button buttonRemove;
+ private System.Windows.Forms.Button buttonUpdate;
+ private System.Windows.Forms.Button buttonCreate;
+ private System.Windows.Forms.Button buttonCancel;
+ private System.Windows.Forms.Button buttonOk;
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.cs
new file mode 100644
index 0000000..a90c94c
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.cs
@@ -0,0 +1,604 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.Core.Bus;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Win.Forms.Utils;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Core.App;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.TabPages;
+using Sarand.PatientMgr.Win.Forms.Filters;
+using Sarand.PatientMgr.Win.Forms.Base;
+
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ //=======================================================================
+ public partial class SpmPanel_Operations : SpmPanel_Items
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelMode
+ {
+ Search,
+ Maintain,
+ }
+ public new class Config : SpmPanel_Items.Config
+ {
+ public Config (PanelMode mode)
+ {
+ Mode = mode;
+ // Defaults based on mode.
+ DisplayFilter = false; // Mode == PanelMode.Maintain || Mode == PanelMode.Search;
+ DisplayTabs = Mode == PanelMode.Maintain;
+ DisplayActionButtons = Mode == PanelMode.Maintain;
+ DisplayNavigationButtons = Mode == PanelMode.Search;
+ }
+ public PanelMode Mode { get; } = PanelMode.Maintain;
+ public SpmForm SearchForm { get; set; }
+ // Display options.
+ public bool DisplayFilter { get; set; } = false;
+ public bool DisplayContextMenu { get; set; } = true;
+ public bool DisplayActionButtons { get; set; } = false;
+ public bool DisplayNavigationButtons { get; set; } = false;
+ public bool DisplayTabs { get; set; } = false;
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config(PanelMode.Search);
+ private readonly List tabPages = new List();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ private SpmPanel_Operations () : this(new Config(PanelMode.Search)) { }
+ public SpmPanel_Operations (Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose (bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ protected override String DefaultMessageTitle { get { return "Operation"; } }
+ public override int ItemTotal { get { return listViewOperation.ItemTotal; } }
+ public override int ItemCount { get { return listViewOperation.ItemCount; } }
+ public override int SelectedItemCount { get { return listViewOperation.SelectedItemCount; } }
+ public SysId SelectedItemId { get { return listViewOperation.SelectedItemId; } }
+ public List SelectedItemIds { get { return listViewOperation.SelectedItemIds; } }
+ public SpmOperation SelectedOperation { get { return listViewOperation.SelectedOperation; } }
+
+ //-------------------------------------------------------------------
+ // Configure.
+ public void SetConfig (Config config)
+ {
+ base.SetConfig(config);
+ this.config = config;
+ ConfigurePanel();
+ }
+
+ //-------------------------------------------------------------------
+ // I n i t i a l i s a t i o n
+ //-------------------------------------------------------------------
+ protected override void OnCreateControl ()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ ConfigurePanel();
+ }
+
+ private void ConfigurePanel ()
+ {
+ if (!Created || this.IsDesignerHosted()) return;
+
+ // Configure filter.
+ if (config.DisplayFilter)
+ {
+ SpmItemListFilter_Operation.Config configFilter = new SpmItemListFilter_Operation.Config();
+ configFilter.Internals = Internals;
+ listFilterOperation.SetConfig(configFilter);
+ }
+ listFilterOperation.Visible = config.DisplayFilter;
+
+ // Configure list.
+ SpmItemListView_Operation.Config configList = new SpmItemListView_Operation.Config();
+ configList.Internals = Internals;
+ configList.Mode = SpmItemListView_Operation.ListMode.General;
+ listViewOperation.SetConfig(configList);
+
+ // Tabs.
+ tabControl.TabPages.Clear();
+ tabControl.Visible = config.DisplayTabs;
+ RefreshTabs();
+
+ // Configure buttons.
+ buttonCreate.Visible = config.DisplayActionButtons && SecurityProfile.Admin.CanManageConfig();
+ buttonUpdate.Visible = config.DisplayActionButtons;
+ buttonRemove.Visible = config.DisplayActionButtons && buttonCreate.Visible;
+ buttonOk.Visible = config.DisplayNavigationButtons && config.Mode == PanelMode.Search;
+ buttonCancel.Visible = config.DisplayNavigationButtons;
+
+ // Complete form initialisation.
+ RefreshDataItems();
+ SetControlActivity();
+ PositionControls();
+ }
+
+ //-------------------------------------------------------------------
+ // Initialise tabs.
+ private void InitTabs ()
+ {
+ String fn = GetType().Name + ".InitTabs";
+ tabControl.TabPages.Clear();
+ tabPages.Clear();
+ if (!config.DisplayTabs)
+ {
+ tabPages.Clear();
+ tabControl.TabPages.Clear();
+ tabControl.Visible = false;
+ return;
+ }
+
+ // Selected Operation.
+ SpmOperation operation = SelectedOperation;
+
+ // Updates.
+ List panelTypes_Updates = new List();
+ panelTypes_Updates.Add(SpmTabPage_Operation.PanelType.Updates);
+ if (panelTypes_Updates.Count > 0)
+ {
+ SpmTabPage_Operation.Config configTabPage = new SpmTabPage_Operation.Config();
+ configTabPage.Internals = Internals;
+ configTabPage.ReadOnly = ReadOnly;
+ configTabPage.PanelTypes.AddRange(panelTypes_Updates);
+ SpmTabPage_Operation tabPage = new SpmTabPage_Operation(configTabPage) { Text = "Updates" };
+ tabPages.Add(tabPage);
+ }
+
+ // Populate tab pages.
+ tabControl.Visible = tabPages.Count > 0;
+ foreach (var tabPage in tabPages)
+ tabControl.TabPages.Add(tabPage);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l I n t e r f a c e
+ //-------------------------------------------------------------------
+ private String previouslySelectedTabPageText = "";
+ private void RefreshTabs ()
+ {
+ if (tabControl.SelectedTab != null)
+ previouslySelectedTabPageText = tabControl.SelectedTab.Text;
+
+ // Reinitialise tabs whenever the selection changes in case the set of tab pages displayed needs to be changed.
+ InitTabs();
+
+ // Select previous tab page if still present.
+ if (!StringUtil.IsEmpty(previouslySelectedTabPageText))
+ {
+ foreach (TabPage tabPage in tabControl.TabPages)
+ {
+ if (tabPage.Text.Equals(previouslySelectedTabPageText))
+ {
+ tabControl.SelectTab(tabPage);
+ break;
+ }
+ }
+ }
+ RefreshTabPages();
+
+ SetControlActivity();
+ PositionControls();
+ }
+ private void RefreshTabPages ()
+ {
+ // Selected Operation - populated when needed.
+ SpmOperation operation = null;
+
+ // Refresh tabs.
+ if (tabControl.Visible)
+ {
+ if (operation == null) operation = SelectedOperation;
+ SpmOperation.Data operationData = operation != null ? operation.GetData() : new SpmOperation.Data();
+ tabPages.PopulateToControls(operationData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // F i l t e r
+ //-------------------------------------------------------------------
+ public bool ParamsAreValid (SpmOperation.Params prmOperation)
+ {
+ return true;
+ }
+ public SpmOperation.Params GetParams ()
+ {
+ SpmOperation.Params prmOperation = new SpmOperation.Params();
+
+ // Sort columns.
+ prmOperation.SortColumns.AddRange(listViewOperation.GetSortColumns());
+ return prmOperation;
+ }
+
+ //-------------------------------------------------------------------
+ // A c t i o n s
+ //-------------------------------------------------------------------
+ // Refresh.
+ public override void RefreshDataItems ()
+ {
+ SpmOperation.Params prmOperation = GetParams();
+ if (!ParamsAreValid(prmOperation)) prmOperation = null;
+ listViewOperation.RefreshOperations(prmOperation);
+ }
+ public override void RefreshDataItem (SysId id)
+ {
+ listViewOperation.RefreshOperation(id);
+ }
+ public override void RemoveDataItem (SysId id)
+ {
+ listViewOperation.RemoveItemById(id);
+ }
+
+ //-------------------------------------------------------------------
+ // Create item.
+ public override bool CanCreateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void CreateItem ()
+ {
+ if (!CanCreateItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ // Create new Operation.
+ SpmForm_Operation.Config configOperation = new SpmForm_Operation.Config();
+ using (var form = new SpmForm_Operation(configOperation))
+ {
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ RefreshDataItem(form.NewItemId);
+ InvokeItemCreatedEvent(Spm.DataItemType.Operation, form.NewItemId);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // View/Update item.
+ public override bool CanViewItem ()
+ {
+ return true;
+ }
+ public override bool CanUpdateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void UpdateItem (bool updateItem = true)
+ {
+ if (config.Mode == PanelMode.Search) return;
+ SpmOperation operation = SelectedOperation;
+ if (SelectedItemCount != 1) return;
+ if (!CanUpdateItem() && !CanViewItem()) return;
+ if (!CanUpdateItem()) updateItem = false;
+ if (operation == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve selected item");
+ return;
+ }
+ SpmForm_Operation.Config configOperation = new SpmForm_Operation.Config();
+ configOperation.OperationToUpdate = operation;
+ configOperation.ReadOnly = (config.ReadOnly || !updateItem);
+ using (SpmForm_Operation formOperation = new SpmForm_Operation(configOperation))
+ {
+ // Perform the update.
+ if (formOperation.ShowDialog() == DialogResult.OK)
+ {
+ // Operation has been updated.
+ RefreshDataItem(operation.Id);
+ listViewOperation.RefreshOperation(operation.Id);
+ InvokeItemUpdatedEvent(Spm.DataItemType.Operation, operation.Id);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Delete item.
+ public override bool CanDeleteItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void DeleteItem ()
+ {
+ if (!CanDeleteItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ if (SelectedItemCount != 1) return;
+ SpmOperation operation = SelectedOperation;
+ if (operation == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve item for deletion.");
+ return;
+ }
+ if (!InstitutionMgr.OperationCanBeDeleted(operation))
+ {
+ MessageConsole.ShowMessageError("Unable to remove operation - " + InstitutionMgr.ErrorStateMessage + ".");
+ return;
+ }
+ if (MessageConsole.ShowMessageConfirm("Are you sure that this operation should be removed from the system?"))
+ {
+ if (InstitutionMgr.DeleteOperation(operation, DbUpdateInfo))
+ {
+ int selectIdx = listViewOperation.SelectedIndex;
+ listViewOperation.RemoveItemById(operation.Id.ToString());
+ if (selectIdx >= listViewOperation.ItemCount - 1) selectIdx--;
+ listViewOperation.SelectedIndices.Clear();
+ listViewOperation.SelectedIndices.Add(selectIdx);
+ }
+ else MessageConsole.ShowMessageError("Failed to remove operation - " + InstitutionMgr.ErrorStateMessage + ".");
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Import data.
+ public override bool CanImportData ()
+ {
+ return false;
+ }
+ public override void ImportData ()
+ {
+ if (!CanImportData()) return;
+ }
+
+ //-------------------------------------------------------------------
+ // Export data.
+ public override bool CanExportData ()
+ {
+ return false;
+ }
+ public override void ExportData ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t e x t M e n u
+ //-------------------------------------------------------------------
+ private SpmContextMenuStrip contextMenuStrip = new SpmContextMenuStrip();
+ private void RefreshContextMenu ()
+ {
+ contextMenuStrip.Name = "Operation";
+ contextMenuStrip.Items.Clear();
+ if (CanCreateItem())
+ contextMenuStrip.Items.Add("Create", null, CreateItem);
+ if (SysId.IsValid(listViewOperation.SelectedItemId))
+ {
+ SpmOperation operation = SelectedOperation;
+ if (operation != null)
+ {
+ if (CanUpdateItem() || CanDeleteItem())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ contextMenuStrip.Items.Add(CanUpdateItem() ? "Update" : "View", null, UpdateItem);
+ if (CanDeleteItem())
+ contextMenuStrip.Items.Add("Remove", null, DeleteItem);
+ }
+ }
+ }
+ if (CanExportData() || CanImportData())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ if (CanImportData())
+ contextMenuStrip.Items.Add("Import", null, ImportData);
+ if (CanExportData())
+ contextMenuStrip.Items.Add("Export", null, ExportData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected override void SetControlActivity ()
+ {
+ SetControlsReadOnly();
+ bool itemSelected = SysId.IsValid(SelectedItemId);
+
+ listViewOperation.Enabled = Enabled;
+ buttonCreate.Enabled = Enabled;
+ buttonUpdate.Enabled = Enabled && itemSelected;
+ buttonRemove.Enabled = Enabled && itemSelected;
+ buttonOk.Enabled = Enabled;
+ buttonCancel.Enabled = Enabled;
+ }
+ protected override void SetControlsReadOnly ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // P o s i t i o n C o n t r o l s
+ //-------------------------------------------------------------------
+ protected override void PositionControls ()
+ {
+ if (this.IsDesignerHosted() || !Created) return;
+ Rectangle clientRect = ClientRectangle;
+
+ //---------------------------------------------------------------
+ // Filter panel.
+ if (listFilterOperation.Visible)
+ {
+ listFilterOperation.PositionAtTopLeftOf(this);
+ listFilterOperation.SetFullWidthOf(this);
+ listFilterOperation.ResizeToBottomControl();
+ listViewOperation.PositionBelow(listFilterOperation);
+ }
+ else
+ {
+ listViewOperation.PositionAtTopLeftOf(this);
+ }
+
+ //---------------------------------------------------------------
+ // List view.
+ int buttonLeft = clientRect.Width - buttonCreate.Width - buttonCreate.Margin.Right - Padding.Right;
+ listViewOperation.Left = listViewOperation.Margin.Left;
+ listViewOperation.Width = buttonLeft - buttonCreate.Margin.Left - listViewOperation.Left - listViewOperation.Margin.Right;
+ if (!(buttonCreate.Visible || buttonUpdate.Visible || buttonRemove.Visible || buttonOk.Visible || buttonCancel.Visible))
+ listViewOperation.Width = clientRect.Width - Padding.Right - listViewOperation.Left - listViewOperation.Margin.Right;
+
+ //---------------------------------------------------------------
+ // Tab control.
+ if (tabControl.Visible)
+ {
+ tabControl.Left = listViewOperation.Left;
+ tabControl.Width = clientRect.Width - (tabControl.Left * 2);
+ listViewOperation.Height = (int)((clientRect.Height - listViewOperation.Top) * 0.40);
+ tabControl.Top = listViewOperation.Bottom + listViewOperation.Margin.Bottom + tabControl.Margin.Top;
+ tabControl.Height = clientRect.Height - tabControl.Top - tabControl.Margin.Bottom - Padding.Bottom;
+ }
+ else
+ {
+ listViewOperation.Height = clientRect.Height - listViewOperation.Top - listViewOperation.Margin.Bottom - Padding.Bottom;
+ }
+
+ //---------------------------------------------------------------
+ // Create button.
+ int buttonTop = listViewOperation.Top + listViewOperation.HeaderHeight;
+ buttonCreate.Top = buttonTop;
+ buttonCreate.Left = buttonLeft;
+ if (buttonCreate.Visible)
+ buttonTop += buttonCreate.Height + buttonCreate.Margin.Bottom;
+
+ // Update button.
+ buttonUpdate.Top = buttonTop;
+ buttonUpdate.Left = buttonLeft;
+ if (buttonUpdate.Visible)
+ buttonTop += buttonUpdate.Height + buttonUpdate.Margin.Bottom;
+
+ // Remove button.
+ buttonRemove.Top = buttonTop;
+ buttonRemove.Left = buttonLeft;
+ if (buttonRemove.Visible)
+ buttonTop += buttonRemove.Height + buttonRemove.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ // Navigation buttons.
+ // Cancel button.
+ buttonCancel.Top = clientRect.Bottom - Padding.Bottom - buttonCancel.Margin.Bottom - buttonCancel.Height;
+ buttonCancel.Left = buttonLeft;
+
+ // OK button.
+ buttonOk.Top = buttonCancel.Top - buttonOk.Height - buttonCancel.Padding.Top - buttonCancel.Margin.Bottom;
+ buttonOk.Left = buttonLeft;
+ if (buttonOk.Visible)
+ buttonTop += buttonOk.Height + buttonOk.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ // Filter.
+ private void listFilterOperation_FilterChanged (object sender, EventArgs e)
+ {
+ RefreshDataItems();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Item list.
+ private void listViewOperation_ColumnClick (object sender, ColumnClickEventArgs e)
+ {
+ RefreshDataItems();
+ }
+ private void listViewOperation_ItemCountChanged (object sender, Sarand.Win.Forms.Controls.SacsListView.ItemCountChangedEventArgs e)
+ {
+ InvokeItemCountChangedEvent(e);
+ }
+ private void listViewOperation_SelectedIndexChanged (object sender, EventArgs e)
+ {
+ RefreshTabs();
+ InvokeItemSelectionChangedEvent(e);
+ SetControlActivity();
+ }
+ private void listViewOperation_DoubleClick (object sender, EventArgs e)
+ {
+ if (config.Mode == PanelMode.Search)
+ {
+ //if (config.SearchForm != null) config.SearchForm.OnOK();
+ }
+ else
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void listViewOperation_MouseUp (object sender, MouseEventArgs e)
+ {
+ switch (e.Button)
+ {
+ case MouseButtons.Right:
+ // Refresh the context menu and display at pointer position.
+ RefreshContextMenu();
+ contextMenuStrip.Show(listViewOperation, new Point(e.X, e.Y), ToolStripDropDownDirection.Default);
+ break;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Actions.
+ private void buttonCreate_Click (object sender, EventArgs e)
+ {
+ CreateItem();
+ SetControlActivity();
+ }
+ private void buttonUpdate_Click (object sender, EventArgs e)
+ {
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void buttonRemove_Click (object sender, EventArgs e)
+ {
+ DeleteItem();
+ SetControlActivity();
+ }
+ private void buttonOk_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnOK();
+ return;
+ }
+ SetControlActivity();
+ }
+ private void buttonCancel_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnCancel();
+ return;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.resx b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Operations.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.Designer.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.Designer.cs
new file mode 100644
index 0000000..52f907b
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.Designer.cs
@@ -0,0 +1,186 @@
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ partial class SpmPanel_Patients
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.listFilterPatient = new Sarand.PatientMgr.Win.Forms.Filters.SpmItemListFilter_Patient();
+ this.listViewPatient = new Sarand.PatientMgr.Win.Forms.Controls.SpmItemListView_Patient();
+ this.tabControl = new System.Windows.Forms.TabControl();
+ this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
+ this.buttonRemove = new System.Windows.Forms.Button();
+ this.buttonUpdate = new System.Windows.Forms.Button();
+ this.buttonCreate = new System.Windows.Forms.Button();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonOk = new System.Windows.Forms.Button();
+ this.tabControl.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // listFilterPatient
+ //
+ this.listFilterPatient.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listFilterPatient.Location = new System.Drawing.Point(0, 2);
+ this.listFilterPatient.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.listFilterPatient.Name = "listFilterPatient";
+ this.listFilterPatient.Size = new System.Drawing.Size(400, 30);
+ this.listFilterPatient.TabIndex = 0;
+ this.listFilterPatient.FilterChanged += new System.EventHandler(this.listFilterPatient_FilterChanged);
+ //
+ // listViewPatient
+ //
+ this.listViewPatient.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.listViewPatient.FullRowSelect = true;
+ this.listViewPatient.HideSelection = false;
+ this.listViewPatient.Location = new System.Drawing.Point(0, 37);
+ this.listViewPatient.Margin = new System.Windows.Forms.Padding(2);
+ this.listViewPatient.Name = "listViewPatient";
+ this.listViewPatient.OwnerDraw = true;
+ this.listViewPatient.Size = new System.Drawing.Size(317, 155);
+ this.listViewPatient.TabIndex = 1;
+ this.listViewPatient.UseCompatibleStateImageBehavior = false;
+ this.listViewPatient.ItemCountChanged += new System.EventHandler(this.listViewPatient_ItemCountChanged);
+ this.listViewPatient.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewPatient_ColumnClick);
+ this.listViewPatient.SelectedIndexChanged += new System.EventHandler(this.listViewPatient_SelectedIndexChanged);
+ this.listViewPatient.DoubleClick += new System.EventHandler(this.listViewPatient_DoubleClick);
+ this.listViewPatient.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listViewPatient_MouseUp);
+ //
+ // tabControl
+ //
+ this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.tabControl.Controls.Add(this.tabPage1);
+ this.tabControl.Controls.Add(this.tabPage2);
+ this.tabControl.Location = new System.Drawing.Point(2, 196);
+ this.tabControl.Margin = new System.Windows.Forms.Padding(2);
+ this.tabControl.Name = "tabControl";
+ this.tabControl.SelectedIndex = 0;
+ this.tabControl.Size = new System.Drawing.Size(398, 154);
+ this.tabControl.TabIndex = 6;
+ //
+ // tabPage1
+ //
+ this.tabPage1.Location = new System.Drawing.Point(4, 22);
+ this.tabPage1.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Name = "tabPage1";
+ this.tabPage1.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage1.Size = new System.Drawing.Size(390, 128);
+ this.tabPage1.TabIndex = 0;
+ this.tabPage1.Text = "tabPage1";
+ this.tabPage1.UseVisualStyleBackColor = true;
+ //
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Margin = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(2);
+ this.tabPage2.Size = new System.Drawing.Size(390, 128);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "tabPage2";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
+ // buttonRemove
+ //
+ this.buttonRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonRemove.Location = new System.Drawing.Point(322, 95);
+ this.buttonRemove.Name = "buttonRemove";
+ this.buttonRemove.Size = new System.Drawing.Size(75, 23);
+ this.buttonRemove.TabIndex = 15;
+ this.buttonRemove.Text = "Remove";
+ this.buttonRemove.UseVisualStyleBackColor = true;
+ this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
+ //
+ // buttonUpdate
+ //
+ this.buttonUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonUpdate.Location = new System.Drawing.Point(322, 66);
+ this.buttonUpdate.Name = "buttonUpdate";
+ this.buttonUpdate.Size = new System.Drawing.Size(75, 23);
+ this.buttonUpdate.TabIndex = 14;
+ this.buttonUpdate.Text = "Update";
+ this.buttonUpdate.UseVisualStyleBackColor = true;
+ this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
+ //
+ // buttonCreate
+ //
+ this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCreate.Location = new System.Drawing.Point(322, 37);
+ this.buttonCreate.Name = "buttonCreate";
+ this.buttonCreate.Size = new System.Drawing.Size(75, 23);
+ this.buttonCreate.TabIndex = 13;
+ this.buttonCreate.Text = "Create";
+ this.buttonCreate.UseVisualStyleBackColor = true;
+ this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonCancel.Location = new System.Drawing.Point(322, 168);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(75, 23);
+ this.buttonCancel.TabIndex = 15;
+ this.buttonCancel.Text = "Cancel";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
+ //
+ // buttonOk
+ //
+ this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.buttonOk.Location = new System.Drawing.Point(322, 139);
+ this.buttonOk.Name = "buttonOk";
+ this.buttonOk.Size = new System.Drawing.Size(75, 23);
+ this.buttonOk.TabIndex = 15;
+ this.buttonOk.Text = "OK";
+ this.buttonOk.UseVisualStyleBackColor = true;
+ this.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);
+ //
+ // SpmPanel_Patients
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.buttonOk);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.buttonRemove);
+ this.Controls.Add(this.buttonUpdate);
+ this.Controls.Add(this.buttonCreate);
+ this.Controls.Add(this.tabControl);
+ this.Controls.Add(this.listViewPatient);
+ this.Controls.Add(this.listFilterPatient);
+ this.Margin = new System.Windows.Forms.Padding(2);
+ this.MinimumSize = new System.Drawing.Size(400, 350);
+ this.Name = "SpmPanel_Patients";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.tabControl.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private Filters.SpmItemListFilter_Patient listFilterPatient;
+ private Controls.SpmItemListView_Patient listViewPatient;
+ private System.Windows.Forms.TabControl tabControl;
+ private System.Windows.Forms.TabPage tabPage1;
+ private System.Windows.Forms.TabPage tabPage2;
+ private System.Windows.Forms.Button buttonRemove;
+ private System.Windows.Forms.Button buttonUpdate;
+ private System.Windows.Forms.Button buttonCreate;
+ private System.Windows.Forms.Button buttonCancel;
+ private System.Windows.Forms.Button buttonOk;
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.cs b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.cs
new file mode 100644
index 0000000..e2f4952
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.cs
@@ -0,0 +1,604 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.Core.Bus;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Win.Forms.Utils;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Core.App;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.TabPages;
+using Sarand.PatientMgr.Win.Forms.Filters;
+using Sarand.PatientMgr.Win.Forms.Base;
+
+namespace Sarand.PatientMgr.Win.Forms.Panels
+{
+ //=======================================================================
+ public partial class SpmPanel_Patients : SpmPanel_Items
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelMode
+ {
+ Search,
+ Maintain,
+ }
+ public new class Config : SpmPanel_Items.Config
+ {
+ public Config (PanelMode mode)
+ {
+ Mode = mode;
+ // Defaults based on mode.
+ DisplayFilter = false; // Mode == PanelMode.Maintain || Mode == PanelMode.Search;
+ DisplayTabs = Mode == PanelMode.Maintain;
+ DisplayActionButtons = Mode == PanelMode.Maintain;
+ DisplayNavigationButtons = Mode == PanelMode.Search;
+ }
+ public PanelMode Mode { get; } = PanelMode.Maintain;
+ public SpmForm SearchForm { get; set; }
+ // Display options.
+ public bool DisplayFilter { get; set; } = false;
+ public bool DisplayContextMenu { get; set; } = true;
+ public bool DisplayActionButtons { get; set; } = false;
+ public bool DisplayNavigationButtons { get; set; } = false;
+ public bool DisplayTabs { get; set; } = false;
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config(PanelMode.Search);
+ private readonly List tabPages = new List();
+
+ //-------------------------------------------------------------------
+ // Construction.
+ private SpmPanel_Patients () : this(new Config(PanelMode.Search)) { }
+ public SpmPanel_Patients (Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose (bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ protected override String DefaultMessageTitle { get { return "Patient"; } }
+ public override int ItemTotal { get { return listViewPatient.ItemTotal; } }
+ public override int ItemCount { get { return listViewPatient.ItemCount; } }
+ public override int SelectedItemCount { get { return listViewPatient.SelectedItemCount; } }
+ public SysId SelectedItemId { get { return listViewPatient.SelectedItemId; } }
+ public List SelectedItemIds { get { return listViewPatient.SelectedItemIds; } }
+ public SpmPatient SelectedPatient { get { return listViewPatient.SelectedPatient; } }
+
+ //-------------------------------------------------------------------
+ // Configure.
+ public void SetConfig (Config config)
+ {
+ base.SetConfig(config);
+ this.config = config;
+ ConfigurePanel();
+ }
+
+ //-------------------------------------------------------------------
+ // I n i t i a l i s a t i o n
+ //-------------------------------------------------------------------
+ protected override void OnCreateControl ()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ ConfigurePanel();
+ }
+
+ private void ConfigurePanel ()
+ {
+ if (!Created || this.IsDesignerHosted()) return;
+
+ // Configure filter.
+ if (config.DisplayFilter)
+ {
+ SpmItemListFilter_Patient.Config configFilter = new SpmItemListFilter_Patient.Config();
+ configFilter.Internals = Internals;
+ listFilterPatient.SetConfig(configFilter);
+ }
+ listFilterPatient.Visible = config.DisplayFilter;
+
+ // Configure list.
+ SpmItemListView_Patient.Config configList = new SpmItemListView_Patient.Config();
+ configList.Internals = Internals;
+ configList.Mode = SpmItemListView_Patient.ListMode.General;
+ listViewPatient.SetConfig(configList);
+
+ // Tabs.
+ tabControl.TabPages.Clear();
+ tabControl.Visible = config.DisplayTabs;
+ RefreshTabs();
+
+ // Configure buttons.
+ buttonCreate.Visible = config.DisplayActionButtons && SecurityProfile.Admin.CanManageConfig();
+ buttonUpdate.Visible = config.DisplayActionButtons;
+ buttonRemove.Visible = config.DisplayActionButtons && buttonCreate.Visible;
+ buttonOk.Visible = config.DisplayNavigationButtons && config.Mode == PanelMode.Search;
+ buttonCancel.Visible = config.DisplayNavigationButtons;
+
+ // Complete form initialisation.
+ RefreshDataItems();
+ SetControlActivity();
+ PositionControls();
+ }
+
+ //-------------------------------------------------------------------
+ // Initialise tabs.
+ private void InitTabs ()
+ {
+ String fn = GetType().Name + ".InitTabs";
+ tabControl.TabPages.Clear();
+ tabPages.Clear();
+ if (!config.DisplayTabs)
+ {
+ tabPages.Clear();
+ tabControl.TabPages.Clear();
+ tabControl.Visible = false;
+ return;
+ }
+
+ // Selected Patient.
+ SpmPatient patient = SelectedPatient;
+
+ // Updates.
+ List panelTypes_Updates = new List();
+ panelTypes_Updates.Add(SpmTabPage_Patient.PanelType.Updates);
+ if (panelTypes_Updates.Count > 0)
+ {
+ SpmTabPage_Patient.Config configTabPage = new SpmTabPage_Patient.Config();
+ configTabPage.Internals = Internals;
+ configTabPage.ReadOnly = ReadOnly;
+ configTabPage.PanelTypes.AddRange(panelTypes_Updates);
+ SpmTabPage_Patient tabPage = new SpmTabPage_Patient(configTabPage) { Text = "Updates" };
+ tabPages.Add(tabPage);
+ }
+
+ // Populate tab pages.
+ tabControl.Visible = tabPages.Count > 0;
+ foreach (var tabPage in tabPages)
+ tabControl.TabPages.Add(tabPage);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l I n t e r f a c e
+ //-------------------------------------------------------------------
+ private String previouslySelectedTabPageText = "";
+ private void RefreshTabs ()
+ {
+ if (tabControl.SelectedTab != null)
+ previouslySelectedTabPageText = tabControl.SelectedTab.Text;
+
+ // Reinitialise tabs whenever the selection changes in case the set of tab pages displayed needs to be changed.
+ InitTabs();
+
+ // Select previous tab page if still present.
+ if (!StringUtil.IsEmpty(previouslySelectedTabPageText))
+ {
+ foreach (TabPage tabPage in tabControl.TabPages)
+ {
+ if (tabPage.Text.Equals(previouslySelectedTabPageText))
+ {
+ tabControl.SelectTab(tabPage);
+ break;
+ }
+ }
+ }
+ RefreshTabPages();
+
+ SetControlActivity();
+ PositionControls();
+ }
+ private void RefreshTabPages ()
+ {
+ // Selected Patient - populated when needed.
+ SpmPatient patient = null;
+
+ // Refresh tabs.
+ if (tabControl.Visible)
+ {
+ if (patient == null) patient = SelectedPatient;
+ SpmPatient.Data patientData = patient != null ? patient.GetData() : new SpmPatient.Data();
+ tabPages.PopulateToControls(patientData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // F i l t e r
+ //-------------------------------------------------------------------
+ public bool ParamsAreValid (SpmPatient.Params prmPatient)
+ {
+ return true;
+ }
+ public SpmPatient.Params GetParams ()
+ {
+ SpmPatient.Params prmPatient = new SpmPatient.Params();
+
+ // Sort columns.
+ prmPatient.SortColumns.AddRange(listViewPatient.GetSortColumns());
+ return prmPatient;
+ }
+
+ //-------------------------------------------------------------------
+ // A c t i o n s
+ //-------------------------------------------------------------------
+ // Refresh.
+ public override void RefreshDataItems ()
+ {
+ SpmPatient.Params prmPatient = GetParams();
+ if (!ParamsAreValid(prmPatient)) prmPatient = null;
+ listViewPatient.RefreshPatients(prmPatient);
+ }
+ public override void RefreshDataItem (SysId id)
+ {
+ listViewPatient.RefreshPatient(id);
+ }
+ public override void RemoveDataItem (SysId id)
+ {
+ listViewPatient.RemoveItemById(id);
+ }
+
+ //-------------------------------------------------------------------
+ // Create item.
+ public override bool CanCreateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void CreateItem ()
+ {
+ if (!CanCreateItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ // Create new Patient.
+ SpmForm_Patient.Config configPatient = new SpmForm_Patient.Config();
+ using (var form = new SpmForm_Patient(configPatient))
+ {
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ RefreshDataItem(form.NewItemId);
+ InvokeItemCreatedEvent(Spm.DataItemType.Patient, form.NewItemId);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // View/Update item.
+ public override bool CanViewItem ()
+ {
+ return true;
+ }
+ public override bool CanUpdateItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void UpdateItem (bool updateItem = true)
+ {
+ if (config.Mode == PanelMode.Search) return;
+ SpmPatient patient = SelectedPatient;
+ if (SelectedItemCount != 1) return;
+ if (!CanUpdateItem() && !CanViewItem()) return;
+ if (!CanUpdateItem()) updateItem = false;
+ if (patient == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve selected item");
+ return;
+ }
+ SpmForm_Patient.Config configPatient = new SpmForm_Patient.Config();
+ configPatient.PatientToUpdate = patient;
+ configPatient.ReadOnly = (config.ReadOnly || !updateItem);
+ using (SpmForm_Patient formPatient = new SpmForm_Patient(configPatient))
+ {
+ // Perform the update.
+ if (formPatient.ShowDialog() == DialogResult.OK)
+ {
+ // Patient has been updated.
+ RefreshDataItem(patient.Id);
+ listViewPatient.RefreshPatient(patient.Id);
+ InvokeItemUpdatedEvent(Spm.DataItemType.Patient, patient.Id);
+ }
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Delete item.
+ public override bool CanDeleteItem ()
+ {
+ if (ReadOnly) return false;
+ if (!SecurityProfile.Admin.CanManageConfig()) return false;
+ return true;
+ }
+ public override void DeleteItem ()
+ {
+ if (!CanDeleteItem()) return;
+ if (config.Mode == PanelMode.Search) return;
+ if (SelectedItemCount != 1) return;
+ SpmPatient patient = SelectedPatient;
+ if (patient == null)
+ {
+ MessageConsole.ShowMessageWarning("Failed to retrieve item for deletion.");
+ return;
+ }
+ if (!InstitutionMgr.PatientCanBeDeleted(patient))
+ {
+ MessageConsole.ShowMessageError("Unable to remove patient - " + InstitutionMgr.ErrorStateMessage + ".");
+ return;
+ }
+ if (MessageConsole.ShowMessageConfirm("Are you sure that this patient should be removed from the system?"))
+ {
+ if (InstitutionMgr.DeletePatient(patient, DbUpdateInfo))
+ {
+ int selectIdx = listViewPatient.SelectedIndex;
+ listViewPatient.RemoveItemById(patient.Id.ToString());
+ if (selectIdx >= listViewPatient.ItemCount - 1) selectIdx--;
+ listViewPatient.SelectedIndices.Clear();
+ listViewPatient.SelectedIndices.Add(selectIdx);
+ }
+ else MessageConsole.ShowMessageError("Failed to remove patient - " + InstitutionMgr.ErrorStateMessage + ".");
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // Import data.
+ public override bool CanImportData ()
+ {
+ return false;
+ }
+ public override void ImportData ()
+ {
+ if (!CanImportData()) return;
+ }
+
+ //-------------------------------------------------------------------
+ // Export data.
+ public override bool CanExportData ()
+ {
+ return false;
+ }
+ public override void ExportData ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t e x t M e n u
+ //-------------------------------------------------------------------
+ private SpmContextMenuStrip contextMenuStrip = new SpmContextMenuStrip();
+ private void RefreshContextMenu ()
+ {
+ contextMenuStrip.Name = "Patient";
+ contextMenuStrip.Items.Clear();
+ if (CanCreateItem())
+ contextMenuStrip.Items.Add("Create", null, CreateItem);
+ if (SysId.IsValid(listViewPatient.SelectedItemId))
+ {
+ SpmPatient patient = SelectedPatient;
+ if (patient != null)
+ {
+ if (CanUpdateItem() || CanDeleteItem())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ contextMenuStrip.Items.Add(CanUpdateItem() ? "Update" : "View", null, UpdateItem);
+ if (CanDeleteItem())
+ contextMenuStrip.Items.Add("Remove", null, DeleteItem);
+ }
+ }
+ }
+ if (CanExportData() || CanImportData())
+ {
+ if (contextMenuStrip.Items.Count > 0)
+ contextMenuStrip.Items.Add(new ToolStripSeparator());
+ if (CanImportData())
+ contextMenuStrip.Items.Add("Import", null, ImportData);
+ if (CanExportData())
+ contextMenuStrip.Items.Add("Export", null, ExportData);
+ }
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected override void SetControlActivity ()
+ {
+ SetControlsReadOnly();
+ bool itemSelected = SysId.IsValid(SelectedItemId);
+
+ listViewPatient.Enabled = Enabled;
+ buttonCreate.Enabled = Enabled;
+ buttonUpdate.Enabled = Enabled && itemSelected;
+ buttonRemove.Enabled = Enabled && itemSelected;
+ buttonOk.Enabled = Enabled;
+ buttonCancel.Enabled = Enabled;
+ }
+ protected override void SetControlsReadOnly ()
+ {
+ }
+
+ //-------------------------------------------------------------------
+ // P o s i t i o n C o n t r o l s
+ //-------------------------------------------------------------------
+ protected override void PositionControls ()
+ {
+ if (this.IsDesignerHosted() || !Created) return;
+ Rectangle clientRect = ClientRectangle;
+
+ //---------------------------------------------------------------
+ // Filter panel.
+ if (listFilterPatient.Visible)
+ {
+ listFilterPatient.PositionAtTopLeftOf(this);
+ listFilterPatient.SetFullWidthOf(this);
+ listFilterPatient.ResizeToBottomControl();
+ listViewPatient.PositionBelow(listFilterPatient);
+ }
+ else
+ {
+ listViewPatient.PositionAtTopLeftOf(this);
+ }
+
+ //---------------------------------------------------------------
+ // List view.
+ int buttonLeft = clientRect.Width - buttonCreate.Width - buttonCreate.Margin.Right - Padding.Right;
+ listViewPatient.Left = listViewPatient.Margin.Left;
+ listViewPatient.Width = buttonLeft - buttonCreate.Margin.Left - listViewPatient.Left - listViewPatient.Margin.Right;
+ if (!(buttonCreate.Visible || buttonUpdate.Visible || buttonRemove.Visible || buttonOk.Visible || buttonCancel.Visible))
+ listViewPatient.Width = clientRect.Width - Padding.Right - listViewPatient.Left - listViewPatient.Margin.Right;
+
+ //---------------------------------------------------------------
+ // Tab control.
+ if (tabControl.Visible)
+ {
+ tabControl.Left = listViewPatient.Left;
+ tabControl.Width = clientRect.Width - (tabControl.Left * 2);
+ listViewPatient.Height = (int)((clientRect.Height - listViewPatient.Top) * 0.40);
+ tabControl.Top = listViewPatient.Bottom + listViewPatient.Margin.Bottom + tabControl.Margin.Top;
+ tabControl.Height = clientRect.Height - tabControl.Top - tabControl.Margin.Bottom - Padding.Bottom;
+ }
+ else
+ {
+ listViewPatient.Height = clientRect.Height - listViewPatient.Top - listViewPatient.Margin.Bottom - Padding.Bottom;
+ }
+
+ //---------------------------------------------------------------
+ // Create button.
+ int buttonTop = listViewPatient.Top + listViewPatient.HeaderHeight;
+ buttonCreate.Top = buttonTop;
+ buttonCreate.Left = buttonLeft;
+ if (buttonCreate.Visible)
+ buttonTop += buttonCreate.Height + buttonCreate.Margin.Bottom;
+
+ // Update button.
+ buttonUpdate.Top = buttonTop;
+ buttonUpdate.Left = buttonLeft;
+ if (buttonUpdate.Visible)
+ buttonTop += buttonUpdate.Height + buttonUpdate.Margin.Bottom;
+
+ // Remove button.
+ buttonRemove.Top = buttonTop;
+ buttonRemove.Left = buttonLeft;
+ if (buttonRemove.Visible)
+ buttonTop += buttonRemove.Height + buttonRemove.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ // Navigation buttons.
+ // Cancel button.
+ buttonCancel.Top = clientRect.Bottom - Padding.Bottom - buttonCancel.Margin.Bottom - buttonCancel.Height;
+ buttonCancel.Left = buttonLeft;
+
+ // OK button.
+ buttonOk.Top = buttonCancel.Top - buttonOk.Height - buttonCancel.Padding.Top - buttonCancel.Margin.Bottom;
+ buttonOk.Left = buttonLeft;
+ if (buttonOk.Visible)
+ buttonTop += buttonOk.Height + buttonOk.Margin.Bottom;
+
+ //---------------------------------------------------------------
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ // Filter.
+ private void listFilterPatient_FilterChanged (object sender, EventArgs e)
+ {
+ RefreshDataItems();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Item list.
+ private void listViewPatient_ColumnClick (object sender, ColumnClickEventArgs e)
+ {
+ RefreshDataItems();
+ }
+ private void listViewPatient_ItemCountChanged (object sender, Sarand.Win.Forms.Controls.SacsListView.ItemCountChangedEventArgs e)
+ {
+ InvokeItemCountChangedEvent(e);
+ }
+ private void listViewPatient_SelectedIndexChanged (object sender, EventArgs e)
+ {
+ RefreshTabs();
+ InvokeItemSelectionChangedEvent(e);
+ SetControlActivity();
+ }
+ private void listViewPatient_DoubleClick (object sender, EventArgs e)
+ {
+ if (config.Mode == PanelMode.Search)
+ {
+ //if (config.SearchForm != null) config.SearchForm.OnOK();
+ }
+ else
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void listViewPatient_MouseUp (object sender, MouseEventArgs e)
+ {
+ switch (e.Button)
+ {
+ case MouseButtons.Right:
+ // Refresh the context menu and display at pointer position.
+ RefreshContextMenu();
+ contextMenuStrip.Show(listViewPatient, new Point(e.X, e.Y), ToolStripDropDownDirection.Default);
+ break;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // Actions.
+ private void buttonCreate_Click (object sender, EventArgs e)
+ {
+ CreateItem();
+ SetControlActivity();
+ }
+ private void buttonUpdate_Click (object sender, EventArgs e)
+ {
+ UpdateItem();
+ SetControlActivity();
+ }
+ private void buttonRemove_Click (object sender, EventArgs e)
+ {
+ DeleteItem();
+ SetControlActivity();
+ }
+ private void buttonOk_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnOK();
+ return;
+ }
+ SetControlActivity();
+ }
+ private void buttonCancel_Click (object sender, EventArgs e)
+ {
+ if (config.SearchForm != null)
+ {
+ //config.SearchForm.OnCancel();
+ return;
+ }
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ }
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.resx b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/Panels/SpmPanel_Patients.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.Designer.cs
new file mode 100644
index 0000000..ae8acb1
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_Employee
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.cs
new file mode 100644
index 0000000..dcae492
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Employee.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_Employee : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// Employee form hosting the tab control.
+ public SpmForm_Employee EmployeeForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_Employee(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmEmployee.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.Employee, data.Id);
+ }
+ public bool IsDataValid(SpmEmployee.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmEmployee.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmEmployee.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_EmployeeList
+ {
+ public static void PopulateToControls (this List tabPages, SpmEmployee.Data data)
+ {
+ foreach (SpmTabPage_Employee tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmEmployee.Data data)
+ {
+ foreach (SpmTabPage_Employee tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.Designer.cs
new file mode 100644
index 0000000..91f960d
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_EmployeeRole
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.cs
new file mode 100644
index 0000000..df7af89
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_EmployeeRole.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_EmployeeRole : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// EmployeeRole form hosting the tab control.
+ public SpmForm_EmployeeRole EmployeeRoleForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_EmployeeRole(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmEmployeeRole.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.EmployeeRole, data.Id);
+ }
+ public bool IsDataValid(SpmEmployeeRole.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmEmployeeRole.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmEmployeeRole.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_EmployeeRoleList
+ {
+ public static void PopulateToControls (this List tabPages, SpmEmployeeRole.Data data)
+ {
+ foreach (SpmTabPage_EmployeeRole tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmEmployeeRole.Data data)
+ {
+ foreach (SpmTabPage_EmployeeRole tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.Designer.cs
new file mode 100644
index 0000000..60a481f
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_Institution
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.cs
new file mode 100644
index 0000000..3a79d46
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Institution.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_Institution : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// Institution form hosting the tab control.
+ public SpmForm_Institution InstitutionForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_Institution(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmInstitution.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.Institution, data.Id);
+ }
+ public bool IsDataValid(SpmInstitution.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmInstitution.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmInstitution.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_InstitutionList
+ {
+ public static void PopulateToControls (this List tabPages, SpmInstitution.Data data)
+ {
+ foreach (SpmTabPage_Institution tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmInstitution.Data data)
+ {
+ foreach (SpmTabPage_Institution tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.Designer.cs
new file mode 100644
index 0000000..8a2992f
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_Operation
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.cs
new file mode 100644
index 0000000..e0e6b44
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Operation.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_Operation : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// Operation form hosting the tab control.
+ public SpmForm_Operation OperationForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_Operation(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmOperation.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.Operation, data.Id);
+ }
+ public bool IsDataValid(SpmOperation.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmOperation.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmOperation.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_OperationList
+ {
+ public static void PopulateToControls (this List tabPages, SpmOperation.Data data)
+ {
+ foreach (SpmTabPage_Operation tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmOperation.Data data)
+ {
+ foreach (SpmTabPage_Operation tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.Designer.cs
new file mode 100644
index 0000000..5190c5c
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_Patient
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.cs
new file mode 100644
index 0000000..4b0f417
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Patient.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_Patient : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// Patient form hosting the tab control.
+ public SpmForm_Patient PatientForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_Patient(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmPatient.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.Patient, data.Id);
+ }
+ public bool IsDataValid(SpmPatient.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmPatient.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmPatient.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_PatientList
+ {
+ public static void PopulateToControls (this List tabPages, SpmPatient.Data data)
+ {
+ foreach (SpmTabPage_Patient tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmPatient.Data data)
+ {
+ foreach (SpmTabPage_Patient tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.Designer.cs
new file mode 100644
index 0000000..a7ebfa3
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_Procedure
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.cs
new file mode 100644
index 0000000..4a8f23a
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_Procedure.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_Procedure : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// Procedure form hosting the tab control.
+ public SpmForm_Procedure ProcedureForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_Procedure(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmProcedure.Data data)
+ {
+ if (panelUpdates != null)
+ panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.Procedure, data.Id);
+ }
+ public bool IsDataValid(SpmProcedure.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmProcedure.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmProcedure.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_ProcedureList
+ {
+ public static void PopulateToControls (this List tabPages, SpmProcedure.Data data)
+ {
+ foreach (SpmTabPage_Procedure tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmProcedure.Data data)
+ {
+ foreach (SpmTabPage_Procedure tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.Designer.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.Designer.cs
new file mode 100644
index 0000000..c68ba09
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.Designer.cs
@@ -0,0 +1,23 @@
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ partial class SpmTabPage_TemplateData
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.cs b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.cs
new file mode 100644
index 0000000..a3a6a94
--- /dev/null
+++ b/SaPatMgrWinForms/Win/Forms/TabPages/SpmTabPage_TemplateData.cs
@@ -0,0 +1,194 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Sarand.PatientMgr.Win.Forms.Base;
+using Sarand.PatientMgr.Core.Bus;
+using Sarand.Core.Base;
+using Sarand.PatientMgr.Win.Forms.Panels;
+using Sarand.Win.Forms.UpdateLog;
+using Sarand.Win.Forms.Controls;
+using Sarand.PatientMgr.Win.Forms.Maint;
+using Sarand.PatientMgr.Core.App;
+using Sarand.Core.Bus;
+using Sarand.Win.Forms.Utils;
+
+namespace Sarand.PatientMgr.Win.Forms.TabPages
+{
+ //=======================================================================
+ public partial class SpmTabPage_TemplateData : SpmTabPage
+ {
+ //-------------------------------------------------------------------
+ // Configuration.
+ public enum PanelType
+ {
+ Unknown = 0,
+ Updates,
+ }
+ public new class Config : SpmTabPage.Config
+ {
+ /// TemplateData form hosting the tab control.
+ //public SpmForm_TemplateData TemplateDataForm { get; set; } = null;
+ /// Panels to display on this tab page.
+ public List PanelTypes { get; } = new List();
+ /// Number of panels on this tab page.
+ public override int PanelCount { get { return PanelTypes.Count; } }
+ }
+
+ //-------------------------------------------------------------------
+ // Data members.
+ private Config config = new Config();
+ private SaPanel_UpdateLog panelUpdates = null;
+
+ //-------------------------------------------------------------------
+ // Construction.
+ public SpmTabPage_TemplateData(Config config) : base(config)
+ {
+ this.config = config;
+ InitializeComponent();
+ }
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ if (components != null) components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ //-------------------------------------------------------------------
+ // Properties.
+ /// Panels to display on this tab page.
+ public List PanelTypes { get { return config.PanelTypes; } }
+
+ //-------------------------------------------------------------------
+ // Initialisation.
+ protected override void OnCreateControl()
+ {
+ base.OnCreateControl();
+ if (this.IsDesignerHosted()) return;
+
+ // Configure page.
+
+ // Initial panels.
+ List panels = new List();
+ foreach (var panelType in config.PanelTypes)
+ {
+ SacsPanel panel = null;
+ switch (panelType)
+ {
+ case PanelType.Updates:
+ {
+ SaPanel_UpdateLog.Config configUpdateLog = new SaPanel_UpdateLog.Config();
+ configUpdateLog.UpdateLogConsole = UpdateLogConsole;
+ panelUpdates = new SaPanel_UpdateLog();
+ panelUpdates.SetConfig(configUpdateLog);
+ panel = panelUpdates;
+ panel.SizeChanged += Panel_Resize;
+ break;
+ }
+ }
+ if (panel != null)
+ panels.Add(panel);
+ else Logger.Warn(GetType().Name + ".OnCreateControl Panel type not supported: " + panelType.ToString());
+ }
+ AddPanelsToPage(panels);
+
+ // Complete panel initialisation.
+ SetControlsReadOnly();
+ SetControlActivity();
+ }
+
+ //-------------------------------------------------------------------
+ // P a g e I n t e r f a c e
+ //-------------------------------------------------------------------
+
+
+ //-------------------------------------------------------------------
+ // P o p u l a t i o n
+ //-------------------------------------------------------------------
+ public void PopulateToControls(SpmTemplateData.Data data)
+ {
+ //if (panelUpdates != null)
+ //panelUpdates.ItemId = new ItemId((short)Spm.DataItemType.TemplateData, data.Id);
+ }
+ public bool IsDataValid(SpmTemplateData.Data data)
+ {
+ return true;
+ }
+ public void PopulateFromControls(SpmTemplateData.Data data)
+ {
+ }
+ public bool UpdateAssociatedData(SpmTemplateData.Data data)
+ {
+ return true;
+ }
+
+ //-------------------------------------------------------------------
+ // C o n t r o l A c t i v i t y
+ //-------------------------------------------------------------------
+ protected void SetControlActivity()
+ {
+ if (panelUpdates != null)
+ panelUpdates.Enabled = Enabled;
+ }
+ public bool IsFieldReadOnly(SpmDbDfn.ColumnIdx col)
+ {
+ return false;
+ }
+ protected void SetControlsReadOnly()
+ {
+ return;
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l E v e n t s
+ //-------------------------------------------------------------------
+ private void panel_ItemCreated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemCreatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemUpdated(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemUpdatedEvent((short)e.ItemType, e.ItemId);
+ }
+ private void panel_ItemDeleted(object sender, SpmPanel_Items.ItemModifiedEventArgs e)
+ {
+ InvokeItemDeletedEvent((short)e.ItemType, e.ItemId);
+ }
+
+ //-------------------------------------------------------------------
+ // P a n e l S i z e a n d P o s i t i o n
+ //-------------------------------------------------------------------
+ protected override void PositionControls()
+ {
+ base.PositionControls();
+ Rectangle clientRect = ClientRectangle;
+
+ }
+
+ //-------------------------------------------------------------------
+ }
+
+ //=======================================================================
+ public static class SpmTabPage_TemplateDataList
+ {
+ public static void PopulateToControls (this List tabPages, SpmTemplateData.Data data)
+ {
+ foreach (SpmTabPage_TemplateData tabPage in tabPages)
+ tabPage.PopulateToControls(data);
+ }
+ public static void PopulateFromControls (this List tabPages, SpmTemplateData.Data data)
+ {
+ foreach (SpmTabPage_TemplateData tabPage in tabPages)
+ tabPage.PopulateFromControls(data);
+ }
+ }
+
+ //=======================================================================
+}