Example #1
0
        public ActionResult Edit(LessonSessionsModel modifiedModel, string FILTER_Keyword, string FILTER_InvoiceNo, int?FILTER_Cancelled,
                                 bool?FILTER_chkDateFrom, DateTime?FILTER_DateFrom, bool?FILTER_chkDateTo, DateTime?FILTER_DateTo)
        {
            if (ModelState.IsValid)
            {
                LessonSessionsModel originalModel = get(modifiedModel.Id);

                //without the specified access, some fields are excluded in edit form resulting in no value. Copy values from original model
                if (!UserAccountsController.getUserAccess(Session).LessonSessions_Edit)
                {
                    modifiedModel.HourlyRates_Rate = originalModel.HourlyRates_Rate;
                    modifiedModel.TravelCost       = originalModel.TravelCost;
                    modifiedModel.TutorTravelCost  = originalModel.TutorTravelCost;
                }

                string log = string.Empty;
                log = Helper.append(log, originalModel.HourlyRates_Rate, modifiedModel.HourlyRates_Rate, LessonSessionsModel.COL_HourlyRates_Rate.LogDisplay);
                log = Helper.append(log, originalModel.TravelCost, modifiedModel.TravelCost, LessonSessionsModel.COL_TravelCost.LogDisplay);
                log = Helper.append(log, originalModel.TutorTravelCost, modifiedModel.TutorTravelCost, LessonSessionsModel.COL_TutorTravelCost.LogDisplay);
                log = Helper.append(log, originalModel.Review, modifiedModel.Review, LessonSessionsModel.COL_Review.LogDisplay);
                log = Helper.append(log, originalModel.InternalNotes, modifiedModel.InternalNotes, LessonSessionsModel.COL_InternalNotes.LogDisplay);

                if (!string.IsNullOrEmpty(log))
                {
                    update(modifiedModel, log);

                    //update payrollitem if rate or travel cost is changed
                    //Tutor Travel Cost is not currently checked against total travel cost amount paid by customer. This edit may cause cost to exceed amount paid by customer.
                    PayrollPaymentItemsModel payrollPaymentItem = PayrollPaymentItemsController.get(Session, originalModel.PayrollPaymentItems_Id);

                    //this is necessary for payrollpaymentitems that has multiple lessonsessions (class)
                    payrollPaymentItem.HourlyRate      += (modifiedModel.HourlyRates_Rate - originalModel.HourlyRates_Rate);
                    payrollPaymentItem.TutorTravelCost += (modifiedModel.TutorTravelCost - originalModel.TutorTravelCost);

                    payrollPaymentItem.Amount = PayrollPaymentItemsController.calculateAmount(originalModel.IsWaiveTutorFee, payrollPaymentItem.Hour, payrollPaymentItem.HourlyRate, modifiedModel.TutorTravelCost);
                    PayrollPaymentItemsController.update(db, Session, payrollPaymentItem);
                }

                return(RedirectToAction(nameof(Index), new
                {
                    FILTER_Keyword = FILTER_Keyword,
                    FILTER_InvoiceNo = FILTER_InvoiceNo,
                    FILTER_Cancelled = FILTER_Cancelled,
                    FILTER_chkDateFrom = FILTER_chkDateFrom,
                    FILTER_DateFrom = FILTER_DateFrom,
                    FILTER_chkDateTo = FILTER_chkDateTo,
                    FILTER_DateTo = FILTER_DateTo
                }));
            }

            setViewBag(FILTER_Keyword, FILTER_InvoiceNo, FILTER_Cancelled, FILTER_chkDateFrom, FILTER_DateFrom, FILTER_chkDateTo, FILTER_DateTo);
            return(View(modifiedModel));
        }
        /* PRINT **********************************************************************************************************************************************/

        // GET: Payments/Print
        public ActionResult Print(Guid?id)
        {
            if (id == null || !UserAccountsController.getUserAccess(Session).Payments_View)
            {
                return(RedirectToAction(nameof(HomeController.Index), "Home"));
            }

            PayrollPaymentsModel model = get(Session, (Guid)id);

            ViewBag.InvoiceHeaderText       = new BranchesController().get(Helper.getActiveBranchId(Session)).InvoiceHeaderText;
            ViewData["PayrollPaymentItems"] = PayrollPaymentItemsController.get(Session, null, model.Id, null, null, null);
            ViewBag.TotalAmount             = model.Amount;

            return(View(model));
        }
        public JsonResult Ajax_Create(Guid UserAccounts_Id, string Notes, DateTime Timestamp, decimal Amount, DateTime DatePeriod)
        {
            List <PayrollPaymentItemsModel> PayrollPaymentItems = PayrollPaymentItemsController.combineClassSesions(PayrollPaymentItemsController.get(Session, UserAccounts_Id, DatePeriod, null));

            if (Amount != PayrollPaymentItems.Sum(x => x.Amount - x.PayrollPaymentAmount))
            {
                return(UtilWebMVC.Json(Response, "Due amount has changed. Please reload list and try again."));
            }

            add(PayrollPaymentItems, new PayrollPaymentsModel
            {
                Id              = Guid.NewGuid(),
                Timestamp       = Timestamp,
                Amount          = Amount,
                Notes           = Notes,
                UserAccounts_Id = UserAccounts_Id,
                Branches_Id     = (Guid)PayrollPaymentItems[0].Branches_Id
            });

            return(Json(new { Message = "" }));
        }
