source: Scheduling/branches/Radiology-Support/cs/bsdx0200GUISourceCode/DApptSearch.cs@ 1168

Last change on this file since 1168 was 1168, checked in by Sam Habiel, 13 years ago

Lots of Documentation updates.
Absorption of all updates from trunk.
CGView: Changes in Appointment Menu; Handlers for these; Radiology Support
DRadExamSelect: Change in form design; auto print appointment slip implemented.

File size: 43.1 KB
Line 
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.Windows.Forms;
5using System.Data;
6using System.Linq;
7
8namespace IndianHealthService.ClinicalScheduling
9{
10 /// <summary>
11 /// Modal Dialog for searching for Patient Slots
12 /// </summary>
13 public class DApptSearch : System.Windows.Forms.Form
14 {
15 private System.Windows.Forms.Panel panel1;
16 private System.Windows.Forms.Button cmdCancel;
17 private System.Windows.Forms.Button btnAccept;
18 private System.Windows.Forms.Panel pnlDescription;
19 private System.Windows.Forms.GroupBox grpDescription;
20 private System.Windows.Forms.Label lblDescription;
21 private System.Windows.Forms.GroupBox groupBox1;
22 private System.Windows.Forms.Label label3;
23 private System.Windows.Forms.Label label2;
24 private System.Windows.Forms.CheckedListBox lstAccessTypes;
25 private System.Windows.Forms.ComboBox cboAccessTypeFilter;
26 private System.Windows.Forms.GroupBox grpDayOfWeek;
27 private System.Windows.Forms.CheckBox chkSun;
28 private System.Windows.Forms.CheckBox chkSat;
29 private System.Windows.Forms.CheckBox chkFri;
30 private System.Windows.Forms.CheckBox chkThu;
31 private System.Windows.Forms.CheckBox chkWed;
32 private System.Windows.Forms.CheckBox chkTue;
33 private System.Windows.Forms.CheckBox chkMon;
34 private System.Windows.Forms.GroupBox grpTimeOfDay;
35 private System.Windows.Forms.RadioButton rdoBoth;
36 private System.Windows.Forms.RadioButton rdoPM;
37 private System.Windows.Forms.RadioButton rdoAM;
38 private System.Windows.Forms.Label label1;
39 private System.Windows.Forms.GroupBox groupBox2;
40 private System.Windows.Forms.Button cmdSearch;
41 private ListView lstResults;
42 private ColumnHeader colStartTime;
43 private ColumnHeader colEndTime;
44 private ColumnHeader colResource;
45 private ColumnHeader colSlots;
46 private ColumnHeader colAccessType;
47 private ColumnHeader colDate;
48 private Label lblEnd;
49 private Label lblStart;
50 private DateTimePicker dtEnd;
51 private DateTimePicker dtStart;
52 private ColumnHeader colDOW;
53 private ColumnHeader colID;
54 private Label lblMessage;
55
56 private System.ComponentModel.IContainer components;
57
58 public DApptSearch()
59 {
60 InitializeComponent();
61 }
62
63 #region Fields
64
65 private CGDocumentManager m_DocManager;
66
67 private DataSet m_dsGlobal;
68 DataTable m_dtTypes;
69 DataView m_dvTypes;
70 List<CGAvailability> lstResultantAvailabilities;
71 private CGAvailability _selectedAvailability;
72 DateTime m_dStart;
73 DateTime m_dEnd;
74 ArrayList m_alResources;
75 ArrayList m_alAccessTypes;
76 string m_sWeekDays; //only practical use now is for sending to server
77 string m_sAmpm; // same here.
78
79 #endregion Fields
80
81 #region Methods
82
83 public void LoadListBox(string sGroup)
84 {
85 if (sGroup == "ALL")
86 {
87 //Load the Access Type list box with ALL access types
88 m_dtTypes = m_dsGlobal.Tables["AccessTypes"];
89 m_dvTypes = new DataView(m_dtTypes);
90 lstAccessTypes.DataSource = m_dvTypes;
91 lstAccessTypes.DisplayMember = "ACCESS_TYPE_NAME";
92 lstAccessTypes.Tag = 1; //This holds the column index of the ACCESS_TYPE_NAME column
93 lstAccessTypes.ValueMember = "BMXIEN";
94 }
95 else
96 {
97 //Load the Access Type list box with active access types belonging
98 //to group sGroup
99
100 //Build AccessGroup table containing *active* AccessTypes and their Groups
101 m_dtTypes = m_dsGlobal.Tables["AccessGroupType"];
102 //Create a view that is filterable on Access Group
103 m_dvTypes = new DataView(m_dtTypes);
104 m_dvTypes.RowFilter = "ACCESS_GROUP = '" + this.cboAccessTypeFilter.Text + "'";
105 lstAccessTypes.DataSource = m_dvTypes;
106 lstAccessTypes.DisplayMember = "ACCESS_TYPE";
107 lstAccessTypes.ValueMember = "ACCESS_TYPE_ID";
108 lstAccessTypes.Tag = 4; //This holds the column index of the ACCESS_TYPE column
109 }
110 }
111
112 public void InitializePage(ArrayList alResources, CGDocumentManager docManager)
113 {
114
115 this.Text = "Searching for available slots in: " + string.Join(" | ", alResources.Cast<string>());
116
117 this.m_DocManager = docManager;
118 this.m_dsGlobal = m_DocManager.GlobalDataSet;
119
120 LoadListBox("ALL");
121
122 m_dStart = DateTime.Today;
123 m_dEnd = new DateTime(9999);
124 this.m_alResources = alResources;
125 this.m_alAccessTypes = new ArrayList();
126 this.m_sAmpm="both";
127 this.m_sWeekDays = "";
128
129 //Load filter combo with list of access type groups
130 DataTable dtGroup = m_dsGlobal.Tables["AccessGroup"];
131 DataSet dsTemp = new DataSet("dsTemp");
132 dsTemp.Tables.Add(dtGroup.Copy());
133 DataTable dtTemp = dsTemp.Tables["AccessGroup"];
134 DataView dvGroup = new DataView(dtTemp);
135 DataRowView drv = dvGroup.AddNew();
136 drv["ACCESS_GROUP"]="<Show All Access Types>";
137 cboAccessTypeFilter.DataSource = dvGroup;
138 cboAccessTypeFilter.DisplayMember = "ACCESS_GROUP";
139 cboAccessTypeFilter.SelectedText = "<Show All Access Types>";
140 cboAccessTypeFilter.SelectedIndex = cboAccessTypeFilter.Items.Count - 1;
141 cboAccessTypeFilter.Refresh();
142
143
144 /* OLD CODE
145 //Create DataGridTableStyle for Result grid
146 DataGridTableStyle tsResult = new DataGridTableStyle();
147 tsResult.MappingName = "Result";
148 tsResult.ReadOnly = true;
149
150 // Add START_TIME column style.
151 DataGridTextBoxColumn colStartTime = new DataGridTextBoxColumn();
152 colStartTime.MappingName = "StartTime";
153 colStartTime.HeaderText = "Start Time";
154 colStartTime.Width = 200;
155 colStartTime.Format = "f";
156 tsResult.GridColumnStyles.Add(colStartTime);
157
158 // Add END_TIME column style.
159 DataGridTextBoxColumn colEndTime = new DataGridTextBoxColumn();
160 colEndTime.MappingName = "EndTime";
161 colEndTime.HeaderText = "End Time";
162 colEndTime.Width = 75;
163 colEndTime.Format = "h:mm tt";
164 tsResult.GridColumnStyles.Add(colEndTime);
165
166 // Add RESOURCE column style.
167 DataGridTextBoxColumn colResource = new DataGridTextBoxColumn();
168 colResource.MappingName = "ResourceList";
169 colResource.HeaderText = "Resource";
170 colResource.Width = 200;
171 tsResult.GridColumnStyles.Add(colResource);
172
173 // Add SLOTS column style.
174 DataGridTextBoxColumn colSlots = new DataGridTextBoxColumn();
175 colSlots.MappingName = "SLOTS";
176 colSlots.HeaderText = "Slots";
177 colSlots.Width = 50;
178 tsResult.GridColumnStyles.Add(colSlots);
179
180 // Add AMPM column style.
181 DataGridTextBoxColumn colAccess = new DataGridTextBoxColumn();
182 colAccess.MappingName = "ACCESSNAME";
183 colAccess.HeaderText = "Access Type";
184 colAccess.Width = 200;
185 tsResult.GridColumnStyles.Add(colAccess);
186 //grdResult.TableStyles.Add(tsResult);
187 */
188
189 this.UpdateDialogData(true);
190
191 }
192
193 /// <summary>
194 /// If b is true, moves member vars into control data
195 /// otherwise, moves control data into member vars
196 /// </summary>
197 /// <param name="b"></param>
198 private void UpdateDialogData(bool b)
199 {
200 if (b == true) //move member vars into controls
201 {
202
203 }
204 else //move control data into member vars
205 {
206
207 //Build AccessType list
208
209 this.m_alAccessTypes.Clear();
210
211 for (int j = 0; j < this.lstAccessTypes.CheckedItems.Count; j++)
212 {
213 DataRowView drv = (DataRowView) lstAccessTypes.CheckedItems[j];
214 int nIndex = (int) lstAccessTypes.Tag;
215 string sItem = drv.Row.ItemArray[nIndex].ToString();
216 m_alAccessTypes.Add(sItem);
217 }
218
219 //AM/PM
220 this.m_sAmpm = (this.rdoAM.Checked == true) ? "AM":"BOTH";
221 if (this.m_sAmpm != "AM")
222 this.m_sAmpm = (this.rdoPM.Checked == true) ? "PM":"BOTH";
223
224
225 //Weekday
226 this.m_sWeekDays = ""; //any
227 if (chkMon.Checked == true)
228 m_sWeekDays += "Monday";
229 if (chkTue.Checked == true)
230 m_sWeekDays += "Tuesday";
231 if (chkWed.Checked == true)
232 m_sWeekDays += "Wednesday";
233 if (chkThu.Checked == true)
234 m_sWeekDays += "Thursday";
235 if (chkFri.Checked == true)
236 m_sWeekDays += "Friday";
237 if (chkSat.Checked == true)
238 m_sWeekDays += "Saturday";
239 if (chkSun.Checked == true)
240 m_sWeekDays += "Sunday";
241
242 //Start
243 this.m_dStart = this.dtStart.Value;
244
245 //End
246 this.m_dEnd = this.dtEnd.Value;
247 }
248 }
249
250
251 /// <summary>
252 /// Clean up any resources being used.
253 /// </summary>
254 protected override void Dispose( bool disposing )
255 {
256 if( disposing )
257 {
258 if(components != null)
259 {
260 components.Dispose();
261 }
262 }
263 base.Dispose( disposing );
264 }
265
266 #endregion Methods
267
268 #region Windows Form Designer generated code
269 /// <summary>
270 /// Required method for Designer support - do not modify
271 /// the contents of this method with the code editor.
272 /// </summary>
273 private void InitializeComponent()
274 {
275 this.panel1 = new System.Windows.Forms.Panel();
276 this.lblMessage = new System.Windows.Forms.Label();
277 this.cmdSearch = new System.Windows.Forms.Button();
278 this.cmdCancel = new System.Windows.Forms.Button();
279 this.btnAccept = new System.Windows.Forms.Button();
280 this.pnlDescription = new System.Windows.Forms.Panel();
281 this.grpDescription = new System.Windows.Forms.GroupBox();
282 this.lblDescription = new System.Windows.Forms.Label();
283 this.groupBox1 = new System.Windows.Forms.GroupBox();
284 this.lblEnd = new System.Windows.Forms.Label();
285 this.lblStart = new System.Windows.Forms.Label();
286 this.dtEnd = new System.Windows.Forms.DateTimePicker();
287 this.dtStart = new System.Windows.Forms.DateTimePicker();
288 this.label3 = new System.Windows.Forms.Label();
289 this.label2 = new System.Windows.Forms.Label();
290 this.lstAccessTypes = new System.Windows.Forms.CheckedListBox();
291 this.cboAccessTypeFilter = new System.Windows.Forms.ComboBox();
292 this.grpDayOfWeek = new System.Windows.Forms.GroupBox();
293 this.chkSun = new System.Windows.Forms.CheckBox();
294 this.chkSat = new System.Windows.Forms.CheckBox();
295 this.chkFri = new System.Windows.Forms.CheckBox();
296 this.chkThu = new System.Windows.Forms.CheckBox();
297 this.chkWed = new System.Windows.Forms.CheckBox();
298 this.chkTue = new System.Windows.Forms.CheckBox();
299 this.chkMon = new System.Windows.Forms.CheckBox();
300 this.grpTimeOfDay = new System.Windows.Forms.GroupBox();
301 this.rdoBoth = new System.Windows.Forms.RadioButton();
302 this.rdoPM = new System.Windows.Forms.RadioButton();
303 this.rdoAM = new System.Windows.Forms.RadioButton();
304 this.label1 = new System.Windows.Forms.Label();
305 this.groupBox2 = new System.Windows.Forms.GroupBox();
306 this.lstResults = new System.Windows.Forms.ListView();
307 this.colID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
308 this.colDate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
309 this.colDOW = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
310 this.colStartTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
311 this.colEndTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
312 this.colResource = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
313 this.colSlots = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
314 this.colAccessType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
315 this.panel1.SuspendLayout();
316 this.pnlDescription.SuspendLayout();
317 this.grpDescription.SuspendLayout();
318 this.groupBox1.SuspendLayout();
319 this.grpDayOfWeek.SuspendLayout();
320 this.grpTimeOfDay.SuspendLayout();
321 this.groupBox2.SuspendLayout();
322 this.SuspendLayout();
323 //
324 // panel1
325 //
326 this.panel1.Controls.Add(this.lblMessage);
327 this.panel1.Controls.Add(this.cmdSearch);
328 this.panel1.Controls.Add(this.cmdCancel);
329 this.panel1.Controls.Add(this.btnAccept);
330 this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
331 this.panel1.Location = new System.Drawing.Point(0, 461);
332 this.panel1.Name = "panel1";
333 this.panel1.Size = new System.Drawing.Size(923, 40);
334 this.panel1.TabIndex = 4;
335 //
336 // lblMessage
337 //
338 this.lblMessage.AutoSize = true;
339 this.lblMessage.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
340 this.lblMessage.ForeColor = System.Drawing.Color.Red;
341 this.lblMessage.Location = new System.Drawing.Point(337, 16);
342 this.lblMessage.Name = "lblMessage";
343 this.lblMessage.Size = new System.Drawing.Size(0, 16);
344 this.lblMessage.TabIndex = 3;
345 //
346 // cmdSearch
347 //
348 this.cmdSearch.Location = new System.Drawing.Point(33, 6);
349 this.cmdSearch.Name = "cmdSearch";
350 this.cmdSearch.Size = new System.Drawing.Size(72, 24);
351 this.cmdSearch.TabIndex = 2;
352 this.cmdSearch.Text = "Search";
353 this.cmdSearch.Click += new System.EventHandler(this.cmdSearch_Click);
354 //
355 // cmdCancel
356 //
357 this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
358 this.cmdCancel.Location = new System.Drawing.Point(828, 8);
359 this.cmdCancel.Name = "cmdCancel";
360 this.cmdCancel.Size = new System.Drawing.Size(64, 24);
361 this.cmdCancel.TabIndex = 1;
362 this.cmdCancel.Text = "Cancel";
363 //
364 // btnAccept
365 //
366 this.btnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;
367 this.btnAccept.Location = new System.Drawing.Point(135, 8);
368 this.btnAccept.Name = "btnAccept";
369 this.btnAccept.Size = new System.Drawing.Size(176, 24);
370 this.btnAccept.TabIndex = 0;
371 this.btnAccept.Text = "Select Slot for Appointment";
372 this.btnAccept.Click += new System.EventHandler(this.btnAccept_Click);
373 //
374 // pnlDescription
375 //
376 this.pnlDescription.Controls.Add(this.grpDescription);
377 this.pnlDescription.Dock = System.Windows.Forms.DockStyle.Bottom;
378 this.pnlDescription.Location = new System.Drawing.Point(0, 397);
379 this.pnlDescription.Name = "pnlDescription";
380 this.pnlDescription.Size = new System.Drawing.Size(923, 64);
381 this.pnlDescription.TabIndex = 47;
382 //
383 // grpDescription
384 //
385 this.grpDescription.Controls.Add(this.lblDescription);
386 this.grpDescription.Dock = System.Windows.Forms.DockStyle.Fill;
387 this.grpDescription.Location = new System.Drawing.Point(0, 0);
388 this.grpDescription.Name = "grpDescription";
389 this.grpDescription.Size = new System.Drawing.Size(923, 64);
390 this.grpDescription.TabIndex = 0;
391 this.grpDescription.TabStop = false;
392 this.grpDescription.Text = "Description";
393 //
394 // lblDescription
395 //
396 this.lblDescription.Dock = System.Windows.Forms.DockStyle.Fill;
397 this.lblDescription.Location = new System.Drawing.Point(3, 16);
398 this.lblDescription.Name = "lblDescription";
399 this.lblDescription.Size = new System.Drawing.Size(917, 45);
400 this.lblDescription.TabIndex = 1;
401 this.lblDescription.Text = "Search for available slots times using this panel. You may narrow your search by" +
402 " selecting an access type or by selecting specific days of the week or times of " +
403 "day.";
404 //
405 // groupBox1
406 //
407 this.groupBox1.Controls.Add(this.lblEnd);
408 this.groupBox1.Controls.Add(this.lblStart);
409 this.groupBox1.Controls.Add(this.dtEnd);
410 this.groupBox1.Controls.Add(this.dtStart);
411 this.groupBox1.Controls.Add(this.label3);
412 this.groupBox1.Controls.Add(this.label2);
413 this.groupBox1.Controls.Add(this.lstAccessTypes);
414 this.groupBox1.Controls.Add(this.cboAccessTypeFilter);
415 this.groupBox1.Controls.Add(this.grpDayOfWeek);
416 this.groupBox1.Controls.Add(this.grpTimeOfDay);
417 this.groupBox1.Controls.Add(this.label1);
418 this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
419 this.groupBox1.Location = new System.Drawing.Point(0, 0);
420 this.groupBox1.Name = "groupBox1";
421 this.groupBox1.Size = new System.Drawing.Size(923, 208);
422 this.groupBox1.TabIndex = 56;
423 this.groupBox1.TabStop = false;
424 this.groupBox1.Text = "Search Parameters";
425 //
426 // lblEnd
427 //
428 this.lblEnd.AutoSize = true;
429 this.lblEnd.Location = new System.Drawing.Point(12, 124);
430 this.lblEnd.Name = "lblEnd";
431 this.lblEnd.Size = new System.Drawing.Size(153, 13);
432 this.lblEnd.TabIndex = 67;
433 this.lblEnd.Text = "End Date to Search (Inclusive)";
434 //
435 // lblStart
436 //
437 this.lblStart.AutoSize = true;
438 this.lblStart.Location = new System.Drawing.Point(12, 35);
439 this.lblStart.Name = "lblStart";
440 this.lblStart.Size = new System.Drawing.Size(159, 13);
441 this.lblStart.TabIndex = 66;
442 this.lblStart.Text = "Start Date to Search (Inclusive)";
443 //
444 // dtEnd
445 //
446 this.dtEnd.Location = new System.Drawing.Point(12, 141);
447 this.dtEnd.Name = "dtEnd";
448 this.dtEnd.Size = new System.Drawing.Size(200, 20);
449 this.dtEnd.TabIndex = 65;
450 this.dtEnd.ValueChanged += new System.EventHandler(this.dtEnd_ValueChanged);
451 //
452 // dtStart
453 //
454 this.dtStart.Location = new System.Drawing.Point(12, 54);
455 this.dtStart.Name = "dtStart";
456 this.dtStart.Size = new System.Drawing.Size(200, 20);
457 this.dtStart.TabIndex = 64;
458 this.dtStart.ValueChanged += new System.EventHandler(this.dtStart_ValueChanged);
459 //
460 // label3
461 //
462 this.label3.Location = new System.Drawing.Point(684, 64);
463 this.label3.Name = "label3";
464 this.label3.Size = new System.Drawing.Size(80, 16);
465 this.label3.TabIndex = 63;
466 this.label3.Text = "Access Type:";
467 //
468 // label2
469 //
470 this.label2.Location = new System.Drawing.Point(684, 21);
471 this.label2.Name = "label2";
472 this.label2.Size = new System.Drawing.Size(104, 16);
473 this.label2.TabIndex = 62;
474 this.label2.Text = "Access Group:";
475 //
476 // lstAccessTypes
477 //
478 this.lstAccessTypes.CheckOnClick = true;
479 this.lstAccessTypes.HorizontalScrollbar = true;
480 this.lstAccessTypes.Location = new System.Drawing.Point(661, 88);
481 this.lstAccessTypes.MultiColumn = true;
482 this.lstAccessTypes.Name = "lstAccessTypes";
483 this.lstAccessTypes.Size = new System.Drawing.Size(250, 109);
484 this.lstAccessTypes.TabIndex = 61;
485 //
486 // cboAccessTypeFilter
487 //
488 this.cboAccessTypeFilter.Location = new System.Drawing.Point(661, 40);
489 this.cboAccessTypeFilter.Name = "cboAccessTypeFilter";
490 this.cboAccessTypeFilter.Size = new System.Drawing.Size(250, 21);
491 this.cboAccessTypeFilter.TabIndex = 60;
492 this.cboAccessTypeFilter.Text = "cboAccessTypeFilter";
493 this.cboAccessTypeFilter.SelectionChangeCommitted += new System.EventHandler(this.cboAccessTypeFilter_SelectionChangeCommitted);
494 //
495 // grpDayOfWeek
496 //
497 this.grpDayOfWeek.Controls.Add(this.chkSun);
498 this.grpDayOfWeek.Controls.Add(this.chkSat);
499 this.grpDayOfWeek.Controls.Add(this.chkFri);
500 this.grpDayOfWeek.Controls.Add(this.chkThu);
501 this.grpDayOfWeek.Controls.Add(this.chkWed);
502 this.grpDayOfWeek.Controls.Add(this.chkTue);
503 this.grpDayOfWeek.Controls.Add(this.chkMon);
504 this.grpDayOfWeek.Location = new System.Drawing.Point(311, 94);
505 this.grpDayOfWeek.Name = "grpDayOfWeek";
506 this.grpDayOfWeek.Size = new System.Drawing.Size(240, 101);
507 this.grpDayOfWeek.TabIndex = 59;
508 this.grpDayOfWeek.TabStop = false;
509 this.grpDayOfWeek.Text = "Day of the Week";
510 //
511 // chkSun
512 //
513 this.chkSun.Location = new System.Drawing.Point(176, 64);
514 this.chkSun.Name = "chkSun";
515 this.chkSun.Size = new System.Drawing.Size(48, 16);
516 this.chkSun.TabIndex = 6;
517 this.chkSun.Text = "Sun";
518 //
519 // chkSat
520 //
521 this.chkSat.Location = new System.Drawing.Point(128, 64);
522 this.chkSat.Name = "chkSat";
523 this.chkSat.Size = new System.Drawing.Size(48, 16);
524 this.chkSat.TabIndex = 5;
525 this.chkSat.Text = "Sat";
526 //
527 // chkFri
528 //
529 this.chkFri.Location = new System.Drawing.Point(72, 64);
530 this.chkFri.Name = "chkFri";
531 this.chkFri.Size = new System.Drawing.Size(48, 16);
532 this.chkFri.TabIndex = 4;
533 this.chkFri.Text = "Fri";
534 //
535 // chkThu
536 //
537 this.chkThu.Location = new System.Drawing.Point(16, 64);
538 this.chkThu.Name = "chkThu";
539 this.chkThu.Size = new System.Drawing.Size(48, 16);
540 this.chkThu.TabIndex = 3;
541 this.chkThu.Text = "Thu";
542 //
543 // chkWed
544 //
545 this.chkWed.Location = new System.Drawing.Point(128, 32);
546 this.chkWed.Name = "chkWed";
547 this.chkWed.Size = new System.Drawing.Size(48, 16);
548 this.chkWed.TabIndex = 2;
549 this.chkWed.Text = "Wed";
550 //
551 // chkTue
552 //
553 this.chkTue.Location = new System.Drawing.Point(72, 32);
554 this.chkTue.Name = "chkTue";
555 this.chkTue.Size = new System.Drawing.Size(48, 16);
556 this.chkTue.TabIndex = 1;
557 this.chkTue.Text = "Tue";
558 //
559 // chkMon
560 //
561 this.chkMon.Location = new System.Drawing.Point(16, 32);
562 this.chkMon.Name = "chkMon";
563 this.chkMon.Size = new System.Drawing.Size(48, 16);
564 this.chkMon.TabIndex = 0;
565 this.chkMon.Text = "Mon";
566 //
567 // grpTimeOfDay
568 //
569 this.grpTimeOfDay.Controls.Add(this.rdoBoth);
570 this.grpTimeOfDay.Controls.Add(this.rdoPM);
571 this.grpTimeOfDay.Controls.Add(this.rdoAM);
572 this.grpTimeOfDay.Location = new System.Drawing.Point(311, 32);
573 this.grpTimeOfDay.Name = "grpTimeOfDay";
574 this.grpTimeOfDay.Size = new System.Drawing.Size(240, 48);
575 this.grpTimeOfDay.TabIndex = 58;
576 this.grpTimeOfDay.TabStop = false;
577 this.grpTimeOfDay.Text = "Time of Day";
578 //
579 // rdoBoth
580 //
581 this.rdoBoth.Checked = true;
582 this.rdoBoth.Location = new System.Drawing.Point(176, 24);
583 this.rdoBoth.Name = "rdoBoth";
584 this.rdoBoth.Size = new System.Drawing.Size(48, 16);
585 this.rdoBoth.TabIndex = 2;
586 this.rdoBoth.TabStop = true;
587 this.rdoBoth.Text = "Both";
588 //
589 // rdoPM
590 //
591 this.rdoPM.Location = new System.Drawing.Point(96, 24);
592 this.rdoPM.Name = "rdoPM";
593 this.rdoPM.Size = new System.Drawing.Size(72, 16);
594 this.rdoPM.TabIndex = 1;
595 this.rdoPM.Text = "PM Only";
596 //
597 // rdoAM
598 //
599 this.rdoAM.Location = new System.Drawing.Point(16, 24);
600 this.rdoAM.Name = "rdoAM";
601 this.rdoAM.Size = new System.Drawing.Size(72, 16);
602 this.rdoAM.TabIndex = 0;
603 this.rdoAM.Text = "AM Only";
604 //
605 // label1
606 //
607 this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
608 this.label1.Location = new System.Drawing.Point(6, 16);
609 this.label1.Name = "label1";
610 this.label1.Size = new System.Drawing.Size(136, 16);
611 this.label1.TabIndex = 57;
612 this.label1.Text = "Date Range:";
613 //
614 // groupBox2
615 //
616 this.groupBox2.Controls.Add(this.lstResults);
617 this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
618 this.groupBox2.Location = new System.Drawing.Point(0, 208);
619 this.groupBox2.Name = "groupBox2";
620 this.groupBox2.Size = new System.Drawing.Size(923, 189);
621 this.groupBox2.TabIndex = 57;
622 this.groupBox2.TabStop = false;
623 this.groupBox2.Text = "Search Result";
624 //
625 // lstResults
626 //
627 this.lstResults.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
628 this.colID,
629 this.colDate,
630 this.colDOW,
631 this.colStartTime,
632 this.colEndTime,
633 this.colResource,
634 this.colSlots,
635 this.colAccessType});
636 this.lstResults.Dock = System.Windows.Forms.DockStyle.Fill;
637 this.lstResults.FullRowSelect = true;
638 this.lstResults.GridLines = true;
639 this.lstResults.Location = new System.Drawing.Point(3, 16);
640 this.lstResults.MultiSelect = false;
641 this.lstResults.Name = "lstResults";
642 this.lstResults.Size = new System.Drawing.Size(917, 170);
643 this.lstResults.TabIndex = 0;
644 this.lstResults.UseCompatibleStateImageBehavior = false;
645 this.lstResults.View = System.Windows.Forms.View.Details;
646 this.lstResults.DoubleClick += new System.EventHandler(this.lstResults_DoubleClick);
647 //
648 // colID
649 //
650 this.colID.Text = "ID";
651 this.colID.Width = 0;
652 //
653 // colDate
654 //
655 this.colDate.Text = "Date";
656 this.colDate.Width = 91;
657 //
658 // colDOW
659 //
660 this.colDOW.Text = "Day of Week";
661 this.colDOW.Width = 80;
662 //
663 // colStartTime
664 //
665 this.colStartTime.Text = "Start Time";
666 this.colStartTime.Width = 87;
667 //
668 // colEndTime
669 //
670 this.colEndTime.Text = "End Time";
671 this.colEndTime.Width = 116;
672 //
673 // colResource
674 //
675 this.colResource.Text = "Resource";
676 this.colResource.Width = 370;
677 //
678 // colSlots
679 //
680 this.colSlots.Text = "Slots";
681 this.colSlots.Width = 47;
682 //
683 // colAccessType
684 //
685 this.colAccessType.Text = "Access Type";
686 this.colAccessType.Width = 101;
687 //
688 // DApptSearch
689 //
690 this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
691 this.CancelButton = this.cmdCancel;
692 this.ClientSize = new System.Drawing.Size(923, 501);
693 this.Controls.Add(this.groupBox2);
694 this.Controls.Add(this.groupBox1);
695 this.Controls.Add(this.pnlDescription);
696 this.Controls.Add(this.panel1);
697 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
698 this.Name = "DApptSearch";
699 this.Text = "Find Clinic Availability";
700 this.panel1.ResumeLayout(false);
701 this.panel1.PerformLayout();
702 this.pnlDescription.ResumeLayout(false);
703 this.grpDescription.ResumeLayout(false);
704 this.groupBox1.ResumeLayout(false);
705 this.groupBox1.PerformLayout();
706 this.grpDayOfWeek.ResumeLayout(false);
707 this.grpTimeOfDay.ResumeLayout(false);
708 this.groupBox2.ResumeLayout(false);
709 this.ResumeLayout(false);
710
711 }
712 #endregion
713
714 #region Event Handlers
715
716 private void cmdSearch_Click(object sender, System.EventArgs e)
717 {
718 //Tell user we are processing
719 this.Cursor = Cursors.WaitCursor;
720 this.lblMessage.Text = String.Empty;
721
722 //Get the control data into local vars
723 UpdateDialogData(false);
724 //Resource array, Begin date, Access type array, MTWTF , AM PM
725
726 //Get Availabilities and Appointments from the DB
727 //NB: m_sAmpm and m_sWeekDays don't have an effect on the M side side right now
728 m_dStart = m_dStart.Date; // move to 1200
729 m_dEnd = m_dEnd.Date.AddHours(23).AddMinutes(59).AddSeconds(59); //move to 235959
730 string sSearchInfo = "1|" + m_sAmpm + "|" + m_sWeekDays;
731 DataTable m_availTable = CGSchedLib.CreateAvailabilitySchedule(m_DocManager, m_alResources, m_dStart, m_dEnd, m_alAccessTypes, ScheduleType.Resource, sSearchInfo);
732 DataTable m_apptTable = CGSchedLib.CreateAppointmentSchedule(m_DocManager, m_alResources, m_dStart, m_dEnd);
733
734#if DEBUG
735 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
736 stopwatch.Start();
737#endif
738 lstResultantAvailabilities = (from rowAV in m_availTable.AsEnumerable()
739
740 // Calculate the number of slots consumed in this availability by appointments
741 let slotsConsumed = (from appt in m_apptTable.AsEnumerable()
742 //If the resource is the same and the user selection overlaps, then...
743 where (rowAV.Field<string>("RESOURCE") == appt.Field<string>("RESOURCENAME")
744 && CalendarGrid.TimesOverlap(rowAV.Field<DateTime>("START_TIME"), rowAV.Field<DateTime>("END_TIME"), appt.Field<DateTime>("START_TIME"), appt.Field<DateTime>("END_TIME")))
745 // if appt starttime is before avail start time, only count against the avail starting from the availability start time
746 let startTimeToCountAgainstBlock = appt.Field<DateTime>("START_TIME") < rowAV.Field<DateTime>("START_TIME") ? rowAV.Field<DateTime>("START_TIME") : appt.Field<DateTime>("START_TIME")
747 // if appt endtime is after the avail ends, only count against the avail up to where the avail ends
748 let endTimeToCountAgainstBlock = appt.Field<DateTime>("END_TIME") > rowAV.Field<DateTime>("END_TIME") ? rowAV.Field<DateTime>("END_TIME") : appt.Field<DateTime>("END_TIME")
749 // theoretical minutes per slot for the availability
750 let minPerSlot = (rowAV.Field<DateTime>("END_TIME") - rowAV.Field<DateTime>("START_TIME")).TotalMinutes / rowAV.Field<int>("SLOTS")
751 // how many minutes does this appointment take away from the slot
752 let minPerAppt = (endTimeToCountAgainstBlock - startTimeToCountAgainstBlock).TotalMinutes
753 // how many slots the appointment takes up using this availability's scale
754 let slotsConsumed = minPerAppt / minPerSlot
755 select slotsConsumed).Sum()
756
757 // Subtract the number consumed from the original ones
758 let slotsLeft = (float)rowAV.Field<int>("SLOTS") - slotsConsumed
759 // filter by that value if it is at least one slot
760 where slotsLeft >= 1
761 // Sort by Start Time, then by Resource Name
762 orderby rowAV.Field<DateTime>("START_TIME"), rowAV.Field<string>("RESOURCE")
763 //return as a CGAvailability
764 select new CGAvailability
765 {
766 ResourceList = rowAV.Field<string>("RESOURCE"),
767 StartTime = rowAV.Field<DateTime>("START_TIME"),
768 EndTime = rowAV.Field<DateTime>("END_TIME"),
769 Slots = (int)slotsLeft,
770 // AccessTypeName is grabbed from the Access Type Table using a psuedojoin syntax.
771 // "ACCESS_TYPE" is the IEN of the AcceesType.
772 // Single or default is b/c we are expecting one result.
773 AccessTypeName = (from at in m_dsGlobal.Tables["AccessTypes"].AsEnumerable()
774 where at.Field<int>("BMXIEN")==Int32.Parse(rowAV.Field<string>("ACCESS_TYPE"))
775 select at.Field<string>("ACCESS_TYPE_NAME")).SingleOrDefault<string>(),
776 AvailabilityType = rowAV.Field<int>("AVAILABILITYID")
777 })
778 // convert to Generic List
779 .ToList<CGAvailability>();
780
781 // if specific access types are chosen, filter the results based on a join against them.
782 if (m_alAccessTypes.Count > 0)
783 lstResultantAvailabilities = (from av in lstResultantAvailabilities
784 join at in m_alAccessTypes.Cast<string>() on av.AccessTypeName equals at
785 select av).ToList<CGAvailability>();
786
787 // if user chose AM radio button, get morning appointments
788 // TimeSpan.FromHours(12) gets the number of ticks since Midnight
789 if (rdoAM.Checked) // less than 12 pm
790 {
791 lstResultantAvailabilities = (from av in lstResultantAvailabilities
792 where av.StartTime.TimeOfDay < TimeSpan.FromHours(12)
793 select av).ToList<CGAvailability>();
794 }
795 // if user chose PM radio button, get morning appointments
796 if (rdoPM.Checked) // after or equal to 12 pm
797 {
798 lstResultantAvailabilities = (from av in lstResultantAvailabilities
799 where av.StartTime.TimeOfDay >= TimeSpan.FromHours(12)
800 select av).ToList<CGAvailability>();
801 }
802
803 // if any of the days of week are checked, create a new list based on them
804 // and clear the original list, and join the new lists together
805 if (chkMon.Checked || chkTue.Checked || chkWed.Checked || chkThu.Checked || chkFri.Checked || chkSat.Checked || chkSun.Checked)
806 {
807
808 var lstMonday = new List<CGAvailability>();
809 var lstTuesday = new List<CGAvailability>();
810 var lstWednesday = new List<CGAvailability>();
811 var lstThursday = new List<CGAvailability>();
812 var lstFriday = new List<CGAvailability>();
813 var lstSaturday = new List<CGAvailability>();
814 var lstSunday = new List<CGAvailability>();
815
816 if (chkMon.Checked == true)
817 {
818 lstMonday = (from av in lstResultantAvailabilities
819 where av.StartTime.DayOfWeek == DayOfWeek.Monday
820 select av).ToList<CGAvailability>();
821 }
822
823 if (chkTue.Checked == true)
824 {
825 lstTuesday = (from av in lstResultantAvailabilities
826 where av.StartTime.DayOfWeek == DayOfWeek.Tuesday
827 select av).ToList<CGAvailability>();
828 }
829
830 if (chkWed.Checked == true)
831 {
832 lstWednesday = (from av in lstResultantAvailabilities
833 where av.StartTime.DayOfWeek == DayOfWeek.Wednesday
834 select av).ToList<CGAvailability>();
835
836 }
837
838 if (chkThu.Checked == true)
839 {
840 lstThursday = (from av in lstResultantAvailabilities
841 where av.StartTime.DayOfWeek == DayOfWeek.Thursday
842 select av).ToList<CGAvailability>();
843
844 }
845
846 if (chkFri.Checked == true)
847 {
848 lstFriday = (from av in lstResultantAvailabilities
849 where av.StartTime.DayOfWeek == DayOfWeek.Friday
850 select av).ToList<CGAvailability>();
851 }
852
853 if (chkSat.Checked == true)
854 {
855 lstSaturday = (from av in lstResultantAvailabilities
856 where av.StartTime.DayOfWeek == DayOfWeek.Saturday
857 select av).ToList<CGAvailability>();
858
859 }
860
861 if (chkSun.Checked == true)
862 {
863 lstSunday = (from av in lstResultantAvailabilities
864 where av.StartTime.DayOfWeek == DayOfWeek.Sunday
865 select av).ToList<CGAvailability>();
866
867 }
868
869
870 lstResultantAvailabilities.Clear();
871 lstResultantAvailabilities.AddRange(lstMonday);
872 lstResultantAvailabilities.AddRange(lstTuesday);
873 lstResultantAvailabilities.AddRange(lstWednesday);
874 lstResultantAvailabilities.AddRange(lstThursday);
875 lstResultantAvailabilities.AddRange(lstFriday);
876 lstResultantAvailabilities.AddRange(lstSaturday);
877 lstResultantAvailabilities.AddRange(lstSunday);
878
879 lstResultantAvailabilities.OrderBy(av => av.StartTime).ThenBy(av => av.ResourceList);
880 }
881
882
883
884#if DEBUG
885 System.Diagnostics.Debug.Write("LINQ took this long: " + stopwatch.ElapsedMilliseconds + "\n");
886 stopwatch = null;
887#endif
888
889 //Then, convert the availabilities to ListViewItems
890 var items = (from item in lstResultantAvailabilities
891 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}
892 let lvItem = new ListViewItem(s)
893 select lvItem).ToArray<ListViewItem>();
894
895 //--Updating Listview
896 lstResults.BeginUpdate(); //tell listview to suspend drawing for now
897 lstResults.Items.Clear(); //empty it from old data
898
899 if (items.Length > 0) lstResults.Items.AddRange(items); // add new data
900 else this.lblMessage.Text = "No available slots found!";
901
902 lstResults.EndUpdate(); // ok done adding items, draw now.
903 //--End Update Listview
904
905 //We are done
906 this.Cursor = Cursors.Default;
907 }
908
909 private void cboAccessTypeFilter_SelectionChangeCommitted(object sender, System.EventArgs e)
910 {
911 //Load Access Types listbox & filter
912 string sGroup = cboAccessTypeFilter.Text;
913 if (sGroup == "<Show All Access Types>")
914 {
915 LoadListBox("ALL");
916 }
917 else
918 {
919 LoadListBox("SELECTED");
920 }
921
922 }
923
924
925 private void lstResults_DoubleClick(object sender, EventArgs e)
926 {
927 ProcessChoice(sender, e);
928 }
929
930 private void btnAccept_Click(object sender, EventArgs e)
931 {
932 ProcessChoice(sender, e);
933 }
934
935 /// <summary>
936 /// Shared method to process a user's choice
937 /// </summary>
938 /// <param name="s">sender</param>
939 /// <param name="e">EventArgs</param>
940 private void ProcessChoice(object s, EventArgs e)
941 {
942 if (lstResults.SelectedIndices.Count == 0)
943 {
944 this.DialogResult = DialogResult.None;
945 lblMessage.Text = "No slot selected!";
946 return;
947 }
948
949 int availabilityKey = Int32.Parse(lstResults.SelectedItems[0].SubItems[0].Text);
950 _selectedAvailability = (from av in lstResultantAvailabilities
951 where av.AvailabilityType == availabilityKey
952 select av).Single<CGAvailability>();
953 this.DialogResult = DialogResult.OK;
954 }
955
956 /// <summary>
957 /// Adjust start date based on end date.
958 /// </summary>
959 /// <param name="sender"></param>
960 /// <param name="e"></param>
961 private void dtStart_ValueChanged(object sender, EventArgs e)
962 {
963 if (dtEnd.Value < dtStart.Value) dtEnd.Value = dtStart.Value;
964 }
965
966 /// <summary>
967 /// Adjust end date based on start date.
968 /// </summary>
969 /// <param name="sender"></param>
970 /// <param name="e"></param>
971 private void dtEnd_ValueChanged(object sender, EventArgs e)
972 {
973 if (dtStart.Value > dtEnd.Value) dtStart.Value = dtEnd.Value;
974 }
975
976 #endregion Event Handlers
977
978 #region Properties
979
980 /// <summary>
981 /// Gets the Availability Selected by the User in which to put an appointment
982 /// </summary>
983 public CGAvailability SelectedAvailability
984 {
985 get { return this._selectedAvailability; }
986 }
987
988 #endregion Properties
989
990
991 }
992}
Note: See TracBrowser for help on using the repository browser.