DataModel.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Comal.Classes;
  6. using InABox.Clients;
  7. using InABox.Core;
  8. namespace comal.timesheets
  9. {
  10. public delegate void DataChangedEvent(object sender, Type t);
  11. public delegate void DataRefreshedEvent();
  12. public class DataModel
  13. {
  14. public event DataRefreshedEvent DataRefreshed;
  15. public event DataChangedEvent DataChanged;
  16. public Employee Employee { get; private set; }
  17. public CoreTable TimeSheets { get; set; }
  18. public CoreTable Gates { get; private set; }
  19. public CoreTable Jobs { get; private set; }
  20. public bool CanBypassGates { get; private set; }
  21. public DataModel()
  22. {
  23. }
  24. public void Refresh(bool canbypassgates = true)
  25. {
  26. CanBypassGates = canbypassgates;
  27. RefreshTimeSheet();
  28. RefreshEmployee();
  29. RefreshJobs(canbypassgates);
  30. }
  31. private void RefreshTimeSheet()
  32. {
  33. Task.Run(() =>
  34. {
  35. try
  36. {
  37. CoreTable table = new Client<TimeSheet>().Query(
  38. new Filter<TimeSheet>(x => x.EmployeeLink.UserLink.ID).IsEqualTo(ClientFactory.UserGuid)
  39. .And(x => x.Date).IsEqualTo(DateTime.Today)
  40. .And(x => x.Finish).IsEqualTo(new TimeSpan()),
  41. new Columns<TimeSheet>(
  42. x => x.ID,
  43. x => x.Date,
  44. x => x.Start,
  45. x => x.Notes,
  46. x => x.JobLink.ID,
  47. x => x.JobLink.JobNumber,
  48. x => x.JobLink.Name,
  49. x => x.ActivityLink.ID,
  50. x => x.ActivityLink.Code,
  51. x => x.ActivityLink.Description,
  52. x => x.StartLocation.Latitude,
  53. x => x.StartLocation.Longitude,
  54. x => x.StartLocation.Timestamp,
  55. x => x.EmployeeLink.ID)
  56. );
  57. TimeSheets = table;
  58. DataChanged?.Invoke(this, typeof(TimeSheet));
  59. DataRefreshed?.Invoke();
  60. }
  61. catch (Exception ex)
  62. {
  63. Thread.Sleep(1000);
  64. RefreshTimeSheet();
  65. var log = new MobileLogging(LogType.Query, "Data model RefreshTimeSheet()", ex.Message + ex.StackTrace, this.GetType().Name);
  66. }
  67. });
  68. }
  69. private void RefreshEmployee()
  70. {
  71. Task.Run(() =>
  72. {
  73. try
  74. {
  75. CoreTable table = new Client<Employee>().Query(
  76. new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid),
  77. new Columns<Employee>(
  78. x => x.ID,
  79. x => x.Name
  80. ));
  81. if (table.Rows.Any())
  82. {
  83. Employee = table?.Rows.FirstOrDefault()?.ToObject<Employee>();
  84. DataChanged?.Invoke(this, typeof(Employee));
  85. DataRefreshed?.Invoke();
  86. }
  87. }
  88. catch (Exception ex)
  89. {
  90. Thread.Sleep(1000);
  91. RefreshEmployee();
  92. var log = new MobileLogging(LogType.Query, "Data model RefreshEmployee()", ex.Message + ex.StackTrace, this.GetType().Name);
  93. }
  94. });
  95. }
  96. private void RefreshJobs(bool canbypassgates)
  97. {
  98. Task.Run(() =>
  99. {
  100. try
  101. {
  102. if (canbypassgates)
  103. {
  104. CoreTable table = new Client<Job>().Query(
  105. new Filter<Job>(X => X.Completed).IsEqualTo(DateTime.MinValue).And(x => x.JobStatus.Active).IsEqualTo(true),
  106. new Columns<Job>(
  107. X => X.ID,
  108. X => X.JobNumber,
  109. X => X.Name,
  110. X => X.SiteAddress.Location.Latitude,
  111. X => X.SiteAddress.Location.Longitude),
  112. new SortOrder<Job>(x => x.JobNumber));
  113. if (table.Rows.Any())
  114. {
  115. Jobs = table;
  116. DataChanged?.Invoke(this, typeof(Job));
  117. DataRefreshed?.Invoke();
  118. }
  119. }
  120. else
  121. {
  122. CoreTable table = new Client<JobTracker>().Query(
  123. new Filter<JobTracker>(x => x.Active).IsEqualTo(true),
  124. new Columns<JobTracker>(
  125. x => x.JobLink.ID,
  126. x => x.JobLink.JobNumber,
  127. x => x.JobLink.Name,
  128. x => x.TrackerLink.DeviceID,
  129. x => x.Gate,
  130. x => x.IsJobSite
  131. ));
  132. if (table.Rows.Any())
  133. {
  134. Gates = table;
  135. //DataChanged?.Invoke(this, typeof(JobTracker), e);
  136. DataRefreshed?.Invoke();
  137. }
  138. }
  139. }
  140. catch (Exception ex)
  141. {
  142. Thread.Sleep(1000);
  143. RefreshJobs(true);
  144. var log = new MobileLogging(LogType.Query, "Data model RefreshJobs()", ex.Message + ex.StackTrace, this.GetType().Name);
  145. }
  146. });
  147. }
  148. }
  149. }