public AppointmentCollection Find(DataTypes.AppointmentSearchCriteria criteria)
        {
            if (criteria == null)
            {
                throw new ArgumentNullException("criteria");
            }

            BMS.AppointmentSearchCriteria businessCriteria = AppointmentTranslator.TranslateSearchCriteria(criteria);

            List <BMS.Appointment> businessAppointments = new List <BMS.Appointment>(Helper.GetApplication().Find(businessCriteria));

            return(new AppointmentCollection(businessAppointments.ConvertAll <DataTypes.Appointment>(
                                                 new Converter <BMS.Appointment, DataTypes.Appointment> (AppointmentTranslator.TranslateBusinessToService)
                                                 )));
        }
        public DataTypes.Appointment Save(DataTypes.Appointment appointment)
        {
            if (appointment == null)
            {
                throw new ArgumentNullException("appointment");
            }

            SetupWorkflowEnvironment();

            BMS.Appointment[] businessAppointments = Helper.GetApplication().Find(new AppointmentSearchCriteria(appointment.Ubrn));

            BMS.Appointment businessAppointment;
            if (businessAppointments.Length > 0)
            {
                // Existing Appointment
                // No need to use the workflow as no state change happening.
                businessAppointment = businessAppointments[0];
                businessAppointment = AppointmentTranslator.TranslateServiceToBusiness(appointment, businessAppointment);
                businessAppointment.Save();
            }
            else
            {
                // New Appointment
                if (appointment.Patient == null || appointment.Provider == null || appointment.ClinicType == null)
                {
                    throw new ArgumentNullException("appointment");
                }

                Guid workflowInstanceId = Guid.NewGuid();

                WorkflowInstance workflowInstance =
                    _workflowRuntime.CreateWorkflow(typeof(AppointmentWorkflow), null, workflowInstanceId);
                workflowInstance.Start();

                _appointmentLocalService.RaiseAppointmentCreateEvent
                    (workflowInstanceId, appointment.Patient.Id, appointment.Provider.Id, appointment.ClinicType.Id);

                RunWorkFlow(workflowInstanceId);

                AppointmentSearchCriteria criteria = new AppointmentSearchCriteria(null);
                criteria.WorkflowId = workflowInstanceId;
                businessAppointment = Helper.GetApplication().Find(criteria)[0];
            }

            return(AppointmentTranslator.TranslateBusinessToService(businessAppointment));
        }