DPatientLookup.cs: Usings Cleanup

DApptSearch: Extensive refactoring. Now uses new algorithm to find appointments. Now outputs CGAvailability
CGView: Appointments checked in now set the Checkin time on the appointment structure; changes to support DApptSearch modified output.
CGSchedLib: Extensive refactoring; only 2 methods remain: CreateAppointmentSchedule and CreateAvailabilitySchedule
CGDocument: SlotsAvailable uses a new algorithm
CGAVView: Uses CalendarGrid.TimesOverlap instead of the removed one in CGSchedLib
CGAVDocument: Uses CalendarGrid.TimesOverlap instead of the removed one in CGSchedLib; CreateAssignedSlotSchedule reassigned to CreateAvailabilitySchedule
This commit is contained in:
sam 2011-03-03 09:44:18 +00:00
parent 7524c52392
commit d347c2d7d8
12 changed files with 617 additions and 349 deletions

View File

@ -168,7 +168,7 @@ namespace IndianHealthService.ClinicalScheduling
{ {
DateTime sStart2 = a.StartTime; DateTime sStart2 = a.StartTime;
DateTime sEnd2 = a.EndTime; DateTime sEnd2 = a.EndTime;
if ((a.AppointmentKey != pAppt.AppointmentKey) && (CGSchedLib.TimesOverlap(dNewStart, dNewEnd, a.StartTime, a.EndTime))) if ((a.AppointmentKey != pAppt.AppointmentKey) && (CalendarGrid.TimesOverlap(dNewStart, dNewEnd, a.StartTime, a.EndTime)))
{ {
MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return; return;
@ -297,7 +297,7 @@ namespace IndianHealthService.ClinicalScheduling
{ {
DateTime sStart2 = a.StartTime; DateTime sStart2 = a.StartTime;
DateTime sEnd2 = a.EndTime; DateTime sEnd2 = a.EndTime;
if (CGSchedLib.TimesOverlap(aCopy.StartTime, aCopy.EndTime, a.StartTime, a.EndTime)) if (CalendarGrid.TimesOverlap(aCopy.StartTime, aCopy.EndTime, a.StartTime, a.EndTime))
{ {
// throw new Exception("Access blocks may not overlap."); // throw new Exception("Access blocks may not overlap.");
MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
@ -373,7 +373,7 @@ namespace IndianHealthService.ClinicalScheduling
ArrayList apptTypeIDs = new ArrayList(); ArrayList apptTypeIDs = new ArrayList();
rAppointmentSchedule = CGSchedLib.CreateAssignedSlotSchedule(m_DocManager, (string) m_sResourcesArray[0], this.m_dStartDate, this.m_dEndDate, apptTypeIDs,/* */ this.m_ScheduleType, "0"); rAppointmentSchedule = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_sResourcesArray, this.m_dStartDate, this.m_dEndDate, apptTypeIDs,/* */ this.m_ScheduleType, "0");
foreach (DataRow r in rAppointmentSchedule.Rows) foreach (DataRow r in rAppointmentSchedule.Rows)
{ {

View File

@ -105,7 +105,7 @@ namespace IndianHealthService.ClinicalScheduling
this.panelRight.Dock = System.Windows.Forms.DockStyle.Right; this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
this.panelRight.Location = new System.Drawing.Point(728, 0); this.panelRight.Location = new System.Drawing.Point(728, 0);
this.panelRight.Name = "panelRight"; this.panelRight.Name = "panelRight";
this.panelRight.Size = new System.Drawing.Size(120, 364); this.panelRight.Size = new System.Drawing.Size(120, 343);
this.panelRight.TabIndex = 1; this.panelRight.TabIndex = 1;
// //
// panelClip // panelClip
@ -166,7 +166,7 @@ namespace IndianHealthService.ClinicalScheduling
// //
this.panelBottom.Controls.Add(this.statusBar1); this.panelBottom.Controls.Add(this.statusBar1);
this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom; this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelBottom.Location = new System.Drawing.Point(8, 340); this.panelBottom.Location = new System.Drawing.Point(8, 319);
this.panelBottom.Name = "panelBottom"; this.panelBottom.Name = "panelBottom";
this.panelBottom.Size = new System.Drawing.Size(720, 24); this.panelBottom.Size = new System.Drawing.Size(720, 24);
this.panelBottom.TabIndex = 2; this.panelBottom.TabIndex = 2;
@ -194,10 +194,9 @@ namespace IndianHealthService.ClinicalScheduling
// //
this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right; this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right; this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
this.dateTimePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Short; this.dateTimePicker1.Location = new System.Drawing.Point(517, 0);
this.dateTimePicker1.Location = new System.Drawing.Point(592, 0);
this.dateTimePicker1.Name = "dateTimePicker1"; this.dateTimePicker1.Name = "dateTimePicker1";
this.dateTimePicker1.Size = new System.Drawing.Size(128, 20); this.dateTimePicker1.Size = new System.Drawing.Size(203, 20);
this.dateTimePicker1.TabIndex = 4; this.dateTimePicker1.TabIndex = 4;
this.dateTimePicker1.ValueChanged += new System.EventHandler(this.dateTimePicker1_ValueChanged); this.dateTimePicker1.ValueChanged += new System.EventHandler(this.dateTimePicker1_ValueChanged);
// //
@ -218,7 +217,7 @@ namespace IndianHealthService.ClinicalScheduling
this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill; this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelCenter.Location = new System.Drawing.Point(8, 24); this.panelCenter.Location = new System.Drawing.Point(8, 24);
this.panelCenter.Name = "panelCenter"; this.panelCenter.Name = "panelCenter";
this.panelCenter.Size = new System.Drawing.Size(712, 316); this.panelCenter.Size = new System.Drawing.Size(712, 295);
this.panelCenter.TabIndex = 4; this.panelCenter.TabIndex = 4;
// //
// ctxCalendarGrid // ctxCalendarGrid
@ -254,7 +253,7 @@ namespace IndianHealthService.ClinicalScheduling
this.tvSchedules.HotTracking = true; this.tvSchedules.HotTracking = true;
this.tvSchedules.Location = new System.Drawing.Point(0, 0); this.tvSchedules.Location = new System.Drawing.Point(0, 0);
this.tvSchedules.Name = "tvSchedules"; this.tvSchedules.Name = "tvSchedules";
this.tvSchedules.Size = new System.Drawing.Size(8, 364); this.tvSchedules.Size = new System.Drawing.Size(8, 343);
this.tvSchedules.Sorted = true; this.tvSchedules.Sorted = true;
this.tvSchedules.TabIndex = 5; this.tvSchedules.TabIndex = 5;
// //
@ -455,7 +454,7 @@ namespace IndianHealthService.ClinicalScheduling
this.splitter1.Dock = System.Windows.Forms.DockStyle.Right; this.splitter1.Dock = System.Windows.Forms.DockStyle.Right;
this.splitter1.Location = new System.Drawing.Point(720, 24); this.splitter1.Location = new System.Drawing.Point(720, 24);
this.splitter1.Name = "splitter1"; this.splitter1.Name = "splitter1";
this.splitter1.Size = new System.Drawing.Size(8, 316); this.splitter1.Size = new System.Drawing.Size(8, 295);
this.splitter1.TabIndex = 6; this.splitter1.TabIndex = 6;
this.splitter1.TabStop = false; this.splitter1.TabStop = false;
// //
@ -485,19 +484,19 @@ namespace IndianHealthService.ClinicalScheduling
this.calendarGrid1.Name = "calendarGrid1"; this.calendarGrid1.Name = "calendarGrid1";
this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources"))); this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
this.calendarGrid1.SelectedAppointment = 0; this.calendarGrid1.SelectedAppointment = 0;
this.calendarGrid1.Size = new System.Drawing.Size(712, 316); this.calendarGrid1.Size = new System.Drawing.Size(712, 295);
this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0); this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
this.calendarGrid1.TabIndex = 2; this.calendarGrid1.TabIndex = 2;
this.calendarGrid1.TimeScale = 20; this.calendarGrid1.TimeScale = 20;
this.calendarGrid1.CGAppointmentAdded += new CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded); this.calendarGrid1.CGAppointmentChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged);
this.calendarGrid1.CGAppointmentChanged += new CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentChanged); this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
this.calendarGrid1.CGSelectionChanged += new CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged); this.calendarGrid1.CGSelectionChanged += new IndianHealthService.ClinicalScheduling.CalendarGrid.CGSelectionChangedHandler(this.calendarGrid1_CGSelectionChanged);
this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick); this.calendarGrid1.DoubleClick += new System.EventHandler(this.calendarGrid1_DoubleClick);
// //
// CGAVView // CGAVView
// //
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(848, 364); this.ClientSize = new System.Drawing.Size(848, 343);
this.Controls.Add(this.panelCenter); this.Controls.Add(this.panelCenter);
this.Controls.Add(this.splitter1); this.Controls.Add(this.splitter1);
this.Controls.Add(this.panelTop); this.Controls.Add(this.panelTop);
@ -726,7 +725,7 @@ namespace IndianHealthService.ClinicalScheduling
{ {
DateTime sStart2 = a.StartTime; DateTime sStart2 = a.StartTime;
DateTime sEnd2 = a.EndTime; DateTime sEnd2 = a.EndTime;
if (CGSchedLib.TimesOverlap(dStart, dEnd, a.StartTime, a.EndTime)) if (CalendarGrid.TimesOverlap(dStart, dEnd, a.StartTime, a.EndTime))
{ {
MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); MessageBox.Show("Access blocks may not overlap.","Clinical Scheduling", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return; return;

View File

@ -112,15 +112,15 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="ctxApptClipMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="ctxApptClipMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<metadata name="ctxCalendarGrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="ctxCalendarGrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>151, 17</value> <value>151, 17</value>
</metadata> </metadata>
<data name="calendarGrid1.Resources" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="calendarGrid1.Resources" mimetype="application/x-microsoft.net.object.binary.base64">
@ -129,13 +129,13 @@
bXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL bXMFX3NpemUIX3ZlcnNpb24FAAAICAkCAAAAAAAAAAAAAAAQAgAAAAAAAAAL
</value> </value>
</data> </data>
<metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>281, 17</value> <value>281, 17</value>
</metadata> </metadata>
<metadata name="saveAccessBlocksWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="saveAccessBlocksWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>398, 17</value> <value>398, 17</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC

View File

@ -6,6 +6,7 @@ using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using IndianHealthService.BMXNet; using IndianHealthService.BMXNet;
using System.Linq;
namespace IndianHealthService.ClinicalScheduling namespace IndianHealthService.ClinicalScheduling
{ {
@ -626,8 +627,122 @@ namespace IndianHealthService.ClinicalScheduling
this.m_sResourcesArray.Add(sResource); this.m_sResourcesArray.Add(sResource);
} }
/// <summary>
/// Gets number of slots left in a certain selection on the grid. Used in Multiple Places.
/// </summary>
/// <param name="dSelStart">Selection Start Date</param>
/// <param name="dSelEnd">Selection End Date</param>
/// <param name="sResource">Resource Name</param>
/// <param name="sAccessType">Out: Name of Access Type</param>
/// <param name="sAvailabilityMessage">Out: Access Note</param>
/// <returns>Number of slots</returns>
public int SlotsAvailable(DateTime dSelStart, DateTime dSelEnd, string sResource, out string sAccessType, out string sAvailabilityMessage) public int SlotsAvailable(DateTime dSelStart, DateTime dSelEnd, string sResource, out string sAccessType, out string sAvailabilityMessage)
{ {
sAccessType = ""; //default out value
sAvailabilityMessage = ""; //default out value
double slotsAvailable = 0; //defalut return value
//NOTE: What's this lock? This lock makes sure that nobody is editing the availability array
//when we are looking at it. Since the availability array could potentially be updated on
//a different thread, we are can be potentially left stuck with an empty array.
//
//The other place that uses this lock is the RefershAvailabilitySchedule method
//
//This is a temporary fix until I figure out how to divorce the availbilities here from those drawn
//on the calendar. Appointments are cloned b/c they are in an object that supports that; and b/c I
//don't need to suddenly query them at runtime like I do with Availabilities.
//Let's Try Linq
lock (this.m_pAvArray)
{
//This foreach loop looks for an availability that overlaps where the user clicked.
//There can only be one, as availabilites cannot overlap each other (enforced at the DB level)
//If selection hits multiple blocks, get the block with the most slots (reflected by the sorting here)
CGAvailability[] pAVs = (from pAV in this.m_pAvArray.Cast<CGAvailability>()
where (sResource == pAV.ResourceList && CalendarGrid.TimesOverlap(dSelStart, dSelEnd, pAV.StartTime, pAV.EndTime))
orderby pAV.Slots descending
select pAV)
.ToArray<CGAvailability>();
if ((pAVs.Length) == 0) return 0;
slotsAvailable = pAVs[0].Slots;
sAccessType = pAVs[0].AccessTypeName;
sAvailabilityMessage = pAVs[0].Note;
//Subtract total slots current appointments take up.
slotsAvailable -= (from appt in this.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
//If the resource is the same and the user selection overlaps, then...
where (sResource == appt.Resource && CalendarGrid.TimesOverlap(pAVs[0].StartTime, pAVs[0].EndTime, appt.StartTime, appt.EndTime))
// if appt starttime is before avail start time, only count against the avail starting from the availability start time
let startTimeToCountAgainstBlock = appt.StartTime < pAVs[0].StartTime ? pAVs[0].StartTime : appt.StartTime
// if appt endtime is after the avail ends, only count against the avail up to where the avail ends
let endTimeToCountAgainstBlock = appt.EndTime > pAVs[0].EndTime ? pAVs[0].EndTime : appt.EndTime
// theoretical minutes per slot for the availability
let minPerSlot = (pAVs[0].EndTime - pAVs[0].StartTime).TotalMinutes / pAVs[0].Slots
// how many minutes does this appointment take away from the slot
let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
// how many slots the appointment takes up using this availability's scale
let slotsConsumed = minPerAppt / minPerSlot
select slotsConsumed)
// add up SlotsConsumed to substract from slotsAvailable
.Sum();
}
return (int)slotsAvailable;
/* OLD ALGOTHRIM 2
lock (this.m_pAvArray)
{
//This foreach loop looks for an availability that overlaps where the user clicked.
//There can only be one, as availabilites cannot overlap each other (enforced at the DB level)
//Therefore, we loop, and once we find it, we break.
foreach (CGAvailability pAV in this.m_pAvArray)
{
//If the resource is the same and the user selection overlaps, then...
if (sResource == pAV.ResourceList && CalendarGrid.TimesOverlap(dSelStart, dSelEnd, pAV.StartTime, pAV.EndTime))
{
slotsAvailable = pAV.Slots; //variable now holds the total number of slots
sAccessType = pAV.AccessTypeName; //Access Name
sAvailabilityMessage = pAV.Note; //Access Block Note
//Here we substract each appointment weight in slots from slotsAvailable
foreach (DictionaryEntry apptDict in this.m_appointments.AppointmentTable)
{
CGAppointment appt = (CGAppointment)apptDict.Value;
//If the appointment is in the same resource and overlaps with this availablity
if (sResource == appt.Resource && CalendarGrid.TimesOverlap(pAV.StartTime, pAV.EndTime, appt.StartTime, appt.EndTime))
{
// if appt starttime is before avail start time, only count against the avail starting from the availability start time
DateTime startTimeToCountAgainstBlock = appt.StartTime < pAV.StartTime ? pAV.StartTime : appt.StartTime;
// if appt endtime is after the avail ends, only count against the avail up to where the avail ends
DateTime endTimeToCountAgainstBlock = appt.EndTime > pAV.EndTime ? pAV.EndTime : appt.EndTime;
// theoretical minutes per slot for the availability
double minPerSlot = (pAV.EndTime - pAV.StartTime).TotalMinutes/pAV.Slots;
// how many minutes does this appointment take away from the slot
double minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes;
// how many slots the appointment takes up using this availability's scale
double slotsConsumed = minPerAppt / minPerSlot;
// subscract that from the total slots for the availability
slotsAvailable -= slotsConsumed;
} //end if
//now go to the next appointment in foreach
}
// As I said above, we can match only one availability. Once we found it and substracted from it; we are done.
break;
}
}
// We return the integer portion of the variable for display to the user or for calculations.
// That means, if 2.11 slots are left, the user sees 2. If 2.66, still 2.
return (int)slotsAvailable;
}
*/
/* ORIGINAL ALGORITHM
sAccessType = ""; sAccessType = "";
sAvailabilityMessage = ""; sAvailabilityMessage = "";
DateTime dStart; DateTime dStart;
@ -694,6 +809,7 @@ namespace IndianHealthService.ClinicalScheduling
nAvailableSlots = 0; nAvailableSlots = 0;
} }
return nAvailableSlots; return nAvailableSlots;
*/
} }
/// <summary> /// <summary>

View File

@ -1,10 +1,8 @@
using System; using System;
using System.Data; using System.Data;
//using System.Data.OleDb;
using System.Collections; using System.Collections;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using IndianHealthService.BMXNet;
namespace IndianHealthService.ClinicalScheduling namespace IndianHealthService.ClinicalScheduling
{ {
@ -23,28 +21,19 @@ namespace IndianHealthService.ClinicalScheduling
/// <summary> /// <summary>
/// Gets appointments from VISTA to display in Grid /// Gets appointments from VISTA to display in Grid
/// </summary> /// </summary>
/// <param name="docManager"></param> /// <param name="docManager">God Class</param>
/// <param name="saryResNames"></param> /// <param name="saryResNames">Resource Names Array</param>
/// <param name="StartTime"></param> /// <param name="StartTime">Self Explanatory</param>
/// <param name="EndTime"></param> /// <param name="EndTime">Self Explanatory</param>
/// <returns></returns> /// <returns></returns>
public static DataTable CreateAppointmentSchedule(CGDocumentManager docManager, ArrayList saryResNames, DateTime StartTime, DateTime EndTime) public static DataTable CreateAppointmentSchedule(CGDocumentManager docManager, ArrayList saryResNames, DateTime StartTime, DateTime EndTime)
{ {
string sResName = ""; string sResName = string.Join("|", saryResNames.ToArray());
for (int i = 0; i < saryResNames.Count; i++)
{
sResName += saryResNames[i];
if ((i+1) < saryResNames.Count)
sResName += "|";
}
string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString; string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
string sEnd = FMDateTime.Create(EndTime).FMDateString; string sEnd = FMDateTime.Create(EndTime).FMDateString;
string sSql = "BSDX CREATE APPT SCHEDULE^" + sResName + "^" + sStart + "^" + sEnd ; string sSql = "BSDX CREATE APPT SCHEDULE^" + sResName + "^" + sStart + "^" + sEnd ;
DataTable dtRet = docManager.RPMSDataTable(sSql, "AppointmentSchedule"); DataTable dtRet = docManager.RPMSDataTable(sSql, "AppointmentSchedule");
return dtRet; return dtRet;
} }
@ -56,34 +45,34 @@ namespace IndianHealthService.ClinicalScheduling
/// <param name="StartTime">Self-Explanatory</param> /// <param name="StartTime">Self-Explanatory</param>
/// <param name="EndTime">Self-Explanatory</param> /// <param name="EndTime">Self-Explanatory</param>
/// <param name="saryApptTypes">Array of Access Type IDs</param> /// <param name="saryApptTypes">Array of Access Type IDs</param>
/// <param name="stType"></param> /// <param name="stType">Not used</param>
/// <param name="sSearchInfo"></param> /// <param name="sSearchInfo">Specific Search Parameters</param>
/// <returns></returns> /// <returns></returns>
public static DataTable CreateAvailabilitySchedule(CGDocumentManager docManager, public static DataTable CreateAvailabilitySchedule(CGDocumentManager docManager,
ArrayList saryResourceNames, DateTime StartTime, DateTime EndTime, ArrayList saryResourceNames, DateTime StartTime, DateTime EndTime,
ArrayList saryApptTypes,/**/ ScheduleType stType, string sSearchInfo) ArrayList saryApptTypes,/**/ ScheduleType stType, string sSearchInfo)
{ {
DataTable rsOut; DataTable rsOut = new DataTable("AvailabilitySchedule");
rsOut = new DataTable("AvailabilitySchedule"); if (saryResourceNames.Count == 0) return rsOut;
string sResNames = string.Join("|", saryResourceNames.ToArray());
string sApptTypeIDs = string.Join("|", saryApptTypes.ToArray());
string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
string sEnd = FMDateTime.Create(EndTime).FMDateString;
string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResNames + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ;
rsOut = docManager.RPMSDataTable(sSql, "AssignedSlotSchedule");
DataTable rsSlotSchedule;
DataTable rsApptSchedule;
DataTable rsTemp1;
int nSize = saryResourceNames.Count;
if (nSize == 0)
{
return rsOut; return rsOut;
} }
string sResName; /*NOT USED ANYMORE
//TODO: Optimize: no need to keep looping through resources. //TODO: Optimize: no need to keep looping through resources.
// for each resource // for each resource
for (int i = 0; i < nSize; i++) for (int i = 0; i < nSize; i++)
{ {
sResName = saryResourceNames[i].ToString(); sResName = saryResourceNames[i].ToString();
//Gets all the slots (or Availabities, or AV Blocks if you like) //Gets all the slots (or Availabities, or AV Blocks if you like)
rsSlotSchedule = CGSchedLib.CreateAssignedSlotSchedule(docManager, sResName, StartTime, EndTime, saryApptTypes,/**/ stType, sSearchInfo); rsSlotSchedule = CGSchedLib.CreateAssignedSlotSchedule(docManager, sResName, StartTime, EndTime, saryApptTypes, stType, sSearchInfo);
rsTemp1 = rsSlotSchedule;
//if we have slots //if we have slots
if (rsSlotSchedule.Rows.Count > 0 ) if (rsSlotSchedule.Rows.Count > 0 )
@ -102,6 +91,7 @@ namespace IndianHealthService.ClinicalScheduling
} }
// if only one resource was passed in, its availablility is what we want // if only one resource was passed in, its availablility is what we want
if (i == 0) if (i == 0)
{ {
@ -116,7 +106,7 @@ namespace IndianHealthService.ClinicalScheduling
} }
return rsOut; return rsOut;
} }
*/
/* NOT USED ANYMORE!!! /* NOT USED ANYMORE!!!
public static DataTable CreateAssignedTypeSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType) public static DataTable CreateAssignedTypeSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType)
@ -280,21 +270,12 @@ namespace IndianHealthService.ClinicalScheduling
/// <returns>DataTable with the following Columns: /// <returns>DataTable with the following Columns:
/// D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID /// D00030START_TIME^D00030END_TIME^I00010SLOTS^T00030RESOURCE^T00010ACCESS_TYPE^T00250NOTE^I00030AVAILABILITYID
/// </returns> /// </returns>
public static DataTable CreateAssignedSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, /*
DateTime EndTime, ArrayList rsaryApptTypeIDs, /**/ ScheduleType stType, string sSearchInfo) * public static DataTable CreateAssignedSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime,
DateTime EndTime, ArrayList rsaryApptTypeIDs, ScheduleType stType, string sSearchInfo)
{ {
//Appointment type ids is now always "" so that all appointment types are returned. //Appointment type ids is now always "" so that all appointment types are returned.
string sApptTypeIDs = ""; string sApptTypeIDs = string.Join("|", rsaryApptTypeIDs.ToArray());
//flatten types by '|'
int nSize = rsaryApptTypeIDs.Count; //nSize is used to decide where to put the '|' sent in the RPC as we flatten sApptTypeIDs
for (int i=0; i < nSize; i++)
{
sApptTypeIDs += rsaryApptTypeIDs[i];
if (i < (nSize-1))
sApptTypeIDs += "|";
}
string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString; string sStart = FMDateTime.Create(StartTime).DateOnly.FMDateString;
string sEnd = FMDateTime.Create(EndTime).FMDateString; string sEnd = FMDateTime.Create(EndTime).FMDateString;
string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResourceName + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ; string sSql = "BSDX CREATE ASGND SLOT SCHED^" + sResourceName + "^" + sStart + "^" + sEnd + "^" + sApptTypeIDs + "^" + sSearchInfo; //+ "^" + sSTType ;
@ -302,7 +283,9 @@ namespace IndianHealthService.ClinicalScheduling
return dtRet; return dtRet;
} }
*/
/*
public static DataTable CreateCopyTable() public static DataTable CreateCopyTable()
{ {
DataTable dtCopy = new DataTable("dtCopy"); DataTable dtCopy = new DataTable("dtCopy");
@ -357,6 +340,7 @@ namespace IndianHealthService.ClinicalScheduling
return dtCopy; return dtCopy;
} }
*/
/// <summary> /// <summary>
/// This gets a datatable which shows the appointments between start and end time, one row per appointment /// This gets a datatable which shows the appointments between start and end time, one row per appointment
@ -367,6 +351,7 @@ namespace IndianHealthService.ClinicalScheduling
/// <param name="EndTime"></param> /// <param name="EndTime"></param>
/// <param name="stType"></param> /// <param name="stType"></param>
/// <returns>DataTable with 4 columns: START_TIME, END_TIME, SLOTS, RESOURCE </returns> /// <returns>DataTable with 4 columns: START_TIME, END_TIME, SLOTS, RESOURCE </returns>
/*
public static DataTable CreateAppointmentSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType) public static DataTable CreateAppointmentSlotSchedule(CGDocumentManager docManager, string sResourceName, DateTime StartTime, DateTime EndTime, ScheduleType stType)
{ {
//Change Dates to FM Format //Change Dates to FM Format
@ -423,7 +408,7 @@ namespace IndianHealthService.ClinicalScheduling
//Convert Appointments to Availabilities, where all appointments become squeezed together. //Convert Appointments to Availabilities, where all appointments become squeezed together.
ScheduleFromArray(cdtArray, StartTime, EndTime, ref ctbApptSchedule); ScheduleFromArray(cdtArray, StartTime, EndTime, ref ctbApptSchedule);
/*So far, we have the following: So far, we have the following:
* dtRet -> List of Appointments Start and End times, one row per appointment * dtRet -> List of Appointments Start and End times, one row per appointment
* cdtArray -> Linear 1 dimensional Array of dtRet Start and End times, sorted * cdtArray -> Linear 1 dimensional Array of dtRet Start and End times, sorted
* ctbAppointments -> Arraylist of dtRet as Availabilities * ctbAppointments -> Arraylist of dtRet as Availabilities
@ -431,7 +416,7 @@ namespace IndianHealthService.ClinicalScheduling
* (overlaps in appointments get converted into availabilties themselves: so * (overlaps in appointments get converted into availabilties themselves: so
* 2 appts as 10:10-10:30 and 10:20-10:40 get converted into 10:10-10:20, * 2 appts as 10:10-10:30 and 10:20-10:40 get converted into 10:10-10:20,
* 10:20-10:30, 10:30-10:40). * 10:20-10:30, 10:30-10:40).
*/
//Find number of TimeBlocks in ctbApptSchedule that overlap the TimeBlocks in ctbAppointments //Find number of TimeBlocks in ctbApptSchedule that overlap the TimeBlocks in ctbAppointments
ArrayList ctbApptSchedule2 = new ArrayList(); ArrayList ctbApptSchedule2 = new ArrayList();
@ -497,7 +482,9 @@ namespace IndianHealthService.ClinicalScheduling
return dtCopy; return dtCopy;
} }
*/
/*
public static int BlocksOverlap(CGAvailability rBlock, ArrayList rTBArray) public static int BlocksOverlap(CGAvailability rBlock, ArrayList rTBArray)
{ {
//this overload implements default false for bCountSlots //this overload implements default false for bCountSlots
@ -541,6 +528,7 @@ namespace IndianHealthService.ClinicalScheduling
return nCount; return nCount;
} }
*/
/// <summary> /// <summary>
/// Does an appointment overlap with another appointment in the same day? /// Does an appointment overlap with another appointment in the same day?
@ -551,6 +539,7 @@ namespace IndianHealthService.ClinicalScheduling
/// <param name="dEnd2">End Time of Second Appt</param> /// <param name="dEnd2">End Time of Second Appt</param>
/// <returns>true or false</returns> /// <returns>true or false</returns>
/// <remarks>Draws 2 rectangles and sees if they overlap using minutes from 1980 as the start point</remarks> /// <remarks>Draws 2 rectangles and sees if they overlap using minutes from 1980 as the start point</remarks>
/*
public static bool TimesOverlap(DateTime dStart1, DateTime dEnd1, DateTime dStart2, DateTime dEnd2) public static bool TimesOverlap(DateTime dStart1, DateTime dEnd1, DateTime dStart2, DateTime dEnd2)
{ {
Rectangle rect1 = new Rectangle(); Rectangle rect1 = new Rectangle();
@ -567,7 +556,9 @@ namespace IndianHealthService.ClinicalScheduling
bool bRet = rect2.IntersectsWith(rect1); bool bRet = rect2.IntersectsWith(rect1);
return bRet; return bRet;
} }
*/
/*
public static void ConsolidateBlocks(ArrayList rTBArray) public static void ConsolidateBlocks(ArrayList rTBArray)
{ {
//TODO: Test this function //TODO: Test this function
@ -606,7 +597,7 @@ namespace IndianHealthService.ClinicalScheduling
} }
} }
while (!((bDirty == false) || (rTBArray.Count == 1))); while (!((bDirty == false) || (rTBArray.Count == 1)));
} } */
/// <summary> /// <summary>
/// My guess is that this calculates remaining slots /// My guess is that this calculates remaining slots
@ -615,6 +606,7 @@ namespace IndianHealthService.ClinicalScheduling
/// <param name="rsBlocks2"></param> /// <param name="rsBlocks2"></param>
/// <param name="sResource"></param> /// <param name="sResource"></param>
/// <returns></returns> /// <returns></returns>
/*
public static DataTable SubtractSlotsRS2(DataTable rsBlocks1, DataTable rsBlocks2, string sResource) public static DataTable SubtractSlotsRS2(DataTable rsBlocks1, DataTable rsBlocks2, string sResource)
{ {
//Subtract slots in rsBlocks2 from rsBlocks1 //Subtract slots in rsBlocks2 from rsBlocks1
@ -679,7 +671,9 @@ namespace IndianHealthService.ClinicalScheduling
return rsCopy; return rsCopy;
} }
*/
/*
public static DataTable UnionBlocks(DataTable rs1, DataTable rs2) public static DataTable UnionBlocks(DataTable rs1, DataTable rs2)
{ {
//Test input tables //Test input tables
@ -713,7 +707,9 @@ namespace IndianHealthService.ClinicalScheduling
} }
return rsCopy; return rsCopy;
} }
*/
/*
public static DataTable IntersectBlocks(DataTable rs1, DataTable rs2) public static DataTable IntersectBlocks(DataTable rs1, DataTable rs2)
{ {
DataTable rsCopy = CGSchedLib.CreateCopyTable(); DataTable rsCopy = CGSchedLib.CreateCopyTable();
@ -769,7 +765,7 @@ namespace IndianHealthService.ClinicalScheduling
// rect2.Y = CGSchedLib.MinSince80(dStart2); // rect2.Y = CGSchedLib.MinSince80(dStart2);
// rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y; // rect2.Height = CGSchedLib.MinSince80(dEnd2) - rect2.Y;
if ( if (
/*(rect2.IntersectsWith(rect1) == true)*/ /*(rect2.IntersectsWith(rect1) == true)
(CGSchedLib.TimesOverlap(dStart1, dEnd1, dStart2, dEnd2) == true) (CGSchedLib.TimesOverlap(dStart1, dEnd1, dStart2, dEnd2) == true)
&& &&
((sClinic == sClinic2) || (sClinic == "NONE") || (sClinic2 == "NONE")) ((sClinic == sClinic2) || (sClinic == "NONE") || (sClinic2 == "NONE"))
@ -796,12 +792,14 @@ namespace IndianHealthService.ClinicalScheduling
}//foreach r1 in rs1.rows }//foreach r1 in rs1.rows
return rsCopy; return rsCopy;
}//end IntersectBlocks }//end IntersectBlocks
*/
/// <summary> /// <summary>
/// Number of minutes since Jan 1 1980 /// Number of minutes since Jan 1 1980
/// </summary> /// </summary>
/// <param name="d">Date to compare</param> /// <param name="d">Date to compare</param>
/// <returns>Minutes as integer</returns> /// <returns>Minutes as integer</returns>
/*
public static int MinSince80(DateTime d) public static int MinSince80(DateTime d)
{ {
//Returns the total minutes between d and 1 Jan 1980 //Returns the total minutes between d and 1 Jan 1980
@ -813,7 +811,9 @@ namespace IndianHealthService.ClinicalScheduling
int nMinutes = (int) ts.TotalMinutes; int nMinutes = (int) ts.TotalMinutes;
return nMinutes; return nMinutes;
} }
*/
/*
/// <summary> /// <summary>
/// Converts an Array of Times like this: /// Converts an Array of Times like this:
/// 10:00 10:00 10:20 10:20 10:30 10:30 10:30 10:40 /// 10:00 10:00 10:20 10:20 10:30 10:30 10:30 10:40
@ -908,7 +908,9 @@ namespace IndianHealthService.ClinicalScheduling
} }
}//end ScheduleFromArray }//end ScheduleFromArray
*/
/*
//long CResourceLink::SlotsInBlock(CTimeBlock &rTimeBlock, _RecordsetPtr rsBlock) //long CResourceLink::SlotsInBlock(CTimeBlock &rTimeBlock, _RecordsetPtr rsBlock)
public static int SlotsInBlock(CGAvailability rTimeBlock, DataTable rsBlock) public static int SlotsInBlock(CGAvailability rTimeBlock, DataTable rsBlock)
{ {
@ -951,7 +953,9 @@ namespace IndianHealthService.ClinicalScheduling
} }
return nSlots; return nSlots;
}//end SlotsInBlock }//end SlotsInBlock
*/
/*
public static string ClinicInBlock(CGAvailability rTimeBlock, DataTable rsBlock) public static string ClinicInBlock(CGAvailability rTimeBlock, DataTable rsBlock)
{ {
DateTime dStart1; DateTime dStart1;
@ -990,7 +994,9 @@ namespace IndianHealthService.ClinicalScheduling
} }
return sClinic; return sClinic;
}//end ClinicInBlock }//end ClinicInBlock
*/
/*
public static bool ResourceRulesInBlock(CGAvailability rTimeBlock, DataTable rsBlock, ref string sResourceList, ref string sAccessRuleList, ref string sNote) public static bool ResourceRulesInBlock(CGAvailability rTimeBlock, DataTable rsBlock, ref string sResourceList, ref string sAccessRuleList, ref string sNote)
{ {
DateTime dStart1; DateTime dStart1;
@ -1058,6 +1064,7 @@ namespace IndianHealthService.ClinicalScheduling
} }
return true; return true;
}//End ResourceRulesInBlock }//End ResourceRulesInBlock
*/
} }

