| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- @using Comal.Classes
- @using GenHTTP.Api.Protocol
- @using GenHTTP.Modules.IO
- @using InABox.Clients
- @using InABox.Core
- @using PRSServer
- @using System.Text
- @{
- var renewalPeriods = new List<Tuple<int, Func<DateTime, DateTime>>> {
- new(1, x => x.AddDays(-7)),
- new(3, x => x.AddDays(-14)),
- new(6, x => x.AddMonths(-1))
- };
- var request = Serialization.Deserialize<LicenseRenewal>(Model.Request.Content);
- if(request == null){
- Model.Respond().Status(ResponseStatus.BadRequest);
- return;
- }
- Logger.Send(LogType.Information, "", $"Request for license renewal from {request.Company.CompanyName}");
- var customerID = request.OldLicense.CustomerID;
- if(customerID == Guid.Empty){
- customerID = CreateNewCustomer().ID;
- request.OldLicense.CustomerID = customerID;
- }
- Logger.Send(LogType.Information, "", "Generating new license");
- var newLicense = GenerateLicense();
- var newLicenseData = LicenseUtils.EncryptLicense(newLicense);
- if(newLicenseData == null){
- Logger.Send(LogType.Error, "", "Encryption of new license failed!");
- Model.Respond().Status(ResponseStatus.InternalServerError);
- return;
- }
- Logger.Send(LogType.Information, "", "Generating customer document");
- var customerDocument = CreateNewCustomerDocument(customerID, $"{request.Company.CompanyName} - PRS License - {DateTime.Now:dd MMM yyyy}.txt", newLicenseData);
- Logger.Send(LogType.Information, "", "Creating invoice");
- CreateInvoice(customerID, request);
- Model.Respond()
- .Status(ResponseStatus.OK)
- .Content(Serialization.Serialize(new License { Data = newLicenseData } )); // Send just the encrypted data.
- return;
- int GetMonthDifference(DateTime date1, DateTime date2){
- var months = (date2.Year - date1.Year) * 12 + (date2.Month - date1.Month);
-
- if(date2.Day >= date1.Day){
- return months;
- }
- return months - 1;
- }
- LicenseData GenerateLicense(){
- var renewalPeriodInMonths = GetMonthDifference(request.DateRenewed, request.NewExpiry);
- var renewalAvailable = renewalPeriods
- .Where(x => renewalPeriodInMonths >= x.Item1)
- .MaxBy(x => x.Item1)
- .Item2(request.NewExpiry);
-
- var newLicense = LicenseUtils.RenewLicense(request.OldLicense, request.DateRenewed, request.NewExpiry, renewalAvailable);
-
- return newLicense;
- }
- string NewCustomerCode(){
- var code = request.Company.CompanyName.ToUpper();
- var codes = new Client<Customer>().Query(
- new Filter<Customer>(x => x.Code).BeginsWith(code),
- new Columns<Customer>(x => x.Code))?.Rows.Select(x => x.Get<Customer, string>(x => x.Code)).ToList();
-
- var tryCode = code;
- var i = 0;
- while(codes.Contains(tryCode)){
- tryCode = $"{code}{i}";
- ++i;
- }
-
- return tryCode;
- }
- Customer CreateNewCustomer(){
- Logger.Send(LogType.Information, "", "Creating new customer");
-
- var customer = new Customer {
- Code = NewCustomerCode(),
- Name = $"{request.Company.CompanyName} - {request.Company.ABN}",
- Delivery = request.Company.DeliveryAddress,
- Email = request.Company.Email,
- Postal = request.Company.PostalAddress
- };
- new Client<Customer>().Save(customer, "Created by License Renewal");
- return customer;
- }
- CustomerDocument CreateNewCustomerDocument(Guid customerID, string fileName, string data){
- var document = new Document {
- FileName = fileName,
- Private = true,
- TimeStamp = DateTime.Now,
- Data = Encoding.UTF8.GetBytes(data)
- };
- document.CRC = CoreUtils.CalculateCRC(document.Data);
-
- new Client<Document>().Save(document, "");
-
- var documentType = new Client<DocumentType>()
- .Query(new Filter<DocumentType>(x => x.Code).IsEqualTo("LICENSE"), new Columns<DocumentType>(x => x.ID))
- .Rows.FirstOrDefault()?.Get<DocumentType, Guid>(x => x.ID) ?? Guid.Empty;
- if(documentType == Guid.Empty){
- Logger.Send(LogType.Error, "", "Document Type 'LICENSE' doesn't exist");
- }
-
- var customerDocument = new CustomerDocument();
- customerDocument.Type.ID = documentType;
- customerDocument.EntityLink.ID = customerID;
- customerDocument.DocumentLink.ID = document.ID;
-
- new Client<CustomerDocument>().Save(customerDocument, "Created by License Renewal");
- return customerDocument;
- }
- void CreateInvoice(Guid customerID, LicenseRenewal renewal){
- var invoiceLines = new List<InvoiceLine>();
- var notes = new List<string>();
- foreach(var item in renewal.LicenseTracking){
- var invoiceLine = new InvoiceLine {
- Description = $"{item.License} - {item.Users} Users @ ${item.Rate:F2} per user",
- ExTax = item.ExGST
- };
- invoiceLines.Add(invoiceLine);
- notes.Add(invoiceLine.Description);
- }
- var discountLine = new InvoiceLine {
- Description = $"${renewal.Discount:F2} discount",
- ExTax = -renewal.Discount
- };
- invoiceLines.Add(discountLine);
- notes.Add(discountLine.Description);
-
- var invoice = new Invoice {
- Date = DateTime.Today,
- Description = $"License Renewal - Stripe Transaction No. '{renewal.TransactionID}'"
- };
- invoice.CustomerLink.ID = customerID;
-
- new Client<Invoice>().Save(invoice, "Created by License Renewal");
-
- foreach(var line in invoiceLines){
- line.InvoiceLink.ID = invoice.ID;
- }
- new Client<InvoiceLine>().Save(invoiceLines, "");
-
- var receipt = new Receipt {
- Date = DateTime.Today,
- Notes = string.Join('\n', notes)
- };
- new Client<Receipt>().Save(receipt, "");
-
- var invoiceReceipt = new InvoiceReceipt {
- Notes = "Receipt for License Renewal",
- Amount = renewal.Net
- };
- invoiceReceipt.InvoiceLink.ID = invoice.ID;
- invoiceReceipt.ReceiptLink.ID = receipt.ID;
- new Client<InvoiceReceipt>().Save(invoiceReceipt, "");
- }
- }
|