You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
10 KiB

  1. using GMCabsDriverAssistant.Enums;
  2. using GMCabsDriverAssistant.Models;
  3. using GMCabsDriverAssistant.Services;
  4. using GMCabsDriverAssistantSolution.Models.Rydo;
  5. using GMCabsDriverAssistantSolution.Views;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Text.Json;
  11. using System.Threading.Tasks;
  12. namespace GMCabsDriverAssistantSolution.ViewModels
  13. {
  14. [QueryProperty(nameof(BookingJson), nameof(BookingJson))]
  15. public class BookingDetailViewModel : BaseViewModel
  16. {
  17. #region Constants
  18. private const int RYDO_METER_FARE_PROVIDER_CHARGE = 10;
  19. private const int RYDO_FIXED_PRICE_PROVIDER_CHARGE = 10;
  20. private const int RYDO_METER_FARE_PROVIDER_CHARGE_GM_DRIVER = 10;
  21. private const int RYDO_FIXED_PRICE_PROVIDER_CHARGE_GM_DRIVER = 5;
  22. #endregion
  23. #region Fields
  24. private string _bookingId;
  25. private float distance;
  26. private string formattedDistance;
  27. private string startAddress;
  28. private string startSuburb;
  29. private string endAddress;
  30. private string endSuburb;
  31. private string rewardPoints;
  32. private double bookingFee;
  33. private bool isCorporateBooking;
  34. private string fareTypeValue;
  35. private int? fixedAmount;
  36. private bool isFutureBooking;
  37. private int pickUpTime;
  38. private string formattedPickUpTime;
  39. private string formattedPickUpTimeDateOnly;
  40. private string formattedPickUpTimeTimeOnly;
  41. private string bookingJson;
  42. private string startStreetName;
  43. private string endStreetName;
  44. #endregion
  45. #region Properties
  46. public Guid Id { get; set; }
  47. public string BookingId
  48. {
  49. get => _bookingId;
  50. set
  51. {
  52. _bookingId = value;
  53. // LoadBooking(Guid.Parse(value));
  54. }
  55. }
  56. public float Distance
  57. {
  58. get => distance;
  59. set => SetProperty(ref distance, value);
  60. }
  61. public string FormattedDistance
  62. {
  63. get => (distance >= 1000) ? $"{distance / 1000:0.##}k" : $"{(int)distance}m";
  64. set => SetProperty(ref formattedDistance, value);
  65. }
  66. public string StartAddress
  67. {
  68. get => startAddress;
  69. set => SetProperty(ref startAddress, value);
  70. }
  71. public string StartSuburb
  72. {
  73. get => startSuburb;
  74. set => SetProperty(ref startSuburb, value);
  75. }
  76. public string EndAddress
  77. {
  78. get => endAddress;
  79. set => SetProperty(ref endAddress, value);
  80. }
  81. public string EndSuburb
  82. {
  83. get => endSuburb;
  84. set => SetProperty(ref endSuburb, value);
  85. }
  86. public string RewardPoints
  87. {
  88. get => rewardPoints;
  89. set => SetProperty(ref rewardPoints, value);
  90. }
  91. public double BookingFee
  92. {
  93. get => bookingFee;
  94. set => SetProperty(ref bookingFee, value);
  95. }
  96. public bool IsCorporateBooking
  97. {
  98. get => isCorporateBooking;
  99. set => SetProperty(ref isCorporateBooking, value);
  100. }
  101. public string FareTypeValue
  102. {
  103. get => fareTypeValue;
  104. set => SetProperty(ref fareTypeValue, value);
  105. }
  106. public int? FixedAmount
  107. {
  108. get => fixedAmount;
  109. set => SetProperty(ref fixedAmount, value);
  110. }
  111. public bool IsFutureBooking
  112. {
  113. get => isFutureBooking;
  114. set => SetProperty(ref isFutureBooking, value);
  115. }
  116. public int PickUpTime
  117. {
  118. get => pickUpTime;
  119. set => SetProperty(ref pickUpTime, value);
  120. }
  121. public string FormattedPickUpTime
  122. {
  123. get
  124. {
  125. DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
  126. dateTime = dateTime.AddSeconds(pickUpTime).ToLocalTime();
  127. return dateTime.ToString("dd/MM/yyyy hh:mm tt");
  128. }
  129. set => SetProperty(ref formattedPickUpTime, value);
  130. }
  131. public Command OnAcceptBookingClicked { get; }
  132. public Command OnDeclineBookingClicked { get; }
  133. public string BookingJson
  134. {
  135. get => bookingJson;
  136. set
  137. {
  138. bookingJson = value;
  139. LoadBooking(value);
  140. }
  141. }
  142. public string StartStreetName
  143. {
  144. get => startStreetName;
  145. set => SetProperty(ref startStreetName, value);
  146. }
  147. public string EndStreetName
  148. {
  149. get => endStreetName;
  150. set => SetProperty(ref endStreetName, value);
  151. }
  152. #endregion
  153. #region Constructor
  154. public BookingDetailViewModel()
  155. {
  156. Title = "Booking Details";
  157. OnAcceptBookingClicked = new Command(async () => { await AcceptBooking(); });
  158. OnDeclineBookingClicked = new Command(async () => { await DeclineBooking(Id.ToString()); });
  159. }
  160. public BookingDetailViewModel(Guid bookingId)
  161. {
  162. BookingId = bookingId.ToString();
  163. Title = "Booking Details";
  164. OnAcceptBookingClicked = new Command(async () => { await AcceptBooking(); });
  165. OnDeclineBookingClicked = new Command(async () => { await DeclineBooking(Id.ToString()); });
  166. }
  167. #endregion
  168. #region Method
  169. private async void LoadBooking(string bookingJson)
  170. {
  171. /* string rydoAccessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN,"");
  172. GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
  173. var booking = await gmCabsDriverService.GetBookingDetails(rydoAccessToken, bookingId);*/
  174. BookingDto booking = JsonSerializer.Deserialize<BookingDto>(bookingJson);
  175. if (booking.BookingId == Guid.Empty)
  176. {
  177. await Shell.Current.GoToAsync("..");
  178. }
  179. Id = booking.BookingId;
  180. Distance = booking.Distance;
  181. FormattedDistance = booking.Distance.ToString();
  182. StartAddress = booking.StartAddress;
  183. StartSuburb = booking.StartSuburb;
  184. EndAddress = booking.EndAddress;
  185. EndSuburb = booking.EndSuburb;
  186. IsCorporateBooking = booking.IsCorporate;
  187. FixedAmount = booking.FixedAmount;
  188. IsFutureBooking = booking.FutureBooking;
  189. PickUpTime = booking.PickupTime;
  190. FormattedPickUpTime = booking.PickupTime.ToString();
  191. BookingFee = 0;
  192. if (FixedAmount != null)
  193. {
  194. decimal amount = (decimal)(FixedAmount / 100.0);
  195. FareTypeValue = "$" + amount;
  196. }
  197. else
  198. {
  199. FareTypeValue = "METER";
  200. }
  201. RewardPoints = booking.RydoStars > 0 ? string.Format($"+{booking.RydoStars}") : booking.RydoStars.ToString();
  202. var preferredDriver = booking.PriorityDriver;
  203. if (preferredDriver)
  204. {
  205. if (booking.FareType == FareType.Fixed)
  206. {
  207. if (booking.FixedAmount > booking.MinFareAmount)
  208. {
  209. BookingFee = booking.ProviderChargeFixedFarePreferred.Value;
  210. }
  211. }
  212. else if (booking.FareType == FareType.Meter)
  213. {
  214. BookingFee = booking.ProviderChargeMeterFarePreferred.Value;
  215. }
  216. }
  217. else
  218. {
  219. if (booking.FareType == FareType.Fixed)
  220. {
  221. if (booking.FixedAmount > booking.MinFareAmount)
  222. {
  223. BookingFee = booking.ProviderChargeFixedFare.Value;
  224. }
  225. }
  226. else if (booking.FareType == FareType.Meter)
  227. {
  228. BookingFee = booking.ProviderChargeMeterFare.Value;
  229. }
  230. }
  231. string[] splitStartAddresses = StartAddress.Split(' ');
  232. bool isStartAddressNumberOccurance = splitStartAddresses[0].Any(letter => char.IsDigit(letter));
  233. string[] splitEndAddresses = EndAddress.Split(' ');
  234. bool isEndAddressNumberOccurance = splitEndAddresses[0].Any(letter => char.IsDigit(letter));
  235. if (isEndAddressNumberOccurance)
  236. {
  237. StartStreetName = StartAddress.Substring(StartAddress.IndexOf(' ') + 1);
  238. StartStreetName = StartStreetName + $", {StartSuburb}";
  239. }
  240. else
  241. {
  242. StartStreetName = StartSuburb;
  243. }
  244. if (isEndAddressNumberOccurance)
  245. {
  246. EndStreetName = EndAddress.Substring(EndAddress.IndexOf(' ') + 1);
  247. EndStreetName = EndStreetName + $", {EndSuburb}";
  248. }
  249. else
  250. {
  251. EndStreetName = EndSuburb;
  252. }
  253. }
  254. [Obsolete]
  255. private async Task AcceptBooking()
  256. {
  257. await Shell.Current.GoToAsync($"{nameof(AcceptBookingPage)}?{nameof(AcceptBookingViewModel.BookingId)}={Id}&{nameof(AcceptBookingViewModel.PickUpAddress)}={StartAddress}&{nameof(AcceptBookingViewModel.DropUpAddress)}={EndAddress}&{nameof(AcceptBookingViewModel.IsFutureBooking)}={IsFutureBooking}");
  258. }
  259. private async Task DeclineBooking(string booking_Id)
  260. {
  261. string rydoAccessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
  262. Guid driverId = Guid.Parse(Preferences.Get(LoginResponseDto.USER_CODE, ""));
  263. GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
  264. AcceptDeclineBookingRequest acceptBookingRequest = new AcceptDeclineBookingRequest();
  265. acceptBookingRequest.DriverId = driverId;
  266. var res = await gmCabsDriverService.DeclineBooking(acceptBookingRequest, rydoAccessToken, booking_Id);
  267. if (res.StatusCode == 200)
  268. {
  269. await Shell.Current.GoToAsync($"//{nameof(HomePage)}");
  270. }
  271. }
  272. #endregion
  273. }
  274. }