Example #4
0
        public ActionResult Create(string JsonLessonSessions, string FILTER_Keyword, string FILTER_InvoiceNo, int?FILTER_Cancelled,
                                   bool?FILTER_chkDateFrom, DateTime?FILTER_DateFrom, bool?FILTER_chkDateTo, DateTime?FILTER_DateTo)
        {
            List <LessonSessionsModel> LessonSessions = new List <LessonSessionsModel>();

            if (string.IsNullOrEmpty(JsonLessonSessions))
            {
                return(returnView(LessonSessions, "Please add at least one student"));
            }

            LessonSessions = JsonConvert.DeserializeObject <List <LessonSessionsModel> >(JsonLessonSessions);
            LessonSessionsModel model = LessonSessions[0];

            model.Branches_Id = Helper.getActiveBranchId(Session);

            if (ModelState.IsValid)
            {
                Guid PayrollPaymentItems_Id = Guid.NewGuid();

                //verify remaining hours is enough to cover the session hours. show error for the first error only
                string SaleInvoiceItems_IdList = string.Join(",", LessonSessions.Select(x => x.SaleInvoiceItems_Id.ToString()).ToArray());
                List <SaleInvoiceItemsModel> SaleInvoiceItems           = SaleInvoiceItemsController.get_by_IdList(SaleInvoiceItems_IdList);
                List <SaleInvoiceItemsModel> insufficientRemainingHours = SaleInvoiceItems.Where(x => x.SessionHours_Remaining < model.SessionHours).ToList();
                if (insufficientRemainingHours.Count > 0)
                {
                    return(returnView(LessonSessions, string.Format("Insufficient remaining hours for student {0}", insufficientRemainingHours[0].Customer_UserAccounts_Name)));
                }

                //set tutor pay rate
                List <HourlyRatesModel> hourlyRates = HourlyRatesController.get(null, null, model.Tutor_UserAccounts_Id);
                bool isFullTimeTutor = false;
                foreach (HourlyRatesModel hourlyRate in hourlyRates)
                {
                    if (hourlyRate.FullTimeTutorPayrate > 0)
                    {
                        isFullTimeTutor = true;
                        continue;
                    }
                }

                foreach (LessonSessionsModel session in LessonSessions)
                {
                    SaleInvoiceItemsModel saleInvoiceItem = SaleInvoiceItems.Where(x => x.Id == session.SaleInvoiceItems_Id).FirstOrDefault();

                    session.Id                     = Guid.NewGuid();
                    session.Branches_Id            = model.Branches_Id;
                    session.HourlyRates_Rate       = 0;
                    session.SessionHours           = session.IsScheduleChange ? 0 : session.SessionHours;
                    session.TravelCost             = session.IsScheduleChange ? 0 : (int)Math.Ceiling((saleInvoiceItem.TravelCost / saleInvoiceItem.SessionHours) * session.SessionHours);
                    session.TutorTravelCost        = session.IsScheduleChange ? 0 : (int)Math.Ceiling((saleInvoiceItem.TutorTravelCost / saleInvoiceItem.SessionHours) * session.SessionHours);
                    session.PayrollPaymentItems_Id = session.IsScheduleChange ? (Guid?)null : PayrollPaymentItems_Id;

                    //Calculate tutor payrate
                    if (!isFullTimeTutor && hourlyRates.Count > 0)
                    {
                        foreach (HourlyRatesModel hourlyRate in hourlyRates)
                        {
                            session.HourlyRates_Rate = Math.Ceiling(hourlyRate.Rate / LessonSessions.Count);
                            if (hourlyRate.LessonPackages_Id == saleInvoiceItem.LessonPackages_Id) //rate for the exact lesson package
                            {
                                break;
                            }
                        }
                    }
                    model.TutorTravelCost = session.TutorTravelCost;

                    add(session);

                    //adjust remaining session hours
                    saleInvoiceItem.SessionHours_Remaining -= session.SessionHours;
                    SaleInvoiceItemsController.update_SessionHours_Remaining(db, Session, saleInvoiceItem.Id, saleInvoiceItem.SessionHours_Remaining,
                                                                             string.Format("Lesson Session on {0:dd/MM/yy HH:mm} for {1:N2} hours. Remaining hours: {2:N2} hours.", session.Timestamp, session.SessionHours, saleInvoiceItem.SessionHours_Remaining));
                }
                db.SaveChanges();

                //create payrollpaymentitem
                if (!model.IsScheduleChange)
                {
                    //Calculate tutor payrate
                    decimal HourlyRate = 0;
                    if (!isFullTimeTutor && hourlyRates.Count > 0)
                    {
                        foreach (HourlyRatesModel hourlyRate in hourlyRates)
                        {
                            HourlyRate = hourlyRate.Rate;
                            if (hourlyRate.Branches_Id == model.Branches_Id) //rate for the exact lesson package
                            {
                                break;
                            }
                        }
                    }

                    PayrollPaymentItemsController.add(new PayrollPaymentItemsModel()
                    {
                        Id = PayrollPaymentItems_Id,
                        PayrollPayments_Id = null,
                        Timestamp          = model.Timestamp,
                        Description        = null,
                        Hour            = model.IsWaiveTutorFee ? 0 : model.SessionHours,
                        HourlyRate      = HourlyRate,
                        TutorTravelCost = model.TutorTravelCost,
                        Amount          = PayrollPaymentItemsController.calculateAmount(model.IsWaiveTutorFee, model.SessionHours, HourlyRate, model.TutorTravelCost),
                        UserAccounts_Id = model.Tutor_UserAccounts_Id,
                        Branches_Id     = model.Branches_Id,
                        IsFullTime      = false
                    });
                }

                return(RedirectToAction(nameof(Index), new
                {
                    FILTER_Keyword = FILTER_Keyword,
                    FILTER_InvoiceNo = FILTER_InvoiceNo,
                    FILTER_Cancelled = FILTER_Cancelled,
                    FILTER_chkDateFrom = FILTER_chkDateFrom,
                    FILTER_DateFrom = FILTER_DateFrom,
                    FILTER_chkDateTo = FILTER_chkDateTo,
                    FILTER_DateTo = FILTER_DateTo
                }));
            }

            return(returnView(LessonSessions, null));
        }
        public void add(List <PayrollPaymentItemsModel> items, PayrollPaymentsModel model)
        {
            if (items.Count == 0)
            {
                return;
            }

            Guid?PayrollPayments_Id = null;

            foreach (PayrollPaymentItemsModel item in items)
            {
                if (item.PayrollPayments_Id != null)
                {
                    PayrollPayments_Id = item.PayrollPayments_Id;
                    break;
                }
            }

            string log = string.Format("Payment of {0:N0} on {1:dd/MM/yy}", model.Amount, model.Timestamp);

            if (!string.IsNullOrWhiteSpace(model.Notes))
            {
                log += ", Notes: " + model.Notes;
            }

            if (PayrollPayments_Id != null)
            {
                log   = "Additional " + log;
                model = get(Session, (Guid)PayrollPayments_Id);
            }
            else
            {
                model.Id = Guid.NewGuid();

                db.Database.ExecuteSqlCommand(@"
	                -- INCREMENT LAST HEX NUMBER
	                DECLARE @HexLength int = 5, @LastHex_String varchar(5), @NewNo varchar(5)
	                SELECT @LastHex_String = ISNULL(MAX(No),'') From PayrollPayments	
	                DECLARE @LastHex_Int int
	                SELECT @LastHex_Int = CONVERT(INT, CONVERT(VARBINARY, REPLICATE('0', LEN(@LastHex_String)%2) + @LastHex_String, 2)) --@LastHex_String length must be even number of digits to convert to int
	                SET @NewNo = RIGHT(CONVERT(NVARCHAR(10), CONVERT(VARBINARY(8), @LastHex_Int + 1), 1),@HexLength)

                INSERT INTO PayrollPayments (Id, No,    Timestamp, UserAccounts_Id, Amount, Branches_Id, Approved, Cancelled, CancelNotes, Notes) 
                                     VALUES(@Id,@NewNo,@Timestamp,@UserAccounts_Id,@Amount,@Branches_Id,@Approved,@Cancelled,@CancelNotes,@Notes);
            ",
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Id.Name, model.Id),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Timestamp.Name, model.Timestamp),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_No.Name, model.No),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_UserAccounts_Id.Name, model.UserAccounts_Id),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Amount.Name, model.Amount),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Branches_Id.Name, model.Branches_Id),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Approved.Name, model.Approved),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Cancelled.Name, model.Cancelled),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_CancelNotes.Name, model.CancelNotes),
                                              DBConnection.getSqlParameter(PayrollPaymentsModel.COL_Notes.Name, model.Notes)
                                              );
            }
            ActivityLogsController.Add(db, Session, model.Id, log);

            PayrollPaymentItemsController.update_PayrollPayments_Id(db, Session, model.Id, items);

            db.SaveChanges();
        }