public void ExportBillDemand(ApiCommandArgument arg) { AuthenticationService.Authenticate(arg.SecurityToken); if (!AuthenticationService.IsAuthenticated()) { return; } if (!AuthorizationService.IsAllowedToExecuteCommand(arg.InstanceId, WorkflowCommandType.Export)) { return; } FireCommandWithWaiting(arg, delegate(ApiCommandArgument arg1) { using (var sync = GetWorkflowSync(arg1)) { WorkflowInitService.RaiseExport(arg1.InstanceId); sync.WaitHandle.WaitOne(60000); } }); var state = WorkflowStateService.GetCurrentState(arg.InstanceId); if (state == WorkflowState.BillDemandInAccountingWithExport) { var errorMessage = WorkflowParcelService.GetAndRemoveMessage(arg.InstanceId); throw new FaultException <BaseFault>(new BaseFault((int)ErrorCodes.BillDemandUploadError), new FaultReason(string.IsNullOrEmpty(errorMessage) ? "Не удалось выгрузить расходный документ. Попробуйте провести данную операцию еще раз. Если сообщение будет повторятся, обратитесь к Администратору." : errorMessage)); } }
private void TryExportBillDemand(MultipleExportBillDemandState multipleExportBillDemandState) { if (!multipleExportBillDemandState.BillDemandBusinessService.CheckPaymentPlanFilled(multipleExportBillDemandState.InstanceId)) { AddPaymentPlanNotSelectedResult(multipleExportBillDemandState); } else { try { RaiseExportBillDemand(multipleExportBillDemandState); if (WorkflowStateService.GetCurrentState(multipleExportBillDemandState.InstanceId) == WorkflowState.BillDemandInAccountingWithExport) { AddErrorResult(multipleExportBillDemandState); } else { AddOkResult(multipleExportBillDemandState); } } catch (Exception ex) { AddErrorResult(multipleExportBillDemandState); } } }
//TODO Вынести имперсонацию отсюда public List <WorkflowCommandType> IsAllowedToExecuteCommand(Guid instanceUid, List <WorkflowCommandType> commandsToCheck) { var allowedOperations = new List <WorkflowCommandType>(commandsToCheck.Count); WorkflowState currentState; try { currentState = WorkflowStateService.GetCurrentState(instanceUid); } catch (ArgumentException) { return(allowedOperations); } WorkflowType workflowType = currentState == null ? WorkflowStateService.TryGetExpectedWorkflowType(instanceUid) : currentState.Type; if (workflowType == null) { return(allowedOperations); } IAuthorizationValidator validator; try { var validatorFactory = new AuthorizationValidatorFactory(workflowType, this); validator = validatorFactory.CreateValidator(); } catch (ArgumentException) { return(allowedOperations); } var identities = GetAllIdentities(); if (AuthorizeAccessAndImpersonateIfNecessary(identities, validator, currentState, instanceUid)) { allowedOperations.AddRange(commandsToCheck.Where(commandToCheck => validator.IsCommandSupportsInState(currentState, commandToCheck, instanceUid))); } //Добавление дополнительных команд специфичных для вф и не привязанных к паре пользователь-состояние allowedOperations = validator.AddAdditionalCommand(AuthenticationService.GetCurrentIdentity(), identities, currentState, instanceUid, allowedOperations); return(allowedOperations); }