예제 #1
0
        public IActionResult Index(Guid?id, string StatusMessage)
        {
            SalesInvoiceTmp tmp;
            var             store = JsonConvert.DeserializeObject <Store>(HttpContext.Session.GetString("Store"));

            if (id != null)
            {
                tmp = _context.SalesInvoiceTmp.Include(x => x.SalesInvoiceItems).FirstOrDefault(x => x.Id == id);
                //remove self reference object
                tmp = JsonConvert.DeserializeObject <SalesInvoiceTmp>(
                    JsonConvert.SerializeObject(tmp, Formatting.Indented, new JsonSerializerSettings
                {
                    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                }));
            }
            else
            {
                // var store = _context.Store.FirstOrDefault();

                int invoiceId = 0;
                if (Request.Query["Mode"].ToString() != null && Request.Query["Mode"].ToString() == "tax")
                {
                    invoiceId = _context.SalesInvoice.Where(x => x.Trans_Type == "Tax").Select(x => x.Invoice_Id).DefaultIfEmpty(0).Max() + 1;
                }
                else
                {
                    invoiceId = _context.SalesInvoice.Where(x => x.Trans_Type == "Sales").Select(x => x.Invoice_Id).DefaultIfEmpty(0).Max() + 1;
                }
                tmp = new SalesInvoiceTmp()
                {
                    Invoice_Number = "SI-" + invoiceId.ToString("0000") + "-" + store.INITIAL + "-" + store.FISCAL_YEAR
                };
            }
            TempData["StatusMessage"] = StatusMessage;
            ViewData["Store"]         = store;

            //for customer
            //display only ismember data later
            //IList<Customer> customers;
            //if (!_cache.TryGetValue("Customer", out customers))
            //{
            //    // Key not in cache, so get data.
            //    customers = _context.Customer.Where(x => x.Is_Member == true).ToList();

            //    _cache.Set("Customer", customers);
            //}
            //ViewData["Customer"] = customers;

            return(View(tmp));
        }
예제 #2
0
        public async Task <IActionResult> Delete(Guid?id)
        {
            if (id != null)
            {
                SalesInvoiceTmp invoice = await _context.SalesInvoiceTmp.FirstOrDefaultAsync(x => x.Id == id);

                if (invoice != null)
                {
                    _context.SalesInvoiceTmp.Remove(invoice);
                    _context.SaveChanges();
                    return(Ok("Delete Successfull !!"));
                }
            }
            return(NotFound());
        }