View File

@ -616,7 +616,7 @@ namespace IndianHealthService.ClinicalScheduling
this.tvSchedules.HotTracking = true; this.tvSchedules.HotTracking = true;
this.tvSchedules.Location = new System.Drawing.Point(0, 0); this.tvSchedules.Location = new System.Drawing.Point(0, 0);
this.tvSchedules.Name = "tvSchedules"; this.tvSchedules.Name = "tvSchedules";
this.tvSchedules.Size = new System.Drawing.Size(128, 400); this.tvSchedules.Size = new System.Drawing.Size(128, 358);
this.tvSchedules.Sorted = true; this.tvSchedules.Sorted = true;
this.tvSchedules.TabIndex = 1; this.tvSchedules.TabIndex = 1;
this.tvSchedules.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSchedules_AfterSelect); this.tvSchedules.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvSchedules_AfterSelect);
@ -663,7 +663,7 @@ namespace IndianHealthService.ClinicalScheduling
this.panelRight.Dock = System.Windows.Forms.DockStyle.Right; this.panelRight.Dock = System.Windows.Forms.DockStyle.Right;
this.panelRight.Location = new System.Drawing.Point(941, 0); this.panelRight.Location = new System.Drawing.Point(941, 0);
this.panelRight.Name = "panelRight"; this.panelRight.Name = "panelRight";
this.panelRight.Size = new System.Drawing.Size(128, 400); this.panelRight.Size = new System.Drawing.Size(128, 358);
this.panelRight.TabIndex = 3; this.panelRight.TabIndex = 3;
this.panelRight.Visible = false; this.panelRight.Visible = false;
// //
@ -736,10 +736,9 @@ namespace IndianHealthService.ClinicalScheduling
// //
this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right; this.dateTimePicker1.Dock = System.Windows.Forms.DockStyle.Right;
this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right; this.dateTimePicker1.DropDownAlign = System.Windows.Forms.LeftRightAlignment.Right;
this.dateTimePicker1.Format = System.Windows.Forms.DateTimePickerFormat.Short; this.dateTimePicker1.Location = new System.Drawing.Point(607, 0);
this.dateTimePicker1.Location = new System.Drawing.Point(685, 0);
this.dateTimePicker1.Name = "dateTimePicker1"; this.dateTimePicker1.Name = "dateTimePicker1";
this.dateTimePicker1.Size = new System.Drawing.Size(128, 20); this.dateTimePicker1.Size = new System.Drawing.Size(206, 20);
this.dateTimePicker1.TabIndex = 1; this.dateTimePicker1.TabIndex = 1;
this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp); this.dateTimePicker1.CloseUp += new System.EventHandler(this.dateTimePicker1_CloseUp);
this.dateTimePicker1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dateTimePicker1_KeyPress); this.dateTimePicker1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dateTimePicker1_KeyPress);
@ -760,7 +759,7 @@ namespace IndianHealthService.ClinicalScheduling
this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill; this.panelCenter.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelCenter.Location = new System.Drawing.Point(136, 24); this.panelCenter.Location = new System.Drawing.Point(136, 24);
this.panelCenter.Name = "panelCenter"; this.panelCenter.Name = "panelCenter";
this.panelCenter.Size = new System.Drawing.Size(802, 352); this.panelCenter.Size = new System.Drawing.Size(802, 310);
this.panelCenter.TabIndex = 7; this.panelCenter.TabIndex = 7;
// //
// ctxCalendarGrid // ctxCalendarGrid
@ -846,7 +845,7 @@ namespace IndianHealthService.ClinicalScheduling
// //
this.panelBottom.Controls.Add(this.statusBar1); this.panelBottom.Controls.Add(this.statusBar1);
this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom; this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelBottom.Location = new System.Drawing.Point(136, 376); this.panelBottom.Location = new System.Drawing.Point(136, 334);
this.panelBottom.Name = "panelBottom"; this.panelBottom.Name = "panelBottom";
this.panelBottom.Size = new System.Drawing.Size(802, 24); this.panelBottom.Size = new System.Drawing.Size(802, 24);
this.panelBottom.TabIndex = 8; this.panelBottom.TabIndex = 8;
@ -864,7 +863,7 @@ namespace IndianHealthService.ClinicalScheduling
// //
this.splitter1.Location = new System.Drawing.Point(128, 24); this.splitter1.Location = new System.Drawing.Point(128, 24);
this.splitter1.Name = "splitter1"; this.splitter1.Name = "splitter1";
this.splitter1.Size = new System.Drawing.Size(8, 376); this.splitter1.Size = new System.Drawing.Size(8, 334);
this.splitter1.TabIndex = 9; this.splitter1.TabIndex = 9;
this.splitter1.TabStop = false; this.splitter1.TabStop = false;
// //
@ -873,7 +872,7 @@ namespace IndianHealthService.ClinicalScheduling
this.splitter2.Dock = System.Windows.Forms.DockStyle.Right; this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
this.splitter2.Location = new System.Drawing.Point(938, 24); this.splitter2.Location = new System.Drawing.Point(938, 24);
this.splitter2.Name = "splitter2"; this.splitter2.Name = "splitter2";
this.splitter2.Size = new System.Drawing.Size(3, 376); this.splitter2.Size = new System.Drawing.Size(3, 334);
this.splitter2.TabIndex = 10; this.splitter2.TabIndex = 10;
this.splitter2.TabStop = false; this.splitter2.TabStop = false;
// //
@ -901,7 +900,7 @@ namespace IndianHealthService.ClinicalScheduling
this.calendarGrid1.Name = "calendarGrid1"; this.calendarGrid1.Name = "calendarGrid1";
this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources"))); this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
this.calendarGrid1.SelectedAppointment = 0; this.calendarGrid1.SelectedAppointment = 0;
this.calendarGrid1.Size = new System.Drawing.Size(802, 352); this.calendarGrid1.Size = new System.Drawing.Size(802, 310);
this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0); this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
this.calendarGrid1.TabIndex = 0; this.calendarGrid1.TabIndex = 0;
this.calendarGrid1.TimeScale = 20; this.calendarGrid1.TimeScale = 20;
@ -914,7 +913,7 @@ namespace IndianHealthService.ClinicalScheduling
// CGView // CGView
// //
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(1069, 400); this.ClientSize = new System.Drawing.Size(1069, 358);
this.Controls.Add(this.panelCenter); this.Controls.Add(this.panelCenter);
this.Controls.Add(this.panelBottom); this.Controls.Add(this.panelBottom);
this.Controls.Add(this.splitter2); this.Controls.Add(this.splitter2);
@ -1987,15 +1986,15 @@ namespace IndianHealthService.ClinicalScheduling
//Save to Database //Save to Database
this.Document.CheckInAppointment(nApptID, dtCheckIn); this.Document.CheckInAppointment(nApptID, dtCheckIn);
//Tell appointment that it is checked in--smh cancel that! //Tell appointment that it is checked in
//a.CheckInTime = DateTime.Now; a.CheckInTime = DateTime.Now;
//smh new code //smh new code
if (dlgCheckin.PrintRouteSlip) if (dlgCheckin.PrintRouteSlip)
this.printRoutingSlip.Print(); this.printRoutingSlip.Print();
// end new code // end new code
//redraw grid (would this work???) //redraw grid
this.calendarGrid1.Invalidate(); this.calendarGrid1.Invalidate();
} }
catch (Exception ex) catch (Exception ex)
@ -2474,11 +2473,12 @@ namespace IndianHealthService.ClinicalScheduling
if (dSearch.ShowDialog(this) == DialogResult.Cancel) if (dSearch.ShowDialog(this) == DialogResult.Cancel)
return; return;
string sResource = dSearch.SelectedResource; CGAvailability av = dSearch.SelectedAvailability;
ArrayList alResource = new ArrayList(); ArrayList alResource = new ArrayList();
alResource.Add(sResource); alResource.Add(av.ResourceList);
DateTime sDate = dSearch.SelectedDate; DateTime sDate = av.StartTime;
m_sDocName = sResource; m_sDocName = av.ResourceList;
OpenSelectedSchedule(alResource, sDate); OpenSelectedSchedule(alResource, sDate);
} }

