FuellingData.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. using System;
  2. using System.Xml;
  3. namespace Wayne.ForecourtControl
  4. {
  5. /// <summary>
  6. /// Fuelling data, contains serializable data from a fuelling.
  7. /// </summary>
  8. public sealed class FuellingData
  9. {
  10. #region Fields
  11. #endregion
  12. #region Construction
  13. /// <summary>
  14. /// Initializes a new fuellingdata object when applying discount.
  15. /// </summary>
  16. /// <param name="fuellingSequenceNumber"></param>
  17. /// <param name="nozzleId"></param>
  18. /// <param name="pumpId"></param>
  19. /// <param name="fuellingType"></param>
  20. /// <param name="quantity"></param>
  21. /// <param name="amount"></param>
  22. /// <param name="presetValue"></param>
  23. /// <param name="presetType"></param>
  24. /// <param name="price"></param>
  25. /// <param name="completionDateTiem"></param>
  26. /// <param name="completionReason"></param>
  27. /// <param name="fuelGrade"></param>
  28. /// <param name="priceGroup"></param>
  29. /// <param name="fuelPeriodId"></param>
  30. /// <param name="authorizationId"></param>
  31. /// <param name="reservingDeviceId"></param>
  32. /// <param name="priceRevision"></param>
  33. /// <param name="signatureReceiptLines"></param>
  34. public FuellingData(int fuellingSequenceNumber,
  35. int nozzleId,
  36. int pumpId,
  37. FuellingType fuellingType,
  38. decimal quantity,
  39. decimal amount,
  40. decimal presetValue,
  41. PresetType presetType,
  42. decimal price,
  43. DateTime completionDateTiem,
  44. int completionReason,
  45. int fuelGrade,
  46. PriceGroup priceGroup,
  47. int fuelPeriodId,
  48. long authorizationId,
  49. byte reservingDeviceId,
  50. byte priceRevision,
  51. string signatureReceiptLines)
  52. : this(fuellingSequenceNumber, nozzleId, pumpId, fuellingType, quantity, amount, presetValue, presetType, price, completionDateTiem, completionReason, fuelGrade, priceGroup, fuelPeriodId, authorizationId, reservingDeviceId, priceRevision, signatureReceiptLines, signatureReceiptLines)
  53. {
  54. }
  55. /// <summary>
  56. /// Initializes a new fuellingdata object when applying discount.
  57. /// </summary>
  58. /// <param name="fuellingSequenceNumber"></param>
  59. /// <param name="nozzleId"></param>
  60. /// <param name="pumpId"></param>
  61. /// <param name="fuellingType"></param>
  62. /// <param name="quantity"></param>
  63. /// <param name="amount"></param>
  64. /// <param name="presetValue"></param>
  65. /// <param name="presetType"></param>
  66. /// <param name="price"></param>
  67. /// <param name="completionDateTiem"></param>
  68. /// <param name="completionReason"></param>
  69. /// <param name="fuelGrade"></param>
  70. /// <param name="priceGroup"></param>
  71. /// <param name="fuelPeriodId"></param>
  72. /// <param name="authorizationId"></param>
  73. /// <param name="reservingDeviceId"></param>
  74. /// <param name="priceRevision"></param>
  75. /// <param name="signatureReceiptLines"></param>
  76. /// <param name="signatureReceiptLinesWide"></param>
  77. public FuellingData(int fuellingSequenceNumber,
  78. int nozzleId,
  79. int pumpId,
  80. FuellingType fuellingType,
  81. decimal quantity,
  82. decimal amount,
  83. decimal presetValue,
  84. PresetType presetType,
  85. decimal price,
  86. DateTime completionDateTiem,
  87. int completionReason,
  88. int fuelGrade,
  89. PriceGroup priceGroup,
  90. int fuelPeriodId,
  91. long authorizationId,
  92. byte reservingDeviceId,
  93. byte priceRevision,
  94. string signatureReceiptLines,
  95. string signatureReceiptLinesWide)
  96. {
  97. FuellingSequenceNumber = fuellingSequenceNumber;
  98. NozzleId = nozzleId;
  99. PumpId = pumpId;
  100. this.Type = fuellingType;
  101. Quantity = quantity;
  102. Amount = amount;
  103. PresetValue = presetValue;
  104. PresetType = presetType;
  105. Price = price;
  106. CompletionDateTime = completionDateTiem;
  107. CompletionReason = completionReason;
  108. FuelGrade = fuelGrade;
  109. PriceGroup = priceGroup;
  110. FuelPeriodId = fuelPeriodId;
  111. AuthorizationId = authorizationId;
  112. ReservingDeviceId = reservingDeviceId;
  113. PriceRevision = priceRevision;
  114. SignedReceiptLines = signatureReceiptLines;
  115. SignedReceiptLinesWide = signatureReceiptLinesWide;
  116. }
  117. /// <summary>
  118. /// Used when deserializing.
  119. /// </summary>
  120. private FuellingData()
  121. {
  122. }
  123. /// <summary>
  124. /// Initializes a new fuellingdata object using a ForecourtControl IFuelling object.
  125. /// </summary>
  126. /// <param name="fuelling"></param>
  127. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String)")]
  128. public FuellingData(IFuelling fuelling)
  129. {
  130. if (fuelling == null)
  131. throw new ArgumentException("IFuelling can't be null");
  132. FuellingSequenceNumber = fuelling.FuellingSequenceNumber;
  133. if (fuelling.Pump != null)
  134. {
  135. PumpId = fuelling.Pump.Id;
  136. }
  137. if (fuelling.Nozzle != null)
  138. {
  139. NozzleId = fuelling.Nozzle.Id;
  140. }
  141. Type = fuelling.Type;
  142. Quantity = fuelling.Quantity;
  143. Amount = fuelling.Amount;
  144. PresetValue = fuelling.PresetValue;
  145. PresetType = fuelling.PresetType;
  146. Price = fuelling.Price;
  147. CompletionDateTime = fuelling.CompletionDateTime;
  148. CompletionReason = fuelling.CompletionReason;
  149. FuelGrade = fuelling.FuelGrade;
  150. if ((fuelling.PriceGroup >= PriceGroup.MinValue) && (fuelling.PriceGroup <= PriceGroup.MaxValue))
  151. {
  152. PriceGroup = fuelling.PriceGroup;
  153. }
  154. else
  155. {
  156. PriceGroup = 0;
  157. }
  158. FuelPeriodId = fuelling.FuelPeriodId;
  159. AuthorizationId = fuelling.AuthorizationId;
  160. ReservingDeviceId = fuelling.ReservingDeviceId;
  161. PriceRevision = fuelling.PriceRevision;
  162. SignedReceiptLines = fuelling.SignedReceiptLines;
  163. SignedReceiptLinesWide = fuelling.SignedReceiptLinesWide;
  164. }
  165. #endregion
  166. #region Properties
  167. /// <summary>
  168. /// Fuelling sequence number is a unique number created for ever
  169. /// completed fuelling. Begins to count from 1 at system cold-start
  170. /// </summary>
  171. public int FuellingSequenceNumber { get; private set; }
  172. /// <summary>
  173. /// Id of the nozzle that performed the fuelling
  174. /// </summary>
  175. public int NozzleId { get; private set; }
  176. /// <summary>
  177. /// Id of the pump that performed the fuelling
  178. /// </summary>
  179. public int PumpId { get; private set; }
  180. /// <summary>
  181. /// Type of the fuelling
  182. /// </summary>
  183. public FuellingType Type { get; private set; }
  184. /// <summary>
  185. /// Fuelled quantity
  186. /// </summary>
  187. public decimal Quantity { get; private set; }
  188. /// <summary>
  189. /// Fuelled amount
  190. /// </summary>
  191. public decimal Amount { get; private set; }
  192. /// <summary>
  193. /// Preset amount or quantity
  194. /// </summary>
  195. public decimal PresetValue { get; private set; }
  196. /// <summary>
  197. /// Indicates if the preset value contains an amount or quantity.
  198. /// </summary>
  199. public PresetType PresetType { get; private set; }
  200. /// <summary>
  201. /// Unit price of the fuelling.
  202. /// </summary>
  203. public decimal Price { get; private set; }
  204. /// <summary>
  205. /// Date and time when the fuelling completed.
  206. /// </summary>
  207. public DateTime CompletionDateTime { get; private set; }
  208. /// <summary>
  209. /// A status code signaling why the fuelling stopped.
  210. /// </summary>
  211. public int CompletionReason { get; private set; }
  212. /// <summary>
  213. /// Fuelgrade that was used in the fuelling.
  214. /// </summary>
  215. public int FuelGrade { get; private set; }
  216. /// <summary>
  217. /// Price group that was used to calculate the price in the fuelling.
  218. /// </summary>
  219. public PriceGroup PriceGroup { get; private set; }
  220. /// <summary>
  221. /// Fuel period that the fuelling belongs to.
  222. /// </summary>
  223. public int FuelPeriodId { get; private set; }
  224. /// <summary>
  225. /// Authorization Id of the fuelling authorization.
  226. /// </summary>
  227. public long AuthorizationId { get; private set; }
  228. /// <summary>
  229. /// Device Id that was supplied in the reservation of the pump before authorization of the fuelling.
  230. /// </summary>
  231. public byte ReservingDeviceId { get; private set; }
  232. /// <summary>
  233. /// Internal Price revision number that was active when the fuelling took place.
  234. /// </summary>
  235. public byte PriceRevision { get; private set; }
  236. /// <summary>
  237. /// Application extension data.
  238. /// </summary>
  239. public string ApplicationExtension { get; set; }
  240. /// <summary>
  241. /// The MID Signed ReceiptLines.
  242. /// </summary>
  243. public string SignedReceiptLines { get; private set; }
  244. /// <summary>
  245. /// The MID Signed ReceiptLines for Wide printer.
  246. /// </summary>
  247. public string SignedReceiptLinesWide { get; private set; }
  248. #endregion
  249. /// <summary>
  250. /// Serializes the fuelling data.
  251. /// </summary>
  252. /// <param name="writer"></param>
  253. /// <param name="prefix"></param>
  254. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String)")]
  255. public void WriteXml(XmlWriter writer, string prefix)
  256. {
  257. if (writer != null)
  258. {
  259. writer.WriteStartElement(prefix, "FuellingData", ForecourtControlXml.Ns);
  260. writer.WriteAttributeString("FuellingSequenceNumber", XmlConvert.ToString(FuellingSequenceNumber));
  261. writer.WriteElementString(prefix, "PumpId", ForecourtControlXml.Ns, XmlConvert.ToString(PumpId));
  262. writer.WriteElementString(prefix, "NozzleId", ForecourtControlXml.Ns, XmlConvert.ToString(NozzleId));
  263. writer.WriteElementString(prefix, "FuellingType", ForecourtControlXml.Ns, Type.ToString());
  264. writer.WriteElementString(prefix, "Amount", ForecourtControlXml.Ns, XmlConvert.ToString(Amount));
  265. writer.WriteElementString(prefix, "Quantity", ForecourtControlXml.Ns, XmlConvert.ToString(Quantity));
  266. writer.WriteElementString(prefix, "PresetValue", ForecourtControlXml.Ns, XmlConvert.ToString(PresetValue));
  267. writer.WriteElementString(prefix, "PresetType", ForecourtControlXml.Ns, PresetType.ToString());
  268. writer.WriteElementString(prefix, "Price", ForecourtControlXml.Ns, XmlConvert.ToString(Price));
  269. writer.WriteElementString(prefix, "CompletionDateTime", ForecourtControlXml.Ns, XmlConvert.ToString(CompletionDateTime, XmlDateTimeSerializationMode.Local));
  270. writer.WriteElementString(prefix, "CompletionReason", ForecourtControlXml.Ns, XmlConvert.ToString(CompletionReason));
  271. writer.WriteElementString(prefix, "FuelGrade", ForecourtControlXml.Ns, XmlConvert.ToString(FuelGrade));
  272. writer.WriteElementString(prefix, "PriceGroup", ForecourtControlXml.Ns, XmlConvert.ToString((int)PriceGroup));
  273. writer.WriteElementString(prefix, "FuelPeriodId", ForecourtControlXml.Ns, XmlConvert.ToString(FuelPeriodId));
  274. writer.WriteElementString(prefix, "AuthorizationId", ForecourtControlXml.Ns, XmlConvert.ToString(AuthorizationId));
  275. writer.WriteElementString(prefix, "ReservingDeviceId", ForecourtControlXml.Ns, XmlConvert.ToString(ReservingDeviceId));
  276. writer.WriteElementString(prefix, "PriceRevision", ForecourtControlXml.Ns, XmlConvert.ToString(PriceRevision));
  277. writer.WriteElementString(prefix, "SignedReceiptLines", ForecourtControlXml.Ns, SignedReceiptLines);
  278. writer.WriteElementString(prefix, "SignedReceiptLinesWide", ForecourtControlXml.Ns, SignedReceiptLinesWide);
  279. if (ApplicationExtension != null)
  280. writer.WriteElementString(prefix, "ApplicationExtension", ForecourtControlXml.Ns, ApplicationExtension);
  281. writer.WriteEndElement();//FuellingData
  282. }
  283. else
  284. throw new ArgumentException("XmlWriter cannot be null");
  285. }
  286. /// <summary>
  287. /// Recreates a fuelling data object from an Xml element.
  288. /// </summary>
  289. /// <param name="fuellingDataElement"></param>
  290. /// <returns></returns>
  291. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1059:MembersShouldNotExposeCertainConcreteTypes", MessageId = "System.Xml.XmlNode")]
  292. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "System.ArgumentException.#ctor(System.String)")]
  293. public static FuellingData Deserialize(XmlElement fuellingDataElement)
  294. {
  295. if (fuellingDataElement == null)
  296. throw new ArgumentException("Fuelling data element cannot be null");
  297. FuellingData data = new FuellingData();
  298. data.FuellingSequenceNumber = XmlConvert.ToInt32(fuellingDataElement.Attributes["FuellingSequenceNumber"].Value);
  299. data.PumpId = XmlConvert.ToInt32(fuellingDataElement["PumpId", ForecourtControlXml.Ns].InnerText);
  300. data.NozzleId = XmlConvert.ToInt32(fuellingDataElement["NozzleId", ForecourtControlXml.Ns].InnerText);
  301. data.Type = (FuellingType)Enum.Parse(typeof(FuellingType), fuellingDataElement["FuellingType", ForecourtControlXml.Ns].InnerText, false);
  302. data.Quantity = XmlConvert.ToDecimal(fuellingDataElement["Quantity", ForecourtControlXml.Ns].InnerText);
  303. data.Amount = XmlConvert.ToDecimal(fuellingDataElement["Amount", ForecourtControlXml.Ns].InnerText);
  304. data.PresetValue = XmlConvert.ToDecimal(fuellingDataElement["PresetValue", ForecourtControlXml.Ns].InnerText);
  305. data.PresetType = (PresetType)Enum.Parse(typeof(PresetType), fuellingDataElement["PresetType", ForecourtControlXml.Ns].InnerText, false);
  306. data.Price = XmlConvert.ToDecimal(fuellingDataElement["Price", ForecourtControlXml.Ns].InnerText);
  307. data.CompletionDateTime = XmlConvert.ToDateTime(fuellingDataElement["CompletionDateTime", ForecourtControlXml.Ns].InnerText, XmlDateTimeSerializationMode.Local);
  308. data.CompletionReason = XmlConvert.ToInt32(fuellingDataElement["CompletionReason", ForecourtControlXml.Ns].InnerText);
  309. data.FuelGrade = XmlConvert.ToInt32(fuellingDataElement["FuelGrade", ForecourtControlXml.Ns].InnerText);
  310. data.PriceGroup = XmlConvert.ToInt32(fuellingDataElement["PriceGroup", ForecourtControlXml.Ns].InnerText);
  311. data.FuelPeriodId = XmlConvert.ToInt32(fuellingDataElement["FuelPeriodId", ForecourtControlXml.Ns].InnerText);
  312. data.AuthorizationId = XmlConvert.ToInt32(fuellingDataElement["AuthorizationId", ForecourtControlXml.Ns].InnerText);
  313. XmlElement signedReceiptLinesElement = fuellingDataElement["SignedReceiptLines", ForecourtControlXml.Ns];
  314. if (signedReceiptLinesElement != null)
  315. data.SignedReceiptLines = signedReceiptLinesElement.InnerText;
  316. else
  317. data.SignedReceiptLines = "";
  318. XmlElement signedReceiptLinesWideElement = fuellingDataElement["SignedReceiptLinesWide", ForecourtControlXml.Ns];
  319. if (signedReceiptLinesWideElement != null)
  320. data.SignedReceiptLinesWide = signedReceiptLinesWideElement.InnerText;
  321. else
  322. data.SignedReceiptLinesWide = "";
  323. if (fuellingDataElement["ReservingDeviceId", ForecourtControlXml.Ns] != null)
  324. data.ReservingDeviceId = XmlConvert.ToByte(fuellingDataElement["ReservingDeviceId", ForecourtControlXml.Ns].InnerText);
  325. if (fuellingDataElement["PriceRevision", ForecourtControlXml.Ns] != null)
  326. data.PriceRevision = XmlConvert.ToByte(fuellingDataElement["PriceRevision", ForecourtControlXml.Ns].InnerText);
  327. if (fuellingDataElement["ApplicationExtension", ForecourtControlXml.Ns] != null)
  328. data.ApplicationExtension = fuellingDataElement["ApplicationExtension", ForecourtControlXml.Ns].InnerText;
  329. return data;
  330. }
  331. }
  332. }