// GET: PaymentRequests/Create
        public ActionResult Create()
        {
            GenerateProjectsList();
            PaymentRequestEditModel model = new PaymentRequestEditModel()
            {
                Sum_Add = new double[100], UserName_Add = new string[100], type_Add = new PaymentRequestType[100]
            };

            model.DepartmentId = 0;
            return(View("Create", model));
        }
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            PaymentRequest r = db.PaymentRequests.Find(id);

            if (r == null)
            {
                return(HttpNotFound());
            }
            int    p  = r.AttachedFileName.IndexOf('_');
            string fn = p > 0 ? r.AttachedFileName.Substring(p + 1, r.AttachedFileName.Length - p - 1) : r.AttachedFileName;

            var    q1   = db.RequestHistories.Where(x => x.Request.PaymentRequestId == r.PaymentRequestId).ToList();
            string text = "";

            foreach (var item in q1)
            {
                text += item.WhenPosted.ToString("dd.MM.yyyy HH:mm") + ", " + item.Author.ShortName + ": <br/>";
                text += item.Comments;
                text += "<hr/>";
            }

            PaymentRequestEditModel edit = new PaymentRequestEditModel()
            {
                AttachFileName   = fn, HistoryComments = text,
                type             = r.SumType, PaymentRequestId = r.PaymentRequestId, AgreedPM = r.AgreedPM,
                ProjectName      = r.Project.Name, Sum = r.TimesOrSum, UserName = r.RecipientUser.FullName,
                ProjectCode      = PaymentRequestEditModel.getProjectCode(r.Project.Name),
                ProjectShortName = PaymentRequestEditModel.getProjectShortName(r.Project.Name)
            };

            GenerateProjectsList();

            return(View(edit));
        }
        // GET: RegularPayments/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            RegularPayment regularPayment = db.RegularPayments.Find(id);

            if (regularPayment == null)
            {
                return(HttpNotFound());
            }
            RegularPaymentEditModel model =
                new RegularPaymentEditModel()
            {
                RegularPaymentId = regularPayment.RegularPaymentId, Sum = regularPayment.Sum, UserName = regularPayment.RecipientUser.FullName,
                PayoutFrom       = regularPayment.PayoutFrom, PayoutTo = regularPayment.PayoutTo,
                ProjectCode      = PaymentRequestEditModel.getProjectCode(regularPayment.Project.Name),
                ProjectShortName = PaymentRequestEditModel.getProjectShortName(regularPayment.Project.Name)
            };

            return(View(model));
        }
        public ActionResult HistoryComments(int?id)
        {
            PaymentRequestEditModel edit = new PaymentRequestEditModel();

            if (id == null)
            {
                edit.HistoryComments = "Нет комментариев";
            }
            else
            {
                var    q1   = db.RequestHistories.Where(x => x.Request.PaymentRequestId == id).ToList();
                string text = "";
                foreach (var item in q1)
                {
                    text += item.WhenPosted.ToString("dd.MM.yyyy HH:mm") + ", " + item.Author.ShortName + ": <br/>";
                    text += item.Comments;
                    text += "<hr/>";
                }
                edit.HistoryComments = text == "" ? "Нет комментариев" : text;
            }
            return(PartialView("HistoryComments", edit));
            //return View(edit);
            //return Json(edit, JsonRequestBehavior.AllowGet);
        }
        public ActionResult Edit(PaymentRequestEditModel input)
        {
            if (ModelState.IsValid)
            {
                var             currentUser = manager.FindById(User.Identity.GetUserId());
                Project         prj         = db.Projects.SingleOrDefault(x => x.Name.Trim() == input.ProjectName.Trim());
                ApplicationUser recipient   = db.Users.SingleOrDefault(x => x.FullName == input.UserName);
                PaymentRequest  request     = db.PaymentRequests.Find(input.PaymentRequestId);

                if (request != null)
                {
                    string pre_fileName = !String.IsNullOrEmpty(request.AttachedFileName) ? System.IO.Path.Combine(Server.MapPath("~/App_Data/Uploads"), request.AttachedFileName) : "";

                    if ((pre_fileName != "") && input.DeleteAttachedFile)
                    {
                        System.IO.File.Delete(pre_fileName);
                    }

                    string fileName = input.File != null ? Environment.TickCount + "_" + System.IO.Path.GetFileName(input.File.FileName) : "";
                    if (fileName != "")
                    {
                        try
                        {
                            if (pre_fileName != "")
                            {
                                System.IO.File.Delete(pre_fileName);
                            }

                            var path = System.IO.Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName);
                            input.File.SaveAs(path);
                        }
                        catch (Exception e)
                        {
                            ModelState.AddModelError("", "Ошибка загрузки файла " + e.Message);
                            GenerateProjectsList();
                            return(View(input));
                        }
                    }

                    if (recipient != null)
                    {
                        if (prj == null)
                        {
                            Department dept = db.Departments.SingleOrDefault(x => x.Boss.Id == currentUser.Id);
                            if (dept == null)
                            {
                                ModelState.AddModelError("", "Пользователь не РП ");
                                GenerateProjectsList();
                                return(View(input));
                            }
                            prj = db.Projects.Add(new Project()
                            {
                                Department = dept, Name = input.ProjectName
                            });
                        }

                        request.AttachedFileName = fileName;
                        request.SumType          = input.type;
                        request.RecipientUser    = recipient;
                        request.AgreedPM         = input.AgreedPM;
                        request.TimesOrSum       = request.SumType == PaymentRequestType.Times ? input.Sum : PaymentRequest.RoundSum(input.Sum);
                        request.Project          = prj;
                        if (!manager.IsInRole(currentUser.Id, SalaryRoles.Directors))
                        {
                            request.RequestState = input.SetStateWaitConfirm ? PaymentRequestState.WaitConfirm : PaymentRequestState.InProcess;
                        }
                        else
                        {
                            request.RequestState = input.SetStateCredited ? PaymentRequestState.Confirmed : PaymentRequestState.WaitConfirm;
                        }

                        if (request.RequestState == PaymentRequestState.WaitConfirm)
                        {
                            SendMailToDirector(request.AppointedUser.ShortName, request.Project.Name);
                        }


                        if (!String.IsNullOrEmpty(input.Comments))
                        {
                            db.RequestHistories.Add(new RequestHistory()
                            {
                                WhenPosted = DateTime.Now, Comments = input.Comments, Author = currentUser, Request = request
                            });
                        }

                        db.SaveChanges();
                        return(RedirectToAction("Index"));
                    }
                }
            }
            GenerateProjectsList();
            ModelState.AddModelError("", "Ошибка ввода");
            return(View(input));
        }
        public ActionResult Create(PaymentRequestEditModel input)
        {
            if (ModelState.IsValid)
            {
                Project prj = ProjectFind(db, input.ProjectCode, input.ProjectShortName);

                if ((input.ProjectCode != null && input.ProjectShortName != null) || prj != null)
                {
                    input.ProjectName = input.ProjectCode + "_" + input.ProjectShortName;
                    var             currentUser = manager.FindById(User.Identity.GetUserId());
                    ApplicationUser recipient   = db.Users.SingleOrDefault(x => x.FullName == input.UserName);

                    bool exists = System.IO.Directory.Exists(Server.MapPath("~/App_Data"));
                    if (!exists)
                    {
                        System.IO.Directory.CreateDirectory(Server.MapPath("~/App_Data"));
                        System.IO.Directory.CreateDirectory(Server.MapPath("~/App_Data/Uploads"));
                    }
                    else
                    {
                        if (!System.IO.Directory.Exists(Server.MapPath("~/App_Data/Uploads")))
                        {
                            System.IO.Directory.CreateDirectory(Server.MapPath("~/App_Data/Uploads"));
                        }
                    }

                    string fileName = input.File != null ? Environment.TickCount + "_" + System.IO.Path.GetFileName(input.File.FileName) : "";
                    if (fileName != "")
                    {
                        try
                        {
                            var path = System.IO.Path.Combine(Server.MapPath("~/App_Data/Uploads"), fileName);
                            input.File.SaveAs(path);
                        }
                        catch (Exception e)
                        {
                            ModelState.AddModelError("", "Ошибка загрузки файла " + e.Message);
                            GenerateProjectsList();
                            return(View(input));
                        }
                    }


                    if (recipient != null)
                    {
                        if (prj == null)
                        {
                            var res = (from d in db.Departments select d);
                            if (!manager.IsInRole(currentUser.Id, SalaryRoles.Directors))
                            {
                                res = res.Where(d => d.Boss.Id == currentUser.Id || d.Assistant.Id == currentUser.Id);
                            }

                            var        depts = res.ToList();
                            Department dept  = null;
                            if (depts.Count == 0 && !manager.IsInRole(currentUser.Id, "Directors"))
                            {
                                ModelState.AddModelError("", "Пользователь не имеет прав добавлять проекты ");
                                GenerateProjectsList();
                                return(View(input));
                            }
                            else if (depts.Count == 0 && manager.IsInRole(currentUser.Id, "Directors"))
                            {
                                dept = db.Departments.SingleOrDefault(x => x.Name == "_Резерв");
                                if (dept == null)
                                {
                                    dept = db.Departments.Add(new Department {
                                        Name = "_Резерв", Boss = currentUser
                                    });
                                    db.SaveChanges();
                                    dept = db.Departments.SingleOrDefault(x => x.Name == "_Резерв");
                                }
                            }
                            else if (depts.Count > 0)
                            {
                                dept = depts.FirstOrDefault(x => x.DepartmentId == input.DepartmentId);
                                if (dept == null)
                                {
                                    ModelState.AddModelError("", "Неверно задано направление ");
                                    GenerateProjectsList();
                                    return(View(input));
                                }
                            }
                            prj = db.Projects.Add(new Project()
                            {
                                Department = dept, Name = input.ProjectName
                            });
                            db.SaveChanges();
                        }

                        PaymentRequest r = new PaymentRequest()
                        {
                            SumType          = input.type,
                            TimesOrSum       = input.type == PaymentRequestType.Times ? input.Sum : PaymentRequest.RoundSum(input.Sum),
                            AgreedPM         = input.AgreedPM,
                            Project          = prj,
                            AttachedFileName = fileName,
                            AppointedUser    = currentUser,
                            RecipientUser    = recipient,
                        };

                        if (manager.IsInRole(currentUser.Id, SalaryRoles.Managers) || manager.IsInRole(currentUser.Id, SalaryRoles.Assistant))
                        {
                            r.RequestState = input.SetStateWaitConfirm ? PaymentRequestState.WaitConfirm : PaymentRequestState.InProcess;
                            // шлем почту если надо
                            if (r.RequestState == PaymentRequestState.WaitConfirm)
                            {
                                SendMailToDirector(r.AppointedUser.ShortName, r.Project.Name);
                            }
                        }
                        else if (manager.IsInRole(currentUser.Id, "Directors"))
                        {
                            r.RequestState = input.SetStateCredited ? PaymentRequestState.Confirmed : PaymentRequestState.WaitConfirm;
                        }

                        r = db.PaymentRequests.Add(r);

                        if (!String.IsNullOrEmpty(input.Comments))
                        {
                            db.RequestHistories.Add(new RequestHistory()
                            {
                                WhenPosted = DateTime.Now, Comments = input.Comments, Author = currentUser, Request = r
                            });
                        }


                        db.SaveChanges();

                        for (int i = 0; i < input.UserName_Add.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(input.UserName_Add[i]) && input.Sum_Add[i] > 0)
                            {
                                string          str        = input.UserName_Add[i];
                                ApplicationUser recipient1 = db.Users.SingleOrDefault(x => x.FullName == str);
                                if (recipient1 != null)
                                {
                                    PaymentRequest r1 = new PaymentRequest()
                                    {
                                        AgreedPM         = input.AgreedPM,
                                        Project          = r.Project,
                                        AttachedFileName = r.AttachedFileName,
                                        AppointedUser    = r.AppointedUser,
                                        RequestState     = r.RequestState,

                                        RecipientUser = recipient1,
                                        SumType       = input.type_Add[i],
                                        TimesOrSum    = input.type_Add[i] == PaymentRequestType.Times ? input.Sum_Add[i] : PaymentRequest.RoundSum(input.Sum_Add[i])
                                    };
                                    db.PaymentRequests.Add(r1);
                                    db.SaveChanges();
                                }
                            }
                        }

                        return(RedirectToAction("Index"));
                    }
                    else
                    {
                        ModelState.AddModelError("", "Сотрудник не найден или не задано поле Кому");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Не задано поле Шифр и/или Название");
                }
            }
            ModelState.AddModelError("", "Ошибка ввода");
            GenerateProjectsList();
            return(View(input));
        }