RenewLicense.txt 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. @using Comal.Classes
  2. @using GenHTTP.Api.Protocol
  3. @using GenHTTP.Modules.IO
  4. @using InABox.Clients
  5. @using InABox.Core
  6. @using PRSServer
  7. @using System.Text
  8. @{
  9. var renewalPeriods = new List<Tuple<int, Func<DateTime, DateTime>>> {
  10. new(1, x => x.AddDays(-7)),
  11. new(3, x => x.AddDays(-14)),
  12. new(6, x => x.AddMonths(-1))
  13. };
  14. var request = Serialization.Deserialize<LicenseRenewal>(Model.Request.Content);
  15. if(request == null){
  16. Model.Respond().Status(ResponseStatus.BadRequest);
  17. return;
  18. }
  19. Logger.Send(LogType.Information, "", $"Request for license renewal from {request.Company.CompanyName}");
  20. var customerID = request.OldLicense.CustomerID;
  21. if(customerID == Guid.Empty){
  22. customerID = CreateNewCustomer().ID;
  23. request.OldLicense.CustomerID = customerID;
  24. }
  25. Logger.Send(LogType.Information, "", "Generating new license");
  26. var newLicense = GenerateLicense();
  27. var newLicenseData = LicenseUtils.EncryptLicense(newLicense);
  28. if(newLicenseData == null){
  29. Logger.Send(LogType.Error, "", "Encryption of new license failed!");
  30. Model.Respond().Status(ResponseStatus.InternalServerError);
  31. return;
  32. }
  33. Logger.Send(LogType.Information, "", "Generating customer document");
  34. var customerDocument = CreateNewCustomerDocument(customerID, $"{request.Company.CompanyName} - PRS License - {DateTime.Now:dd MMM yyyy}.txt", newLicenseData);
  35. Logger.Send(LogType.Information, "", "Creating invoice");
  36. CreateInvoice(customerID, request);
  37. Model.Respond()
  38. .Status(ResponseStatus.OK)
  39. .Content(Serialization.Serialize(new License { Data = newLicenseData } )); // Send just the encrypted data.
  40. return;
  41. int GetMonthDifference(DateTime date1, DateTime date2){
  42. var months = (date2.Year - date1.Year) * 12 + (date2.Month - date1.Month);
  43. if(date2.Day >= date1.Day){
  44. return months;
  45. }
  46. return months - 1;
  47. }
  48. LicenseData GenerateLicense(){
  49. var renewalPeriodInMonths = GetMonthDifference(request.DateRenewed, request.NewExpiry);
  50. var renewalAvailable = renewalPeriods
  51. .Where(x => renewalPeriodInMonths >= x.Item1)
  52. .MaxBy(x => x.Item1)
  53. .Item2(request.NewExpiry);
  54. var newLicense = LicenseUtils.RenewLicense(request.OldLicense, request.DateRenewed, request.NewExpiry, renewalAvailable);
  55. return newLicense;
  56. }
  57. string NewCustomerCode(){
  58. var code = request.Company.CompanyName.ToUpper();
  59. var codes = new Client<Customer>().Query(
  60. new Filter<Customer>(x => x.Code).BeginsWith(code),
  61. new Columns<Customer>(x => x.Code))?.Rows.Select(x => x.Get<Customer, string>(x => x.Code)).ToList();
  62. var tryCode = code;
  63. var i = 0;
  64. while(codes.Contains(tryCode)){
  65. tryCode = $"{code}{i}";
  66. ++i;
  67. }
  68. return tryCode;
  69. }
  70. Customer CreateNewCustomer(){
  71. Logger.Send(LogType.Information, "", "Creating new customer");
  72. var customer = new Customer {
  73. Code = NewCustomerCode(),
  74. Name = $"{request.Company.CompanyName} - {request.Company.ABN}",
  75. Delivery = request.Company.DeliveryAddress,
  76. Email = request.Company.Email,
  77. Postal = request.Company.PostalAddress
  78. };
  79. new Client<Customer>().Save(customer, "Created by License Renewal");
  80. return customer;
  81. }
  82. CustomerDocument CreateNewCustomerDocument(Guid customerID, string fileName, string data){
  83. var document = new Document {
  84. FileName = fileName,
  85. Private = true,
  86. TimeStamp = DateTime.Now,
  87. Data = Encoding.UTF8.GetBytes(data)
  88. };
  89. document.CRC = CoreUtils.CalculateCRC(document.Data);
  90. new Client<Document>().Save(document, "");
  91. var documentType = new Client<DocumentType>()
  92. .Query(new Filter<DocumentType>(x => x.Code).IsEqualTo("LICENSE"), new Columns<DocumentType>(x => x.ID))
  93. .Rows.FirstOrDefault()?.Get<DocumentType, Guid>(x => x.ID) ?? Guid.Empty;
  94. if(documentType == Guid.Empty){
  95. Logger.Send(LogType.Error, "", "Document Type 'LICENSE' doesn't exist");
  96. }
  97. var customerDocument = new CustomerDocument();
  98. customerDocument.Type.ID = documentType;
  99. customerDocument.EntityLink.ID = customerID;
  100. customerDocument.DocumentLink.ID = document.ID;
  101. new Client<CustomerDocument>().Save(customerDocument, "Created by License Renewal");
  102. return customerDocument;
  103. }
  104. void CreateInvoice(Guid customerID, LicenseRenewal renewal){
  105. var invoiceLines = new List<InvoiceLine>();
  106. var notes = new List<string>();
  107. foreach(var item in renewal.LicenseTracking){
  108. var invoiceLine = new InvoiceLine {
  109. Description = $"{item.License} - {item.Users} Users @ ${item.Rate:F2} per user",
  110. ExTax = item.ExGST
  111. };
  112. invoiceLines.Add(invoiceLine);
  113. notes.Add(invoiceLine.Description);
  114. }
  115. var discountLine = new InvoiceLine {
  116. Description = $"${renewal.Discount:F2} discount",
  117. ExTax = -renewal.Discount
  118. };
  119. invoiceLines.Add(discountLine);
  120. notes.Add(discountLine.Description);
  121. var invoice = new Invoice {
  122. Date = DateTime.Today,
  123. Description = $"License Renewal - Stripe Transaction No. '{renewal.TransactionID}'"
  124. };
  125. invoice.CustomerLink.ID = customerID;
  126. new Client<Invoice>().Save(invoice, "Created by License Renewal");
  127. foreach(var line in invoiceLines){
  128. line.InvoiceLink.ID = invoice.ID;
  129. }
  130. new Client<InvoiceLine>().Save(invoiceLines, "");
  131. var receipt = new Receipt {
  132. Date = DateTime.Today,
  133. Notes = string.Join('\n', notes)
  134. };
  135. new Client<Receipt>().Save(receipt, "");
  136. var invoiceReceipt = new InvoiceReceipt {
  137. Notes = "Receipt for License Renewal",
  138. Amount = renewal.Net
  139. };
  140. invoiceReceipt.InvoiceLink.ID = invoice.ID;
  141. invoiceReceipt.ReceiptLink.ID = receipt.ID;
  142. new Client<InvoiceReceipt>().Save(invoiceReceipt, "");
  143. }
  144. }