// Main Program (this code is called in a loop by resource by timeperiod (depending on how many TS needs to be created) timeSheetUid = PSITimeSheet.CreateTimeSheetFor(resUid, tsmgrUid, periodUid, j + 1); appLog.WriteLine(string.Format("Created TimeSheet: {0}", timeSheetUid), false); if (timeSheetUid == Guid.Empty) continue; timesheetDs = Program.timeSheet.ReadTimesheet(timeSheetUid); List tsLines = new List(); List adminLines = new List(); for (int i = 0; i < timesheetDs.Lines.Count; i++) { if (timesheetDs.Lines[i].TS_LINE_VALIDATION_TYPE == (int)PSLibrary.TimesheetEnum.ValidationType.Verified) { assignments.Add(timesheetDs.Lines[i].ASSN_UID); tsLines.Add(timesheetDs.Lines[i].TS_LINE_UID); } else // Admin time (Unverified) adminLines.Add(timesheetDs.Lines[i].TS_LINE_UID); } PSITimeSheet.AddActualsRows(timesheetDs, timePeriodDs, adminLines, tsLines, periodUid, appLog); // Update TS jobUid = Guid.NewGuid(); Program.timeSheet.QueueUpdateTimesheet(jobUid, timeSheetUid, timesheetDs); appLog.WriteLine(string.Format("Updated {0}", timesheetDs.Headers[0].TS_NAME), false); // Submit TS jobUid = Guid.NewGuid(); Program.timeSheet.QueueSubmitTimesheet(jobUid, timeSheetUid, tsmgrUid, "Submited via PSI"); appLog.WriteLine(string.Format("Submitted {0}", timesheetDs.Headers[0].TS_NAME), false); // Approve TS if (approveTS) { jobUid = Guid.NewGuid(); Program.timeSheet.QueueReviewTimesheet(jobUid, timeSheetUid, tsmgrUid, "Approved via PSI", MicrosoftFrance.MCS.EPM2007.TimeSheetWS.Action.Approve); appLog.WriteLine(string.Format("Approved {0} by Manager {1}\r\n", timesheetDs.Headers[0].TS_NAME, tsmgrUid), false); } // Helper methods (contained in another cs file) public static Guid CreateTimeSheetFor(Guid resourceGuid, Guid mgrUid, Guid periodUid, int index) { if (resourceGuid != Guid.Empty && mgrUid != Guid.Empty && periodUid != Guid.Empty) { TimeSheetWS.TimesheetDataSet timesheetDs = new TimeSheetWS.TimesheetDataSet(); TimeSheetWS.TimesheetDataSet.HeadersRow headersRow = timesheetDs.Headers.NewHeadersRow(); headersRow.RES_UID = resourceGuid; headersRow.TS_UID = Guid.NewGuid(); headersRow.WPRD_UID = periodUid; headersRow.TS_CREATOR_RES_UID = mgrUid; headersRow.TS_NAME = "Timesheet " + index.ToString(); headersRow.TS_COMMENTS = "Timesheet creatign using PSI"; headersRow.TS_ENTRY_MODE_ENUM = (byte)PSLibrary.TimesheetEnum.EntryMode.Weekly; timesheetDs.Headers.AddHeadersRow(headersRow); // Create the timesheet with the default line types specified by the admin Program.timeSheet.CreateTimesheet(timesheetDs, TimeSheetWS.PreloadType.Default); return headersRow.TS_UID; } else return Guid.Empty; } public static TimeSheetWS.TimesheetDataSet AddActualsRows(TimeSheetWS.TimesheetDataSet tsDS, AdminWS.TimePeriodDataSet timePeriodDs, List adminLines, List tsLines, Guid periodUid, AppLog appLog) { decimal totalActual = tsDS.Headers[0].TS_GRAND_TOTAL_ACT_VALUE; decimal totalToSubmit = 1440000; //24h -> 1440000; 32h -> 1920000; 40h -> 2400000 decimal taskTotalToSubmit = 0; decimal taskTotalToSubmitAux = 0; int taskRemaingHoursBag = 480000; // 8h are kept to split them randomly over all the tasks int taskHourBag = 0; Random randObj1 = new Random(DateTime.Now.Millisecond); for (int i = 0; i < tsDS.Actuals.Count; i++) { if (tsDS.Lines[i].TASK_UID != null && tsDS.Lines[i].TASK_UID != Guid.Empty) { if (i == tsDS.Actuals.Count) { taskTotalToSubmit = totalToSubmit; } else { taskTotalToSubmit = tsDS.Actuals.Count > 0 ? Math.Round(totalToSubmit / (tsDS.Actuals.Count - i), 0) : totalToSubmit; taskHourBag = randObj1.Next(taskRemaingHoursBag); taskTotalToSubmitAux = Math.Round (taskTotalToSubmit + taskHourBag); totalToSubmit = totalToSubmit - taskTotalToSubmit; taskRemaingHoursBag = taskRemaingHoursBag - taskHourBag; } tsDS.Actuals[i].TS_ACT_PLAN_VALUE = taskTotalToSubmitAux; tsDS.Actuals[i].TS_ACT_VALUE = taskTotalToSubmitAux; tsDS.Actuals[i].TS_ACT_COMMENT = "Updated existing line via PSI utility"; appLog.WriteLine(string.Format("Update Actual- SD:{0} FD:{1} AW:{2}", tsDS.Actuals[i].TS_ACT_START_DATE, tsDS.Actuals[i].TS_ACT_FINISH_DATE, tsDS.Actuals[i].TS_ACT_VALUE), false); } } // Randomly add Admin Time (-> 8h per week) Random randObj = new Random(DateTime.Now.Millisecond); int index = randObj.Next(adminLines.Count); TimeSheetWS.TimesheetDataSet.ActualsRow actualsRow = tsDS.Actuals.NewActualsRow(); actualsRow.TS_ACT_COMMENT = "Updated with default values by code sample"; // If no assignment add 40h of administrative time else 8h actualsRow.TS_ACT_PLAN_VALUE = tsDS.Actuals.Count == 0 ? 2400000 : 480000; actualsRow.TS_ACT_VALUE = actualsRow.TS_ACT_PLAN_VALUE; actualsRow.TS_ACT_START_DATE = GetTSPeriodDate(timePeriodDs, periodUid, true); actualsRow.TS_ACT_FINISH_DATE = GetTSPeriodDate(timePeriodDs, periodUid, false); actualsRow.TS_LINE_UID = adminLines[index]; tsDS.Actuals.AddActualsRow(actualsRow); return tsDS; } public static DateTime GetTSPeriodDate(AdminWS.TimePeriodDataSet timePeriodDs, Guid timeSheetPeriodUID, bool startDate) { for (int i = 0; i < timePeriodDs.TimePeriods.Count; i++) { if (timePeriodDs.TimePeriods[i].WPRD_UID == timeSheetPeriodUID) { if (startDate) return timePeriodDs.TimePeriods[i].WPRD_START_DATE; else return timePeriodDs.TimePeriods[i].WPRD_FINISH_DATE; } } return DateTime.Now; }