DeliveryDetails.xaml.cs 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using System.Threading;
  5. using System.Linq;
  6. using Xamarin.Forms;
  7. using XF.Material.Forms.UI;
  8. using XF.Material.Forms.UI.Dialogs;
  9. using InABox.Core;
  10. using InABox.Clients;
  11. using Comal.Classes;
  12. using System.IO;
  13. using Plugin.Media;
  14. using InABox.Mobile;
  15. using System.Linq.Expressions;
  16. using comal.timesheets.Deliveries;
  17. using Xamarin.Essentials;
  18. using Contact = Comal.Classes.Contact;
  19. using comal.timesheets.CustomControls;
  20. using Plugin.Media.Abstractions;
  21. namespace comal.timesheets
  22. {
  23. public partial class DeliveryDetails : ContentPage
  24. {
  25. private Delivery _delivery = null;
  26. private string address = "";
  27. public IEnumerable<Placemark> addresses;
  28. private Guid empID = Guid.Empty;
  29. private string empName = "";
  30. ToolbarItem completeButton;
  31. bool openingAnotherPage = false;
  32. ObservableList<Docket> dockets = new ObservableList<Docket>();
  33. ObservableList<Document> newPhotoDocuments = new ObservableList<Document>();
  34. List<Guid> existingDocumentIDs = new List<Guid>();
  35. List<Tuple<MaterialButton, Guid, String, List<DeliveryItem>>> requis = new List<Tuple<MaterialButton, Guid, String, List<DeliveryItem>>>();
  36. List<Tuple<MaterialButton, Guid, String, List<DeliveryItem>>> shipments = new List<Tuple<MaterialButton, Guid, String, List<DeliveryItem>>>();
  37. public DeliveryDetails(Guid deliveryID = default(Guid))
  38. {
  39. InitializeComponent();
  40. LoadPage(deliveryID);
  41. }
  42. async void LoadPage(Guid deliveryID)
  43. {
  44. try
  45. {
  46. Title = "Loading";
  47. await Task.Run(() =>
  48. {
  49. GetEmpIDAndName();
  50. if (deliveryID != Guid.Empty)
  51. {
  52. CoreTable table = new Client<Delivery>().Query(
  53. new Filter<Delivery>(x => x.ID).IsEqualTo(deliveryID), null, null);
  54. if (table.Rows.Count != 0)
  55. {
  56. foreach (var row in table.Rows)
  57. {
  58. _delivery = row.ToObject<Delivery>();
  59. }
  60. UpdateImages();
  61. DeliveryItemsCount();
  62. Device.BeginInvokeOnMainThread(() =>
  63. {
  64. completeButton = new ToolbarItem() { Text = "Record 'Delivered' Flag", Command = new DropDownMenuCommand(CompleteDelivery), Order = ToolbarItemOrder.Primary, IsEnabled = true };
  65. if (_delivery.Delivered != DateTime.MinValue) completeButton.IsEnabled = false;
  66. ToolbarItems.Add(completeButton);
  67. ItemsToBeDelivered.IsVisible = true;
  68. Title = _delivery.Number.ToString();
  69. if (_delivery.Location.Longitude != 0 && _delivery.Location.Latitude != 0)
  70. {
  71. DeliveredFlagFrame.IsVisible = true;
  72. DeliveredLbl.IsVisible = true;
  73. DeliveredDetails.Text = "Loading Delivered Flag Details";
  74. if (string.IsNullOrWhiteSpace(_delivery.Location.Address))
  75. {
  76. GetLocationFromDetails();
  77. }
  78. else
  79. ShowDeliveredDetails(false);
  80. }
  81. });
  82. }
  83. }
  84. else if (deliveryID == Guid.Empty)
  85. {
  86. _delivery = new Delivery();
  87. Device.BeginInvokeOnMainThread(() =>
  88. {
  89. var CreateDeliveryButton = new ToolbarItem() { Text = "Create Delivery/Pickup", Command = new Command(CreateDelivery) };
  90. ToolbarItems.Add(CreateDeliveryButton);
  91. ItemsFrame.IsVisible = false;
  92. loadDeliveryItems.IsVisible = false;
  93. Title = "New Delivery";
  94. _delivery.Employee.ID = empID;
  95. _delivery.Employee.Name = empName;
  96. });
  97. }
  98. Device.BeginInvokeOnMainThread(() =>
  99. {
  100. PopulateFields();
  101. CheckKanbanSent();
  102. });
  103. });
  104. }
  105. catch { }
  106. }
  107. void GetEmpIDAndName()
  108. {
  109. empID = GlobalVariables.EmpID;
  110. empName = GlobalVariables.EmpName;
  111. }
  112. protected async override void OnDisappearing()
  113. {
  114. await Task.Run(() =>
  115. {
  116. if (_delivery.ID != Guid.Empty && !openingAnotherPage)
  117. {
  118. try
  119. {
  120. new Client<Delivery>().Save(_delivery, "Updated from mobile device");
  121. }
  122. catch (Exception ex)
  123. {
  124. DisplayAlert("Error saving delivery", ex.Message, "OK");
  125. }
  126. }
  127. });
  128. base.OnDisappearing();
  129. }
  130. protected override void OnAppearing()
  131. {
  132. openingAnotherPage = false;
  133. base.OnAppearing();
  134. }
  135. #region Create Delivery or add delivered flag
  136. async void CreateDelivery()
  137. {
  138. try
  139. {
  140. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Saving Delivery"))
  141. {
  142. _delivery.Due = dueDate.Date; //unable to make duedate changed event without crashing the screen on startup....
  143. new Client<Delivery>().Save(_delivery, "Updated From Mobile Device");
  144. if (newPhotoDocuments.Count != 0)
  145. {
  146. new Client<Document>().Save(newPhotoDocuments, "Photo Taken on Device");
  147. ObservableList<DeliveryDocument> newDeliveryDocuments = new ObservableList<DeliveryDocument>();
  148. foreach (Document doc in newPhotoDocuments)
  149. {
  150. var deliveryDocument = new DeliveryDocument();
  151. deliveryDocument.EntityLink.ID = _delivery.ID;
  152. deliveryDocument.DocumentLink.ID = doc.ID;
  153. deliveryDocument.DocumentLink.FileName = doc.FileName;
  154. newDeliveryDocuments.Add(deliveryDocument);
  155. }
  156. new Client<DeliveryDocument>().Save(newDeliveryDocuments, "Photo Taken on Device");
  157. newPhotoDocuments.Clear();
  158. }
  159. }
  160. string successMessage = "Delivery Created" + System.Environment.NewLine + "Delivery Number: " + _delivery.Number;
  161. }
  162. catch (Exception ex)
  163. {
  164. DisplayAlert("Error creating delivery", ex.Message, "OK");
  165. }
  166. await Navigation.PopAsync();
  167. }
  168. private async void CompleteDelivery()
  169. {
  170. try
  171. {
  172. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Getting Location..Please wait"))
  173. {
  174. LocationServices locationServices = new LocationServices();
  175. locationServices.OnLocationFound += LocationFound;
  176. locationServices.OnLocationError += LocationError;
  177. locationServices.GetLocation();
  178. Thread.Sleep(1000); //"Getting Location" notification disappears too quickly on some devices - ensures a minimum of 1 second while location tasks execute on other threads
  179. }
  180. }
  181. catch { }
  182. }
  183. private async void LocationFound(LocationServices sender)
  184. {
  185. try
  186. {
  187. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Getting Location..Please wait"))
  188. {
  189. _delivery.Location.Latitude = sender.Latitude;
  190. _delivery.Location.Longitude = sender.Longitude;
  191. _delivery.Location.Timestamp = DateTime.Now;
  192. _delivery.Location.Address = sender.Address;
  193. _delivery.DeliveredBy.ID = empID;
  194. _delivery.DeliveredBy.Name = empName;
  195. address = sender.Address;
  196. _delivery.Delivered = DateTime.Now;
  197. await Task.Run(() =>
  198. {
  199. new Client<Delivery>().Save(_delivery, "Updated From Mobile Device");
  200. });
  201. }
  202. await DisplayAlert("Success", "Delivered: " + _delivery.Delivered.ToString("hh:mm:ss tt dd-MMM-yy")
  203. + System.Environment.NewLine + "Location Now: " + address
  204. , "OK");
  205. ShowDeliveredDetails();
  206. }
  207. catch { }
  208. }
  209. private void LocationError(LocationServices sender, Exception error)
  210. {
  211. DisplayAlert("GPS Error", error.Message, "OK");
  212. }
  213. #endregion
  214. #region Load Screen values from Database
  215. private void PopulateFields()
  216. {
  217. if (!string.IsNullOrWhiteSpace(_delivery.Job.Name)) JobName.Text = _delivery.Job.Name + " (" + _delivery.Job.JobNumber + ")";
  218. TypeLbl.Text = _delivery.Type.Description;
  219. ContactNameLbl.Text = _delivery.Contact.Name;
  220. streetEdt.Text = _delivery.Address.Street;
  221. cityEdt.Text = _delivery.Address.City;
  222. statePicker.SelectedIndex = SelectState();
  223. postCodeEdt.Text = _delivery.Address.PostCode;
  224. EmployeeName.Text = _delivery.Employee.Name;
  225. deliveryNotesEdt.Text = _delivery.Notes;
  226. if (_delivery.Due != DateTime.MinValue) dueDate.Date = _delivery.Due;
  227. else dueDate.Date = DateTime.Today;
  228. }
  229. public IEnumerable<Placemark> Addresses
  230. {
  231. get { return addresses; }
  232. set { addresses = value; ShowDeliveredDetails(); }
  233. }
  234. private void ShowDeliveredDetails(bool wait = true)
  235. {
  236. Task.Run(() =>
  237. {
  238. if (wait)
  239. {
  240. Thread.Sleep(5000);
  241. }
  242. Device.BeginInvokeOnMainThread(() =>
  243. {
  244. completeButton.IsEnabled = false;
  245. DeliveredFlagFrame.IsVisible = true;
  246. DeliveredLbl.IsVisible = true;
  247. if (string.IsNullOrWhiteSpace(address))
  248. {
  249. if (!string.IsNullOrWhiteSpace(_delivery.Location.Address))
  250. address = _delivery.Location.Address;
  251. else
  252. address = "(Address service failed). Driver was at Latitude: " + _delivery.Location.Latitude + " Longitude: " + _delivery.Location.Longitude;
  253. }
  254. DeliveredDetails.Text = address + " at " + _delivery.Delivered.ToString("hh:mm:ss tt dd MMM yy") + System.Environment.NewLine
  255. + "by: " + _delivery.DeliveredBy.Name;
  256. openMapBtn.IsEnabled = true;
  257. });
  258. });
  259. }
  260. private async void GetLocationFromDetails()
  261. {
  262. await Task.Run(async () =>
  263. {
  264. try
  265. {
  266. Addresses = await Geocoding.GetPlacemarksAsync(_delivery.Location.Latitude, _delivery.Location.Longitude);
  267. Placemark placemark = null;
  268. foreach (var cur in Addresses)
  269. {
  270. placemark = cur;
  271. if (placemark != null)
  272. {
  273. address = String.Format("{0} {1} {2}", placemark.SubThoroughfare, placemark.Thoroughfare, placemark.Locality);
  274. _delivery.Location.Address = address;
  275. return;
  276. }
  277. }
  278. }
  279. catch
  280. {
  281. address = "Longitude: " + _delivery.Location.Longitude + "Latitude: " + _delivery.Location.Latitude + " Address service failed to load address";
  282. }
  283. });
  284. }
  285. private async void OpenMapBtn_Clicked(object sender, EventArgs e)
  286. {
  287. var location = new Xamarin.Essentials.Location(_delivery.Location.Latitude, _delivery.Location.Longitude);
  288. var options = new MapLaunchOptions { };
  289. await Map.OpenAsync(location, options);
  290. }
  291. private async void UpdateImages()
  292. {
  293. try
  294. {
  295. if (_delivery.Documents != 0)
  296. {
  297. Device.BeginInvokeOnMainThread(() =>
  298. {
  299. photosLbl.Text = "Loading " + _delivery.Documents + " Photo(s)";
  300. photosLbl.TextColor = Color.DarkOrange;
  301. });
  302. int count = _delivery.Documents;
  303. CoreTable table = new Client<DeliveryDocument>().Query(
  304. new Filter<DeliveryDocument>(x => x.EntityLink.ID).IsEqualTo(_delivery.ID),
  305. new Columns<DeliveryDocument>(x => x.DocumentLink.ID),
  306. null
  307. );
  308. if (table.Rows.Count != 0)
  309. {
  310. foreach (var row in table.Rows)
  311. {
  312. List<object> list = row.Values;
  313. if (list[0] == null) { list[0] = Guid.Empty; }
  314. Guid deliveryDocLinkID = Guid.Parse(list[0].ToString());
  315. existingDocumentIDs.Add(deliveryDocLinkID);
  316. new Client<Document>().Query(
  317. new Filter<Document>(x => x.ID).IsEqualTo(deliveryDocLinkID),
  318. null,
  319. null,
  320. (t, e) =>
  321. {
  322. CoreRow docrow = t.Rows.FirstOrDefault();
  323. if (docrow != null)
  324. {
  325. byte[] data = docrow.Get<Document, byte[]>(x => x.Data);
  326. ImageSource src = ImageSource.FromStream(() => new MemoryStream(data));
  327. Image img = new Image();
  328. img.HeightRequest = 150;
  329. img.WidthRequest = 150;
  330. img.Aspect = Aspect.AspectFit;
  331. img.Source = src;
  332. img.GestureRecognizers.Add(new TapGestureRecognizer
  333. {
  334. Command = new Command(OnTap),
  335. CommandParameter = src,
  336. NumberOfTapsRequired = 1
  337. });
  338. Device.BeginInvokeOnMainThread(() =>
  339. {
  340. ImageScroller.IsVisible = true;
  341. images.Children.Add(img);
  342. count = count - 1;
  343. photosLbl.Text = "Loading " + count + " Photo(s)";
  344. if (count == 0)
  345. {
  346. photosLbl.Text = "Photos";
  347. photosLbl.TextColor = Color.Default;
  348. }
  349. });
  350. }
  351. }
  352. );
  353. }
  354. }
  355. }
  356. }
  357. catch
  358. {
  359. }
  360. }
  361. private async void DeliveryItemsCount()
  362. {
  363. try
  364. {
  365. await Task.Run(() =>
  366. {
  367. var table = new Client<DeliveryItem>().Query(
  368. new Filter<DeliveryItem>(x => x.Delivery.ID).IsEqualTo(_delivery.ID),
  369. new Columns<DeliveryItem>(
  370. X => X.ManufacturingPacketLink.SetoutLink.Number,
  371. X => X.ShipmentCode,
  372. X => X.Description,
  373. X => X.RequisitionLink.Number
  374. ),
  375. new SortOrder<DeliveryItem>(x => x.ShipmentCode)
  376. );
  377. if (table.Rows.Count != 0)
  378. {
  379. string emptyString = "";
  380. foreach (var row in table.Rows)
  381. {
  382. List<object> list = row.Values;
  383. if (list[0] == null) { list[0] = emptyString; }
  384. if (list[1] == null) { list[1] = emptyString; }
  385. if (list[2] == null) { list[2] = emptyString; }
  386. if (list[3] == null) { list[3] = emptyString; }
  387. Docket docket = new Docket();
  388. docket.Setout = "Setout #" + list[0].ToString();
  389. docket.Rack = "Rack: " + list[1].ToString();
  390. docket.Description = list[2].ToString();
  391. docket.Requi = "Requi: " + list[3].ToString();
  392. dockets.Add(docket);
  393. }
  394. }
  395. Device.BeginInvokeOnMainThread(() =>
  396. {
  397. if (table.Rows.Count != 0)
  398. {
  399. loadDeliveryItems.Text = "View " + table.Rows.Count + " items";
  400. loadDeliveryItems.IsEnabled = true;
  401. }
  402. else
  403. {
  404. loadDeliveryItems.Text = "0 Items Found";
  405. }
  406. });
  407. }
  408. );
  409. }
  410. catch { }
  411. }
  412. #endregion
  413. #region Values Changed Events
  414. private async void SelectType_Clicked(object sender, EventArgs e)
  415. {
  416. try
  417. {
  418. Dictionary<string, Guid> deliveryTypePairs = new Dictionary<string, Guid>();
  419. List<string> _deliveryTypes = new List<string>();
  420. var table = new Client<DeliveryType>().Query(new Filter<DeliveryType>(x => x.Description).IsNotEqualTo(string.Empty));
  421. foreach (CoreRow row in table.Rows)
  422. {
  423. DeliveryType _deliveryType = row.ToObject<DeliveryType>();
  424. _deliveryTypes.Add(_deliveryType.Description);
  425. deliveryTypePairs.Add(_deliveryType.Description, _deliveryType.ID);
  426. }
  427. if (_deliveryTypes.Count != 0)
  428. {
  429. string[] array = _deliveryTypes.ToArray();
  430. string chosenOption = await DisplayActionSheet("Choose Delivery Type", "Cancel", null, array);
  431. if (!chosenOption.Equals("Cancel"))
  432. {
  433. _delivery.Type.Description = chosenOption;
  434. TypeLbl.Text = _delivery.Type.Description;
  435. _delivery.Type.ID = deliveryTypePairs[chosenOption];
  436. }
  437. }
  438. }
  439. catch { }
  440. }
  441. private void SelectJob_Clicked(object sender, EventArgs e)
  442. {
  443. openingAnotherPage = true;
  444. JobSelectionPage jobSelectionPage = new JobSelectionPage();
  445. jobSelectionPage.OnItemSelected += (() =>
  446. {
  447. _delivery.Job.ID = jobSelectionPage.Job.ID;
  448. _delivery.Job.Name = jobSelectionPage.Job.Name;
  449. _delivery.Job.JobNumber = jobSelectionPage.Job.JobNumber;
  450. JobName.Text = _delivery.Job.Name + " (" + _delivery.Job.JobNumber + ")";
  451. openingAnotherPage = false;
  452. });
  453. Navigation.PushAsync(jobSelectionPage);
  454. }
  455. #region Address
  456. private void StreetEdt_Changed(object sender, EventArgs e)
  457. {
  458. _delivery.Address.Street = streetEdt.Text;
  459. }
  460. private void CityEdt_Changed(object sender, EventArgs e)
  461. {
  462. _delivery.Address.City = cityEdt.Text;
  463. }
  464. private void StatePicker_Changed(object sender, EventArgs e)
  465. {
  466. _delivery.Address.State = statePicker.SelectedItem.ToString();
  467. }
  468. private void PostCode_Changed(object sender, EventArgs e)
  469. {
  470. _delivery.Address.PostCode = postCodeEdt.Text;
  471. }
  472. private int SelectState()
  473. {
  474. int state = 0;
  475. switch (_delivery.Address.State)
  476. {
  477. case "Western Australia":
  478. state = 0;
  479. break;
  480. case "Victoria":
  481. state = 1;
  482. break;
  483. case "South Australia":
  484. state = 2;
  485. break;
  486. case "New South Wales":
  487. state = 3;
  488. break;
  489. case "Queensland":
  490. state = 4;
  491. break;
  492. case "Tasmania":
  493. state = 5;
  494. break;
  495. default:
  496. state = 0;
  497. break;
  498. }
  499. return state;
  500. }
  501. #endregion Address
  502. private async void SelectContact_Clicked(object sender, EventArgs e)
  503. {
  504. try
  505. {
  506. openingAnotherPage = true;
  507. GenericSelectionPage page = new GenericSelectionPage
  508. (
  509. "Select Contact",
  510. new SelectionViewModel<Contact>
  511. (
  512. new Filter<Contact>(x => x.ID).IsNotEqualTo(Guid.Empty).And(x => x.Address.Street).IsNotEqualTo(string.Empty),
  513. new Expression<Func<Contact, object>>[] { x => x.Name, x => x.Address.Street, x => x.Address.City },
  514. new Expression<Func<Contact, object>>[] { x => x.Address.PostCode, x => x.ID },
  515. new SortOrder<Contact>(x => x.Name)
  516. ));
  517. page.OnItemSelected += (row) =>
  518. {
  519. var contact = row.ToObject<Contact>();
  520. _delivery.Contact.Address.Street = contact.Address.Street;
  521. _delivery.Contact.Address.City = contact.Address.City;
  522. _delivery.Contact.Address.PostCode = contact.Address.PostCode;
  523. _delivery.Contact.Address.State = contact.Address.State;
  524. Device.BeginInvokeOnMainThread(() =>
  525. {
  526. streetEdt.Text = _delivery.Contact.Address.Street;
  527. cityEdt.Text = _delivery.Contact.Address.City;
  528. postCodeEdt.Text = _delivery.Contact.Address.PostCode;
  529. ContactNameLbl.Text = _delivery.Contact.Name;
  530. openingAnotherPage = false;
  531. });
  532. };
  533. Navigation.PushAsync(page);
  534. }
  535. catch { }
  536. }
  537. private void SelectCustomerPage()
  538. {
  539. //if (_searching)
  540. // return;
  541. //else
  542. //{
  543. // _searching = true;
  544. // GenericSelectionPage page = new GenericSelectionPage
  545. // (
  546. // "Select Customer",
  547. // new SelectionViewModel<CustomerContact>
  548. // (
  549. // new Filter<CustomerContact>(x => x.Contact.ID).IsNotEqualTo(Guid.Empty).And(x => x.Contact.Address.Street).IsNotEqualTo(string.Empty),
  550. // new Expression<Func<CustomerContact, object>>[] { x => x.Contact.Name, x => x.Contact.Address.Street, x => x.Contact.Address.City },
  551. // new Expression<Func<CustomerContact, object>>[] { x => x.Contact.Address.PostCode, x => x.Contact.ID, x => x.Contact },
  552. // new SortOrder<CustomerContact>(x => x.Contact.Name)
  553. // ));
  554. // page.OnItemSelected += (row) =>
  555. // {
  556. // var customerContact = row.ToObject<CustomerContact>();
  557. // _delivery.Contact.Address.Street = customerContact.Contact.Address.Street;
  558. // _delivery.Contact.Address.City = customerContact.Contact.Address.City;
  559. // _delivery.Contact.Address.PostCode = customerContact.Contact.Address.PostCode;
  560. // _delivery.Contact.Address.State = customerContact.Contact.Address.State;
  561. // Device.BeginInvokeOnMainThread(() =>
  562. // {
  563. // streetEdt.Text = _delivery.Contact.Address.Street;
  564. // cityEdt.Text = _delivery.Contact.Address.City;
  565. // postCodeEdt.Text = _delivery.Contact.Address.PostCode;
  566. // ContactNameLbl.Text = _delivery.Contact.Name;
  567. // });
  568. // };
  569. // Navigation.PushAsync(page);
  570. //}
  571. }
  572. private void SelectSupplierPage()
  573. {
  574. //if (_searching)
  575. // return;
  576. //else
  577. //{
  578. // _searching = true;
  579. // GenericSelectionPage page = new GenericSelectionPage
  580. // (
  581. // "Select Supplier",
  582. // new SelectionViewModel<SupplierContact>
  583. // (
  584. // new Filter<SupplierContact>(x => x.Contact.ID).IsNotEqualTo(Guid.Empty).And(x =>x.Contact.Address.Street).IsNotEqualTo(string.Empty),
  585. // new Expression<Func<SupplierContact, object>>[] { x => x.Contact.Name, x => x.Contact.Address.Street, x => x.Contact.Address.City },
  586. // new Expression<Func<SupplierContact, object>>[] { x => x.Contact.Address.PostCode, x => x.Contact.ID, x => x.Contact },
  587. // new SortOrder<SupplierContact>(x => x.Contact.Name)
  588. // ));
  589. // page.OnItemSelected += (row) =>
  590. // {
  591. // SupplierContact supplierContact = row.ToObject<SupplierContact>();
  592. // _delivery.Contact.ID = supplierContact.Contact.ID;
  593. // _delivery.Contact.Address.Street = supplierContact.Contact.Address.Street;
  594. // _delivery.Contact.Address.City = supplierContact.Contact.Address.City;
  595. // _delivery.Contact.Address.PostCode = supplierContact.Contact.Address.PostCode;
  596. // _delivery.Contact.Address.State = supplierContact.Contact.Address.State;
  597. // Device.BeginInvokeOnMainThread(() =>
  598. // {
  599. // streetEdt.Text = _delivery.Contact.Address.Street;
  600. // cityEdt.Text = _delivery.Contact.Address.City;
  601. // postCodeEdt.Text = _delivery.Contact.Address.PostCode;
  602. // ContactNameLbl.Text = _delivery.Contact.Name;
  603. // });
  604. // };
  605. // Navigation.PushAsync(page);
  606. //}
  607. }
  608. private void SelectOtherPage()
  609. {
  610. //if (_searching)
  611. // return;
  612. //else
  613. //{
  614. // _searching = true;
  615. // GenericSelectionPage page = new GenericSelectionPage
  616. // (
  617. // "Select",
  618. // new SelectionViewModel<Comal.Classes.Contact>
  619. // (
  620. // new Filter<Comal.Classes.Contact>(x => x.Name).IsNotEqualTo(String.Empty).And(x => x.Address.Street).IsNotEqualTo(string.Empty),
  621. // new Expression<Func<Comal.Classes.Contact, object>>[] { x => x.Name, x => x.Address.Street, x => x.Address.City },
  622. // new Expression<Func<Comal.Classes.Contact, object>>[] { },
  623. // new SortOrder<Comal.Classes.Contact>(x => x.Name)
  624. // ));
  625. // page.OnItemSelected += (row) =>
  626. // {
  627. // Comal.Classes.Contact contact = row.ToObject<Comal.Classes.Contact>();
  628. // _delivery.Contact.ID = contact.ID;
  629. // _delivery.Contact.Address.Street = contact.Address.Street;
  630. // _delivery.Contact.Address.City = contact.Address.City;
  631. // _delivery.Contact.Address.PostCode = contact.Address.PostCode;
  632. // _delivery.Contact.Address.State = contact.Address.State;
  633. // Device.BeginInvokeOnMainThread(() =>
  634. // {
  635. // streetEdt.Text = _delivery.Contact.Address.Street;
  636. // cityEdt.Text = _delivery.Contact.Address.City;
  637. // postCodeEdt.Text = _delivery.Contact.Address.PostCode;
  638. // ContactNameLbl.Text = _delivery.Contact.Name;
  639. // });
  640. // };
  641. // Navigation.PushAsync(page);
  642. //}
  643. }
  644. private void SelectEmployee_Clicked(object sender, EventArgs e)
  645. {
  646. openingAnotherPage = true;
  647. EmployeeSelectionPage employeeSelectionPage = new EmployeeSelectionPage();
  648. employeeSelectionPage.OnItemSelected += (() =>
  649. {
  650. _delivery.Employee.ID = employeeSelectionPage.employee.ID;
  651. _delivery.Employee.Name = employeeSelectionPage.employee.Name;
  652. EmployeeName.Text = employeeSelectionPage.employee.Name;
  653. openingAnotherPage = false;
  654. });
  655. Navigation.PushAsync(employeeSelectionPage);
  656. }
  657. private void DeliveryNotes_Completed(object sender, EventArgs e)
  658. {
  659. _delivery.Notes = deliveryNotesEdt.Text;
  660. }
  661. #endregion
  662. #region Photos
  663. async void ChooseImage_Clicked(System.Object sender, System.EventArgs e)
  664. {
  665. try
  666. {
  667. openingAnotherPage = true;
  668. await CrossMedia.Current.Initialize();
  669. if (!CrossMedia.Current.IsPickPhotoSupported)
  670. {
  671. await DisplayAlert("No Library", ":( No Photo Library available.", "OK");
  672. openingAnotherPage = false;
  673. return;
  674. }
  675. var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions()
  676. {
  677. CompressionQuality = 10,
  678. PhotoSize = Plugin.Media.Abstractions.PhotoSize.Full
  679. });
  680. if (file == null)
  681. {
  682. openingAnotherPage = false;
  683. return;
  684. }
  685. Image img = null;
  686. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Adding Photo"))
  687. {
  688. var memoryStream = new MemoryStream();
  689. file.GetStream().CopyTo(memoryStream);
  690. var data = memoryStream.ToArray();
  691. Document doc = new Document()
  692. {
  693. FileName = Path.GetFileName(file.Path),
  694. Data = data,
  695. CRC = CoreUtils.CalculateCRC(data),
  696. TimeStamp = DateTime.Now
  697. };
  698. SavePhoto(doc);
  699. ImageSource src = ImageSource.FromStream(() => new MemoryStream(data));
  700. img = new Image();
  701. img.HeightRequest = 150;
  702. img.WidthRequest = 150;
  703. img.Aspect = Aspect.AspectFit;
  704. img.Source = src;
  705. img.GestureRecognizers.Add(new TapGestureRecognizer
  706. {
  707. Command = new Command(OnTap),
  708. CommandParameter = src,
  709. NumberOfTapsRequired = 1
  710. });
  711. file.Dispose();
  712. }
  713. if (img != null)
  714. {
  715. Device.BeginInvokeOnMainThread(() =>
  716. {
  717. ImageScroller.IsVisible = true;
  718. images.Children.Add(img);
  719. openingAnotherPage = false;
  720. });
  721. await pageScroller.ScrollToAsync(ImageScroller, ScrollToPosition.Center, false);
  722. }
  723. }
  724. catch { }
  725. }
  726. async void SavePhoto(Document doc)
  727. {
  728. try
  729. {
  730. await Task.Run(() =>
  731. {
  732. if (_delivery.ID != Guid.Empty)
  733. {
  734. new Client<Document>().Save(doc, "Photo Taken on Device");
  735. var deliveryDocument = new DeliveryDocument();
  736. deliveryDocument.EntityLink.ID = _delivery.ID;
  737. deliveryDocument.DocumentLink.ID = doc.ID;
  738. deliveryDocument.DocumentLink.FileName = doc.FileName;
  739. new Client<DeliveryDocument>().Save(deliveryDocument, "Photo Taken on Device");
  740. existingDocumentIDs.Add(doc.ID);
  741. }
  742. else
  743. {
  744. newPhotoDocuments.Add(doc);
  745. }
  746. });
  747. }
  748. catch { }
  749. }
  750. async void TakePhoto_Clicked(System.Object sender, System.EventArgs e)
  751. {
  752. try
  753. {
  754. openingAnotherPage = true;
  755. await CrossMedia.Current.Initialize();
  756. if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
  757. {
  758. await DisplayAlert("No Camera", ":( No camera available.", "OK");
  759. openingAnotherPage = false;
  760. return;
  761. }
  762. String filename = String.Format("{0:yyyy-MM-dd HH:mm:ss.fff}.png", DateTime.Now);
  763. var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
  764. {
  765. Name = filename,
  766. CompressionQuality = 10,
  767. PhotoSize = Plugin.Media.Abstractions.PhotoSize.Full
  768. });
  769. if (file == null)
  770. {
  771. openingAnotherPage = false;
  772. return;
  773. }
  774. Image img = null;
  775. using (await MaterialDialog.Instance.LoadingDialogAsync(message: "Adding Photo"))
  776. {
  777. var memoryStream = new MemoryStream();
  778. file.GetStream().CopyTo(memoryStream);
  779. var data = memoryStream.ToArray();
  780. Document doc = new Document()
  781. {
  782. FileName = filename,
  783. Data = data,
  784. CRC = CoreUtils.CalculateCRC(data),
  785. TimeStamp = DateTime.Now
  786. };
  787. SavePhoto(doc);
  788. ImageSource src = ImageSource.FromStream(() => new MemoryStream(data));
  789. img = new Image();
  790. img.HeightRequest = 150;
  791. img.WidthRequest = 150;
  792. img.Aspect = Aspect.AspectFit;
  793. img.Source = src;
  794. img.GestureRecognizers.Add(new TapGestureRecognizer
  795. {
  796. Command = new Command(OnTap),
  797. CommandParameter = src,
  798. NumberOfTapsRequired = 1
  799. });
  800. file.Dispose();
  801. }
  802. if (img != null)
  803. {
  804. Device.BeginInvokeOnMainThread(() =>
  805. {
  806. ImageScroller.IsVisible = true;
  807. images.Children.Add(img);
  808. openingAnotherPage = false;
  809. });
  810. await pageScroller.ScrollToAsync(ImageScroller, ScrollToPosition.Center, false);
  811. }
  812. }
  813. catch { }
  814. }
  815. private void OnTap(object obj)
  816. {
  817. ImageViewer viewer = new ImageViewer(obj as ImageSource);
  818. Navigation.PushAsync(viewer);
  819. }
  820. #endregion
  821. private void Docket_Clicked(object sender, EventArgs e)
  822. {
  823. try
  824. {
  825. openingAnotherPage = true;
  826. var docket = new DeliveryDocket(_delivery.Number, dockets);
  827. Navigation.PushAsync(docket);
  828. }
  829. catch { }
  830. }
  831. #region last row buttons
  832. void ConvertToTaskBtn_Clicked(Object sender, EventArgs e)
  833. {
  834. try
  835. {
  836. openingAnotherPage = true;
  837. EmployeeSelectionPage employeeSelectionPage = new EmployeeSelectionPage();
  838. employeeSelectionPage.OnItemSelected += (() =>
  839. {
  840. Kanban kanban = new Kanban();
  841. kanban.EmployeeLink.ID = employeeSelectionPage.employee.ID;
  842. openingAnotherPage = false;
  843. ConfirmPerson(employeeSelectionPage.employee.Name, kanban);
  844. });
  845. Navigation.PushAsync(employeeSelectionPage);
  846. }
  847. catch { }
  848. }
  849. async void ConfirmPerson(string name, Kanban kanban)
  850. {
  851. string chosenOption = await DisplayActionSheet("Confirm send to " + name, "Cancel", null, "Yes", "No");
  852. switch (chosenOption)
  853. {
  854. case "Cancel":
  855. break;
  856. case "No":
  857. break;
  858. case "Yes":
  859. CreateKanban(kanban);
  860. break;
  861. default:
  862. break;
  863. }
  864. }
  865. async void CreateKanban(Kanban kanban)
  866. {
  867. try
  868. {
  869. convertToTaskBtn.Text = "Saving..";
  870. convertToTaskBtn.IsEnabled = false;
  871. await Task.Run(() =>
  872. {
  873. kanban.ManagerLink.ID = GlobalVariables.EmpID;
  874. kanban.Title = "Delivery " + _delivery.Number + System.Environment.NewLine +
  875. "Delivery Type: " + _delivery.Type.Description + System.Environment.NewLine +
  876. GlobalVariables.EmpName + " converted to Task for further action";
  877. kanban.DueDate = DateTime.Today;
  878. kanban.Category = "Open";
  879. if (!_delivery.Job.ID.Equals(Guid.Empty)) kanban.JobLink.ID = _delivery.Job.ID;
  880. kanban.Description = _delivery.Notes;
  881. new Client<Kanban>().Save(kanban, "Kanban Created from Deliveries Module");
  882. _delivery.KanbanNumber = kanban.Number;
  883. new Client<Delivery>().Save(_delivery, "Updated From Mobile Device");
  884. List<KanbanDocument> kanbanDocuments = new List<KanbanDocument>();
  885. if (existingDocumentIDs.Count != 0)
  886. {
  887. foreach (Guid id in existingDocumentIDs)
  888. {
  889. KanbanDocument kanbanDocument = new KanbanDocument();
  890. kanbanDocument.DocumentLink.ID = id;
  891. kanbanDocument.EntityLink.ID = kanban.ID;
  892. kanbanDocuments.Add(kanbanDocument);
  893. }
  894. }
  895. if (kanbanDocuments.Count != 0)
  896. {
  897. new Client<KanbanDocument>().Save(kanbanDocuments, "Updated from mobile device");
  898. }
  899. List<KanbanSubscriber> subscribers = new List<KanbanSubscriber>();
  900. KanbanSubscriber sub1 = new KanbanSubscriber();
  901. sub1.Kanban.ID = kanban.ID;
  902. sub1.Employee.ID = kanban.EmployeeLink.ID;
  903. sub1.Assignee = true;
  904. subscribers.Add(sub1);
  905. //KanbanSubscriber sub2 = new KanbanSubscriber();
  906. //sub2.Kanban.ID = kanban.ID;
  907. //sub2.Employee.ID = kanban.ManagerLink.ID;
  908. //sub2.Manager = true;
  909. //if (sub2.Employee.ID != sub1.Employee.ID)
  910. // subscribers.Add(sub2);
  911. new Client<KanbanSubscriber>().Save(subscribers, "Updated from mobile device");
  912. Device.BeginInvokeOnMainThread(() =>
  913. {
  914. convertToTaskBtn.Text = "Saved To Task " + kanban.Number;
  915. });
  916. });
  917. //save kanban - return kanban ID
  918. //load list of photos - save as kanbandocs
  919. //save subscribers
  920. }
  921. catch { }
  922. }
  923. void CheckKanbanSent()
  924. {
  925. if (_delivery.KanbanNumber != 0)
  926. {
  927. convertToTaskBtn.Text = "Saved To Task " + _delivery.KanbanNumber;
  928. convertToTaskBtn.IsEnabled = false;
  929. }
  930. if (_delivery.ID == Guid.Empty)
  931. {
  932. convertToTaskBtn.IsEnabled = false;
  933. }
  934. }
  935. #endregion
  936. }
  937. }