Example #1
0
        public async Task <IHttpActionResult> PostInvoice(InvoiceCreateDTO invoiceData)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            string reg   = User.Identity.GetUserId();
            Order  order = await db.Orders.FindAsync(invoiceData.orderid);

            Accountant accountant = db.Accountants.Where(b => b.user_id == reg).SingleOrDefault();

            /*int inv = await db.Invoices.CountAsync(b => b.invoiceNumber== invoiceData.invoiceNumber || b.orderid==order.id);
             * if (inv != 0)
             * {
             *  return BadRequest("Invoice number exists or invoice for this order was already made");
             * }**/
            if (accountant == null)
            {
                return(BadRequest("Accountant does not exist"));
            }

            TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById("South Africa Standard Time");
            DateTime     userTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timeInfo);

            Invoice invoice = new Invoice
            {
                accountant_id = accountant.id,
                date          = userTime,
                // invoiceNumber= invoiceData.invoiceNumber,
                orderid = invoiceData.orderid,
                status  = "not_paid",
            };

            // critical section generate invoice number
            lock (Lock)
            {
                string year      = DateTime.Now.Year.ToString();
                string reference = "INV-" + year + "-";
                int    invo      = db.Invoices.Count();
                if (invo == 0)
                {
                    invo      += 1;
                    reference += String.Format("{0:00000}", invo);
                }
                else
                {
                    invo       = db.Invoices.Count(b => b.invoiceNumber.Substring(4, 4) == year);
                    invo      += 1;
                    reference += String.Format("{0:00000}", invo);
                }
                while (db.Invoices.Count(d => d.invoiceNumber == reference) != 0)
                {
                    reference = "INV-" + year + "-" + String.Format("{0:00000}", ++invo);
                }
                order.status            = "processing";
                order.warehouseLocation = invoiceData.warehouseLocation;
                order.invoiceNumber     = reference;
                db.Entry(order).State   = EntityState.Modified;
                invoice.invoiceNumber   = reference;
                db.Invoices.Add(invoice);
                db.SaveChanges();
            }

            InvoiceGenerator inv    = new InvoiceGenerator();
            Stream           invPdf = inv.CreateInvoicePDF(order);
            FileDTO          file;
            string           filename = Guid.NewGuid().ToString() + "invoice.pdf";

            string bucket = "supremebrands";

            StringWriter s = new StringWriter();

            if (S3Bucket.UploadFileToS3(filename, invPdf, bucket))
            {
                file = new FileDTO()
                {
                    url = "https://s3-us-west-2.amazonaws.com/supremebrands/" + filename
                };

                string body = string.Format(@"
                <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN""      ""http://www.w3.org/TR/html4/strict.dtd"">
                <html>
                <body>
                    <h2> Dear sir/madam</h2>
                    <br>
                    <p>This email contains the link of the Invoice pdf created by the system</p>
                    <p><a href='{0}'>Click here</a> to open the pdf </p>
                    <p>Or copy and paste this link in your browser </p>
                    <p>{1}</p>
                    <br>
                    <p>Kind Regards</p>
                    
                     <p>Supreme Brands Team<p>
    
                    
                </body>
                </html>
                ", file.url, file.url);

                Email.sendEmail("*****@*****.**", "invoice " + order.invoiceNumber, body);
                invoice.invoiceUrl      = file.url;
                db.Entry(invoice).State = EntityState.Modified;
                db.SaveChanges();
            }


            return(Ok(invoice.invoiceNumber));
        }