예제 #1
0
        PaymentsGroupViewModel getPaymentsGroupViewModel(PaymentsGroup paymentsGroup)
        {
            PaymentsGroupViewModel model = new PaymentsGroupViewModel();

            model.Header = getPG_HeaderViewModel(paymentsGroup);

            List <Project> Projects = paymentsGroup.UsersPayments.Select(n => n.Project).Distinct().ToList();

            model.ProjectsNames = Projects.Select(n => n.Name).ToArray();
            model.ProjectsIds   = Projects.Select(n => n.ProjectId).ToArray();

            for (int i = 0; i < model.Header.UserIds.Length; i++)
            {
                model.Header.Payments[i] = new double[model.ProjectsIds.Length];
            }

            for (int i = 0; i < model.Header.UserNames.Length; i++)
            {
                Dictionary <int, double> up = paymentsGroup.UsersPayments.Where(x => x.User.Id == model.Header.UserIds[i]).ToDictionary(z => z.Project.ProjectId, z => z.Sum);
                for (int j = 0; j < model.ProjectsIds.Length; j++)
                {
                    model.Header.Payments[i][j] = up.ContainsKey(model.ProjectsIds[j]) ? up[model.ProjectsIds[j]] : -1;
                }
            }
            return(model);
        }
예제 #2
0
        public ActionResult AddPaymentLine(PG_ListViewModel input)
        {
            IsAddPaymentLine = true;

            PaymentsGroup g = db.PaymentsGroups.Find(input.Header.PaymentsGroupId);

            if (g != null)
            {
                if (!string.IsNullOrEmpty(input.NewUserPaymentName) && input.NewUserPaymentProject != null && input.NewUserPaymenSum != null)
                {
                    var b = db.UserBalances.SingleOrDefault(x => x.User.FullName == input.NewUserPaymentName && x.Project.ProjectId == input.NewUserPaymentProject);
                    if (b != null)
                    {
                        var pm = g.UsersPayments.FirstOrDefault(x => x.Project.ProjectId == input.NewUserPaymentProject);
                        if (pm == null)
                        {
                            if (b.Sum >= (int)input.NewUserPaymenSum && (int)input.NewUserPaymenSum != 0)
                            {
                                UserPayment p = new UserPayment()
                                {
                                    User         = b.User,
                                    Project      = b.Project,
                                    Sum          = (double)input.NewUserPaymenSum,
                                    PaymentGroup = db.PaymentsGroups.Find(input.Header.PaymentsGroupId)
                                };
                                db.UserPayments.Add(p);
                                db.SaveChanges();

                                input = getPG_ListsViewModel(input.Header.PaymentsGroupId);
                            }
                            else
                            {
                                ModelState.AddModelError("", "Ошибка, сумма платежа превышает баланс или равна нулю");
                                input.NewUserPaymentName = "";
                                return(View("Edit", input));
                            }
                        }
                        else
                        {
                            ModelState.AddModelError("", "Ошибка, выплата по проекту уже есть в ведомости");
                            input.NewUserPaymentName = "";
                            return(View("Edit", input));
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("", "Ошибка, нет выплат по проекту");
                        input.NewUserPaymentName = "";
                        return(View("Edit", input));
                    }
                }
            }
            input.NewUserPaymentName = "";
            return(Edit(input));
        }
예제 #3
0
 public Payment(PaymentsGroup _parent, string payment_date, string service_name, decimal payment_value, string _isp_inn, string _isp_name, int _isp_id, int _isSent)
 {
     IspId         = _isp_id;
     IsSent        = _isSent;
     Parent        = _parent;
     Date          = payment_date;
     Service       = service_name;
     Value         = payment_value;
     Parent.Total += Value;
     Isp_inn       = _isp_inn;
     Isp_name      = _isp_name;
 }
예제 #4
0
        public ActionResult DeleteConfirmed(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            PaymentsGroup paymentsGroup = db.PaymentsGroups.Find(id);

            db.UserPayments.RemoveRange(db.UserPayments.Where(x => x.PaymentGroup.PaymentsGroupId == id));
            db.PaymentsGroups.Remove(paymentsGroup);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
예제 #5
0
        public JsonResult UserBalances(string FullName, int PaymentsGroupId)
        {
            PaymentsGroup             g    = db.PaymentsGroups.Find(PaymentsGroupId);
            List <UserProjectBalance> list = new List <UserProjectBalance>();

            if (g != null)
            {
                var projects = (from p in g.UsersPayments select p.Project.ProjectId).ToList();
                var res      = (from b in db.UserBalances where b.User.FullName == FullName && b.Sum > 0 && !projects.Contains(b.Project.ProjectId) select
                                new UserProjectBalance {
                    Name = b.Project.Name, ProjectId = b.Project.ProjectId, Sum = b.Sum
                });
                list = res.ToList();
            }
            return(Json(list, JsonRequestBehavior.AllowGet));
        }
예제 #6
0
            public object Clone()
            {
                var _clonedPayments = this.PaymentsCollection.Select(i => (Payment)i.Clone()).ToList();

                this.Total = _clonedPayments.Select(i => i.Parent.Total).Sum();
                _clonedPayments.Select(i => i.Parent = null);
                ObservableCollection <Payment> clonedPayments = new ObservableCollection <Payment>(_clonedPayments);
                PaymentsGroup clonedObject = new PaymentsGroup(this.IsCorrect, this.PackId, this.Occ, this.PaymentId, this.Email, clonedPayments, this.Source, this.Pack_date, this.Vipiska_id, this.Vipiska_date, this.Pack_total, this.Docsnum);

                foreach (Payment item in clonedObject.PaymentsCollection)
                {
                    item.Parent = clonedObject;
                }

                clonedObject.Total = this.Total;
                return(clonedObject);
            }
예제 #7
0
        PG_HeaderViewModel getPG_HeaderViewModel(PaymentsGroup paymentsGroup)
        {
            PG_HeaderViewModel Header = new PG_HeaderViewModel();

            Header.State           = paymentsGroup.State;
            Header.WhenCreated     = paymentsGroup.WhenCreated;
            Header.WhenPaidOut     = paymentsGroup.WhenPaidOut;
            Header.UserClosed      = paymentsGroup.UserClosed;
            Header.PaymentsGroupId = paymentsGroup.PaymentsGroupId;

            List <ApplicationUser> users = paymentsGroup.UsersPayments != null?paymentsGroup.UsersPayments.Select(p => p.User).Distinct().ToList() : new List <ApplicationUser>();

            Header.UserNames = users.Select(x => x.ShortName == null ? x.UserName : x.ShortName).ToArray();
            Header.UserIds   = users.Select(x => x.Id).ToArray();

            Header.Payments = new double[Header.UserIds.Length][];

            return(Header);
        }
예제 #8
0
        PG_ListViewModel getPG_ListsViewModel(PaymentsGroup paymentsGroup)
        {
            PG_ListViewModel model = new PG_ListViewModel();

            model.Header                 = getPG_HeaderViewModel(paymentsGroup);
            model.ProjectNames           = new string[model.Header.UserIds.Length][];
            model.ProjectIds             = new int[model.Header.UserIds.Length][];
            model.Header.Payments        = new double[model.Header.UserIds.Length][];
            model.Header.RegularPayments = new double[model.Header.UserIds.Length][];
            model.Balances               = new double[model.Header.UserIds.Length][];

            for (int i = 0; i < model.Header.UserNames.Length; i++)
            {
                var list = paymentsGroup.UsersPayments.Where(x => x.User.Id == model.Header.UserIds[i]).ToList();
                model.ProjectNames[i]           = new string[list.Count];
                model.ProjectIds[i]             = new int[list.Count];
                model.Header.Payments[i]        = new double[list.Count];
                model.Header.RegularPayments[i] = new double[list.Count];
                model.Balances[i] = new double[list.Count];
                for (int j = 0; j < list.Count; j++)
                {
                    model.ProjectNames[i][j]           = list[j].Project.Name;
                    model.ProjectIds[i][j]             = list[j].Project.ProjectId;
                    model.Header.Payments[i][j]        = list[j].Sum - list[j].RegularPaymentSum;
                    model.Header.RegularPayments[i][j] = list[j].RegularPaymentSum;
                }
                for (int j = 0; j < model.ProjectIds[i].Length; j++)
                {
                    string uid = model.Header.UserIds[i];
                    int    pid = model.ProjectIds[i][j];
                    var    b   = db.UserBalances.FirstOrDefault(x => x.User.Id == uid && x.Project.ProjectId == pid);
                    model.Balances[i][j] = b == null ? 0 : b.Sum;
                }
            }

            model.NewUserPaymentName = "";
            model.NewUserPaymenSum   = null;
            return(model);
        }
예제 #9
0
        public ActionResult EditByTable(PaymentsGroupViewModel model)
        {
            if (ModelState.IsValid)
            {
                PaymentsGroup paymentsGroup = db.PaymentsGroups.Find(model.Header.PaymentsGroupId);
                if (paymentsGroup != null)
                {
                    bool was_apply = false;
                    bool has_error = false;
                    for (int i = 0; i < model.Header.UserIds.Length; i++)
                    {
                        ApplicationUser user = db.Users.Find(model.Header.UserIds[i]);
                        if (user != null)
                        {
                            for (int j = 0; j < model.ProjectsIds.Length; j++)
                            {
                                if (model.Header.Payments[i][j] == -1)
                                {
                                    continue;
                                }
                                UserBalance user_b = user.UserBalances.FirstOrDefault(x => x.Project.ProjectId == model.ProjectsIds[j]);
                                UserPayment user_p = paymentsGroup.UsersPayments.FirstOrDefault(x => x.Project.ProjectId == model.ProjectsIds[j] && x.User.Id == model.Header.UserIds[i]);
                                if (user_b != null && user_p != null)
                                {
                                    if (user_b.Sum >= model.Header.Payments[i][j])
                                    {
                                        if (model.Header.State == PaymentsGroupState.PaidOut)
                                        {
                                            user_b.Sum -= model.Header.Payments[i][j];
                                        }
                                        user_p.Sum = model.Header.Payments[i][j];
                                        was_apply  = true;
                                    }
                                    else
                                    {
                                        has_error = true;
                                        ModelState.AddModelError("", "Сумма платежа первышает остаток, Пользователь " + model.Header.UserNames[i] + " Проект " + model.ProjectsNames[j]);
                                    }
                                }
                                else
                                {
                                    has_error = true;
                                    if (user_b == null)
                                    {
                                        ModelState.AddModelError("", "Не найден счет, Пользователь " + model.Header.UserNames[i] + " Проект " + model.ProjectsNames[j]);
                                    }
                                    if (user_p == null)
                                    {
                                        ModelState.AddModelError("", "Не найден платеж, Пользователь " + model.Header.UserNames[i] + " Проект " + model.ProjectsNames[j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            has_error = true;
                            ModelState.AddModelError("", "Пользователь " + model.Header.UserNames[i] + " не найден");
                        }
                    }


                    if (was_apply && !has_error)
                    {
                        var             UserManager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(db));
                        string          uid         = User.Identity.GetUserId();
                        ApplicationUser admin       = db.Users.FirstOrDefault(x => x.Id == uid);
                        if (model.Header.State == PaymentsGroupState.PaidOut)
                        {
                            paymentsGroup.UserClosed  = admin;
                            paymentsGroup.State       = PaymentsGroupState.PaidOut;
                            paymentsGroup.WhenPaidOut = DateTime.Now;
                        }

                        db.SaveChanges();

                        return(RedirectToAction("Index"));
                    }
                    else
                    {
                        if (!was_apply)
                        {
                            ModelState.AddModelError("", "В счете не найдено корректных платежей");
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Счет не найден, id=" + model.Header.PaymentsGroupId);
                }
            }
            else
            {
                ModelState.AddModelError("", "Ошибка ввода ");
            }

            return(View(model));
        }
예제 #10
0
        PG_ListViewModel getPG_ListsViewModel(int?id)
        {
            PaymentsGroup paymentsGroup = db.PaymentsGroups.Find(id);

            return(paymentsGroup == null ? null : getPG_ListsViewModel(paymentsGroup));
        }
예제 #11
0
        public ActionResult Edit(PG_ListViewModel model)
        {
            PG_EditErrors.Clear();
            bool was_apply = false;
            bool has_error = false;

            if (ModelState.IsValid)
            {
                PaymentsGroup paymentsGroup = db.PaymentsGroups.Find(model.Header.PaymentsGroupId);
                if (paymentsGroup != null)
                {
                    for (int i = 0; i < model.Header.UserIds.Length; i++)
                    {
                        ApplicationUser user = db.Users.Find(model.Header.UserIds[i]);
                        if (user != null)
                        {
                            for (int j = 0; j < model.ProjectIds[i].Length; j++)
                            {
                                UserBalance user_b = user.UserBalances.FirstOrDefault(x => x.Project.ProjectId == model.ProjectIds[i][j]);
                                UserPayment user_p = paymentsGroup.UsersPayments.FirstOrDefault(x => x.Project.ProjectId == model.ProjectIds[i][j] && x.User.Id == model.Header.UserIds[i]);

                                if (user_b == null)
                                {
                                    user_b = db.UserBalances.Add(new UserBalance()
                                    {
                                        Project = db.Projects.Find(model.ProjectIds[i][j]), Sum = 0, User = user
                                    });
                                    db.SaveChanges();
                                }

                                if (user_b != null && user_p != null)
                                {
                                    if (user_b.Sum >= model.Header.Payments[i][j])
                                    {
                                        if (model.Header.State == PaymentsGroupState.PaidOut)
                                        {
                                            user_b.Sum -= model.Header.Payments[i][j];
                                        }
                                        user_p.Sum = model.Header.Payments[i][j] + model.Header.RegularPayments[i][j];
                                        user_p.RegularPaymentSum = model.Header.RegularPayments[i][j];
                                        was_apply = true;
                                    }
                                    else
                                    {
                                        has_error = true;
                                        PG_EditErrors.Add("Сумма платежа первышает остаток, Пользователь " + model.Header.UserNames[i] + " Проект " + model.ProjectNames[i][j]);
                                    }
                                }
                            }
                        }
                        else
                        {
                            has_error = true;
                            PG_EditErrors.Add("Пользователь " + model.Header.UserNames[i] + " не найден");
                        }
                    }


                    if (was_apply && !has_error)
                    {
                        var             UserManager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(db));
                        string          uid         = User.Identity.GetUserId();
                        ApplicationUser admin       = db.Users.FirstOrDefault(x => x.Id == uid);
                        if (model.Header.State == PaymentsGroupState.PaidOut)
                        {
                            paymentsGroup.UserClosed  = admin;
                            paymentsGroup.State       = PaymentsGroupState.PaidOut;
                            paymentsGroup.WhenPaidOut = DateTime.Now;


                            // создаем список рассылки
                            foreach (var p in paymentsGroup.UsersPayments)
                            {
                                db.JobForMailings.Add(new JobForMailing()
                                {
                                    UserPayment = p
                                });
                            }

                            HostingEnvironment.QueueBackgroundWorkItem(cancellationToken => new MailSendWorker().SendPaidOut(cancellationToken));
                        }

                        db.SaveChanges();

                        foreach (var err in PG_EditErrors)
                        {
                            ModelState.AddModelError("", err);
                        }

                        if (IsAddPaymentLine)
                        {
                            return(RedirectToAction("Edit/" + model.Header.PaymentsGroupId));
                        }
                        else
                        {
                            return(RedirectToAction("Index"));
                        }
                    }
                    else
                    {
                        if (!was_apply)
                        {
                            PG_EditErrors.Add("В счете не найдено корректных платежей");
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Счет не найден, id=" + model.Header.PaymentsGroupId);
                }
            }
            else
            {
                ModelState.AddModelError("", "Ошибка ввода ");
            }

            if (!was_apply || has_error)
            {
                foreach (var err in PG_EditErrors)
                {
                    ModelState.AddModelError("", err);
                }
            }



            return(View(model));
        }
예제 #12
0
        public ActionResult UploadForm(RateUploadModel input)
        {
            Dictionary <string, double> stavki = new Dictionary <string, double>();

            if (ModelState.IsValid)
            {
                if (input.UploadFile != null)
                {
                    using (var package = new ExcelPackage(input.UploadFile.InputStream))
                    {
                        var Sheet   = package.Workbook.Worksheets[1];
                        int lastRow = Sheet.Dimension.End.Row;
                        int lastCol = Sheet.Dimension.End.Column;
                        int i       = 5;
                        do
                        {
                            if (Sheet.Cells[i, 1].Value != null && Sheet.Cells[i, 5].Value != null)
                            {
                                if (!String.IsNullOrEmpty(Sheet.Cells[i, 1].Value.ToString()))
                                {
                                    if (!String.IsNullOrEmpty(Sheet.Cells[i, 5].Value.ToString()))
                                    {
                                        double v;
                                        if (double.TryParse(Sheet.Cells[i, 5].Value.ToString(), out v))
                                        {
                                            stavki.Add(Sheet.Cells[i, 1].Value.ToString().Trim().Replace(". ", ".").Replace(". ", ".").ToUpper(), v);
                                        }
                                    }
                                }
                            }
                            i++;
                        } while (i <= lastRow);

                        PaymentsGroup pg = new PaymentsGroup()
                        {
                            State = PaymentsGroupState.InProcess, WhenCreated = DateTime.Now, WhenPaidOut = DateTime.Now
                        };
                        pg = db.PaymentsGroups.Add(pg);

                        foreach (KeyValuePair <string, double> s in stavki)
                        {
                            ApplicationUser user = db.Users.FirstOrDefault(x => x.ShortName.Replace(". ", ".").ToUpper() == s.Key.Replace(". ", ".").ToUpper());
                            if (user != null)
                            {
                                double limit = input.SalaryRate * s.Value / 100;
                                double c_sum = 0;
                                foreach (var b in user.UserBalances.OrderBy(x => x.Sum).ToList())
                                {
                                    if (b.Sum == 0)
                                    {
                                        continue;
                                    }
                                    UserPayment p = null;

                                    if (b.Sum > (limit - c_sum))
                                    {
                                        double rsum = PaymentRequest.TruncSum(limit - c_sum);
                                        if (((uint)rsum) == 0)
                                        {
                                            continue;
                                        }
                                        p = new UserPayment()
                                        {
                                            PaymentGroup = pg, Project = b.Project, User = user, Sum = rsum
                                        };

                                        p = db.UserPayments.Add(p);
                                        break;
                                    }
                                    else
                                    {
                                        double rsum = PaymentRequest.TruncSum(b.Sum);
                                        if (((uint)rsum) == 0)
                                        {
                                            continue;
                                        }
                                        p = new UserPayment()
                                        {
                                            PaymentGroup = pg, Project = b.Project, User = user, Sum = rsum
                                        };
                                        c_sum += p.Sum;
                                        p      = db.UserPayments.Add(p);
                                    }
                                }
                            }
                            else
                            {
                                ModelState.AddModelError("", "в БД не найден " + s.Key);
                            }
                        }

                        db.SaveChanges();

                        if (input.regularPaymentIds != null)
                        {
                            //  обработка регулярных платежей
                            for (int l = 0; l < input.regularPaymentIds.Length; l++)
                            {
                                if (input.accrueRegularPayments[l])
                                {
                                    RegularPayment rp = db.RegularPayments.Find(input.regularPaymentIds[l]);
                                    if (rp != null)
                                    {
                                        // проверяем дату
                                        DateTime d_from = rp.PayoutFrom == null ? new DateTime(DateTime.Now.Year - 10, DateTime.Now.Month, 1) :
                                                          new DateTime(rp.PayoutFrom.Value.Year, rp.PayoutFrom.Value.Month, 1);
                                        DateTime d_to = rp.PayoutTo == null ? new DateTime(DateTime.Now.Year + 10, DateTime.Now.Month, 1) :
                                                        new DateTime(rp.PayoutTo.Value.Year, rp.PayoutTo.Value.Month, 1);
                                        DateTime d_now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                                        if (d_now >= d_from && d_now <= d_to)
                                        {
                                            UserPayment p = pg.UsersPayments.FirstOrDefault(x => x.Project.ProjectId == rp.Project.ProjectId && x.User.Id == rp.RecipientUser.Id);
                                            if (p == null)
                                            {
                                                p = db.UserPayments.Add(new UserPayment {
                                                    PaymentGroup = pg, Project = rp.Project, User = rp.RecipientUser, Sum = 0
                                                });
                                            }

                                            p.Sum += rp.Sum;
                                            p.RegularPaymentSum = rp.Sum;
                                            db.SaveChanges();
                                        }
                                    }
                                }
                            }
                        }

                        return(RedirectToAction("CreateConfirm/" + pg.PaymentsGroupId));
                    }
                }
                else
                {
                    UploadFormErros.Add("Не выбран файл ставок");
                }
            }

            return(RedirectToAction("UploadForm"));
        }
예제 #13
0
        private string TryImportUserPayments(AppDbContext db, ApplicationUser user_ctx, string fio) // возвращает ексель имя пользователя
        {
            string shortname = null;
            var    q1        = db.ImportUsers.Where(x => x.Fio.ToUpper().Replace("Ё", "Е") == fio).ToList();

            foreach (var item in q1)
            {
                shortname = item.Fio;

                Department department = user_ctx.Department;// db.Departments.SingleOrDefault(x => x.Name == item.Department);
                if (department == null)
                {
                    department = new Department()
                    {
                        Name = item.Department.Name
                    };
                    db.Departments.Add(department);
                    db.SaveChanges();
                }

                Project project = db.Projects.SingleOrDefault(x => x.Name == item.Project);
                if (project == null)
                {
                    project = new Project()
                    {
                        Name = item.Project, Department = department, Description = "", WhenWasClosed = DateTime.Now.AddMonths(6)
                    };
                    db.Projects.Add(project);
                    db.SaveChanges();
                }

                foreach (var p in item.ImportUserPayments)
                {
                    PaymentsGroup pgrp = db.PaymentsGroups.FirstOrDefault(x => x.WhenPaidOut == p.WhenPaidOut && x.State == p.State);
                    if (pgrp == null)
                    {
                        pgrp = new PaymentsGroup()
                        {
                            WhenPaidOut = p.WhenPaidOut, State = p.State
                        };
                        db.PaymentsGroups.Add(pgrp);
                    }

                    UserPayment payment = new UserPayment()
                    {
                        User = user_ctx, Project = project, Sum = p.Sum, PaymentGroup = pgrp
                    };
                    payment = db.UserPayments.Add(payment);
                    // пополняем баланс, если не выплачено
                    var user_balance = db.UserBalances.FirstOrDefault(x => x.User.Id == user_ctx.Id && x.Project.ProjectId == payment.Project.ProjectId);
                    if (user_balance == null)
                    {
                        user_balance = new UserBalance()
                        {
                            User = user_ctx, Project = payment.Project, Sum = 0
                        };
                        db.UserBalances.Add(user_balance);
                    }
                    if (pgrp.State == PaymentsGroupState.InProcess)
                    {
                        user_balance.Sum += payment.Sum;
                    }

                    db.SaveChanges();
                }
                db.ImportUserPayments.RemoveRange(item.ImportUserPayments);
                db.SaveChanges();
            }
            db.ImportUsers.RemoveRange(q1);
            db.SaveChanges();
            return(shortname);
        }