View File

@ -36,7 +36,7 @@
<RemoteDebugMachine> <RemoteDebugMachine>
</RemoteDebugMachine> </RemoteDebugMachine>
<StartAction>Project</StartAction> <StartAction>Project</StartAction>
<StartArguments>/s=192.168.56.101 /p=9260 /a=shabiel12 /v=catdog.77</StartArguments> <StartArguments>/s=172.16.16.108 /p=9250 /a=s.habiel /v=catdog.66</StartArguments>
<StartPage> <StartPage>
</StartPage> </StartPage>
<StartProgram>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\IEExec.exe</StartProgram> <StartProgram>C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\IEExec.exe</StartProgram>

View File

@ -1,22 +1,21 @@
using System; using System;
using System.Drawing;
using System.Collections; using System.Collections;
using System.ComponentModel; using System.Collections.Generic;
using System.Windows.Forms; using System.Windows.Forms;
using System.Data; using System.Data;
using System.Linq;
//using System.Data.OleDb; //using System.Data.OleDb;
using IndianHealthService.BMXNet;
namespace IndianHealthService.ClinicalScheduling namespace IndianHealthService.ClinicalScheduling
{ {
/// <summary> /// <summary>
/// Summary description for DApptSearch. /// Modal Dialog for searching for Patient Slots
/// </summary> /// </summary>
public class DApptSearch : System.Windows.Forms.Form public class DApptSearch : System.Windows.Forms.Form
{ {
private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button cmdCancel; private System.Windows.Forms.Button cmdCancel;
private System.Windows.Forms.Button cmdOK; private System.Windows.Forms.Button btnAccept;
private System.Windows.Forms.Panel pnlDescription; private System.Windows.Forms.Panel pnlDescription;
private System.Windows.Forms.GroupBox grpDescription; private System.Windows.Forms.GroupBox grpDescription;
private System.Windows.Forms.Label lblDescription; private System.Windows.Forms.Label lblDescription;
@ -38,14 +37,23 @@ namespace IndianHealthService.ClinicalScheduling
private System.Windows.Forms.RadioButton rdoPM; private System.Windows.Forms.RadioButton rdoPM;
private System.Windows.Forms.RadioButton rdoAM; private System.Windows.Forms.RadioButton rdoAM;
private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label1;
private System.Windows.Forms.MonthCalendar calStartDate;
private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.DataGrid grdResult;
private System.Windows.Forms.Button cmdSearch; private System.Windows.Forms.Button cmdSearch;
/// <summary> private ListView lstResults;
/// Required designer variable. private ColumnHeader colStartTime;
/// </summary> private ColumnHeader colEndTime;
private System.ComponentModel.Container components = null; private ColumnHeader colResource;
private ColumnHeader colSlots;
private ColumnHeader colAccessType;
private ColumnHeader colDate;
private Label lblEnd;
private Label lblStart;
private DateTimePicker dtEnd;
private DateTimePicker dtStart;
private ColumnHeader colDOW;
private ColumnHeader colID;
private System.ComponentModel.IContainer components;
public DApptSearch() public DApptSearch()
{ {
@ -59,19 +67,14 @@ namespace IndianHealthService.ClinicalScheduling
private DataSet m_dsGlobal; private DataSet m_dsGlobal;
DataTable m_dtTypes; DataTable m_dtTypes;
DataView m_dvTypes; DataView m_dvTypes;
List<CGAvailability> lstResultantAvailabilities;
private CGAvailability _selectedAvailability;
DateTime m_dStart; DateTime m_dStart;
DateTime m_dEnd; DateTime m_dEnd;
ArrayList m_alResources; ArrayList m_alResources;
ArrayList m_alAccessTypes; ArrayList m_alAccessTypes;
string m_sWeekDays; string m_sWeekDays; //only practical use now is for sending to server
string m_sAmpm; string m_sAmpm; // same here.
DataTable m_dtResult;
DataView m_dvResult;
string m_sSelectedResource;
DateTime m_sSelectedDate;
#endregion Fields #endregion Fields
@ -109,9 +112,11 @@ namespace IndianHealthService.ClinicalScheduling
public void InitializePage(ArrayList alResources, CGDocumentManager docManager) public void InitializePage(ArrayList alResources, CGDocumentManager docManager)
{ {
this.Text = "Searching for Appointments in: " + string.Join(" | ", alResources.Cast<string>());
this.m_DocManager = docManager; this.m_DocManager = docManager;
this.m_dsGlobal = m_DocManager.GlobalDataSet; this.m_dsGlobal = m_DocManager.GlobalDataSet;
System.IntPtr pHandle = this.Handle;
LoadListBox("ALL"); LoadListBox("ALL");
m_dStart = DateTime.Today; m_dStart = DateTime.Today;
@ -135,13 +140,16 @@ namespace IndianHealthService.ClinicalScheduling
cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1; cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1;
cboAccessTypeFilter.Refresh(); cboAccessTypeFilter.Refresh();
/* OLD CODE
//Create DataGridTableStyle for Result grid //Create DataGridTableStyle for Result grid
DataGridTableStyle tsResult = new DataGridTableStyle(); DataGridTableStyle tsResult = new DataGridTableStyle();
tsResult.MappingName = "Result"; tsResult.MappingName = "Result";
tsResult.ReadOnly = true; tsResult.ReadOnly = true;
// Add START_TIME column style. // Add START_TIME column style.
DataGridTextBoxColumn colStartTime = new DataGridTextBoxColumn(); DataGridTextBoxColumn colStartTime = new DataGridTextBoxColumn();
colStartTime.MappingName = "START_TIME"; colStartTime.MappingName = "StartTime";
colStartTime.HeaderText = "Start Time"; colStartTime.HeaderText = "Start Time";
colStartTime.Width = 200; colStartTime.Width = 200;
colStartTime.Format = "f"; colStartTime.Format = "f";
@ -149,7 +157,7 @@ namespace IndianHealthService.ClinicalScheduling
// Add END_TIME column style. // Add END_TIME column style.
DataGridTextBoxColumn colEndTime = new DataGridTextBoxColumn(); DataGridTextBoxColumn colEndTime = new DataGridTextBoxColumn();
colEndTime.MappingName = "END_TIME"; colEndTime.MappingName = "EndTime";
colEndTime.HeaderText = "End Time"; colEndTime.HeaderText = "End Time";
colEndTime.Width = 75; colEndTime.Width = 75;
colEndTime.Format = "h:mm tt"; colEndTime.Format = "h:mm tt";
@ -157,7 +165,7 @@ namespace IndianHealthService.ClinicalScheduling
// Add RESOURCE column style. // Add RESOURCE column style.
DataGridTextBoxColumn colResource = new DataGridTextBoxColumn(); DataGridTextBoxColumn colResource = new DataGridTextBoxColumn();
colResource.MappingName = "RESOURCE"; colResource.MappingName = "ResourceList";
colResource.HeaderText = "Resource"; colResource.HeaderText = "Resource";
colResource.Width = 200; colResource.Width = 200;
tsResult.GridColumnStyles.Add(colResource); tsResult.GridColumnStyles.Add(colResource);
@ -175,7 +183,8 @@ namespace IndianHealthService.ClinicalScheduling
colAccess.HeaderText = "Access Type"; colAccess.HeaderText = "Access Type";
colAccess.Width = 200; colAccess.Width = 200;
tsResult.GridColumnStyles.Add(colAccess); tsResult.GridColumnStyles.Add(colAccess);
grdResult.TableStyles.Add(tsResult); //grdResult.TableStyles.Add(tsResult);
*/
this.UpdateDialogData(true); this.UpdateDialogData(true);
@ -231,13 +240,10 @@ namespace IndianHealthService.ClinicalScheduling
m_sWeekDays += "Sunday"; m_sWeekDays += "Sunday";
//Start //Start
this.m_dStart = this.calStartDate.SelectionStart; this.m_dStart = this.dtStart.Value;
//End //End
m_dEnd = calStartDate.SelectionEnd; this.m_dEnd = this.dtEnd.Value;
m_dEnd = m_dEnd.AddHours(23);
m_dEnd = m_dEnd.AddMinutes(59);
} }
} }
@ -269,11 +275,15 @@ namespace IndianHealthService.ClinicalScheduling
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
this.cmdSearch = new System.Windows.Forms.Button(); this.cmdSearch = new System.Windows.Forms.Button();
this.cmdCancel = new System.Windows.Forms.Button(); this.cmdCancel = new System.Windows.Forms.Button();
this.cmdOK = new System.Windows.Forms.Button(); this.btnAccept = new System.Windows.Forms.Button();
this.pnlDescription = new System.Windows.Forms.Panel(); this.pnlDescription = new System.Windows.Forms.Panel();
this.grpDescription = new System.Windows.Forms.GroupBox(); this.grpDescription = new System.Windows.Forms.GroupBox();
this.lblDescription = new System.Windows.Forms.Label(); this.lblDescription = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.lblEnd = new System.Windows.Forms.Label();
this.lblStart = new System.Windows.Forms.Label();
this.dtEnd = new System.Windows.Forms.DateTimePicker();
this.dtStart = new System.Windows.Forms.DateTimePicker();
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.lstAccessTypes = new System.Windows.Forms.CheckedListBox(); this.lstAccessTypes = new System.Windows.Forms.CheckedListBox();
@ -291,9 +301,16 @@ namespace IndianHealthService.ClinicalScheduling
this.rdoPM = new System.Windows.Forms.RadioButton(); this.rdoPM = new System.Windows.Forms.RadioButton();
this.rdoAM = new System.Windows.Forms.RadioButton(); this.rdoAM = new System.Windows.Forms.RadioButton();
this.label1 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
this.calStartDate = new System.Windows.Forms.MonthCalendar();
this.groupBox2 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox();
this.grdResult = new System.Windows.Forms.DataGrid(); this.lstResults = new System.Windows.Forms.ListView();
this.colID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colDOW = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colResource = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colSlots = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.colAccessType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.panel1.SuspendLayout(); this.panel1.SuspendLayout();
this.pnlDescription.SuspendLayout(); this.pnlDescription.SuspendLayout();
this.grpDescription.SuspendLayout(); this.grpDescription.SuspendLayout();
@ -301,14 +318,13 @@ namespace IndianHealthService.ClinicalScheduling
this.grpDayOfWeek.SuspendLayout(); this.grpDayOfWeek.SuspendLayout();
this.grpTimeOfDay.SuspendLayout(); this.grpTimeOfDay.SuspendLayout();
this.groupBox2.SuspendLayout(); this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.grdResult)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
// panel1 // panel1
// //
this.panel1.Controls.Add(this.cmdSearch); this.panel1.Controls.Add(this.cmdSearch);
this.panel1.Controls.Add(this.cmdCancel); this.panel1.Controls.Add(this.cmdCancel);
this.panel1.Controls.Add(this.cmdOK); this.panel1.Controls.Add(this.btnAccept);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom; this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 461); this.panel1.Location = new System.Drawing.Point(0, 461);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
@ -333,16 +349,15 @@ namespace IndianHealthService.ClinicalScheduling
this.cmdCancel.TabIndex = 1; this.cmdCancel.TabIndex = 1;
this.cmdCancel.Text = "Cancel"; this.cmdCancel.Text = "Cancel";
// //
// cmdOK // btnAccept
// //
this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK; this.btnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;
this.cmdOK.Location = new System.Drawing.Point(128, 8); this.btnAccept.Location = new System.Drawing.Point(128, 8);
this.cmdOK.Name = "cmdOK"; this.btnAccept.Name = "btnAccept";
this.cmdOK.Size = new System.Drawing.Size(64, 24); this.btnAccept.Size = new System.Drawing.Size(176, 24);
this.cmdOK.TabIndex = 0; this.btnAccept.TabIndex = 0;
this.cmdOK.Text = "OK"; this.btnAccept.Text = "Select Slot for Appointment";
this.cmdOK.Visible = false; this.btnAccept.Click += new System.EventHandler(this.btnAccept_Click);
this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click);
// //
// pnlDescription // pnlDescription
// //
@ -377,6 +392,10 @@ namespace IndianHealthService.ClinicalScheduling
// //
// groupBox1 // groupBox1
// //
this.groupBox1.Controls.Add(this.lblEnd);
this.groupBox1.Controls.Add(this.lblStart);
this.groupBox1.Controls.Add(this.dtEnd);
this.groupBox1.Controls.Add(this.dtStart);
this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.lstAccessTypes); this.groupBox1.Controls.Add(this.lstAccessTypes);
@ -384,7 +403,6 @@ namespace IndianHealthService.ClinicalScheduling
this.groupBox1.Controls.Add(this.grpDayOfWeek); this.groupBox1.Controls.Add(this.grpDayOfWeek);
this.groupBox1.Controls.Add(this.grpTimeOfDay); this.groupBox1.Controls.Add(this.grpTimeOfDay);
this.groupBox1.Controls.Add(this.label1); this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.calStartDate);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top; this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
this.groupBox1.Location = new System.Drawing.Point(0, 0); this.groupBox1.Location = new System.Drawing.Point(0, 0);
this.groupBox1.Name = "groupBox1"; this.groupBox1.Name = "groupBox1";
@ -393,6 +411,38 @@ namespace IndianHealthService.ClinicalScheduling
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Search Parameters"; this.groupBox1.Text = "Search Parameters";
// //
// lblEnd
//
this.lblEnd.AutoSize = true;
this.lblEnd.Location = new System.Drawing.Point(12, 124);
this.lblEnd.Name = "lblEnd";
this.lblEnd.Size = new System.Drawing.Size(153, 13);
this.lblEnd.TabIndex = 67;
this.lblEnd.Text = "End Date to Search (Inclusive)";
//
// lblStart
//
this.lblStart.AutoSize = true;
this.lblStart.Location = new System.Drawing.Point(12, 35);
this.lblStart.Name = "lblStart";
this.lblStart.Size = new System.Drawing.Size(159, 13);
this.lblStart.TabIndex = 66;
this.lblStart.Text = "Start Date to Search (Inclusive)";
//
// dtEnd
//
this.dtEnd.Location = new System.Drawing.Point(12, 141);
this.dtEnd.Name = "dtEnd";
this.dtEnd.Size = new System.Drawing.Size(200, 20);
this.dtEnd.TabIndex = 65;
//
// dtStart
//
this.dtStart.Location = new System.Drawing.Point(12, 54);
this.dtStart.Name = "dtStart";
this.dtStart.Size = new System.Drawing.Size(200, 20);
this.dtStart.TabIndex = 64;
//
// label3 // label3
// //
this.label3.Location = new System.Drawing.Point(684, 64); this.label3.Location = new System.Drawing.Point(684, 64);
@ -541,22 +591,15 @@ namespace IndianHealthService.ClinicalScheduling
// label1 // label1
// //
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(16, 24); this.label1.Location = new System.Drawing.Point(6, 16);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(136, 16); this.label1.Size = new System.Drawing.Size(136, 16);
this.label1.TabIndex = 57; this.label1.TabIndex = 57;
this.label1.Text = "Date Range:"; this.label1.Text = "Date Range:";
// //
// calStartDate
//
this.calStartDate.Location = new System.Drawing.Point(16, 40);
this.calStartDate.MaxSelectionCount = 62;
this.calStartDate.Name = "calStartDate";
this.calStartDate.TabIndex = 56;
//
// groupBox2 // groupBox2
// //
this.groupBox2.Controls.Add(this.grdResult); this.groupBox2.Controls.Add(this.lstResults);
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(0, 208); this.groupBox2.Location = new System.Drawing.Point(0, 208);
this.groupBox2.Name = "groupBox2"; this.groupBox2.Name = "groupBox2";
@ -565,19 +608,68 @@ namespace IndianHealthService.ClinicalScheduling
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "Search Result"; this.groupBox2.Text = "Search Result";
// //
// grdResult // lstResults
// //
this.grdResult.CaptionVisible = false; this.lstResults.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.grdResult.DataMember = ""; this.colID,
this.grdResult.Dock = System.Windows.Forms.DockStyle.Fill; this.colDate,
this.grdResult.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.colDOW,
this.grdResult.Location = new System.Drawing.Point(3, 16); this.colStartTime,
this.grdResult.Name = "grdResult"; this.colEndTime,
this.grdResult.ReadOnly = true; this.colResource,
this.grdResult.Size = new System.Drawing.Size(917, 170); this.colSlots,
this.grdResult.TabIndex = 0; this.colAccessType});
this.grdResult.DoubleClick += new System.EventHandler(this.grdResult_DoubleClick); this.lstResults.Dock = System.Windows.Forms.DockStyle.Fill;
this.grdResult.CurrentCellChanged += new System.EventHandler(this.grdResult_CurrentCellChanged); this.lstResults.FullRowSelect = true;
this.lstResults.GridLines = true;
this.lstResults.Location = new System.Drawing.Point(3, 16);
this.lstResults.MultiSelect = false;
this.lstResults.Name = "lstResults";
this.lstResults.Size = new System.Drawing.Size(917, 170);
this.lstResults.TabIndex = 0;
this.lstResults.UseCompatibleStateImageBehavior = false;
this.lstResults.View = System.Windows.Forms.View.Details;
this.lstResults.DoubleClick += new System.EventHandler(this.lstResults_DoubleClick);
//
// colID
//
this.colID.Text = "ID";
this.colID.Width = 0;
//
// colDate
//
this.colDate.Text = "Date";
this.colDate.Width = 91;
//
// colDOW
//
this.colDOW.Text = "Day of Week";
this.colDOW.Width = 80;
//
// colStartTime
//
this.colStartTime.Text = "Start Time";
this.colStartTime.Width = 87;
//
// colEndTime
//
this.colEndTime.Text = "End Time";
this.colEndTime.Width = 116;
//
// colResource
//
this.colResource.Text = "Resource";
this.colResource.Width = 370;
//
// colSlots
//
this.colSlots.Text = "Slots";
this.colSlots.Width = 47;
//
// colAccessType
//
this.colAccessType.Text = "Access Type";
this.colAccessType.Width = 101;
// //
// DApptSearch // DApptSearch
// //
@ -595,161 +687,205 @@ namespace IndianHealthService.ClinicalScheduling
this.pnlDescription.ResumeLayout(false); this.pnlDescription.ResumeLayout(false);
this.grpDescription.ResumeLayout(false); this.grpDescription.ResumeLayout(false);
this.groupBox1.ResumeLayout(false); this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.grpDayOfWeek.ResumeLayout(false); this.grpDayOfWeek.ResumeLayout(false);
this.grpTimeOfDay.ResumeLayout(false); this.grpTimeOfDay.ResumeLayout(false);
this.groupBox2.ResumeLayout(false); this.groupBox2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.grdResult)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
} }
#endregion #endregion
#region Event Handlers #region Event Handlers
private void cmdOK_Click(object sender, System.EventArgs e)
{
}
private void cmdSearch_Click(object sender, System.EventArgs e) private void cmdSearch_Click(object sender, System.EventArgs e)
{ {
//Tell user we are processing
this.Cursor = Cursors.WaitCursor;
//Get the control data into local vars //Get the control data into local vars
UpdateDialogData(false); UpdateDialogData(false);
//Resource array, Begin date, Access type array, MTWTF , AM PM //Resource array, Begin date, Access type array, MTWTF , AM PM
//Assemble |-delimited resource string
string sResources = "";
for (int j=0; j < m_alResources.Count; j++)
{
sResources = sResources + m_alResources[j];
if (j < (m_alResources.Count - 1))
sResources = sResources + "|";
}
//Access Types Array
string sTypes = "";
if (m_alAccessTypes.Count > 0)
{
for (int j=0; j < m_alAccessTypes.Count; j++)
{
sTypes = sTypes + (string) m_alAccessTypes[j];
if (j < (m_alAccessTypes.Count-1))
sTypes = sTypes + "|";
}
}
//Get Availabilities and Appointments from the DB
//NB: m_sAmpm and m_sWeekDays don't have an effect on the M side side right now
string sSearchInfo = "1|" + m_sAmpm + "|" + m_sWeekDays; string sSearchInfo = "1|" + m_sAmpm + "|" + m_sWeekDays;
m_dtResult = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_alResources, m_dStart, m_dEnd, m_alAccessTypes, ScheduleType.Resource, sSearchInfo); DataTable m_availTable = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_alResources, m_dStart, m_dEnd, m_alAccessTypes, ScheduleType.Resource, sSearchInfo);
DataTable m_apptTable = CGSchedLib.CreateAppointmentSchedule(m_DocManager, m_alResources, m_dStart, m_dEnd);
if (m_dtResult.Rows.Count == 0) #if DEBUG
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
#endif
lstResultantAvailabilities = (from rowAV in m_availTable.AsEnumerable()
// Calculate the number of slots consumed in this availability by appointments
let slotsConsumed = (from appt in m_apptTable.AsEnumerable()
//If the resource is the same and the user selection overlaps, then...
where (rowAV.Field<string>("RESOURCE") == appt.Field<string>("RESOURCENAME")
&& CalendarGrid.TimesOverlap(rowAV.Field<DateTime>("START_TIME"), rowAV.Field<DateTime>("END_TIME"), appt.Field<DateTime>("START_TIME"), appt.Field<DateTime>("END_TIME")))
// if appt starttime is before avail start time, only count against the avail starting from the availability start time
let startTimeToCountAgainstBlock = appt.Field<DateTime>("START_TIME") < rowAV.Field<DateTime>("START_TIME") ? rowAV.Field<DateTime>("START_TIME") : appt.Field<DateTime>("START_TIME")
// if appt endtime is after the avail ends, only count against the avail up to where the avail ends
let endTimeToCountAgainstBlock = appt.Field<DateTime>("END_TIME") > rowAV.Field<DateTime>("END_TIME") ? rowAV.Field<DateTime>("END_TIME") : appt.Field<DateTime>("END_TIME")
// theoretical minutes per slot for the availability
let minPerSlot = (rowAV.Field<DateTime>("END_TIME") - rowAV.Field<DateTime>("START_TIME")).TotalMinutes / rowAV.Field<int>("SLOTS")
// how many minutes does this appointment take away from the slot
let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
// how many slots the appointment takes up using this availability's scale
let slotsConsumed = minPerAppt / minPerSlot
select slotsConsumed).Sum()
// Subtract the number consumed from the original ones
let slotsLeft = (float)rowAV.Field<int>("SLOTS") - slotsConsumed
// filter by that value if it is at least one slot
where slotsLeft >= 1
// Sort by Start Time, then by Resource Name
orderby rowAV.Field<DateTime>("START_TIME"), rowAV.Field<string>("RESOURCE")
//return as a CGAvailability
select new CGAvailability
{ {
MessageBox.Show("No availability found."); ResourceList = rowAV.Field<string>("RESOURCE"),
return; StartTime = rowAV.Field<DateTime>("START_TIME"),
EndTime = rowAV.Field<DateTime>("END_TIME"),
Slots = (int)slotsLeft,
// AccessTypeName is grabbed from the Access Type Table using a psuedojoin syntax.
// "ACCESS_TYPE" is the IEN of the AcceesType.
// Single or default is b/c we are expecting one result.
AccessTypeName = (from at in m_dsGlobal.Tables["AccessTypes"].AsEnumerable()
where at.Field<int>("BMXIEN")==Int32.Parse(rowAV.Field<string>("ACCESS_TYPE"))
select at.Field<string>("ACCESS_TYPE_NAME")).SingleOrDefault<string>(),
AvailabilityType = rowAV.Field<int>("AVAILABILITYID")
})
// convert to Generic List
.ToList<CGAvailability>();
// if specific access types are chosen, filter the results based on a join against them.
if (m_alAccessTypes.Count > 0)
lstResultantAvailabilities = (from av in lstResultantAvailabilities
join at in m_alAccessTypes.Cast<string>() on av.AccessTypeName equals at
select av).ToList<CGAvailability>();
// if user chose AM radio button, get morning appointments
// TimeSpan.FromHours(12) gets the number of ticks since Midnight
if (rdoAM.Checked) // less than 12 pm
{
lstResultantAvailabilities = (from av in lstResultantAvailabilities
where av.StartTime.TimeOfDay < TimeSpan.FromHours(12)
select av).ToList<CGAvailability>();
}
// if user chose PM radio button, get morning appointments
if (rdoPM.Checked) // after or equal to 12 pm
{
lstResultantAvailabilities = (from av in lstResultantAvailabilities
where av.StartTime.TimeOfDay >= TimeSpan.FromHours(12)
select av).ToList<CGAvailability>();
} }
m_dtResult.TableName = "Result"; // if any of the days of week are checked, create a new list based on them
m_dtResult.Columns.Add("AMPM", System.Type.GetType("System.String") ,"Convert(START_TIME, 'System.String')" ); // and clear the original list, and join the new lists together
m_dtResult.Columns.Add("DAYOFWEEK", System.Type.GetType("System.String")); if (chkMon.Checked || chkTue.Checked || chkWed.Checked || chkThu.Checked || chkFri.Checked || chkSat.Checked || chkSun.Checked)
m_dtResult.Columns.Add("ACCESSNAME", System.Type.GetType("System.String"));
DataRow drAT;
DateTime dt;
string sDOW;
int nAccessTypeID;
string sAccessType;
foreach (DataRow dr in m_dtResult.Rows)
{ {
dt = (DateTime) dr["START_TIME"];
sDOW = dt.DayOfWeek.ToString();
dr["DAYOFWEEK"] = sDOW;
if (dr["ACCESS_TYPE"].ToString() != "")
{
nAccessTypeID =Convert.ToInt16(dr["ACCESS_TYPE"].ToString());
drAT = m_dsGlobal.Tables["AccessTypes"].Rows.Find(nAccessTypeID);
if (drAT != null)
{
sAccessType = drAT["ACCESS_TYPE_NAME"].ToString();
dr["ACCESSNAME"] = sAccessType;
}
}
}
var lstMonday = new List<CGAvailability>();
var lstTuesday = new List<CGAvailability>();
var lstWednesday = new List<CGAvailability>();
var lstThursday = new List<CGAvailability>();
var lstFriday = new List<CGAvailability>();
var lstSaturday = new List<CGAvailability>();
var lstSunday = new List<CGAvailability>();
m_dvResult = new DataView(m_dtResult);
string sFilter = "(SLOTS > 0)";
if (m_sAmpm != "")
{
if (m_sAmpm == "AM")
sFilter = sFilter + " AND (AMPM LIKE '*AM*')";
if (m_sAmpm == "PM")
sFilter = sFilter + " AND (AMPM LIKE '*PM*')";
}
bool sOr = false;
if (m_sWeekDays != "")
{
sFilter += " AND (";
if (chkMon.Checked == true) if (chkMon.Checked == true)
{ {
sFilter = sFilter + "(DAYOFWEEK LIKE '*Monday*')"; lstMonday = (from av in lstResultantAvailabilities
sOr = true; where av.StartTime.DayOfWeek == DayOfWeek.Monday
select av).ToList<CGAvailability>();
} }
if (chkTue.Checked == true) if (chkTue.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstTuesday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Tuesday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Tuesday
sOr = true; select av).ToList<CGAvailability>();
} }
if (chkWed.Checked == true) if (chkWed.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstWednesday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Wednesday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Wednesday
sOr = true; select av).ToList<CGAvailability>();
} }
if (chkThu.Checked == true) if (chkThu.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstThursday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Thursday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Thursday
sOr = true; select av).ToList<CGAvailability>();
} }
if (chkFri.Checked == true) if (chkFri.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstFriday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Friday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Friday
sOr = true; select av).ToList<CGAvailability>();
} }
if (chkSat.Checked == true) if (chkSat.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstSaturday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Saturday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Saturday
sOr = true; select av).ToList<CGAvailability>();
} }
if (chkSun.Checked == true) if (chkSun.Checked == true)
{ {
sFilter = (sOr == true)?sFilter + " OR ":sFilter; lstSunday = (from av in lstResultantAvailabilities
sFilter = sFilter + "(DAYOFWEEK LIKE '*Sunday*')"; where av.StartTime.DayOfWeek == DayOfWeek.Sunday
sOr = true; select av).ToList<CGAvailability>();
}
sFilter += ")";
} }
if (m_alAccessTypes.Count > 0)
{ lstResultantAvailabilities.Clear();
sFilter += " AND ("; lstResultantAvailabilities.AddRange(lstMonday);
sOr = false; lstResultantAvailabilities.AddRange(lstTuesday);
foreach (string sType in m_alAccessTypes) lstResultantAvailabilities.AddRange(lstWednesday);
{ lstResultantAvailabilities.AddRange(lstThursday);
if (sOr == true) lstResultantAvailabilities.AddRange(lstFriday);
sFilter += " OR "; lstResultantAvailabilities.AddRange(lstSaturday);
sOr = true; lstResultantAvailabilities.AddRange(lstSunday);
sFilter += "(ACCESSNAME = '" + sType + "')";
} lstResultantAvailabilities.OrderBy(av => av.StartTime).ThenBy(av => av.ResourceList);
sFilter += ")";
} }
m_dvResult.RowFilter = sFilter;
this.grdResult.DataSource = m_dvResult;
#if DEBUG
System.Diagnostics.Debug.Write("LINQ took this long: " + stopwatch.ElapsedMilliseconds + "\n");
stopwatch = null;
#endif
//Then, convert the availabilities to ListViewItems
var items = (from item in lstResultantAvailabilities
let s = new string[] {item.AvailabilityType.ToString(), item.StartTime.ToShortDateString(), item.StartTime.DayOfWeek.ToString(),item.StartTime.ToShortTimeString() ,item.EndTime.ToShortTimeString() ,item.ResourceList,item.Slots.ToString(),item.AccessTypeName}
let lvItem = new ListViewItem(s)
select lvItem).ToArray<ListViewItem>();
//--Updating Listview
lstResults.BeginUpdate(); //tell listview to suspend drawing for now
lstResults.Items.Clear(); //empty it from old data
//if (items.Length == 0) lstResults.Items.Add(new ListViewItem(new string[] { "", "", "", "" , "", "No Slots found", "", "" })); // no results
if (items.Length > 0) lstResults.Items.AddRange(items); // add new data
lstResults.EndUpdate(); // ok done adding items, draw now.
//--End Update Listview
//We are done
this.Cursor = Cursors.Default;
} }
private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e) private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e)
@ -769,51 +905,65 @@ namespace IndianHealthService.ClinicalScheduling
private void grdResult_DoubleClick(object sender, System.EventArgs e) private void grdResult_DoubleClick(object sender, System.EventArgs e)
{ {
if (grdResult.DataSource == null) /*
if (lstResults.DataSource == null)
return; return;
DataGridCell dgCell; DataGridViewCell dgCell;
dgCell = this.grdResult.CurrentCell; dgCell = this.grdResult.CurrentCell;
dgCell.ColumnNumber = 2; this.m_sSelectedResource = grdResult.SelectedRows[0].Cells[2].ToString();
this.m_sSelectedResource = grdResult[dgCell.RowNumber, dgCell.ColumnNumber].ToString(); this.m_sSelectedDate = (DateTime)grdResult.SelectedRows[0].Cells[0].Value;
this.m_sSelectedDate = (DateTime) grdResult[dgCell.RowNumber,0];
this.DialogResult = DialogResult.OK; this.DialogResult = DialogResult.OK;
this.Close(); this.Close();
*/
} }
private void grdResult_CurrentCellChanged(object sender, System.EventArgs e) private void grdResult_CurrentCellChanged(object sender, System.EventArgs e)
{ {
DataGridCell dgCell; /*
DataGridViewCell dgCell;
dgCell = this.grdResult.CurrentCell; dgCell = this.grdResult.CurrentCell;
this.grdResult.Select(dgCell.RowNumber); */
}
/// <summary>
/// BAAAAAAAAAAAAAAAAAD. Use a shared method instead.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lstResults_DoubleClick(object sender, EventArgs e)
{
btnAccept_Click(sender, e);
}
private void btnAccept_Click(object sender, EventArgs e)
{
if (lstResults.SelectedIndices.Count == 0)
{
this.DialogResult = DialogResult.None;
return;
}
long availabilityKey = long.Parse(lstResults.SelectedItems[0].SubItems[0].Text);
_selectedAvailability = (from av in lstResultantAvailabilities
where av.AvailabilityType == availabilityKey
select av).Single<CGAvailability>();
this.DialogResult = DialogResult.OK;
} }
#endregion Event Handlers #endregion Event Handlers
#region Properties #region Properties
/// <summary>
/// Gets the resource selected by the user
/// </summary>
public string SelectedResource
{
get
{
return this.m_sSelectedResource;
}
}
/// <summary> /// <summary>
/// Gets the date selected by the user /// Gets the Availability Selected by the User in which to put an appointment
/// </summary> /// </summary>
public DateTime SelectedDate public CGAvailability SelectedAvailability
{ {
get get { return this._selectedAvailability; }
{
return this.m_sSelectedDate;
}
} }
#endregion Properties #endregion Properties
} }
} }

View File

@ -112,9 +112,9 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
</root> </root>

View File

@ -1,11 +1,7 @@
using System; using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms; using System.Windows.Forms;
using System.Data; using System.Data;
//using System.Data.OleDb;
using IndianHealthService.BMXNet;
namespace IndianHealthService.ClinicalScheduling namespace IndianHealthService.ClinicalScheduling
{ {