= VISTA Scheduling GUI Home Page =
[[Image(SchedMain.png,600px,align=right)]]
Welcome to the VISTA Scheduling GUI homepage. I am Sam Habiel; I am the current maintainer for the Scheduling GUI. I can be reached at sam dot habiel at gmail dot com. The original package was written for Indian Health Service by Horace Whitt, and I ported it to VISTA and made a lot of enhancements.
== What is the Scheduling GUI? ==
Historically, VISTA has always used the PIMS Scheduling module on the VT-100 emulated terminal. The Scheduling GUI is intended to be a replacement and complement for PIMS Scheduling. You can run the Scheduling GUI without any interaction with PIMS; or you can have it interacting with PIMS so that appointments will have various cascading effects on other packages using the PIMS triggered protocols and PIMS APIs. Most people use it with PIMS so that it can integrate well with CPRS.
== I want it I want it I want it! ==
You can follow the instructions here to install it: source:Scheduling/tag/1.5/README.txt
== License ==
The project is licensed by myself under LGPL latest version, whatever it is. http://www.gnu.org/licenses/lgpl-2.1.html.
[[Image(apptslip.png,600px,align=right)]]
== Feature List ==
* Obviously, make and cancel appointments (Future appointments and Walk-ins)
* Check-in and undo check-in's.
* No-show and undo No-shows.
* Make slots (i.e. how many patients will a provider see)
* Set Overbook permissions to Clerks
* Print Schedule List for Providers
* Print Appointment List for Patients
* Print Appointment Reminder Letters
* Print Appointment List for Providers
* Auto-Rebook appointments (along with Rebook letters)
* Search for appointments in the future (you can limit to specific slot type or day)
* Integration with the Radiology Package to make Radiology Appointments (v 1.6)
* Dynamic view of Schedules:
* Can open multiple schedules for a Clinic Group
* Can view a single schedule in 1, 5 or 7 day view
* Can change the time scale as long as it isn't less the minimum appointment length
* Bi-directional communication with PIMS Scheduling Module.
* Appointment Clipboard Functionality
* Drag and drop for appointments
* Full UTF-8 support if the Mumps Database supports it.
* L18N for Arabic
== What is the Scheduling GUI written in? ==
The client is in C# using the .Net 4.0 libraries on MS Windows. The Windowing library used is WinForms 2.0. The database side uses Plain Jane remote procedures over a custom broker developed by Indian Health Service called BMX that provides ADO.net support to Fileman. Currently, most remote procedures are very heavy Mumps.
== Show me some code! ==
This is the C# code that inits the Scheduling GUI.
{{{
#!java
#if DEBUG
//To write to the console
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
private const int ATTACH_PARENT_PROCESS = -1;
#endif
///
/// Main Entry Point
///
/// We accept the following Arguments:
/// /s or -s = Server ip address or name
/// /p or -p = port number (must be numeric)
/// /a or -a = Access Code
/// /v or -v = Verify Code
/// /e or -e = Encoding (name of encoding as known to windows, such as windows-1256)
/// /culture or -culture = Culture Name for UI Culture if you wish to override the Windows Culture
///
///
/// Encoding decision is complex. This is the order of priority:
/// - If the M DB runs in UTF-8, that's what we are going to use.
/// - If that's not so, /e sets the default encoding. If /e is a non-existent encoding, move to next step.
/// - If /e is not supplied or is not recognized, the default encoding is the Windows default Encoding for the user.
///
[STAThread()]
static void Main(string[] args)
{
//Application wide error handler for unhandled errors (later I figure out that's only for WinForm ex'es)
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.ThreadException += new ThreadExceptionEventHandler(App_ThreadException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(App_DomainException);
#if DEBUG
// Print console messages to console if launched from console
// Note: Imported From kernel32.dll
AttachConsole(ATTACH_PARENT_PROCESS);
#endif
#if TRACE
DateTime startLoadTime = DateTime.Now;
#endif
//Store a class instance of manager. Actual constructor does nothing.
_current = new CGDocumentManager();
//Get command line options; store in private class wide variables
var opset = new OptionSet() {
{ "s=", s => _current.m_Server = s },
{ "p=", p => _current.m_Port = int.Parse(p) },
{ "a=", a => _current.m_AccessCode = a },
{ "v=", v => _current.m_VerifyCode = v },
{ "e=", e => _current.m_Encoding = e},
{ "culture=", culture => _current.m_CultureName = culture }
};
opset.Parse(args);
//Init app
bool isEverythingOkay = _current.InitializeApp();
//if an error occurred, break out.
if (!isEverythingOkay) return;
//Create the first empty document
//A document holds the resources, appointments, and availabilites
//SAM: Good place for break point
CGDocument doc = new CGDocument();
doc.DocManager = _current;
//Create new View
//A view is a specific arrangement of appointments and availabilites that constitute a document
CGView view = new CGView();
view.InitializeDocView(doc, _current, doc.StartDate, _current.WindowText);
//Handle BMX Event
Application.DoEvents();
//test
//doc.ThrowException();
//test
#if TRACE
DateTime EndLoadTime = DateTime.Now;
TimeSpan LoadTime = EndLoadTime - startLoadTime;
Debug.Write("Load Time for GUI is " + LoadTime.Seconds + " s & " + LoadTime.Milliseconds + " ms\n");
#endif
view.Show();
view.Activate();
Application.Run();
}
}}}