public async Task <bool> AddUpdateWorkflowAsync(cor_workflow model)
        {
            if (model.WorkflowId > 0)
            {
                var item = await _dataContext.cor_workflow.FindAsync(model.WorkflowId);

                _dataContext.Entry(item).CurrentValues.SetValues(model);
            }
            else
            {
                await _dataContext.cor_workflow.AddAsync(model);
            }
            return(await _dataContext.SaveChangesAsync() > 0);
        }
Esempio n. 2
0
        public async Task <WorkflowRespObj> Handle(AddUpdateWorkflowCommand request, CancellationToken cancellationToken)
        {
            try
            {
                if (request.WorkflowId > 0)
                {
                    _repo.DeleteWorkflowAsync(request.WorkflowId);
                }

                List <cor_workflowaccess>        wkfAccesses        = new List <cor_workflowaccess>();
                List <cor_workflowdetailsaccess> wkfDetailsAccesses = new List <cor_workflowdetailsaccess>();
                List <cor_workflowdetails>       wkfDetails         = new List <cor_workflowdetails>();
                cor_workflow workflow = new cor_workflow();

                var currentUserId = _httpContextAccessor.HttpContext.User?.FindFirst(x => x.Type == "userId").Value;
                var user          = await _userManger.FindByIdAsync(currentUserId);

                #region Check if workflow with selected access Ids exist for this company

                //if (await _repo.CheckIfOperationAndAccessExistAsync(request.OperationId, request.WorkflowAccessIds))
                //    return new WorkflowRespObj
                //    {
                //        Status = new APIResponseStatus
                //        {
                //            IsSuccessful = false,
                //            Message = new APIResponseMessage { FriendlyMessage = "Workflow with same operation and access level is already added" }
                //        }
                //    };

                #endregion
                using (var _trans = await _dataContext.Database.BeginTransactionAsync())
                {
                    try
                    {
                        #region Check if office access selected matches the companystructure from repository

                        if (request.Details != null)
                        {
                            foreach (var workflowDetail in request.Details)
                            {
                                if (workflowDetail.AccessOfficeIds.Length > 0)
                                {
                                    var result = (from compStruct in _dataContext.cor_companystructure
                                                  join compStructDef in _dataContext.cor_companystructuredefinition on compStruct.StructureTypeId equals compStructDef.StructureDefinitionId
                                                  where workflowDetail.AccessOfficeIds.Contains(compStruct.CompanyStructureId) || workflowDetail.AccessOfficeIds.Contains((int)compStruct.ParentCompanyID)
                                                  select compStruct.CompanyStructureId).ToArray();

                                    string OfficeAccessIds = string.Join(',', result);

                                    var singleDetail = new cor_workflowdetails
                                    {
                                        WorkflowId      = request.WorkflowId,//to be looked into
                                        WorkflowGroupId = workflowDetail.WorkflowGroupId,
                                        WorkflowLevelId = workflowDetail.WorkflowLevelId,
                                        AccessId        = workflowDetail.AccessId,
                                        Position        = workflowDetail.Position,
                                        OfficeAccessIds = OfficeAccessIds,
                                        Active          = false,
                                        Deleted         = false,
                                        CreatedBy       = user.UserName,
                                        CreatedOn       = DateTime.Now,
                                        UpdatedBy       = user.UserName,
                                        UpdatedOn       = DateTime.Now,
                                        OperationId     = request.OperationId
                                    };
                                    wkfDetails.Add(singleDetail);
                                }
                            }
                        }
                        else
                        {
                            return new WorkflowRespObj
                                   {
                                       Status = new APIResponseStatus {
                                           IsSuccessful = false, Message = new APIResponseMessage {
                                               FriendlyMessage = "No Workflow details added for this settup"
                                           }
                                       }
                                   }
                        };

                        #endregion

                        #region At this point, we check for the workflow access
                        if (request.WorkflowAccessIds.Length > 0)
                        {
                            var CselectedCompanyStructureIds = (from compStruct in _dataContext.cor_companystructure
                                                                join compStructdef in _dataContext.cor_companystructuredefinition on compStruct.StructureTypeId equals compStructdef.StructureDefinitionId
                                                                where request.WorkflowAccessIds.Contains(compStruct.CompanyStructureId) || request.WorkflowAccessIds.Contains((int)compStruct.ParentCompanyID)
                                                                select compStruct.CompanyStructureId).ToArray();

                            if (CselectedCompanyStructureIds.Length > 0)
                            {
                                foreach (var officeAccessId in CselectedCompanyStructureIds)
                                {
                                    var access = new cor_workflowaccess
                                    {
                                        OfficeAccessId = officeAccessId,
                                        OperationId    = request.OperationId,
                                        Active         = true,
                                        Deleted        = false,
                                        CreatedBy      = user.UserName,
                                        CreatedOn      = DateTime.Now,
                                        UpdatedBy      = user.UserName,
                                        UpdatedOn      = DateTime.Now,
                                    };
                                    wkfAccesses.Add(access);
                                }
                            }
                        }
                        else
                        {
                            return new WorkflowRespObj
                                   {
                                       Status = new APIResponseStatus {
                                           IsSuccessful = false, Message = new APIResponseMessage {
                                               FriendlyMessage = "No Workflow Accesss added for this workflow settup"
                                           }
                                       }
                                   }
                        };
                        #endregion

                        #region At this point, there is a check if exist on workflow (ADD||UPDATE)

                        bool output = false;
                        if (request.WorkflowId > 0)
                        {
                            workflow = _dataContext.cor_workflow.Find(request.WorkflowId);

                            if (workflow != null)
                            {
                                var targetDetails  = _dataContext.cor_workflowdetails.Where(x => x.WorkflowId == workflow.WorkflowId).ToList();
                                var targetAccesses = _dataContext.cor_workflowaccess.Where(x => x.WorkflowId == workflow.WorkflowId).ToList();

                                if (targetDetails.Any())
                                {
                                    foreach (var item in targetDetails)
                                    {
                                        _dataContext.cor_workflowdetails.Remove(item);
                                    }
                                }
                                if (targetAccesses.Any())
                                {
                                    foreach (var item in targetAccesses)
                                    {
                                        _dataContext.cor_workflowaccess.Remove(item);
                                    }
                                }
                                workflow.WorkflowName        = request.WorkflowName;
                                workflow.WorkflowAccessId    = request.WorkflowAccessId;
                                workflow.OperationId         = request.OperationId;
                                workflow.ApprovalStatusId    = workflow.ApprovalStatusId; //(int)ApprovalStatus.Approved; (question)="why us it initialize with approved"
                                workflow.cor_workflowaccess  = wkfAccesses;
                                workflow.cor_workflowdetails = wkfDetails;
                                workflow.Active    = true;
                                workflow.Deleted   = false;
                                workflow.UpdatedBy = user.UserName;
                                workflow.UpdatedOn = DateTime.Now;
                                _dataContext.Entry(workflow).CurrentValues.SetValues(workflow);
                            }
                        }
                        else
                        {
                            workflow = new cor_workflow
                            {
                                WorkflowName     = request.WorkflowName,
                                WorkflowAccessId = request.WorkflowAccessId,
                                OperationId      = request.OperationId,
                                ApprovalStatusId = (int)ApprovalStatus.Approved,
                                Active           = true,
                                Deleted          = false,
                                CreatedBy        = workflow.UpdatedBy = user.UserName,
                                CreatedOn        = DateTime.Now,
                                UpdatedBy        = workflow.UpdatedBy = user.UserName,
                                UpdatedOn        = DateTime.Now,
                            };
                            _dataContext.cor_workflow.Add(workflow);

                            if (await _dataContext.SaveChangesAsync() > 0)
                            {
                                foreach (var item in wkfAccesses)
                                {
                                    item.WorkflowId = workflow.WorkflowId;
                                    await _dataContext.cor_workflowaccess.AddAsync(item);
                                }
                                foreach (var item in wkfDetails)
                                {
                                    item.WorkflowId = workflow.WorkflowId;
                                    await _dataContext.cor_workflowdetails.AddAsync(item);
                                }
                                await _dataContext.SaveChangesAsync();
                            }
                        }
                        #endregion

                        await _repo.AddWorkFlowDetailsAccessAsync();

                        await _trans.CommitAsync();

                        return(new WorkflowRespObj
                        {
                            Status = new APIResponseStatus
                            {
                                IsSuccessful = true,
                                Message = new APIResponseMessage
                                {
                                    FriendlyMessage = "Successful"
                                }
                            }
                        });
                    }
                    catch (Exception ex)
                    {
                        await _trans.RollbackAsync();

                        throw new Exception(ex.Message);
                    }
                    finally { await _trans.DisposeAsync(); }
                }
            }
            catch (Exception ex)
            {
                #region Log error to file
                var errorCode = ErrorID.Generate(4);
                _logger.Error($"ErrorID : AddUpdateWorkflowCommandHandler{errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}");
                return(new WorkflowRespObj
                {
                    Status = new APIResponseStatus
                    {
                        IsSuccessful = false,
                        Message = new APIResponseMessage
                        {
                            FriendlyMessage = "Error occured!! Unable to process item",
                            MessageId = errorCode,
                            TechnicalMessage = $"ErrorID : AddUpdateWorkflowCommandHandler{errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}"
                        }
                    }
                });

                #endregion
            }
        }