예제 #3
0
        public async Task <IActionResult> Index([FromBody] SalesInvoiceAndCustomerViewModel model)
        {
            SalesInvoiceTmp salesInvoiceTmp = model.SalesInvoice;
            Customer        customer        = model.Customer;

            if (ModelState.IsValid)
            {
                if (model.SalesInvoice.Trans_Date_Ad.Value.ToShortDateString() != DateTime.Now.ToShortDateString())
                {
                    return(StatusCode(400, "Date is not Up-to-Date !!"));
                }
                try
                {
                    //if that salesinvoice already exist, than track first
                    SalesInvoiceTmp oldData = new SalesInvoiceTmp();
                    bool            isExistOldSalesInvoice = false;
                    if (salesInvoiceTmp.Id != null)
                    {
                        oldData = await _context.SalesInvoiceTmp.FirstOrDefaultAsync(x => x.Id == salesInvoiceTmp.Id);

                        if (oldData != null)
                        {
                            isExistOldSalesInvoice = true;
                        }
                    }

                    //add membership
                    if (!string.IsNullOrEmpty(customer.Name) && !string.IsNullOrEmpty(customer.Mobile1) && customer.Is_Member == true)
                    {
                        Customer member = AddCustomer(customer);
                        //_context.SaveChanges();
                        salesInvoiceTmp.Customer_Id = member.Code;
                        salesInvoiceTmp.MemberId    = member.Membership_Number;
                    }


                    //now processed to new save invoice
                    salesInvoiceTmp.Id           = Guid.NewGuid();
                    salesInvoiceTmp.Trans_Time   = DateTime.Now.TimeOfDay;
                    salesInvoiceTmp.Division     = "Divisioin";
                    salesInvoiceTmp.Terminal     = HttpContext.Session.GetString("Terminal");
                    salesInvoiceTmp.Created_Date = DateTime.Now;
                    salesInvoiceTmp.Created_By   = User.Identity.Name;



                    _context.Add(salesInvoiceTmp);

                    foreach (var item in salesInvoiceTmp.SalesInvoiceItems)
                    {
                        item.Invoice_Id     = salesInvoiceTmp.Id;
                        item.Invoice_Number = salesInvoiceTmp.Invoice_Number;
                        _context.SalesInvoiceItemsTmp.Add(item);
                    }



                    await _context.SaveChangesAsync();

                    //if everything goes right then delete old sales invoice in background
                    if (isExistOldSalesInvoice)
                    {
                        _context.SalesInvoiceTmp.Remove(oldData);
                        _context.SaveChanges();
                    }



                    //for serverside return
                    //if (salesInvoiceTmp.Trans_Type == "Hold")
                    //    return RedirectToAction("Index");
                    //else
                    //    return RedirectToAction("Billing", new { id = salesInvoiceTmp.Id });
                    //for api return
                    if (salesInvoiceTmp.Trans_Type == "Save")
                    {
                        return(Ok(new { redirectUrl = "" }));
                    }
                    if (salesInvoiceTmp.Trans_Type == "Hold" || salesInvoiceTmp.Trans_Type == "Save")
                    {
                        return(Ok(new { redirectUrl = "/SalesInvoice/Landing" }));
                    }
                    else if (salesInvoiceTmp.Trans_Type == "Tax")
                    {
                        return(Ok(new { RedirectUrl = "/SalesInvoice/Billing/" + salesInvoiceTmp.Id + "?M=" + salesInvoiceTmp.MemberId + "&Mode=tax" }));
                    }
                    else
                    {
                        return(Ok(new { RedirectUrl = "/SalesInvoice/Billing/" + salesInvoiceTmp.Id + "?M=" + salesInvoiceTmp.MemberId }));
                    }
                }
                catch (Exception ex)
                {
                    return(StatusCode(500, ex.InnerException));
                }
            }
            return(View(salesInvoiceTmp));
        }
