SchedulePlugin.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using System;
  5. using System.Linq;
  6. namespace Comal.TaskScheduler.Shared
  7. {
  8. public abstract class SchedulePlugin<T> : ISchedulePlugin where T : Entity, IPersistent, IRemotable, ISchedulable, new()
  9. {
  10. //public Entity LoadEntity(Guid id)
  11. //{
  12. // Entity = new Client<T>().Load(new Filter<T>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  13. // return Entity;
  14. //}
  15. public Entity[] LoadEntities(Guid[] ids)
  16. {
  17. return new Client<T>().Load(new Filter<T>(x => x.ID).InList(ids)).ToArray<Entity>();
  18. }
  19. public virtual void LoadKanban(Kanban kanban, Schedule schedule, T entity) { }
  20. public virtual void LoadJob(Job job, Schedule schedule, T entity) { }
  21. private Kanban CreateKanban(Schedule schedule, T Entity)
  22. {
  23. Logger.Send(LogType.Information, ClientFactory.UserID, String.Format(" * Creating Scheduled Task: {0} {1}", schedule.DueDate, schedule.Title));
  24. Kanban kanban = new Kanban();
  25. kanban.Title = Entity.ToString() + " - " + schedule.Title;
  26. kanban.Notes = new string[] { schedule.Description };
  27. kanban.ScheduleLink.ID = schedule.ID;
  28. kanban.Category = "Open";
  29. kanban.EmployeeLink.ID = schedule.EmployeeLink.ID;
  30. kanban.ManagerLink.ID = schedule.ManagerLink.ID;
  31. kanban.DueDate = schedule.DueDate;
  32. kanban.Type.ID = schedule.KanbanType.ID;
  33. //kanban.QAForm.ID = schedule.QAForm.ID;
  34. LoadKanban(kanban, schedule, Entity);
  35. new Client<Kanban>().Save(kanban, "Task Created by Scheduler");
  36. if (schedule.Report.IsValid())
  37. {
  38. Guid docid = Guid.Empty;
  39. using (Client<Document> client = new Client<Document>())
  40. {
  41. Document doc = client.Load(new Filter<Document>(x => x.ID).IsEqualTo(schedule.Report.ID)).FirstOrDefault();
  42. if (doc != null)
  43. {
  44. doc.ID = Guid.Empty;
  45. client.Save(doc, "Scheduled Task Report Created");
  46. docid = doc.ID;
  47. }
  48. }
  49. if (docid != Guid.Empty)
  50. {
  51. KanbanDocument kdoc = new KanbanDocument();
  52. kdoc.EntityLink.ID = kanban.ID;
  53. kdoc.DocumentLink.ID = docid;
  54. new Client<KanbanDocument>().Save(kdoc, "Scheduled Task Report Created");
  55. }
  56. }
  57. return kanban;
  58. }
  59. private void CreateJob(Schedule schedule, T entity)
  60. {
  61. Logger.Send(LogType.Information, ClientFactory.UserID, String.Format(" * Creating Scheduled Job: [0] {0}", schedule.DueDate, schedule.Title));
  62. Job job = new Job();
  63. job.ScheduleLink.ID = schedule.ID;
  64. job.ExpectedCompletionDate = schedule.DueDate;
  65. job.Name = entity.ToString() + " - " + schedule.Title;
  66. job.Notes = new string[] { schedule.Description };
  67. job.EmployeeLink.ID = schedule.EmployeeLink.ID;
  68. job.ManagerLink.ID = schedule.ManagerLink.ID;
  69. //job.QAForm.ID = schedule.QAForm.ID;
  70. LoadJob(job, schedule, entity);
  71. new Client<Job>().Save(job, "Scheduled Job Created");
  72. if (schedule.Report.IsValid())
  73. {
  74. Guid docid = Guid.Empty;
  75. using (Client<Document> client = new Client<Document>())
  76. {
  77. Document doc = client.Load(new Filter<Document>(x => x.ID).IsEqualTo(schedule.Report.ID)).FirstOrDefault();
  78. if (doc != null)
  79. {
  80. doc.ID = Guid.Empty;
  81. client.Save(doc, "Scheduled Task Report Created");
  82. docid = doc.ID;
  83. }
  84. }
  85. if (docid != Guid.Empty)
  86. {
  87. JobDocument jdoc = new JobDocument();
  88. jdoc.EntityLink.ID = job.ID;
  89. jdoc.DocumentLink.ID = docid;
  90. new Client<JobDocument>().Save(jdoc, "Scheduled Task Report Created");
  91. }
  92. }
  93. }
  94. private static bool IsOpen<TType>(Schedule schedule) where TType : Entity, IPersistent, IRemotable, IScheduleAction, new()
  95. {
  96. CoreTable result = new Client<TType>().Query(
  97. new Filter<TType>(x => x.ScheduleLink.ID).IsEqualTo(schedule.ID).And(x => x.Completed).IsEqualTo(DateTime.MinValue),
  98. new Columns<TType>(x => x.ID),
  99. null
  100. );
  101. return result.Rows.Any();
  102. }
  103. public bool Execute(Schedule schedule, Entity entity)
  104. {
  105. return Execute(schedule, (T)entity);
  106. }
  107. public virtual bool Execute(Schedule schedule, T entity)
  108. {
  109. if (schedule.Rollover.Equals(ScheduleRollover.FromDueDate))
  110. {
  111. if (schedule.DueDate.AddDays(0 - schedule.LeadTime) <= DateTime.Now)
  112. {
  113. if (schedule.ScheduleType == ScheduleType.Task)
  114. CreateKanban(schedule, (T)entity);
  115. else
  116. CreateJob(schedule, (T)entity);
  117. schedule.DueDate = schedule.GetNextDate(schedule.DueDate);
  118. new Client<Schedule>().Save(schedule, "Schedule Updated by Task (Due Date)");
  119. return true;
  120. }
  121. }
  122. else
  123. {
  124. bool isopen = (schedule.ScheduleType == ScheduleType.Task) ? IsOpen<Kanban>(schedule) : IsOpen<Job>(schedule);
  125. if (!isopen) // ie no open tasks
  126. {
  127. if (schedule.DueDate.AddDays(0 - schedule.LeadTime) <= DateTime.Now)
  128. {
  129. if (schedule.ScheduleType == ScheduleType.Task)
  130. CreateKanban(schedule, (T)entity);
  131. else
  132. CreateJob(schedule, (T)entity);
  133. return true;
  134. }
  135. }
  136. }
  137. return false;
  138. }
  139. }
  140. }