LeaveRequestList.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using InABox.Core;
  7. using Comal.Classes;
  8. using InABox.Clients;
  9. using Xamarin.Forms;
  10. using Xamarin.Forms.Xaml;
  11. using comal.timesheets.QAForms;
  12. using InABox.Mobile;
  13. using LogType = InABox.Core.LogType;
  14. namespace comal.timesheets
  15. {
  16. [XamlCompilation(XamlCompilationOptions.Compile)]
  17. public partial class LeaveRequestList
  18. {
  19. DateTime lastFrom = DateTime.MinValue;
  20. DateTime lastTo = DateTime.MinValue;
  21. List<LeaveRequestShell> leaveRequestShells = new List<LeaveRequestShell>();
  22. public LeaveRequestList()
  23. {
  24. InitializeComponent();
  25. //if (ClientFactory.IsAllowed<CanViewPublicHolidaysOnMobile>())
  26. //{
  27. // publicHolidaysLbl.IsVisible = true;
  28. // showPublicHolidaysCb.IsVisible = true;
  29. //}
  30. }
  31. protected override void OnAppearing()
  32. {
  33. Title = "Loading";
  34. Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Me.ID).And(x => x.From).IsGreaterThanOrEqualTo(DateTime.Today)
  35. .And(x => x.LeaveType.Code).IsNotEqualTo("92");
  36. LoadList(filter);
  37. base.OnAppearing();
  38. }
  39. private async void LoadList(Filter<LeaveRequest> filter)
  40. {
  41. await Task.Run(() =>
  42. {
  43. leaveRequestShells.Clear();
  44. CoreTable table = QueryLeaveRequests(filter);
  45. while (table == null)
  46. table = QueryLeaveRequests(filter);
  47. if (table.Rows.Any())
  48. {
  49. foreach (CoreRow row in table.Rows)
  50. {
  51. if (!CheckDuplicates(row))
  52. {
  53. LeaveRequestShell leaveRequestShell = new LeaveRequestShell()
  54. {
  55. ID = row.Get<LeaveRequest, Guid>(x => x.ID),
  56. From = row.Get<LeaveRequest, DateTime>(x => x.From).ToString("dd MMM yy"),
  57. To = row.Get<LeaveRequest, DateTime>(x => x.To).ToString("dd MMM yy"),
  58. Type = row.Get<LeaveRequest, string>(x => x.LeaveType.Description),
  59. ApprovalNotes = row.Get<LeaveRequest, string>(x => x.StatusNotes),
  60. Approval = row.Get<LeaveRequest, LeaveRequestStatus>(x => x.Status).ToString(),
  61. LeaveCode = row.Get<LeaveRequest, string>(x => x.LeaveType.Code),
  62. };
  63. if (leaveRequestShell.Approval == "InProgress")
  64. {
  65. leaveRequestShell.Approval = "Pending";
  66. }
  67. lastFrom = row.Get<LeaveRequest, DateTime>(x => x.From);
  68. lastTo = row.Get<LeaveRequest, DateTime>(x => x.To);
  69. leaveRequestShell = ChooseColour(leaveRequestShell);
  70. leaveRequestShells.Add(leaveRequestShell);
  71. }
  72. }
  73. Device.BeginInvokeOnMainThread(() =>
  74. {
  75. leaveRequestList.ItemsSource = null;
  76. leaveRequestList.ItemsSource = leaveRequestShells;
  77. Title = "Leave Requests";
  78. });
  79. }
  80. else
  81. {
  82. Device.BeginInvokeOnMainThread(() =>
  83. {
  84. leaveRequestList.ItemsSource = null;
  85. Title = "Requests (0)";
  86. });
  87. }
  88. });
  89. }
  90. private bool CheckDuplicates(CoreRow row)
  91. {
  92. if (row.Get<LeaveRequest, DateTime>(x => x.From) == lastFrom && row.Get<LeaveRequest, DateTime>(x => x.To) == lastTo)
  93. return true;
  94. return false;
  95. }
  96. private CoreTable QueryLeaveRequests(Filter<LeaveRequest> filter)
  97. {
  98. try
  99. {
  100. return new Client<LeaveRequest>().Query
  101. (
  102. filter,
  103. new Columns<LeaveRequest>(
  104. x => x.ID, //0
  105. x => x.From, //1
  106. x => x.To, //2
  107. x => x.LeaveType.Description, //3
  108. x => x.Status, //4
  109. x => x.LeaveType.Code, //5
  110. x => x.StatusNotes //6
  111. ),
  112. new SortOrder<LeaveRequest>(x => x.To, SortDirection.Descending)
  113. );
  114. }
  115. catch (Exception ex)
  116. {
  117. InABox.Mobile.MobileLogging.Log(ex);
  118. return null;
  119. }
  120. }
  121. private async void Add_Clicked(object sender, EventArgs e)
  122. {
  123. //.And(x => x.Form.Secure).IsEqualTo(true)
  124. CoreTable table = QueryDigitalFormLayout();
  125. while (table == null)
  126. table = QueryDigitalFormLayout();
  127. if (table.Rows.Any())
  128. {
  129. List<string> layoutNamesList = new List<string>();
  130. List<DigitalFormLayout> layouts = new List<DigitalFormLayout>();
  131. foreach (CoreRow row in table.Rows)
  132. {
  133. DigitalFormLayout layout = row.ToObject<DigitalFormLayout>();
  134. layoutNamesList.Add(layout.Description);
  135. layouts.Add(layout);
  136. }
  137. string[] namesArray = layoutNamesList.ToArray();
  138. string chosenOption = await DisplayActionSheet("Choose Leave Form", "Cancel", null, namesArray);
  139. if (string.IsNullOrWhiteSpace(chosenOption))
  140. return;
  141. if (chosenOption == "Cancel")
  142. return;
  143. DigitalFormLayout digitalFormLayout = layouts.Find(x => x.Description.Equals(chosenOption));
  144. DigitalFormHostModel<LeaveRequest, LeaveRequestLink, LeaveRequestForm> model = new DigitalFormHostModel<LeaveRequest, LeaveRequestLink, LeaveRequestForm>();
  145. LeaveRequest request = new LeaveRequest();
  146. LeaveRequestForm leaveform = new LeaveRequestForm();
  147. leaveform.Form.ID = digitalFormLayout.Form.ID;
  148. model.LoadItems(request, leaveform, digitalFormLayout);
  149. DigitalFormHost host = new DigitalFormHost(model);
  150. Navigation.PushAsync(host);
  151. }
  152. else
  153. {
  154. DisplayAlert("Alert", "No Leave Forms Found", "OK");
  155. }
  156. }
  157. private CoreTable QueryDigitalFormLayout()
  158. {
  159. try
  160. {
  161. return new Client<DigitalFormLayout>().Query
  162. (
  163. new Filter<DigitalFormLayout>
  164. (
  165. x => x.Type).IsEqualTo(DFLayoutType.Mobile)
  166. .And(x => x.Active).IsEqualTo(true)
  167. .And(x => x.Form.Active).IsEqualTo(true)
  168. .And(x => x.Form.AppliesTo).IsEqualTo("LeaveRequest")
  169. );
  170. }
  171. catch (Exception ex)
  172. {
  173. InABox.Mobile.MobileLogging.Log(ex);
  174. return null;
  175. }
  176. }
  177. private void LeaveRequestList_Tapped(object sender, EventArgs e)
  178. {
  179. LeaveRequestShell leaveRequestShell = leaveRequestList.SelectedItem as LeaveRequestShell;
  180. string message = "No notes currently";
  181. if (!string.IsNullOrWhiteSpace(leaveRequestShell.ApprovalNotes))
  182. {
  183. message = leaveRequestShell.ApprovalNotes;
  184. }
  185. DisplayAlert("Leave Request Approval Notes:", message, "OK");
  186. }
  187. private LeaveRequestShell ChooseColour(LeaveRequestShell leaveRequestShell)
  188. {
  189. switch (leaveRequestShell.LeaveCode)
  190. {
  191. case "89": //Maternity
  192. leaveRequestShell.Color = Color.FromHex("#ffe4e1"); //mistyrose / pink
  193. break;
  194. case "90": //Compassionate
  195. leaveRequestShell.Color = Color.FromHex("#add8e6"); //light blue
  196. break;
  197. case "91": //Workers comp
  198. leaveRequestShell.Color = Color.FromHex("#c9ffe51"); //aero blue
  199. break;
  200. case "92": //Public Holiday
  201. leaveRequestShell.Color = Color.FromHex("#ffef00"); //yellow
  202. break;
  203. case "93": //Long service
  204. leaveRequestShell.Color = Color.FromHex("#ffc0cb"); //pink
  205. break;
  206. case "94": //Unpaid
  207. leaveRequestShell.Color = Color.FromHex("#f4a460"); //brown
  208. break;
  209. case "95": //Work Travel
  210. leaveRequestShell.Color = Color.FromHex("#7b68ee"); //medium slate blue
  211. break;
  212. case "96": //Training
  213. leaveRequestShell.Color = Color.FromHex("#7b68ee"); //medium slate blue
  214. break;
  215. case "97": //Sick
  216. leaveRequestShell.Color = Color.FromHex("#db7093"); //pale violet
  217. break;
  218. case "98": //RDO
  219. leaveRequestShell.Color = Color.FromHex("#cd853f"); //brown
  220. break;
  221. case "99": //Annual
  222. leaveRequestShell.Color = Color.FromHex("#7df9ff"); //electric blue
  223. break;
  224. default:
  225. break;
  226. }
  227. if (leaveRequestShell.Approval == "No")
  228. {
  229. leaveRequestShell.Color = Color.FromHex("#ff4040"); //red
  230. }
  231. return leaveRequestShell;
  232. }
  233. private void ShowAllCb_Changed(object sender, EventArgs e)
  234. {
  235. ChooseList();
  236. }
  237. private void ShowPublicHolidaysCb_Changed(object sender, EventArgs e)
  238. {
  239. ChooseList();
  240. }
  241. private void ChooseList()
  242. {
  243. //if (ClientFactory.IsAllowed<CanViewPublicHolidaysOnMobile>())
  244. //{
  245. if (showPublicHolidaysCb.IsChecked)
  246. {
  247. if (showAllCb.IsChecked)
  248. {
  249. Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Me.ID);
  250. LoadList(filter);
  251. }
  252. else
  253. {
  254. Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Me.ID).And(x => x.From).IsGreaterThanOrEqualTo(DateTime.Today);
  255. LoadList(filter);
  256. }
  257. }
  258. else
  259. {
  260. if (showAllCb.IsChecked)
  261. {
  262. Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Me.ID).And(x => x.LeaveType.Code).IsNotEqualTo("92");
  263. LoadList(filter);
  264. }
  265. else
  266. {
  267. Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Me.ID).And(x => x.From).IsGreaterThanOrEqualTo(DateTime.Today)
  268. .And(x => x.LeaveType.Code).IsNotEqualTo("92");
  269. LoadList(filter);
  270. }
  271. }
  272. // }
  273. // else
  274. // {
  275. //if (showAllCb.IsChecked)
  276. //{
  277. // Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Employee.ID).And(x => x.LeaveType.Code).IsNotEqualTo("92");
  278. // LoadList(filter);
  279. //}
  280. //else
  281. //{
  282. // Filter<LeaveRequest> filter = new Filter<LeaveRequest>(x => x.EmployeeLink.ID).IsEqualTo(App.Data.Employee.ID).And(x => x.From).IsGreaterThanOrEqualTo(DateTime.Today)
  283. // .And(x => x.LeaveType.Code).IsNotEqualTo("92");
  284. // LoadList(filter);
  285. //}
  286. // }
  287. }
  288. }
  289. public class LeaveRequestShell
  290. {
  291. public Guid ID { get; set; }
  292. public string Type { get; set; }
  293. public string To { get; set; }
  294. public string From { get; set; }
  295. public string Approval { get; set; }
  296. public string LeaveCode { get; set; }
  297. public Color Color { get; set; }
  298. public string ApprovalNotes { get; set; }
  299. public LeaveRequestShell()
  300. {
  301. ID = Guid.Empty;
  302. Type = "";
  303. To = "";
  304. From = "";
  305. Approval = "";
  306. LeaveCode = "";
  307. Color = Color.Default;
  308. ApprovalNotes = "";
  309. }
  310. }
  311. }