예제 #4
0
        public IActionResult Billing([FromBody] SalesInvoiceBillingViewModel model)
        {
            try
            {
                //check if billing is not available
                if (model == null || model.bill.Count() == 0)
                {
                    return(NotFound());
                }

                //Check from salesInvoiceTmp table
                SalesInvoiceTmp salesInvoiceTmp = _context.SalesInvoiceTmp.FirstOrDefault(x => x.Id == model.salesInvoiceId);
                if (salesInvoiceTmp == null)
                {
                    return(NotFound());
                }


                using (var trans = _context.Database.BeginTransaction())
                {
                    SalesInvoice salesInvoice = new SalesInvoice();
                    try
                    {
                        //get store info
                        Store store = JsonConvert.DeserializeObject <Store>(HttpContext.Session.GetString("Store"));
                        //convert to sales invoice and save


                        //if (_context.ChangeTracker.HasChanges(.Any(x => x.Id == model.salesInvoiceId))
                        //    salesInvoice = _context.SalesInvoice.FirstOrDefault(x => x.Id == model.salesInvoiceId);
                        //else
                        salesInvoice    = _mapper.Map <SalesInvoice>(salesInvoiceTmp);
                        salesInvoice.Id = Guid.NewGuid();

                        salesInvoice.Total_Bill_Discount      = model.billDiscount;
                        salesInvoice.Total_Payable_Amount     = model.totalPayable;
                        salesInvoice.Total_Net_Amount_Roundup = model.totalNetAmountRoundUp;
                        salesInvoice.Tender_Amount            = model.tenderAmount;
                        salesInvoice.Change_Amount            = model.changeAmount;
                        salesInvoice.Invoice_Id     = _context.SalesInvoice.Where(x => x.Trans_Type == salesInvoice.Trans_Type).Select(x => x.Invoice_Id).DefaultIfEmpty(0).Max() + 1;
                        salesInvoice.Invoice_Number = SalesInvoiceNumberFormat(store, salesInvoice.Invoice_Id, salesInvoice.Trans_Type);
                        _context.SalesInvoice.Add(salesInvoice);


                        //get invoice items temp convert to sales invoice item and save them
                        IList <SalesInvoiceItemsTmp> itemtmp = _context.SalesInvoiceItemsTmp.Where(x => x.Invoice_Id == salesInvoiceTmp.Id).ToList();
                        foreach (var item in itemtmp)
                        {
                            item.Invoice = null;
                            SalesInvoiceItems salesItem = _mapper.Map <SalesInvoiceItems>(item);
                            salesItem.Id             = 0;
                            salesItem.Invoice_Id     = salesInvoice.Id;
                            salesItem.Invoice_Number = salesInvoice.Invoice_Number;
                            _context.SalesInvoiceItems.Add(salesItem);
                        }
                        _context.SaveChanges();

                        //check session
                        Settlement oldSettlement = _context.Settlement.FirstOrDefault(x => x.UserId == salesInvoice.Created_By && x.Status == "Open");
                        string     sessionId     = oldSettlement != null ? oldSettlement.SessionId : Guid.NewGuid().ToString();
                        string     crNumber      = salesInvoice.Invoice_Number;
                        //save bill amount information
                        foreach (var item in model.bill)
                        {
                            item.Invoice_Id     = salesInvoice.Id;
                            item.Invoice_Number = salesInvoice.Invoice_Number;
                            item.Invoice_Type   = salesInvoice.Trans_Type;
                            item.Terminal       = HttpContext.Session.GetString("Terminal");
                            if (item.Trans_Mode == "Cash")
                            {
                                item.Amount = item.Amount - salesInvoice.Change_Amount;
                            }
                            item.IsNavSync = false;


                            _context.SalesInvoiceBill.Add(item);


                            //if credit note amount is used then update credit note table
                            if (item.Trans_Mode == "Credit Note")
                            {
                                CreditNote creditNote = _context.CreditNote.FirstOrDefault(x => x.Credit_Note_Number == item.Account);
                                crNumber = item.Account;
                                if (creditNote != null)
                                {
                                    creditNote.Created_By            = User.Identity.Name;
                                    creditNote.Created_Date          = DateTime.Now;
                                    creditNote.Remarks               = "Claimed";
                                    _context.Entry(creditNote).State = EntityState.Modified;
                                }
                            }


                            //save to settlement table
                            decimal totalAmount = 0;
                            if (item.Trans_Mode == "Cash")
                            {
                                totalAmount = item.Amount;
                            }
                            else
                            {
                                totalAmount = item.Amount;
                            }

                            Settlement settlement = new Settlement()
                            {
                                SessionId = sessionId,

                                TransactionDate   = DateTime.Now,
                                PaymentMode       = item.Trans_Mode,
                                Amount            = item.Amount,
                                Status            = "Open",
                                VerifiedBy        = "",
                                VerifiedDate      = DateTime.Now,
                                TransactionNumber = salesInvoice.Invoice_Number,
                                Remarks           = "",
                                TerminalId        = Convert.ToInt32(HttpContext.Session.GetString("TerminalId")),
                                UserId            = salesInvoice.Created_By
                            };
                            _context.Settlement.Add(settlement);
                        }

                        //save to print table
                        InvoicePrint print = new InvoicePrint()
                        {
                            InvoiceNumber    = salesInvoice.Invoice_Number,
                            Type             = salesInvoice.Trans_Type,
                            FirstPrintedDate = DateTime.Now,
                            FirstPrintedBy   = User.Identity.Name,
                            PrintCount       = 1
                        };
                        _context.InvoicePrint.Add(print);



                        _context.SaveChanges();

                        //if everything seems good, then delete salesInvoiceTmp
                        _context.Remove(salesInvoiceTmp);

                        //total amount excludevat
                        decimal totalRateExcludeVat = 0;
                        foreach (var i in salesInvoice.SalesInvoiceItems)
                        {
                            totalRateExcludeVat += i.RateExcludeVat * i.Quantity.Value;
                        }
                        // salesInvoice.SalesInvoiceItems.Select(x => x.RateExcludeVat).Sum();

                        //save to invoiceMaterialview
                        InvoiceMaterializedView view = new InvoiceMaterializedView()
                        {
                            BillNo           = salesInvoice.Invoice_Number,
                            DocumentType     = salesInvoice.Trans_Type + " Invoice",
                            FiscalYear       = store.FISCAL_YEAR,
                            LocationCode     = store.INITIAL,
                            BillDate         = salesInvoice.Trans_Date_Ad.Value,
                            PostingTime      = salesInvoice.Trans_Time.Value,
                            CustomerCode     = salesInvoice.Customer_Id,
                            CustomerName     = salesInvoice.Customer_Name,
                            Vatno            = salesInvoice.Customer_Vat,
                            Amount           = totalRateExcludeVat,
                            Discount         = salesInvoice.TOTAL_DISCOUNT_EXC_VAT,
                            TaxableAmount    = salesInvoice.TaxableAmount,
                            NonTaxableAmount = salesInvoice.NonTaxableAmount,
                            TaxAmount        = salesInvoice.Total_Vat.Value,
                            TotalAmount      = salesInvoice.Total_Net_Amount.Value,
                            IsBillActive     = true,
                            IsBillPrinted    = true,
                            PrintedBy        = User.Identity.Name,
                            PrintedTime      = DateTime.Now,
                            EnteredBy        = salesInvoice.Created_By,
                            SyncStatus       = "Not Started",
                            SyncedDate       = DateTime.Now,
                            SyncedTime       = DateTime.Now.TimeOfDay,
                            SyncWithIrd      = false,
                            IsRealTime       = false
                        };
                        NavSalesInvoice navSalesInvoice = new NavSalesInvoice()
                        {
                            id                     = salesInvoice.Id.ToString(),
                            number                 = salesInvoice.Invoice_Number,
                            postingno              = salesInvoice.Invoice_Number,
                            shippingno             = salesInvoice.Invoice_Number,
                            orderDate              = salesInvoice.Trans_Date_Ad.Value.ToString("yyyy-MM-dd"),
                            customerNumber         = salesInvoice.MemberId,
                            customerName           = salesInvoice.Customer_Name,
                            vatregistrationnumber  = salesInvoice.Customer_Vat,
                            locationcode           = store.INITIAL,
                            accountabilitycenter   = store.INITIAL,
                            assigneduserid         = salesInvoice.Created_By,
                            externalDocumentNumber = crNumber,
                            amountrounded          = salesInvoice.Total_Net_Amount != salesInvoice.Total_Payable_Amount
                        };



                        _context.InvoiceMaterializedView.Add(view);
                        _context.SaveChanges();

                        trans.Commit();
                        //*********** background task
                        Config config = ConfigJSON.Read();
                        //Send data to IRD
                        if (!config.StopPostingIRD)
                        {
                            BackgroundJob.Enqueue(() => SendDataToIRD(salesInvoice, store));
                        }
                        //Send data to NAV

                        if (!config.StopInvoicePosting)
                        {
                            NavPostData navPostData = new NavPostData(_context, _mapper);
                            BackgroundJob.Enqueue(() => navPostData.PostSalesInvoice(navSalesInvoice));
                        }



                        //TempData["StatusMessage"] = "Bill Payment Successfull !!";
                        return(Ok(new { StatusMessage = "Bill Payment Successfull !!", InvoiceData = salesInvoice, StoreData = store, BillData = model.bill }));
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        if (ex.Message.Contains("UniqueInvoiceNumber") || ex.InnerException.Message.Contains("UniqueInvoiceNumber"))
                        {
                            _context.Entry(salesInvoice).State = EntityState.Detached;
                            return(Billing(model));
                        }
                        else
                        {
                            return(BadRequest(ex.Message));
                        }
                    }
                };
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }