Exemple #1
0
        public async Task <ActionResult> Create([Bind(Include = "Branches_Id,LessonPackages_Id,Products_Id,Vouchers_Id,Customers_Id,Notes")] SaleInvoicesViewModels saleInvoicesViewModels, int Amount, string Items)
        {
            if (saleInvoicesViewModels.Customers_Id == Guid.Empty)
            {
                ModelState.AddModelError("Customers_Id", "The field Customer is required.");
            }

            if (Items == "[]" || Amount == 0)
            {
                ModelState.AddModelError("Items", "The field Items is required.");
            }

            var user_login = await db.User.Where(x => x.UserName == User.Identity.Name).FirstOrDefaultAsync();

            if (ModelState.IsValid)
            {
                string lastHex_string = db.SaleInvoices.AsNoTracking().Max(x => x.No);
                int    lastHex_int    = int.Parse(
                    string.IsNullOrEmpty(lastHex_string) ? 0.ToString("X5") : lastHex_string,
                    System.Globalization.NumberStyles.HexNumber);
                //var login_session = Session["Login"] as LoginViewModel;

                SaleInvoicesModels saleInvoicesModels = new SaleInvoicesModels
                {
                    Id          = Guid.NewGuid(),
                    Branches_Id = user_login.Branches_Id, //login_session.Branches_Id;
                    No          = (lastHex_int + 1).ToString("X5"),
                    Timestamp   = DateTime.UtcNow,
                    Customer_UserAccounts_Id = saleInvoicesViewModels.Customers_Id.ToString(),
                    Notes     = saleInvoicesViewModels.Notes,
                    Amount    = Amount,
                    Due       = Amount,
                    Cancelled = false,
                    IsChecked = false
                };
                db.SaleInvoices.Add(saleInvoicesModels);

                byte row = 1;
                List <SaleInvoiceItemDetails> details = JsonConvert.DeserializeObject <List <SaleInvoiceItemDetails> >(Items);
                foreach (var item in details)
                {
                    Guid?saleinvoiceitems_vouchers = null;
                    if (!string.IsNullOrEmpty(item.voucher_id))
                    {
                        SaleInvoiceItems_VouchersModels saleInvoiceItems_VouchersModels = new SaleInvoiceItems_VouchersModels
                        {
                            Id          = Guid.NewGuid(),
                            Voucher_Ids = item.voucher_id,
                            Amount      = item.voucher
                        };
                        db.SaleInvoiceItems_Vouchers.Add(saleInvoiceItems_VouchersModels);
                        saleinvoiceitems_vouchers = saleInvoiceItems_VouchersModels.Id;
                    }

                    SaleInvoiceItemsModels sii = new SaleInvoiceItemsModels
                    {
                        Id              = Guid.NewGuid(),
                        RowNo           = row,
                        SaleInvoices_Id = saleInvoicesModels.Id,
                        Description     = item.desc,
                        Qty             = item.qty,
                        Price           = item.price,
                        DiscountAmount  = item.disc,
                        SaleInvoiceItems_Vouchers_Id = saleinvoiceitems_vouchers, //item.voucher_id,
                        Notes                  = item.note,
                        Products_Id            = item.inventory_id,
                        Services_Id            = item.service_id,
                        LessonPackages_Id      = item.lesson_id,
                        SessionHours           = item.qty * item.hours, //item.lesson_id.HasValue ? db.LessonPackages.Where(x => x.Id == item.lesson_id).FirstOrDefault().SessionHours : 0,
                        SessionHours_Remaining = item.qty * item.hours, //item.lesson_id.HasValue ? db.LessonPackages.Where(x => x.Id == item.lesson_id).FirstOrDefault().SessionHours : 0,
                        TravelCost             = item.travel,
                        TutorTravelCost        = item.tutor
                    };
                    db.SaleInvoiceItems.Add(sii);

                    if (item.inventory_id.HasValue)
                    {
                        SyncSaleInvoice_Inventory(user_login.Branches_Id, item.inventory_id.Value, item.qty, sii.Id);

                        Products_QtyModels products_QtyModels = await db.Products_Qty.Where(x => x.Branches_Id == user_login.Branches_Id && x.Products_Id == item.inventory_id.Value).FirstOrDefaultAsync();

                        products_QtyModels.Qty            -= item.qty;
                        db.Entry(products_QtyModels).State = EntityState.Modified;
                    }

                    row++;
                }

                await db.SaveChangesAsync();

                return(RedirectToAction("Index"));
            }

            Permission p = new Permission();

            #region List Voucher
            var           vouchers     = db.Vouchers.Where(x => x.Active == true).OrderBy(x => x.Code).ToList();
            List <object> voucher_list = new List <object>();
            foreach (var item in vouchers)
            {
                voucher_list.Add(new
                {
                    item.Id,
                    Name = (string.IsNullOrEmpty(item.Notes))
                            ? "[" + item.Code + ": " + string.Format("{0:N2}", item.Amount) + "] " + item.Description
                            : "[" + item.Code + ": " + string.Format("{0:N2}", item.Amount) + "] " + item.Description + " (" + item.Notes + ")"
                });
            }
            #endregion
            #region List Customer
            var customers = (from u in db.User
                             where u.Active == true
                             //join ur in db.UserRole on u.Id equals ur.UserId
                             //join r in db.Role on ur.RoleId equals r.Id
                             //where r.Name == "Student"
                             orderby u.Firstname
                             select new { u }).ToList();
            List <object> customer_list = new List <object>();
            foreach (var item in customers)
            {
                customer_list.Add(new
                {
                    Id   = item.u.Id,
                    Name = item.u.Firstname + " " + item.u.Middlename + " " + item.u.Lastname
                });
            }
            #endregion
            #region List Lesson
            var lessons = (from lp in db.LessonPackages
                           join l in db.Languages on lp.Languages_Id equals l.Id
                           join lt in db.LessonTypes on lp.LessonTypes_Id equals lt.Id
                           where lp.Active == true
                           orderby lp.Name
                           select new LessonPackagesViewModels
            {
                Id = lp.Id,
                Name = lp.Name,
                Languages = l.Name,
                LessonTypes = lt.Name,
                SessionHours = lp.SessionHours,
                ExpirationDay = lp.ExpirationDay,
                Price = lp.Price,
                Active = lp.Active
            }).ToList();
            List <object> lesson_list = new List <object>();
            foreach (var item in lessons)
            {
                lesson_list.Add(new
                {
                    item.Id,
                    Name = "[" + item.LessonTypes + ", " + item.Languages + "] " + item.Name + " (" + item.SessionHours + " hrs, " + string.Format("{0:N0}", item.Price) + ")"
                });
            }
            #endregion
            #region List Product
            var list_product = (from pr in db.Products
                                join pq in db.Products_Qty on pr.Id equals pq.Products_Id
                                where pq.Branches_Id == user_login.Branches_Id
                                orderby pr.Description
                                select new { pr, pq }).ToList();
            List <object> products = new List <object>();
            foreach (var product in list_product)
            {
                products.Add(new
                {
                    product.pr.Id,
                    Name = product.pr.Description
                });
            }
            #endregion
            #region List Role
            string role_id_allowed          = db.Settings.Find(SettingsValue.GUID_UserSetRoleAllowed).Value_Guid.Value.ToString();
            List <SelectListItem> role_list = new List <SelectListItem>();
            bool setRole = p.IsGranted(User.Identity.Name, "user_setroles");
            if (setRole)
            {
                foreach (var role in db.Role.OrderBy(x => x.Name))
                {
                    role_list.Add(new SelectListItem()
                    {
                        Value = role.Name, Text = role.Name
                    });
                }
            }
            else
            {
                foreach (var role in db.Role.Where(x => x.Id == role_id_allowed).OrderBy(x => x.Name))
                {
                    role_list.Add(new SelectListItem()
                    {
                        Value = role.Name, Text = role.Name
                    });
                }
            }
            #endregion
            ViewBag.listBranch       = new SelectList(db.Branches.Where(x => x.Active == true).OrderBy(x => x.Name).ToList(), "Id", "Name");
            ViewBag.listVoucher      = new SelectList(voucher_list, "Id", "Name");
            ViewBag.listCustomer     = new SelectList(customer_list, "Id", "Name");
            ViewBag.listLesson       = new SelectList(lesson_list, "Id", "Name");
            ViewBag.listProduct      = new SelectList(products, "Id", "Name");
            ViewBag.listService      = new SelectList(db.Services.Where(x => x.Active == true).OrderBy(x => x.Description).ToList(), "Id", "Description");
            ViewBag.listRole         = role_list;
            ViewBag.RoleValueDefault = db.Role.Find(role_id_allowed).Name;
            ViewBag.listLanguage     = new SelectList(db.Languages.Where(x => x.Active == true).OrderBy(x => x.Name).ToList(), "Id", "Name");
            ViewBag.listPromo        = new SelectList(db.PromotionEvents.OrderBy(x => x.Name).ToList(), "Id", "Name");
            ViewBag.DOB = DateTime.UtcNow.Date;

            return(View(saleInvoicesViewModels));
        }
        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));
        }