/// <summary> /// Generates Appointments (Routes Contract) or Service Orders (Service Contract) for each TimeSlot in the [scheduleRules] List. /// </summary> public void GenerateAPPSOUpdateContracts(List <Schedule> scheduleRules, string recordType, DateTime?fromDate, DateTime?toDate, FSSchedule fsScheduleRow) { var generator = new TimeSlotGenerator(); DateTime processEndDate = (DateTime)GetProcessEndDate(scheduleRules.ElementAt(0), toDate); var period = new Period((DateTime)fromDate, processEndDate); // Determines the next generationID number if (nextGenerationID == null) { FSProcessIdentity fsProcessIdentityRow = new FSProcessIdentity(); fsProcessIdentityRow.ProcessType = recordType; fsProcessIdentityRow.FilterFromTo = fromDate; fsProcessIdentityRow.FilterUpTo = toDate; ProcessIdentityMaint graphProcessIdentityMaint = PXGraph.CreateInstance <ProcessIdentityMaint>(); graphProcessIdentityMaint.processIdentityRecords.Insert(fsProcessIdentityRow); graphProcessIdentityMaint.Save.Press(); nextGenerationID = graphProcessIdentityMaint.processIdentityRecords.Current.ProcessID; } List <TimeSlot> timeSlots = generator.GenerateCalendar(period, scheduleRules, nextGenerationID); DateTime? failsOnDate = null; // Transaction to create the appointments (Routes Contract) or Service Orders (Service Contract) using (PXTransactionScope ts = new PXTransactionScope()) { Customer customerRow = PXSelect <Customer, Where < Customer.bAccountID, Equal <Required <Customer.bAccountID> > > > .Select(this, fsScheduleRow.CustomerID) .FirstOrDefault(); if (customerRow.Status != BAccount.status.Active && customerRow.Status != BAccount.status.OneTime) { throw new PXException(PXMessages.LocalizeFormat(AR.Messages.CustomerIsInStatus, new Customer.status.ListAttribute().ValueLabelDic[customerRow.Status])); } try { foreach (var timeSlot in timeSlots) { failsOnDate = timeSlot.DateTimeBegin; if (recordType == ID.RecordType_ServiceContract.SERVICE_CONTRACT) { bool createAppointmnet = fsScheduleRow.ScheduleGenType == ID.ScheduleGenType_ServiceContract.APPOINTMENT; CreateServiceOrder(timeSlot, createAppointmnet); } else if (recordType == ID.RecordType_ServiceContract.ROUTE_SERVICE_CONTRACT) { CreateServiceOrder(timeSlot, true, true); } } DateTime?lastGenerationDate = null; if (timeSlots.Count > 0) { lastGenerationDate = timeSlots.Max(a => a.DateTimeBegin); } CreateContractGenerationHistory((int)nextGenerationID, scheduleRules.ElementAt(0).ScheduleID, processEndDate, lastGenerationDate, recordType); UpdateGeneratedSchedule(scheduleRules.ElementAt(0).ScheduleID, processEndDate, lastGenerationDate, fsScheduleRow); } catch (Exception e) { var exceptionWithContextMessage = ExceptionHelper.GetExceptionWithContextMessage(PXMessages.Localize(TX.Messages.COULD_NOT_PROCESS_RECORD), e); FSGenerationLogError fsGenerationLogErrorRow = new FSGenerationLogError(); fsGenerationLogErrorRow.ProcessType = recordType; fsGenerationLogErrorRow.ErrorMessage = exceptionWithContextMessage.Message; fsGenerationLogErrorRow.ScheduleID = scheduleRules.ElementAt(0).ScheduleID; fsGenerationLogErrorRow.GenerationID = nextGenerationID; fsGenerationLogErrorRow.ErrorDate = failsOnDate; ts.Dispose(); var grapGenerationLogErrorMaint = PXGraph.CreateInstance <GenerationLogErrorMaint>(); grapGenerationLogErrorMaint.LogErrorMessageRecords.Insert(fsGenerationLogErrorRow); grapGenerationLogErrorMaint.Save.Press(); throw exceptionWithContextMessage; } ts.Complete(this); } }
/// <summary> /// Generates an FSTimeSlot for each TimeSlot in the [scheduleRules] List. /// </summary> protected void generateTimeSlotAndUpdateStaffSchedule(List <Schedule> scheduleRules, string recordType, DateTime?fromDate, DateTime?toDate, FSSchedule fsScheduleRow) { var generator = new TimeSlotGenerator(); DateTime processEndDate = (DateTime)getProcessEndDate(scheduleRules.ElementAt(0), toDate); var period = new Period((DateTime)fromDate, (DateTime)toDate); // Determines the next generationID number if (nextGenerationID == null) { FSProcessIdentity fsProcessIdentityRow = new FSProcessIdentity() { ProcessType = recordType, FilterFromTo = fromDate, FilterUpTo = toDate }; var graphProcessIdentityMaint = PXGraph.CreateInstance <ProcessIdentityMaint>(); graphProcessIdentityMaint.processIdentityRecords.Insert(fsProcessIdentityRow); graphProcessIdentityMaint.Save.Press(); nextGenerationID = graphProcessIdentityMaint.processIdentityRecords.Current.ProcessID; } List <TimeSlot> timeSlots = generator.GenerateCalendar(period, scheduleRules, nextGenerationID); DateTime? failsOnDate = null; // Transaction to create the Time Slots using (PXTransactionScope ts = new PXTransactionScope()) { try { //Create all time slots foreach (var timeSlot in timeSlots) { failsOnDate = timeSlot.DateTimeBegin; createTimeSlot(timeSlot); } DateTime?lastGeneratedTimeSlotBySchedules = null; if (timeSlots.Count > 0) { lastGeneratedTimeSlotBySchedules = timeSlots.Max(a => a.DateTimeBegin); } //Update and create a Contract Generation History createContractGenerationHistory( (int)nextGenerationID, scheduleRules.ElementAt(0).ScheduleID, processEndDate, lastGeneratedTimeSlotBySchedules, recordType); //Update Last Generated Time Slot Date updateGeneratedSchedule(scheduleRules.ElementAt(0).ScheduleID, processEndDate, lastGeneratedTimeSlotBySchedules, fsScheduleRow); } catch (PXException e) { FSGenerationLogError fsGenerationLogError = new FSGenerationLogError() { ProcessType = recordType, ErrorMessage = e.Message, ScheduleID = scheduleRules.ElementAt(0).ScheduleID, GenerationID = nextGenerationID, ErrorDate = failsOnDate }; ts.Dispose(); var grapGenerationLogErrorMaint = PXGraph.CreateInstance <GenerationLogErrorMaint>(); grapGenerationLogErrorMaint.LogErrorMessageRecords.Insert(fsGenerationLogError); grapGenerationLogErrorMaint.Save.Press(); throw new PXException(e.Message); } ts.Complete(this); } }