SchedulePlugin.cs 7.6 KB

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