public ActionResult DeleteConfirmed(int id)
        {
            PaymentsModels paymentsModels = db.PaymentsModels.Find(id);

            db.PaymentsModels.Remove(paymentsModels);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
        public ActionResult Approve(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            ReservationsModels reservationsModels = db.ReservationsModels.Find(id);

            if (reservationsModels.approved == false)
            {
                reservationsModels.approved = true;

                db.SaveChanges();

                var newApprovedReservation = new ApprovedReservationsModels();

                newApprovedReservation.User             = reservationsModels.User;
                newApprovedReservation.Date             = reservationsModels.Date;
                newApprovedReservation.Reason           = reservationsModels.Reason;
                newApprovedReservation.Phone            = reservationsModels.Phone;
                newApprovedReservation.LocationReserved = reservationsModels.LocationReserved;

                db.ApprovedReservationsModels.Add(newApprovedReservation);
                db.SaveChanges();

                var newCostsModels = new CostsModels();

                newCostsModels.UserName  = reservationsModels.User;
                newCostsModels.Date      = reservationsModels.Date;
                newCostsModels.Amount    = 200;
                newCostsModels.Month     = reservationsModels.Date;
                newCostsModels.EventId   = 0;
                newCostsModels.EventName = reservationsModels.Reason;

                db.CostsModels.Add(newCostsModels);
                db.SaveChanges();

                var newPaymentsModelss = new PaymentsModels();

                newPaymentsModelss.UserName = reservationsModels.User;
                newPaymentsModelss.Date     = DateTime.Now;
                newPaymentsModelss.Amount   = 400;
                newPaymentsModelss.Month    = DateTime.Now;
                newPaymentsModelss.Member   = false;

                db.PaymentsModels.Add(newPaymentsModelss);
                db.SaveChanges();

                string redirectUrlInside = "/Reservations/Index/";
                return(Redirect(redirectUrlInside));
            }

            string redirectUrl = "/Reservations/Index/";

            return(Redirect(redirectUrl));
        }
 public ActionResult Edit([Bind(Include = "Id,UserName,Amount,Month,Member")] PaymentsModels paymentsModels)
 {
     if (ModelState.IsValid)
     {
         db.Entry(paymentsModels).State = EntityState.Modified;
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
     return(View(paymentsModels));
 }
        public ActionResult Create([Bind(Include = "Id,UserName,Amount,Month,Member")] PaymentsModels paymentsModels)
        {
            if (ModelState.IsValid)
            {
                paymentsModels.Date = DateTime.Now;
                db.PaymentsModels.Add(paymentsModels);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(paymentsModels));
        }
        public ActionResult AddPayment([Bind(Include = "Id,FlatId,Value")] PaymentsModels paymentsModels)
        {
            if (ModelState.IsValid)
            {
                paymentsModels.PaymentDate = DateTime.Now;
                db.PaymentsModels.Add(paymentsModels);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(paymentsModels));
        }
        // GET: Payments/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PaymentsModels paymentsModels = db.PaymentsModels.Find(id);

            if (paymentsModels == null)
            {
                return(HttpNotFound());
            }
            return(View(paymentsModels));
        }
        public async Task <ActionResult> Print(Guid?id)
        {
            Permission p    = new Permission();
            bool       auth = p.IsGranted(User.Identity.Name, this.ControllerContext.RouteData.Values["controller"].ToString() + "_" + this.ControllerContext.RouteData.Values["action"].ToString());

            if (!auth)
            {
                return(new ViewResult()
                {
                    ViewName = "Unauthorized"
                });
            }
            else
            {
                if (id == null || id == Guid.Empty) //show payment index
                {
                    //var login_session = Session["Login"] as LoginViewModel;
                    //Guid user_branch = db.User.Where(x => x.UserName == User.Identity.Name).FirstOrDefault().Branches_Id;
                    //List<PaymentsIndexModels> list_pim = new List<PaymentsIndexModels>();
                    //foreach (var item in db.Payments.ToList())
                    //{
                    //    var check_session = await (from pi in db.PaymentItems
                    //                               join si in db.SaleInvoices on pi.ReferenceId equals si.Id
                    //                               join sii in db.SaleInvoiceItems on si.Id equals sii.SaleInvoices_Id
                    //                               where pi.Payments_Id == item.Id && sii.SessionHours > sii.SessionHours_Remaining
                    //                               select new { pi, si, sii }).ToListAsync();

                    //    PaymentsIndexModels pim = new PaymentsIndexModels
                    //    {
                    //        Id = item.Id,
                    //        No = item.No,
                    //        Timestamp = TimeZoneInfo.ConvertTimeFromUtc(item.Timestamp, TimeZoneInfo.FindSystemTimeZoneById("SE Asia Standard Time")),
                    //        CashAmount = item.CashAmount,
                    //        DebitAmount = item.DebitAmount,
                    //        ConsignmentAmount = item.ConsignmentAmount,
                    //        Cancelled = item.Cancelled,
                    //        Confirmed = item.Confirmed,
                    //        Notes_Cancel = item.Notes_Cancel,
                    //        HasSession = check_session.Count > 0 ? true : false
                    //    };
                    //    Guid sales_invoice_id = db.PaymentItems.Where(x => x.Payments_Id == item.Id).FirstOrDefault().ReferenceId;
                    //    Guid branch_id = db.SaleInvoices.Where(x => x.Id == sales_invoice_id).FirstOrDefault().Branches_Id;
                    //    pim.Branch = db.Branches.Where(x => x.Id == branch_id).FirstOrDefault().Name;
                    //    if (branch_id == user_branch)
                    //        list_pim.Add(pim);
                    //}

                    ViewBag.Cancel  = p.IsGranted(User.Identity.Name, "payments_cancel");
                    ViewBag.Approve = p.IsGranted(User.Identity.Name, "payments_approve");
                    ViewBag.Log     = p.IsGranted(User.Identity.Name, "logs_view");
                    return(View()); //return View(list_pim);
                }
                else //show payment receipt
                {
                    PaymentsModels paymentsModels = await db.Payments.Where(x => x.Id == id).FirstOrDefaultAsync();

                    BranchesModels                 branchesModels = new BranchesModels();
                    List <PaymentItemsDetails>     listItems      = new List <PaymentItemsDetails>();
                    List <SaleInvoiceItemsDetails> listDetails    = new List <SaleInvoiceItemsDetails>();
                    decimal total_paid = 0;

                    //var list_PaymentItemsModels = db.PaymentItems.Where(x => x.Payments_Id == paymentsModels.Id).ToList();
                    var list_PaymentItemsModels = await(from pi in db.PaymentItems
                                                        join si in db.SaleInvoices on pi.ReferenceId equals si.Id
                                                        where pi.Payments_Id == paymentsModels.Id
                                                        orderby si.Timestamp ascending
                                                        select new { pi }).ToListAsync();
                    foreach (var item in list_PaymentItemsModels)
                    {
                        Guid branch_id = db.SaleInvoices.Where(x => x.Id == item.pi.ReferenceId).FirstOrDefault().Branches_Id;
                        branchesModels = await db.Branches.Where(x => x.Id == branch_id).FirstOrDefaultAsync();

                        PaymentItemsDetails paymentItemsDetails = new PaymentItemsDetails
                        {
                            Invoice   = db.SaleInvoices.Where(x => x.Id == item.pi.ReferenceId).FirstOrDefault().No,
                            Amount    = db.SaleInvoices.Where(x => x.Id == item.pi.ReferenceId).Sum(x => x.Amount),
                            DueBefore = item.pi.DueBefore,
                            Payment   = (item.pi.DueBefore > item.pi.DueAfter) ? item.pi.DueBefore - item.pi.DueAfter : item.pi.DueAfter - item.pi.DueBefore,
                            DueAfter  = item.pi.DueAfter
                        };
                        listItems.Add(paymentItemsDetails);
                        total_paid += paymentItemsDetails.Payment;

                        //decimal total = 0;
                        var list_SaleInvoiceItemsModels = await db.SaleInvoiceItems.Where(x => x.SaleInvoices_Id == item.pi.ReferenceId).OrderBy(x => x.RowNo).ToListAsync();

                        foreach (var subitem in list_SaleInvoiceItemsModels)
                        {
                            var data_customer = await(from si in db.SaleInvoices
                                                      join c in db.User on si.Customer_UserAccounts_Id equals c.Id
                                                      where si.Id == item.pi.ReferenceId
                                                      select new { c }).FirstOrDefaultAsync();
                            SaleInvoiceItemsDetails saleInvoiceItemsDetails = new SaleInvoiceItemsDetails();
                            saleInvoiceItemsDetails.Invoice     = paymentItemsDetails.Invoice;
                            saleInvoiceItemsDetails.Description = subitem.Description;
                            saleInvoiceItemsDetails.Notes       = subitem.Notes;
                            saleInvoiceItemsDetails.Customer    = data_customer.c.Firstname + " " + data_customer.c.Middlename + " " + data_customer.c.Lastname;
                            saleInvoiceItemsDetails.Qty         = subitem.Qty;
                            saleInvoiceItemsDetails.Price       = subitem.Price;
                            saleInvoiceItemsDetails.Travel      = subitem.TravelCost;
                            saleInvoiceItemsDetails.Tutor       = subitem.TutorTravelCost;
                            saleInvoiceItemsDetails.Voucher     = (subitem.SaleInvoiceItems_Vouchers_Id.HasValue) ? db.SaleInvoiceItems_Vouchers.Where(x => x.Id == subitem.SaleInvoiceItems_Vouchers_Id).FirstOrDefault().Amount : 0;
                            saleInvoiceItemsDetails.Discount    = subitem.DiscountAmount;
                            saleInvoiceItemsDetails.Amount      = (subitem.Qty * subitem.Price) + subitem.TravelCost - subitem.DiscountAmount - saleInvoiceItemsDetails.Voucher;
                            listDetails.Add(saleInvoiceItemsDetails);
                            //total += saleInvoiceItemsDetails.Amount;
                        }
                    }

                    ReceiptViewModels receiptViewModels = new ReceiptViewModels();
                    receiptViewModels.Branch  = branchesModels;
                    receiptViewModels.Payment = paymentsModels;
                    receiptViewModels.listSaleInvoiceItems = listDetails;
                    receiptViewModels.listPaymentItems     = listItems;
                    //receiptViewModels.TotalCash = paymentsModels.CashAmount;
                    //receiptViewModels.TotalDebit = paymentsModels.DebitAmount;
                    receiptViewModels.ConsignmentName = (paymentsModels.Consignments_Id.HasValue) ? db.Consignments.Where(x => x.Id == paymentsModels.Consignments_Id.Value).FirstOrDefault().Name : "";
                    receiptViewModels.TotalAmount     = total_paid;
                    return(View("Printed", receiptViewModels));
                }
            }
        }
        public JsonResult SavePayments(Guid branch_id, int cash_amount, int consignment_amount, Guid?consignment_id, int bank_amount, string bank_name, string owner_name, string bank_number, string reff_no, string notes, string bank_type, string invoices_id)
        {
            string lastHex_string = db.Payments.AsNoTracking().Max(x => x.No);
            int    lastHex_int    = int.Parse(
                string.IsNullOrEmpty(lastHex_string) ? 0.ToString("X5") : lastHex_string,
                System.Globalization.NumberStyles.HexNumber);

            PaymentsModels paymentsModels = new PaymentsModels
            {
                Id         = Guid.NewGuid(),
                No         = (lastHex_int + 1).ToString("X5"),
                Timestamp  = DateTime.UtcNow,
                CashAmount = cash_amount,

                DebitAmount       = bank_amount,
                DebitBank         = (bank_amount == 0) ? "" : bank_name,
                DebitOwnerName    = (bank_amount == 0) ? "" : owner_name,
                DebitNumber       = (bank_amount == 0) ? "" : bank_number,
                DebitRefNo        = (bank_amount == 0) ? "" : reff_no,
                Consignments_Id   = (consignment_amount == 0) ? null : consignment_id,
                ConsignmentAmount = consignment_amount,
                Notes             = notes,
                Cancelled         = false,
                Confirmed         = false,
                IsTransfer        = (bank_type == "Transfer") ? true : false
            };

            string   status; Guid payment_id;
            DateTime dateStart    = DateTime.UtcNow.AddSeconds(-10); //range time = 10 seconds
            DateTime dateEnd      = DateTime.UtcNow;
            var      paymentCheck = db.Payments.Where(x =>
                                                      x.Timestamp >= dateStart && x.Timestamp <= dateEnd &&
                                                      x.CashAmount == paymentsModels.CashAmount &&
                                                      x.DebitAmount == paymentsModels.DebitAmount &&
                                                      x.DebitBank == paymentsModels.DebitBank &&
                                                      x.DebitOwnerName == paymentsModels.DebitOwnerName &&
                                                      x.DebitNumber == paymentsModels.DebitNumber &&
                                                      x.DebitRefNo == paymentsModels.DebitRefNo &&
                                                      x.Consignments_Id == paymentsModels.Consignments_Id &&
                                                      x.ConsignmentAmount == paymentsModels.ConsignmentAmount &&
                                                      x.Notes == paymentsModels.Notes &&
                                                      x.Cancelled == paymentsModels.Cancelled &&
                                                      x.Confirmed == paymentsModels.Confirmed &&
                                                      x.IsTransfer == paymentsModels.IsTransfer
                                                      ).FirstOrDefault();

            if (paymentCheck != null)
            {
                status = "300"; payment_id = paymentCheck.Id;
            }                                                                           //duplicate
            else
            {
                status = "200"; payment_id = paymentsModels.Id;
                db.Payments.Add(paymentsModels);

                int      total_paid = cash_amount + bank_amount + consignment_amount;
                string[] ids        = invoices_id.Split(',');
                for (int i = ids.Length - 1; i >= 0; i--)  //foreach (string id in ids)
                {
                    if (total_paid > 0)
                    {
                        string             id_saleinvoice     = ids[i];
                        SaleInvoicesModels saleInvoicesModels = db.SaleInvoices.Where(x => x.Id.ToString() == id_saleinvoice).FirstOrDefault();
                        int due_inv = saleInvoicesModels.Due;
                        if (total_paid >= due_inv)
                        {
                            saleInvoicesModels.Due = 0;
                            total_paid            -= due_inv;
                        }
                        else
                        {
                            saleInvoicesModels.Due -= total_paid;
                            total_paid              = 0;
                        }
                        db.Entry(saleInvoicesModels).State = EntityState.Modified;

                        PaymentItemsModels paymentItemsModels = new PaymentItemsModels
                        {
                            Id          = Guid.NewGuid(),
                            Payments_Id = paymentsModels.Id,
                            ReferenceId = saleInvoicesModels.Id,
                            Amount      = (due_inv > saleInvoicesModels.Due) ? due_inv - saleInvoicesModels.Due : saleInvoicesModels.Due - due_inv,
                            DueBefore   = due_inv,
                            DueAfter    = saleInvoicesModels.Due
                        };
                        db.PaymentItems.Add(paymentItemsModels);
                    }
                }

                if (cash_amount > 0)
                {
                    string lastHex_string_pcr = db.PettyCashRecords.AsNoTracking().Max(x => x.No);
                    int    lastHex_int_pcr    = int.Parse(
                        string.IsNullOrEmpty(lastHex_string_pcr) ? 0.ToString("X5") : lastHex_string_pcr,
                        System.Globalization.NumberStyles.HexNumber);

                    PettyCashRecordsModels pettyCashRecordsModels = new PettyCashRecordsModels
                    {
                        Id          = Guid.NewGuid(),
                        Branches_Id = branch_id,
                        RefId       = paymentsModels.Id,
                        No          = (lastHex_int_pcr + 1).ToString("X5"),
                        Timestamp   = DateTime.UtcNow,
                        PettyCashRecordsCategories_Id = db.Settings.Where(x => x.Id == SettingsValue.GUID_AutoEntryForCashPayments).FirstOrDefault().Value_Guid.Value, //db.PettyCashRecordsCategories.Where(x => x.Name == "Penjualan Tunai").FirstOrDefault().Id,
                        Notes           = "Cash Payment [" + paymentsModels.No + "]",
                        Amount          = cash_amount,
                        IsChecked       = false,
                        UserAccounts_Id = db.User.Where(x => x.UserName == User.Identity.Name).FirstOrDefault().Id
                    };
                    db.PettyCashRecords.Add(pettyCashRecordsModels);
                }

                db.SaveChanges();
            }

            return(Json(new { status, payment_id }, JsonRequestBehavior.AllowGet));
        }