public async Task <IActionResult> OnPostRejectAsync() { string storeId = Request.Form["id-store"]; bool completeOk = bool.TryParse(Request.Form["checkbox-complete"], out bool completeCheck); bool stageOk = int.TryParse(Request.Form["next-stage"], out int stageId); if (!stageOk || !completeOk) { return(NotFound()); } WebAppUser webAppUser = await _userHandler.GetUserAsync(HttpContext.User); ApprovalHandler approvalHandler = new ApprovalHandler(_context, storeId); bool isFirstStage = await approvalHandler.IsFirstStageAsync(); bool isApprover = await approvalHandler.IsApproverAsync(webAppUser); if (!isApprover || isFirstStage) { return(NotFound()); } bool isOk = await approvalHandler.ActionReject(completeCheck, stageId, webAppUser); if (isOk) { await SendEmailReject(approvalHandler); } return(Ok()); }
public async Task <IViewComponentResult> InvokeAsync(string idForm) { var user = await _userManager.GetUserAsync(HttpContext.User); var mtdFormList = await ApprovalHandler.GetWaitStoreIds(_context, user, idForm); int pending = mtdFormList.Count(); string searchText = ""; bool whiteList = false; MtdFilter filter = await _context.MtdFilter.FirstOrDefaultAsync(x => x.IdUser == user.Id && x.MtdForm == idForm); if (filter != null) { searchText = filter.SearchText; whiteList = filter.WaitList == 0 ? false : true; } HeaderModelView headerModelView = new HeaderModelView { IdForm = idForm, SearchText = searchText, WaitList = whiteList, Pending = pending, IsApprovalForm = await ApprovalHandler.IsApprovalFormAsync(_context, idForm) }; return(View("Default", headerModelView)); }
private async Task <bool> SendEmailApprove(ApprovalHandler approvalHandler) { string ownerId = await approvalHandler.GetOwnerID(); WebAppUser userCurrent = await _userHandler.GetUserAsync(HttpContext.User); WebAppUser userOwner = _userHandler.Users.Where(x => x.Id == ownerId).FirstOrDefault(); string storeId = await approvalHandler.GetStoreID(); MtdForm mtdForm = await approvalHandler.GetFormAsync(); MtdApprovalStage stageNext = await approvalHandler.GetNextStageAsync(); if (stageNext != null) { WebAppUser userNext = _userHandler.Users.Where(x => x.Id == stageNext.UserId).FirstOrDefault(); BlankEmail blankEmail = new BlankEmail { Subject = _localizer["Approval event"], Email = userNext.Email, Header = _localizer["Approval required"], Content = new List <string> { $"<strong>{_localizer["Document"]} - {mtdForm.Name}</strong>", $"{_localizer["User"]} {userCurrent.Title} {_localizer["approved the document at"]} {DateTime.Now}", $"{_localizer["Click on the link to view the document that required to approve."]}", $"<a href='http://{HttpContext.Request.Host}/workplace/store/details?id={storeId}'>{_localizer["Document link"]}</a>" } }; await _emailSender.SendEmailBlankAsync(blankEmail); } bool IsFirstStage = await approvalHandler.IsFirstStageAsync(); if (!IsFirstStage) { BlankEmail blankEmail = new BlankEmail { Subject = _localizer["Approval event"], Email = userOwner.Email, Header = _localizer["Approval process event"], Content = new List <string> { $"<strong>{_localizer["Document"]} - {mtdForm.Name}</strong>", $"{_localizer["User"]} {userCurrent.Title} {_localizer["approved the document at"]} {DateTime.Now}", $"{_localizer["Click on the link to view the document."]}", $"<a href='http://{HttpContext.Request.Host}/workplace/store/details?id={storeId}'>{_localizer["Document link"]}</a>" } }; await _emailSender.SendEmailBlankAsync(blankEmail); } return(true); }
public async Task <IViewComponentResult> InvokeAsync(string idForm) { var user = await _userHandler.GetUserAsync(HttpContext.User); List <string> partIds = await _userHandler.GetAllowPartsForView(user, idForm); FilterHandler handlerFilter = new FilterHandler(_context, idForm, user, _userHandler); Incomer incomer = await handlerFilter.GetIncomerDataAsync(); TypeQuery typeQuery = await handlerFilter.GetTypeQueryAsync(); OutFlow outFlow = await handlerFilter.GetStackFlowAsync(incomer, typeQuery); IList <MtdStore> mtdStore = outFlow.MtdStores; decimal count = (decimal)outFlow.Count / incomer.PageSize; pageCount = Convert.ToInt32(Math.Round(count, MidpointRounding.AwayFromZero)); pageCount = pageCount == 0 ? 1 : pageCount; IList <string> storeIds = mtdStore.Select(s => s.Id).ToList(); IList <string> fieldIds = fieldIds = incomer.FieldForColumn.Select(x => x.Id).ToList(); IList <string> allowFiieldIds = await _context.MtdFormPartField.Where(x => partIds.Contains(x.MtdFormPart)).Select(x => x.Id).ToListAsync(); fieldIds = allowFiieldIds.Where(x => fieldIds.Contains(x)).ToList(); StackHandler handlerStack = new StackHandler(_context); IList <MtdStoreStack> mtdStoreStack = await handlerStack.GetStackAsync(storeIds, fieldIds); IList <MtdStoreApproval> mtdStoreApprovals = await _context.MtdStoreApproval.Where(x => storeIds.Contains(x.Id)).ToListAsync(); List <ApprovalStore> approvalStores = await ApprovalHandler.GetStoreStatusAsync(_context, storeIds, user); bool isApprovalForm = await ApprovalHandler.IsApprovalFormAsync(_context, idForm); RowsModelView rowsModel = new RowsModelView { IdForm = idForm, SearchNumber = incomer.SearchNumber, PageCount = pageCount, MtdFormPartFields = incomer.FieldForColumn.Where(x => fieldIds.Contains(x.Id)).ToList(), MtdStores = mtdStore, MtdStoreStack = mtdStoreStack, WaitList = incomer.WaitList == 1 ? true : false, ShowDate = await handlerFilter.IsShowDate(), ShowNumber = await handlerFilter.IsShowNumber(), ApprovalStores = approvalStores, IsAppromalForm = isApprovalForm }; return(View("Default", rowsModel)); }
public async Task <IActionResult> OnPostApproveAsync() { string storeId = Request.Form["id-store"]; WebAppUser webAppUser = await _userHandler.GetUserAsync(HttpContext.User); ApprovalHandler approvalHandler = new ApprovalHandler(_context, storeId); bool isApprover = await approvalHandler.IsApproverAsync(webAppUser); if (!isApprover) { return(NotFound()); } bool isOk = await approvalHandler.ActionApprove(webAppUser); if (isOk) { await SendEmailApprove(approvalHandler); } return(Ok()); }
public async Task <IActionResult> OnGetAsync(string id) { if (id == null) { return(NotFound()); } MtdStore = await _context.MtdStore.FirstOrDefaultAsync(m => m.Id == id); if (MtdStore == null) { return(NotFound()); } var user = await _userHandler.GetUserAsync(HttpContext.User); bool isViewer = await _userHandler.IsViewer(user, MtdStore.MtdForm, MtdStore.Id); IsEditor = await _userHandler.IsEditor(user, MtdStore.MtdForm, MtdStore.Id); IsInstallerOwner = await _userHandler.IsInstallerOwner(user, MtdStore.MtdForm, MtdStore.Id); if (!isViewer) { return(Forbid()); } MtdForm = await _context.MtdForm.Include(m => m.InverseParentNavigation).FirstOrDefaultAsync(x => x.Id == MtdStore.MtdForm); MtdLogDocument edited = await _context.MtdLogDocument.Where(x => x.MtdStore == MtdStore.Id).OrderByDescending(x => x.TimeCh).FirstOrDefaultAsync(); MtdLogDocument created = await _context.MtdLogDocument.Where(x => x.MtdStore == MtdStore.Id).OrderBy(x => x.TimeCh).FirstOrDefaultAsync(); StoreOwner = await _context.MtdStoreOwner.Where(x => x.Id == MtdStore.Id).FirstOrDefaultAsync(); ChangesHistory = new ChangesHistory { CreateByTime = MtdStore.Timecr.ToString() }; if (edited != null) { ChangesHistory.LastEditedUser = edited.UserName; ChangesHistory.LastEditedTime = edited.TimeCh.ToString(); } if (created != null) { if (MtdStore.Timecr.Date == created.TimeCh.Date) { ChangesHistory.CreateByUser = created.UserName; } } List <WebAppUser> webAppUsers = await _userHandler.GetUsersInGroupsAsync(user); ViewData["UsersList"] = new SelectList(webAppUsers, "Id", "Title"); ApprovalHandler approvalHandler = new ApprovalHandler(_context, MtdStore.Id); IsApprover = await approvalHandler.IsApproverAsync(user); IsFirstStage = await approvalHandler.IsFirstStageAsync(); IList <MtdApprovalStage> stages = await approvalHandler.GetStagesDownAsync(); ViewData["Stages"] = new SelectList(stages.OrderByDescending(x => x.Stage), "Id", "Name"); List <string> partIds = await approvalHandler.GetWilBeBlockedPartsIds(); BlockParts = new List <MtdFormPart>(); if (partIds.Count > 0) { BlockParts = await _context.MtdFormPart.Where(x => partIds.Contains(x.Id)).OrderBy(x => x.Sequence).ToListAsync(); } IsFormApproval = await approvalHandler.IsApprovalFormAsync(); if (IsFormApproval) { ApprovalStatus = await approvalHandler.GetStatusAsync(user); } return(Page()); }
public async Task <OutFlow> GetStackFlowAsync(Incomer incomer, TypeQuery typeQuery) { OutFlow outFlow = new OutFlow(); if (incomer.WaitList == 1) { List <string> storesForUser = await ApprovalHandler.GetWaitStoreIds(_context, _user, incomer.IdForm); queryMtdStore = queryMtdStore.Where(x => storesForUser.Contains(x.Id)); outFlow = new OutFlow { Count = queryMtdStore.Count(), MtdStores = await queryMtdStore.OrderByDescending(x => x.Sequence).Skip((incomer.Page - 1) * incomer.PageSize).Take(incomer.PageSize).ToListAsync() }; return(outFlow); } IList <MtdFilterScript> scripts = await GetScriptsAsync(); if (scripts != null && scripts.Count > 0) { foreach (var fs in scripts) { if (fs.Apply == 1) { queryMtdStore = queryMtdStore.FromSql(fs.Script); } } } IList <Claim> claims = await _userHandler.GetClaimsAsync(_user); bool ownOnly = claims.Where(x => x.Type == incomer.IdForm && x.Value.Contains("view-own")).Any(); if (ownOnly) { IList <string> storeIds = await _context.MtdStoreOwner.Where(x => x.UserId == _user.Id).Select(x => x.Id).ToListAsync(); queryMtdStore = queryMtdStore.Where(x => storeIds.Contains(x.Id)); } bool groupView = claims.Where(x => x.Type == incomer.IdForm && x.Value.Contains("view-group")).Any(); if (groupView) { IList <WebAppUser> appUsers = await _userHandler.GetUsersInGroupsAsync(_user); List <string> userIds = appUsers.Select(x => x.Id).ToList(); IList <string> storeIds = await _context.MtdStoreOwner.Where(x => userIds.Contains(x.UserId)).Select(x => x.Id).ToListAsync(); queryMtdStore = queryMtdStore.Where(x => storeIds.Contains(x.Id)); } switch (typeQuery) { case TypeQuery.number: { outFlow = await GetDataForNumberAsync(incomer); break; } case TypeQuery.text: { outFlow = await GetDataForTextAsync(incomer); break; } case TypeQuery.field: case TypeQuery.textField: { outFlow = await GetDataForFieldAsync(incomer); break; } default: { outFlow = await GetDataForEmptyAsync(incomer); break; } } return(outFlow); }
private async Task <DataSet> CreateDataSetAsync(MtdStore store, FormType type = FormType.Details) { if (store == null) { return(null); } WebAppUser webAppUser = await _userHandler.GetUserAsync(HttpContext.User); List <MtdFormPart> mtdFormParts = new List <MtdFormPart>(); IList <MtdFormPart> parts = await GetPartsAsync(store.MtdForm); bool isReviewer = await _userHandler.IsReviewer(webAppUser, store.MtdForm); ApprovalHandler approvalHandler = new ApprovalHandler(_context, store.Id); List <string> blockedParts = new List <string>(); if (!isReviewer) { blockedParts = await approvalHandler.GetBlockedPartsIds(); } foreach (MtdFormPart formPart in parts) { if (type == FormType.Edit) { bool isEditor = await _userHandler.IsEditorPartAsync(webAppUser, formPart.Id); if (isEditor && !blockedParts.Contains(formPart.Id)) { mtdFormParts.Add(formPart); } } else { bool isViewer = await _userHandler.IsViewerPartAsync(webAppUser, formPart.Id); if (isViewer) { mtdFormParts.Add(formPart); } } } IList <MtdFormPartField> mtdFormPartFields = await GetFieldsAsync(mtdFormParts); var mtdStore = await _context.MtdStore .Include(m => m.ParentNavigation) .Include(m => m.MtdFormNavigation) .ThenInclude(m => m.MtdFormHeader) .Include(m => m.MtdFormNavigation) .ThenInclude(m => m.ParentNavigation) .FirstOrDefaultAsync(m => m.Id == store.Id); IList <long> ids = await _context.MtdStoreStack.Where(x => x.MtdStore == mtdStore.Id).Select(x => x.Id).ToListAsync(); IList <MtdStoreStack> stack = await _context.MtdStoreStack .Include(m => m.MtdStoreStackText) .Include(m => m.MtdStoreStackDecimal) .Include(m => m.MtdStoreStackFile) .Include(m => m.MtdStoreStackDate) .Include(m => m.MtdStoreStackInt) .Include(m => m.MtdStoreLink) .Where(x => ids.Contains(x.Id)) .ToListAsync(); DataSet result = new DataSet() { Store = mtdStore, Parts = mtdFormParts, Fields = mtdFormPartFields, Stack = stack, }; return(result); }
public async Task <IActionResult> OnPostSaveAsync() { IFormCollection requestForm = await Request.ReadFormAsync(); string Id = requestForm["idStore"]; MtdStore mtdStore = await _context.MtdStore.FirstOrDefaultAsync(x => x.Id == Id); if (mtdStore == null) { return(NotFound()); } WebAppUser webAppUser = await _userHandler.GetUserAsync(HttpContext.User); bool isEditor = await _userHandler.IsEditor(webAppUser, mtdStore.MtdForm, mtdStore.Id); ApprovalHandler approvalHandler = new ApprovalHandler(_context, mtdStore.Id); ApprovalStatus approvalStatus = await approvalHandler.GetStatusAsync(webAppUser); if (!isEditor || approvalStatus == ApprovalStatus.Rejected || approvalStatus == ApprovalStatus.Waiting) { return(Ok(403)); } MtdLogDocument mtdLog = new MtdLogDocument { MtdStore = mtdStore.Id, TimeCh = DateTime.Now, UserId = webAppUser.Id, UserName = webAppUser.Title }; OutData outData = await CreateDataAsync(Id, webAppUser, TypeAction.Edit, requestForm); List <MtdStoreStack> stackNew = outData.MtdStoreStacks; IList <MtdStoreStack> stackOld = await _context.MtdStoreStack .Include(m => m.MtdStoreStackText) .Include(m => m.MtdStoreStackDecimal) .Include(m => m.MtdStoreStackFile) .Include(m => m.MtdStoreStackDate) .Include(m => m.MtdStoreStackInt) .Include(m => m.MtdStoreLink) .Where(x => x.MtdStore == Id).ToListAsync(); foreach (MtdStoreStack stack in stackOld) { MtdStoreStack stackForField = stackNew.SingleOrDefault(x => x.MtdFormPartField == stack.MtdFormPartField); if (stackForField != null) { stack.MtdStoreStackText = stackForField.MtdStoreStackText; stack.MtdStoreLink = stackForField.MtdStoreLink; stack.MtdStoreStackDate = stackForField.MtdStoreStackDate; stack.MtdStoreStackDecimal = stackForField.MtdStoreStackDecimal; stack.MtdStoreStackFile = stackForField.MtdStoreStackFile; stack.MtdStoreStackInt = stackForField.MtdStoreStackInt; } } try { if (stackNew.Count > 0) { int count = await _context.MtdStoreLink.Where(x => x.MtdStore == Id).CountAsync(); if (count > 0) { string titleText = outData.MtdStoreStacks.FirstOrDefault(x => x.MtdFormPartField == outData.MtdFormPartField.Id).MtdStoreStackText.Register; IList <MtdStoreLink> linkIds = await _context.MtdStoreLink.Where(x => x.MtdStore == Id).Select(x => new MtdStoreLink { Id = x.Id, MtdStore = x.MtdStore, Register = titleText }).ToListAsync(); _context.MtdStoreLink.UpdateRange(linkIds); } _context.MtdStoreStack.UpdateRange(stackOld); List <MtdStoreStack> stackNewOnly = stackNew.Where(x => !stackOld.Select(f => f.MtdFormPartField).Contains(x.MtdFormPartField)).ToList(); if (stackNewOnly.Any()) { await _context.MtdStoreStack.AddRangeAsync(stackNewOnly); } _context.MtdLogDocument.Add(mtdLog); await _context.SaveChangesAsync(); } } catch (DbUpdateConcurrencyException) { if (!MtdStoreExists(Id)) { return(NotFound()); } else { throw; } } return(Ok()); }
private async Task <OutData> CreateDataAsync(string Id, WebAppUser user, TypeAction typeAction, IFormCollection requestForm) { var store = await _context.MtdStore .Include(m => m.MtdFormNavigation) .ThenInclude(p => p.MtdFormPart) .FirstOrDefaultAsync(m => m.Id == Id); List <string> partsIds = new List <string>(); bool isReviewer = await _userHandler.IsReviewer(user, store.MtdForm); ApprovalHandler approvalHandler = new ApprovalHandler(_context, store.Id); List <string> blockedParts = new List <string>(); if (!isReviewer) { blockedParts = await approvalHandler.GetBlockedPartsIds(); } foreach (var part in store.MtdFormNavigation.MtdFormPart) { switch (typeAction) { case TypeAction.Create: { if (await _userHandler.IsCreatorPartAsync(user, part.Id)) { partsIds.Add(part.Id); } break; } default: { if (await _userHandler.IsEditorPartAsync(user, part.Id) && !blockedParts.Contains(part.Id)) { partsIds.Add(part.Id); } break; } } } var fields = await _context.MtdFormPartField.Include(m => m.MtdFormPartNavigation) .Where(x => partsIds.Contains(x.MtdFormPartNavigation.Id)) .OrderBy(x => x.MtdFormPartNavigation.Sequence) .ThenBy(x => x.Sequence) .ToListAsync(); var titleField = fields.FirstOrDefault(x => x.MtdSysType == 1); List <MtdStoreStack> stackNew = new List <MtdStoreStack>(); foreach (MtdFormPartField field in fields) { string data = requestForm[field.Id]; MtdStoreStack mtdStoreStack = new MtdStoreStack() { MtdStore = Id, MtdFormPartField = field.Id }; switch (field.MtdSysType) { case 2: { if (data != string.Empty) { bool isOkInt = int.TryParse(data, out int result); if (isOkInt) { mtdStoreStack.MtdStoreStackInt = new MtdStoreStackInt { Register = result }; } } break; } case 3: { if (data != string.Empty) { string separ = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; bool isOkDecimal = decimal.TryParse(data.Replace(".", separ), out decimal result); if (isOkDecimal) { mtdStoreStack.MtdStoreStackDecimal = new MtdStoreStackDecimal { Register = result }; } } break; } case 5: case 6: case 10: { if (data != string.Empty) { bool isOkDate = DateTime.TryParse(data, out DateTime dateTime); if (isOkDate) { mtdStoreStack.MtdStoreStackDate = new MtdStoreStackDate { Register = dateTime }; } } break; } case 7: case 8: { var actionDelete = requestForm[$"{field.Id}-delete"]; if (actionDelete.FirstOrDefault() == null || actionDelete.FirstOrDefault() == "false") { IFormFile file = requestForm.Files.FirstOrDefault(x => x.Name == field.Id); if (file != null) { byte[] streamArray = new byte[file.Length]; await file.OpenReadStream().ReadAsync(streamArray, 0, streamArray.Length); mtdStoreStack.MtdStoreStackFile = new MtdStoreStackFile() { Register = streamArray, FileName = file.FileName, FileSize = streamArray.Length, FileType = file.ContentType }; } if (file == null) { MtdStoreStack stackOld = await _context.MtdStoreStack .Include(m => m.MtdStoreStackFile) .OrderByDescending(x => x.Id) .FirstOrDefaultAsync(x => x.MtdStore == Id & x.MtdFormPartField == field.Id); if (stackOld != null && stackOld.MtdStoreStackFile != null) { mtdStoreStack.MtdStoreStackFile = new MtdStoreStackFile() { FileName = stackOld.MtdStoreStackFile.FileName, FileSize = stackOld.MtdStoreStackFile.FileSize, Register = stackOld.MtdStoreStackFile.Register, FileType = stackOld.MtdStoreStackFile.FileType, }; } } } break; } case 11: { if (data != string.Empty) { string datalink = Request.Form[$"{field.Id}-datalink"]; mtdStoreStack.MtdStoreLink = new MtdStoreLink { MtdStore = data, Register = datalink }; } break; } case 12: { bool isOkCheck = bool.TryParse(data, out bool check); if (isOkCheck) { mtdStoreStack.MtdStoreStackInt = new MtdStoreStackInt { Register = check ? 1 : 0 }; } break; } default: { if (data != string.Empty) { mtdStoreStack.MtdStoreStackText = new MtdStoreStackText() { Register = data }; } break; } } stackNew.Add(mtdStoreStack); } OutData outParam = new OutData() { MtdFormPartField = titleField, MtdStoreStacks = stackNew, }; return(outParam); }
public ApprovalHandler RegisterNext(ApprovalHandler next) { Next = next; return(Next); }