/// <summary> /// 加签 /// </summary> /// <param name="runner"></param> /// <returns></returns> public WfExecutedResult SignForwardProcess(WfAppRunner runner) { IDbConnection conn = SessionFactory.CreateConnection(); IDbTransaction trans = null; try { trans = conn.BeginTransaction(); var result = SignForwardProcess(conn, runner, trans); if (result.Status == WfExecutedStatus.Success) trans.Commit(); else trans.Rollback(); return result; } catch { trans.Rollback(); throw; } finally { if (conn.State == ConnectionState.Open) conn.Close(); } }
internal TransitionInstanceEntity CreateTransitionInstanceObject(ProcessInstanceEntity processInstance, String transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, byte conditionParseResult) { var entity = new TransitionInstanceEntity(); entity.AppName = processInstance.AppName; entity.AppInstanceID = processInstance.AppInstanceID; entity.ProcessGUID = processInstance.ProcessGUID; entity.ProcessInstanceID = processInstance.ID; entity.TransitionGUID = transitionGUID; entity.TransitionType = (byte)transitionType; entity.FlyingType = (byte)flyingType; //构造活动节点数据 entity.FromActivityGUID = fromActivityInstance.ActivityGUID; entity.FromActivityInstanceID = fromActivityInstance.ID; entity.FromActivityType = fromActivityInstance.ActivityType; entity.FromActivityName = fromActivityInstance.ActivityName; entity.ToActivityGUID = toActivityInstance.ActivityGUID; entity.ToActivityInstanceID = toActivityInstance.ID; entity.ToActivityType = toActivityInstance.ActivityType; entity.ToActivityName = toActivityInstance.ActivityName; entity.ConditionParseResult = conditionParseResult; entity.CreatedByUserID = runner.UserID; entity.CreatedByUserName = runner.UserName; entity.CreatedDateTime = System.DateTime.Now; return entity; }
/// <summary> /// 生产节点 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnMade_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; appRunner.AppName = application_name; appRunner.UserID = per_dict["limu"]; appRunner.UserName = "******"; var wfService = new WorkflowService(); var nextSteps = wfService.GetNextActivityTree(appRunner); if (nextSteps != null) { //构造下一步办理人的信息 appRunner.NextActivityPerformers = CreateNextActivityPerformers(nextSteps); var r2 = wfService.RunProcessApp(appRunner); var msg2 = string.Format("执行【生产】:{0}, {1}\r\n", r2.Status, r2.Message); WriteText(msg2); if (r2.Status == WfExecutedStatus.Success) { WriteText(string.Format("任务已经发送到下一节点:{0}\r\n\r\n", nextSteps[0].ActivityName)); } } else { WriteText("您当前没有办理任务!\r\n"); } }
public ResponseResult DiscardProcess(WfAppRunner discarder) { IWorkflowService service = new WorkflowService(); var result = service.DiscardProcess(discarder); return ResponseResult.Success(); }
public ResponseResult ReverseProcess(WfAppRunner runner) { IWorkflowService wfService = new WorkflowService(); IDbConnection conn = new SqlConnection(DBConfig.ConnectionString); conn.Open(); IDbTransaction trans = null; try { trans = conn.BeginTransaction(); var result = wfService.ReverseProcess(conn, runner, trans); trans.Commit(); if (result.Status == WfExecutedStatus.Success) return ResponseResult.Success(); else return ResponseResult.Error(result.Message); } catch (WorkflowException w) { trans.Rollback(); return ResponseResult.Error(w.Message); } finally { trans.Dispose(); if (conn.State == ConnectionState.Open) conn.Close(); } }
private void btn仓库签字_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; //第一步任务承担者,登录后要找到自己的任务 appRunner.AppName = "officeIn"; appRunner.UserID = "1"; appRunner.UserName = "******"; IWorkflowService wfService = new WorkflowService(); //外部变量条件 Dictionary<string, string> dictCondition = new Dictionary<string, string>(); dictCondition.Add("surplus", cBoxSurplus.Text); appRunner.Conditions = dictCondition; //动态获取下一跳转后的节点 NodeView nv = wfService.GetNextActivity(appRunner, dictCondition); //指定对象执行者 PerformerList list = new PerformerList(); list.Add(new Performer("3", "user3")); Dictionary<String, PerformerList> dictPerformer = new Dictionary<String, PerformerList>(); dictPerformer.Add(nv.ActivityGUID, list); appRunner.NextActivityPerformers = dictPerformer; var result = wfService.RunProcessApp(appRunner); var msg = string.Format("流程运行结果:{0}\r\n{1}\r\n", result.Status, result.Message); tBoxResult.Text += msg; }
private void btn综合部签字_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; //第一步任务承担者,登录后要找到自己的任务 appRunner.AppName = "officeIn"; appRunner.UserID = "3"; appRunner.UserName = "******"; IWorkflowService wfService = new WorkflowService(); TaskQueryEntity en = new TaskQueryEntity { UserID = "3" }; IList<TaskViewEntity> taskViewList = wfService.GetReadyTasks(en); appRunner.TaskID = taskViewList[0].TaskID; PerformerList list = new PerformerList(); list.Add(new Performer("5", "user5")); NodeView nv = wfService.GetNextActivity(appRunner); Dictionary<String, PerformerList> dictPerformer = new Dictionary<String, PerformerList>(); dictPerformer.Add(nv.ActivityGUID, list); appRunner.NextActivityPerformers = dictPerformer; var result = wfService.RunProcessApp(appRunner); var msg = string.Format("流程运行结果:{0}\r\n{1}\r\n", result.Status, result.Message); tBoxResult.Text += msg; }
internal ActivityResource(WfAppRunner runner, IDictionary<string, PerformerList> nextActivityPerformers, IDictionary<string, string> conditionKeyValuePair = null) { AppRunner = runner; NextActivityPerformers = nextActivityPerformers; ConditionKeyValuePair = conditionKeyValuePair; }
/// <summary> /// 启动流程 /// </summary> public WfExecutedResult StartProcess(WfAppRunner runner) { //启动流程 var wfService = new WorkflowService(); var result = wfService.StartProcess(runner); return result; }
/// <summary> /// 检查流程是否已经运行 /// </summary> /// <param name="runner">流程查询属性</param> /// <returns></returns> public Boolean CheckProcessInstanceRunning(WfAppRunner runner) { var isRunning = false; var wfService = new WorkflowService(); var instance = wfService.GetRunningProcessInstance(runner); if (instance != null) { isRunning = true; } return isRunning; }
/// <summary> /// 设置任务完成 /// </summary> /// <param name="taskID">任务ID</param> /// <param name="runner"></param> /// <param name="wfLinqDataContext"></param> internal void Complete(long taskID, WfAppRunner runner, IDbSession session) { TaskEntity task = Repository.GetById<TaskEntity>(taskID); task.TaskState = (byte)TaskStateEnum.Completed; task.EndedDateTime = DateTime.Now; task.EndedByUserID = runner.UserID; task.EndedByUserName = runner.UserName; Update(task, session); }
public void SetTaskRead2000() { WfAppRunner taskRunner = new WfAppRunner(); taskRunner.TaskID = 18014; taskRunner.UserID = 10; taskRunner.UserName = "******"; IWorkflowService serviceA; for (var i = 0; i < 2000; i++) { serviceA = new WorkflowService(); serviceA.SetTaskRead(taskRunner); } }
private void btn开始_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; //指定第一步的处理人 appRunner.AppName = "officeIn"; appRunner.UserID = "1"; appRunner.UserName = "******"; IWorkflowService wfService = new WorkflowService(); var result = wfService.StartProcess(appRunner); var msg = string.Format("流程运行结果:{0}\r\n{1}\r\n", result.Status, result.Message); tBoxResult.Text += msg; }
/// <summary> /// 活动实例完成 /// </summary> /// <param name="activityInstanceID"></param> /// <param name="runner"></param> /// <param name="session"></param> internal void Complete(int activityInstanceID, WfAppRunner runner, IDbSession session) { var activityInstance = GetById(session.Connection, activityInstanceID, session.Transaction); activityInstance.ActivityState = (short)ActivityStateEnum.Completed; activityInstance.LastUpdatedByUserID = runner.UserID; activityInstance.LastUpdatedByUserName = runner.UserName; activityInstance.LastUpdatedDateTime = System.DateTime.Now; activityInstance.EndedByUserID = runner.UserID; activityInstance.EndedByUserName = runner.UserName; activityInstance.EndedDateTime = System.DateTime.Now; Update(activityInstance, session); }
/// <summary> /// 打单节点 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnPrintOrder_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; appRunner.AppName = application_name; appRunner.UserID = per_dict["yiran"]; appRunner.UserName = "******"; //先启动流程 var wfService = new WorkflowService(); var r1 = wfService.StartProcess(appRunner); var msg = string.Format("生产订单流程开始:{0}, {1}\r\n", r1.Status, r1.Message); WriteText(msg); if (r1.Status == WfExecutedStatus.Success) { //打单环节加入条件,运行流程 var cond = new Dictionary<string, string>(); cond["CanUseStock"] = chkStock.Checked.ToString().ToLower(); cond["IsHavingWeight"] = chkWeight.Checked.ToString().ToLower(); appRunner.Conditions = cond; string message = string.Empty; var nextSteps = wfService.GetNextActivityTree(appRunner, cond); if (nextSteps != null) { appRunner.NextActivityPerformers = CreateNextActivityPerformers(nextSteps); var r2 = wfService.RunProcessApp(appRunner); message = r2.Message; WriteText(string.Format("执行【打单】: {0}, {1}\r\n", r2.Status, r2.Message)); if (r2.Status == WfExecutedStatus.Success) { WriteText(string.Format("任务已经发送到下一节点:{0}\r\n\r\n", nextSteps[0].ActivityName)); } } else { message = "下一步节点不匹配!"; WriteText(string.Format("{0}\r\n", message)); } } }
public ResponseResult<List<NodeView>> GetNextStepRoleUserTree(WfAppRunner runner) { var result = ResponseResult<List<NodeView>>.Default(); try { var wfservice = new WorkflowService(); var nodeViewList = wfservice.GetNextActivityRoleUserTree(runner).ToList<NodeView>(); result = ResponseResult<List<NodeView>>.Success(nodeViewList, "获取流程下一步信息成功!"); } catch (System.Exception ex) { result = ResponseResult<List<NodeView>>.Error(string.Format( " 请确认角色身份是否切换?! {0}", ex.Message)); } return result; }
/// <summary> /// 创建运行时实例 /// </summary> /// <param name="appName"></param> /// <param name="appInstanceID"></param> /// <param name="processGUID"></param> /// <param name="userID"></param> /// <param name="userName"></param> /// <param name="nextActivityPerformers"></param> /// <returns></returns> public static WfRuntimeManager CreateRuntimeInstanceAppRunning( WfAppRunner runner, ref WfExecutedResult result) { //检查传人参数是否有效 var rmins = new WfRuntimeManagerAppRunning(); rmins.WfExecutedResult = result = new WfExecutedResult(); if (string.IsNullOrEmpty(runner.AppName) || String.IsNullOrEmpty(runner.AppInstanceID) || runner.ProcessGUID == null) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.RunApp_ErrorArguments; result.Message = "方法参数错误,无法运行流程!"; return rmins; } //传递runner变量 rmins.AppRunner = runner; var aim = new ActivityInstanceManager(); TaskViewEntity taskView = null; var runningNode = aim.GetRunningNodeOfMine(runner, out taskView); //判断是否是当前登录用户的任务 if (runningNode.AssignedToUsers.Contains(runner.UserID.ToString()) == false) { result.Status = WfExecutedStatus.Exception; result.ExceptionType = WfExceptionType.RunApp_HasNoTask; result.Message = "当前没有登录用户要办理的任务,无法运行流程!"; return rmins; } var processModel = new ProcessModel(runningNode.ProcessGUID); var activityResource = new ActivityResource(runner, runner.NextActivityPerformers, runner.Conditions); var tm = new TaskManager(); rmins.TaskView = taskView; rmins.RunningActivityInstance = runningNode; rmins.ProcessModel = processModel; rmins.ActivityResource = activityResource; return rmins; }
/// <summary> /// 流程的取消操作 /// </summary> /// <returns>是否成功</returns> internal bool Cancel(WfAppRunner runner, IDbConnection conn = null) { bool isCanceled = false; if (conn == null) { conn = SessionFactory.CreateConnection(); } try { var entity = GetProcessInstanceLatest(runner.AppName, runner.AppInstanceID, runner.ProcessGUID); if (entity == null || entity.ProcessState != (short)ProcessStateEnum.Running) { throw new WorkflowException("无法取消流程,错误原因:当前没有运行中的流程实例,或者同时有多个运行中的流程实例(不合法数据)!"); } IDbSession session = SessionFactory.CreateSession(); entity.ProcessState = (short)ProcessStateEnum.Canceled; entity.RecordStatusInvalid = 1; entity.LastUpdatedByUserID = runner.UserID; entity.LastUpdatedByUserName = runner.UserName; entity.LastUpdatedDateTime = System.DateTime.Now; Update(entity, session); isCanceled = true; } catch (System.Exception e) { throw new WorkflowException(string.Format("取消流程实例失败,错误原因:{0}", e.Message)); } finally { conn.Close(); } return isCanceled; }
/// <summary> /// 跳转流程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnJump_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; appRunner.AppName = "WallwaOrder"; appRunner.UserID = "1"; appRunner.UserName = "******"; //下一步执行人 PerformerList list = new PerformerList(); Performer p = new Performer("13", "andun");//下一步人ID,Name list.Add(p); Dictionary<String, PerformerList> dict = new Dictionary<String, PerformerList>(); dict.Add("7c1aa9f9-7f0f-46bf-a219-0b80fdfbbe3d", list); //print activity:"fc8c71c5-8786-450e-af27-9f6a9de8560f"下一步节点的标识ID appRunner.NextActivityPerformers = dict; IWorkflowService wfService = new WorkflowService(); var result = wfService.JumpProcess(appRunner); var msg = string.Format("流程跳转结果:{0}\r\n", result.Status); textBox1.Text += msg; }
/// <summary> /// 运行流程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRun_Click(object sender, EventArgs e) { WfAppRunner appRunner = new WfAppRunner(); appRunner.ProcessGUID = process_guid; appRunner.AppInstanceID = application_instance_id; //第一步任务承担者,登录后要找到自己的任务 appRunner.AppName = "officeIn"; appRunner.UserID = "1"; appRunner.UserName = "******"; IWorkflowService wfService = new WorkflowService(); TaskQueryEntity en = new TaskQueryEntity { UserID = "1" }; IList<TaskViewEntity> taskViewList = wfService.GetReadyTasks(en); if (taskViewList != null) { dataGridView1.DataSource = taskViewList; } ////下一步执行人 //PerformerList list = new PerformerList(); //Performer p = new Performer("3", "user3"); //下一步人ID,Name 注意有角色区分 //list.Add(p); //Dictionary<string, string> dictCondition = new Dictionary<string, string>(); //dictCondition.Add("IsHavingWeight", "true"); //dictCondition.Add("CanUseStock", "false"); //appRunner.Conditions = dictCondition; //NodeView nv = wfService.GetNextActivity(appRunner);//, dictCondition //Dictionary<String, PerformerList> dictPerformer = new Dictionary<String, PerformerList>(); //dictPerformer.Add(nv.ActivityGUID, list); //appRunner.NextActivityPerformers = dictPerformer; var result = wfService.RunProcessApp(appRunner); var msg = string.Format("流程运行结果:{0}\r\n", result.Status); textBox1.Text += msg; }
/// <summary> /// 工作流运行 /// </summary> /// <param name="session"></param> /// <param name="runner"></param> /// <returns></returns> public WfExecutedResult RunProcess(IDbSession session, WfAppRunner runner, IDictionary<string, string> conditions = null) { var result = new WfExecutedResult(); var wfService = new WorkflowService(); var nodeViewList = wfService.GetNextActivityTree(runner, conditions).ToList<NodeView>(); foreach (var node in nodeViewList) { var performerList = wfService.GetPerformerList(node); //根据节点角色定义,读取执行者列表 Dictionary<string, PerformerList> dict = new Dictionary<string, PerformerList>(); dict.Add(node.ActivityGUID, performerList); runner.NextActivityPerformers = dict; if (node.IsSkipTo == true) { result = wfService.JumpProcess(session.Connection, runner, session.Transaction); } else { result = wfService.RunProcessApp(session.Connection, runner, session.Transaction); } } return result; }
public ResponseResult StartProcess(WfAppRunner starter) { IWorkflowService wfService = new WorkflowService(); IDbConnection conn = SessionFactory.CreateConnection(); IDbTransaction trans = null; try { trans = conn.BeginTransaction(); WfExecutedResult result = wfService.StartProcess(conn, starter, trans); if (result.Status == WfExecutedStatus.Success) { trans.Commit(); int newProcessInstanceID = result.ProcessInstanceIDStarted; IList<NodeView> nextSteps = wfService.GetNextActivityTree(starter); return ResponseResult.Success(); } else { trans.Rollback(); return ResponseResult.Error(result.Message); } } catch (WorkflowException w) { trans.Rollback(); return ResponseResult.Error(w.Message); } finally { trans.Dispose(); if (conn.State == ConnectionState.Open) conn.Close(); } }
public ResponseResult SendBackProcess(WfAppRunner runner) { IWorkflowService wfService = new WorkflowService(); IDbConnection conn = SessionFactory.CreateConnection(); IDbTransaction trans = null; try { trans = conn.BeginTransaction(); var result = wfService.SendBackProcess(conn, runner, trans); if (result.Status == WfExecutedStatus.Success) { trans.Commit(); return ResponseResult.Success(); } else { trans.Rollback(); return ResponseResult.Error(result.Message); } } catch (WorkflowException w) { trans.Rollback(); return ResponseResult.Error(w.Message); } finally { trans.Dispose(); if (conn.State == ConnectionState.Open) conn.Close(); } }
public void StartupRunEnd() { IDbConnection conn = new SqlConnection(DBConfig.ConnectionString); conn.Open(); ////StarterA: ////{"UserID":"10","UserName":"******","AppName":"SamplePrice","AppInstanceID":"100","ProcessGUID":"072af8c3-482a-4b1c-890b-685ce2fcc75d"} var initiator = new WfAppRunner(); initiator.AppName = "SamplePrice"; initiator.AppInstanceID = 100; initiator.ProcessGUID = Guid.Parse("072af8c3-482a-4b1c-890b-685ce2fcc75d"); initiator.UserID = 10; initiator.UserName = "******"; IWorkflowService service = new WorkflowService(); //流程开始->业务员提交 IDbTransaction trans = conn.BeginTransaction(); try { service.StartProcess(conn, initiator, trans); trans.Commit(); } catch { trans.Rollback(); throw; } finally { trans.Dispose(); } //业务员提交->板房签字 var banFangNodeGuid = "fc8c71c5-8786-450e-af27-9f6a9de8560f"; PerformerList pList = new PerformerList(); pList.Add(new Performer(20, "Zhang")); initiator.NextActivityPerformers = new Dictionary<Guid, PerformerList>(); initiator.NextActivityPerformers.Add(Guid.Parse(banFangNodeGuid), pList); trans = conn.BeginTransaction(); try { service.RunProcessApp(conn, initiator, trans); trans.Commit(); } catch { trans.Rollback(); throw; } finally { trans.Dispose(); } //板房签字->业务员签字 //登录用户身份 initiator.UserID = 20; initiator.UserName = "******"; var salesGuid = "39c71004-d822-4c15-9ff2-94ca1068d745"; pList.Clear(); pList.Add(new Performer(10, "Long")); initiator.NextActivityPerformers.Clear(); initiator.NextActivityPerformers.Add(Guid.Parse(salesGuid), pList); trans = conn.BeginTransaction(); try { service.RunProcessApp(conn, initiator, trans); trans.Commit(); } catch { trans.Rollback(); throw; } finally { trans.Dispose(); } //业务员签字->结束 //登录用户身份 initiator.UserID = 10; initiator.UserName = "******"; var endGuid = "b70e717a-08da-419f-b2eb-7a3d71f054de"; pList.Clear(); pList.Add(new Performer(10, "Long")); initiator.NextActivityPerformers.Clear(); initiator.NextActivityPerformers.Add(Guid.Parse(endGuid), pList); trans = conn.BeginTransaction(); try { service.RunProcessApp(conn, initiator, trans); trans.Commit(); } catch { trans.Rollback(); throw; } finally { trans.Dispose(); } if (conn.State == ConnectionState.Open) conn.Close(); }
public ResponseResult GetTaskPerformers(WfAppRunner runner) { IWorkflowService service = new WorkflowService(); var performers = service.GetTaskPerformers(runner); return ResponseResult.Success(performers.Count.ToString()); }
public ResponseResult ReadTask(WfAppRunner runner) { IWorkflowService wfService = new WorkflowService(); bool isRead = wfService.SetTaskRead(runner); return ResponseResult.Success(); }
public ResponseResult<IList<NodeView>> GetNextStepsContainer(WfAppRunner runner) { IWorkflowService wfService = new WorkflowService(); var nodeList = wfService.GetNextActivityTree(runner, null); return ResponseResult<IList<NodeView>>.Success(nodeList); }
public ResponseResult<List<NodeView>> GetFirstStepRoleUserTree(WfAppRunner runner) { var result = ResponseResult<List<NodeView>>.Default(); try { var wfservice = new WorkflowService(); var nodeViewList = wfservice.GetFirstActivityRoleUserTree(runner, runner.Conditions).ToList<NodeView>(); result = ResponseResult<List<NodeView>>.Success(nodeViewList, "获取流程第一个办理节点信息成功!"); } catch (System.Exception ex) { result = ResponseResult<List<NodeView>>.Error(string.Format( " 读取第一个办理节点发生异常: {0}", ex.Message)); } return result; }
/// <summary> /// 创建节点对象 /// </summary> /// <param name="processInstance">流程实例</param> protected ActivityInstanceEntity CreateActivityInstanceObject(ActivityEntity activity, ProcessInstanceEntity processInstance, WfAppRunner runner) { ActivityInstanceManager aim = new ActivityInstanceManager(); this.GatewayActivityInstance = aim.CreateActivityInstanceObject(processInstance.AppName, processInstance.AppInstanceID, processInstance.ID, activity, runner); return this.GatewayActivityInstance; }
/// <summary> /// 插入连线实例的方法 /// </summary> /// <param name="processInstance"></param> /// <param name="fromToTransition"></param> /// <param name="fromActivityInstance"></param> /// <param name="toActivityInstance"></param> /// <param name="conditionParseResult"></param> /// <param name="wfLinqDataContext"></param> /// <returns></returns> internal virtual void InsertTransitionInstance(ProcessInstanceEntity processInstance, string transitionGUID, ActivityInstanceEntity fromActivityInstance, ActivityInstanceEntity toActivityInstance, TransitionTypeEnum transitionType, TransitionFlyingTypeEnum flyingType, WfAppRunner runner, IDbSession session) { var tim = new TransitionInstanceManager(); var transitionInstanceObject = tim.CreateTransitionInstanceObject(processInstance, transitionGUID, fromActivityInstance, toActivityInstance, transitionType, flyingType, runner, (byte)ConditionParseResultEnum.Passed); tim.Insert(session.Connection, transitionInstanceObject, session.Transaction); }