using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ease.CoreV35; using Ease.CoreV35.Caching; using Ease.CoreV35.Model; using Ease.CoreV35.Utility; using System.Text.RegularExpressions; namespace Payroll.BO { [Serializable] public class WFManager where T : IworkflowInterface { #region class variable private OrganogramBasic _ogNode; private Employee _employee = null; private WFSetup _wfSetup = null; private WFMovementTran _MoveTran = null; private T _wfinterface; #endregion class variable #region constructor public WFManager(T ob, Employee oEmployee) { _wfinterface = ob; _employee = oEmployee; ObjectsTemplate emps = OrganogramEmployee.GetByEmp(oEmployee.ID); if (emps == null || emps.Count == 0) { throw new Exception("Employee is not posted in Organ-O-Gram."); } else _ogNode = OrganogramBasic.Get(emps[0].NodeID); _wfSetup = WFSetup.Get(_wfinterface.SetupID); } private T ConvertToT(IworkflowInterface oTran) where T : IworkflowInterface { return (T)oTran; } public WFManager(int nTranID, Employee oEmployee) { _MoveTran = WFMovementTran.Get(ID.FromInteger(nTranID)); _wfinterface = this.ConvertToT(_MoveTran); _employee = oEmployee; ObjectsTemplate oganogramNode = OrganogramEmployee.GetByEmp(_employee.ID); if (oganogramNode == null || oganogramNode.Count == 0) { throw new Exception("Employee is not yet assinged in Organ-O-Gram."); } else _ogNode = OrganogramBasic.Get(oganogramNode[0].NodeID); _wfSetup = WFSetup.Get(_MoveTran.SetupID); _MoveTran.WFSetup = _wfSetup; } #endregion constructor public bool IsInitiator(int ntranID) { OrganogramBasic oNode = WFMovementTran.Service.InitiatorNode(_MoveTran.Uniquenumber); if (oNode != null) { if (oNode.ID.Integer == _ogNode.ID.Integer) { return true; } } return false; } public bool IsInitiator() { return _wfSetup.IsInitiator(_ogNode); } public ObjectsTemplate[] Path() { ObjectsTemplate[] oPath = _wfSetup.GetFullPath(_ogNode); return oPath; } public ObjectsTemplate[] Path(WFMovementTran wfTran) { ObjectsTemplate[] oPath = _wfSetup.GetFullPath(_wfSetup.GetRule(wfTran.WFRuleID), wfTran.Tier, _ogNode); return oPath; } public void InitiateProcess(int nObjectID, string sRemarks) { try { string sTaskRemrks = ""; WFSetupRule oRule; WFMovementTran oTran = new WFMovementTran(); oTran.WFSetup = _wfSetup; oTran.FromNodeID = _ogNode.ID; oTran.FromEmployeeID = _employee.ID; oTran.Remarks = sRemarks; oTran.SetupID = _wfSetup.ID; if (oTran.Remarks == "Cancel request") oTran.Status = enumwfStatus.Cancel_Request; else oTran.Status = enumwfStatus.Received; oRule = _wfSetup.GetNodeRule(_ogNode); oTran.WFRuleID = oRule.ID; ObjectsTemplate onextItems = new ObjectsTemplate(); onextItems = Approvers(oRule, workflowConstants.WF_Initiator_Tier + 1); oTran.WFMNexts = new ObjectsTemplate(); WFMovementNext oNext = new WFMovementNext(); oNext.Status = enumwfStatus.Passed; oNext.Description = onextItems[0].Description; oNext.EmployeeID = oTran.FromEmployeeID; oNext.NodeID = oTran.FromNodeID; oNext.ReceiveStatus = EnumWFReceiveStatus.ALREADY_OPENED; oNext.Remarks = sRemarks; oTran.WFMNexts.Add(oNext); oTran.WFMNexts.AddRange(onextItems); oTran.Tier = oTran.Tier + 1; oTran.Uniquenumber = WFMovementTran.Service.GetUniqueNumber(); oTran.ObjectID = ID.FromInteger(nObjectID); oTran.Senttime = DateTime.Now; oTran.ObjectDescription = _wfinterface.ObjectDescription; // get the object description from interface oTran.SetSourceObjectStatus(); sTaskRemrks = oTran.ObjectDescription; // sTaskRemrks = "(" + _employee.EmployeeNo + ") " + _employee.Name //+ " has submitted a " + _wfSetup.WFType.Name + " Application"; _MoveTran = oTran; oTran.WFMTasks = this.MoveMentTasks(oTran.WFMNexts, oRule, workflowConstants.WF_Initiator_Tier, 0, enumwfStatus.Received, sTaskRemrks); oTran.Save(); SendMail(oTran); } catch (MailSenderException ex) { throw ex; } catch (Exception ex) { throw new ServiceException(ex.Message); } } public void Submit(int nTranID, string Remarks) { WFMovementTran oNextApprovar = null; WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); string sTaskRemrks = ""; try { _MoveTran.UpdateStatus(_ogNode, Remarks, enumwfStatus.Approve); if (_MoveTran.IsReadytoMoveNextTier(oRule) && oRule.HasNextApprovar(_ogNode, _MoveTran.Tier + 1)) { oNextApprovar = new WFMovementTran(); oNextApprovar.FromNodeID = _ogNode.ID; oNextApprovar.FromEmployeeID = _employee.ID; oNextApprovar.Remarks = _MoveTran.GetRemarks(); oNextApprovar.SetupID = _wfSetup.ID; oNextApprovar.WFRuleID = oRule.ID; oNextApprovar.Uniquenumber = _MoveTran.Uniquenumber; oNextApprovar.ObjectID = _MoveTran.ObjectID; oNextApprovar.Tier = _MoveTran.Tier + 1; oNextApprovar.WFMNexts = this.Approvers(oRule, _MoveTran.Tier + 1); // In Rule manual, if (oRule.WFRuleType == EnumWFRuleType.Manual && oNextApprovar.WFMNexts.Count == 1) { if (oNextApprovar.WFMNexts[0].EmployeeID == _employee.ID) { _MoveTran.Tier = _MoveTran.Tier + 1; Submit(_MoveTran.ID.Integer, Remarks); return; } } oNextApprovar.Status = enumwfStatus.Received; if (_MoveTran.Status == enumwfStatus.Cancel_Request) { _MoveTran.Status = enumwfStatus.Cancel_Request; } else _MoveTran.Status = enumwfStatus.Passed; oNextApprovar.ObjectDescription = oNextApprovar.GetSourceObjectDescription(); // get the object description from interface sTaskRemrks = _wfSetup.WFType.Name + " Application has already been approved by " + " " + _employee.Name + ", " + _employee.DescriptionText + ""; oNextApprovar.WFMTasks = this.MoveMentTasks(oNextApprovar.WFMNexts, oRule, _MoveTran.Tier, _MoveTran.Uniquenumber, enumwfStatus.Passed, sTaskRemrks); oNextApprovar.SetSourceObjectStatus(); oNextApprovar.Submit(_MoveTran); SendMail(oNextApprovar); } else { if (_MoveTran.Remarks == "Cancel request" || _MoveTran.Status == enumwfStatus.Cancel_Request) _MoveTran.Status = enumwfStatus.Cancel; else _MoveTran.Status = enumwfStatus.End; _MoveTran.Remarks = sTaskRemrks; _MoveTran.SetSourceObjectStatus(); foreach (WFMovementNext otran in _MoveTran.WFMNexts) otran.Status = enumwfStatus.End; sTaskRemrks = _wfSetup.WFType.Name + " Application has been approved by " + " " + _employee.Name + ", " + _employee.DescriptionText + " and completed approval process successfully."; _MoveTran.WFMTasks = this.MoveMentTasks(_MoveTran.WFMNexts, oRule, _MoveTran.Tier, _MoveTran.Uniquenumber, enumwfStatus.End, sTaskRemrks); _MoveTran.Save(); if (_MoveTran.WFMTasks != null) { SendMail(_MoveTran); } } } catch (MailSenderException ex) { throw ex; } catch (Exception Ex) { throw new ServiceException(Ex.Message); } } public void Decline(int nTranID, string Remarks) { string sTaskRemrks = ""; try { WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); _MoveTran.UpdateStatus(_ogNode, Remarks, enumwfStatus.Decline); if (_MoveTran.IsReadytoMoveNextTier(oRule)) { if (_MoveTran.Remarks == "Cancel request" || _MoveTran.Status == enumwfStatus.Cancel_Request) { _MoveTran.Status = enumwfStatus.End; sTaskRemrks = _wfSetup.WFType.Name + " Cancel request has been Declined by " + " " + _employee.Name + ", " + _employee.DescriptionText; } else { _MoveTran.Status = enumwfStatus.Decline; sTaskRemrks = _wfSetup.WFType.Name + " Application has been Declined by " + " " + _employee.Name + ", " + _employee.DescriptionText; } } _MoveTran.WFMTasks = this.MoveMentTasks(_MoveTran.WFMNexts, oRule, _MoveTran.Tier, _MoveTran.Uniquenumber, enumwfStatus.Decline, sTaskRemrks); _MoveTran.Remarks = sTaskRemrks; _MoveTran.SetSourceObjectStatus(); _MoveTran.Save(); SendMail(_MoveTran); } catch (MailSenderException ex) { throw ex; } catch (Exception Ex) { throw new ServiceException(Ex.Message); } } public void RevertSubmit(int nTranID, string Remarks) { WFMovementTran oNextApprovar = null; string sTaskRemrks = ""; try { WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); _MoveTran.UpdateStatus(_ogNode, Remarks, enumwfStatus.Revert); if (_MoveTran.IsReadytoMoveNextTier(oRule)) { oNextApprovar = new WFMovementTran(); oNextApprovar.FromNodeID = _ogNode.ID; oNextApprovar.FromEmployeeID = _employee.ID; oNextApprovar.Remarks = _MoveTran.GetRemarks(); //_employee.Name + ": " + Remarks; oNextApprovar.SetupID = _wfSetup.ID; oNextApprovar.WFRuleID = oRule.ID; oNextApprovar.Uniquenumber = _MoveTran.Uniquenumber; /*For Initiator Tier will be one*/ oNextApprovar.Tier = _MoveTran.Tier > workflowConstants.WF_Initiator_Tier ? _MoveTran.Tier - 1 : _MoveTran.Tier; oNextApprovar.ObjectID = _MoveTran.ObjectID; oNextApprovar.WFMNexts = this.RevertApprovers(); sTaskRemrks = _wfSetup.WFType.Name + " Application has been reverted to sender by " + " " + _employee.Name + ", " + _employee.DescriptionText; oNextApprovar.WFMTasks = this.MoveMentTasks(oNextApprovar.WFMNexts, oRule, _MoveTran.Tier, _MoveTran.Uniquenumber, enumwfStatus.Revert, sTaskRemrks); oNextApprovar.Status = enumwfStatus.Received; oNextApprovar.ObjectDescription = _wfinterface.ObjectDescription; // get the object description from interface _MoveTran.Status = enumwfStatus.Passed; oNextApprovar.SetSourceObjectStatus(); oNextApprovar.Submit(_MoveTran); SendMail(oNextApprovar); } else { _MoveTran.Status = enumwfStatus.Exception; _MoveTran.SetSourceObjectStatus(); _MoveTran.Save(); } } catch (MailSenderException ex) { throw ex; } catch (Exception Ex) { throw new ServiceException(Ex.Message); } } private ObjectsTemplate Approvers(WFSetupRule oWFRule, int nTier) { ObjectsTemplate oNextApps = new ObjectsTemplate(); WFSetupRule oRule = oWFRule; ObjectsTemplate oApprovarNodes = _wfSetup.Approvers(oRule, _ogNode, nTier); foreach (OrganogramBasic oItem in oApprovarNodes) { foreach (OrganogramEmployee oemp in oItem.OrganEmployees) { WFMovementNext oNextApp = new WFMovementNext(); oNextApp.Status = enumwfStatus.Received; oNextApp.NodeID = oItem.ID; oNextApp.EmployeeID = oemp.EmployeeID; oNextApp.Description = "(" + _employee.EmployeeNo + ") " + _employee.Name + ", " + _employee.DescriptionText + " has applied " + _wfSetup.WFType.Name + " Application"; oNextApps.Add(oNextApp); } } if (oNextApps.Count == 0) throw new ServiceException("Approver node/Position (" + _ogNode.PositionName + ") is Vacant."); return oNextApps; } private ObjectsTemplate RevertApprovers() { ObjectsTemplate oNextApps = new ObjectsTemplate(); WFMovementNext oNextApp = new WFMovementNext(); OrganogramBasic InitiatorNode = WFMovementTran.Service.InitiatorNode(_MoveTran.Uniquenumber); WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); OrganogramBasic oNode = _wfSetup.InitiatorToTierNode(InitiatorNode, oRule, _MoveTran.Tier - 1); oNextApp.NodeID = oNode.ID; Employee emp = oNode.GetAssignedEmployee(); oNextApp.EmployeeID = emp.ID; oNextApp.Status = enumwfStatus.Received; oNextApp.Description = "(" + _employee.EmployeeNo + ") " + _employee.Name + ", " + _employee.DescriptionText + " revert your " + _wfSetup.WFType.Name + " Application"; oNextApps.Add(oNextApp); return oNextApps; } private WFMovementTask RefreshMovementTaskObj(ID empID, ID nodeID, EnumWFNotifyType notifyType, bool status, string Remarks, enumMailSendType mailSendType) { WFMovementTask oDTask = new WFMovementTask(); oDTask.EmployeeID = empID; oDTask.NodeID = nodeID; oDTask.TasksType = notifyType; oDTask.Status = status; oDTask.Description = Remarks; oDTask.MailSendType = mailSendType; oDTask.SentTime = DateTime.Today; return oDTask; } private ObjectsTemplate MoveMentTasks(ObjectsTemplate WFnexts, WFSetupRule rule, int nTier, int uniqueNumber, enumwfStatus ntrantype, string sTaskRemarks) { ObjectsTemplate oWFTasks = new ObjectsTemplate(); try { #region find the doted line and include them into cc if (workflowConstants.WF_Initiator_Tier == nTier) { ObjectsTemplate oDLines = _ogNode.GetAthorities(EnumAuthorityType.Doted); if (oDLines != null) { foreach (OrganogramBasic oNode in oDLines) { if (oNode.EmployeeAssigned == true) { Employee emp = oNode.GetAssignedEmployee(); //System notification oWFTasks.Add(RefreshMovementTaskObj(emp.ID, oNode.ID, EnumWFNotifyType.SysNotification, false, sTaskRemarks, enumMailSendType.CC)); //Email notification oWFTasks.Add(RefreshMovementTaskObj(emp.ID, oNode.ID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.CC)); } } } // Send mail to Matrix line authority ObjectsTemplate oMLines = _ogNode.GetAthorities(EnumAuthorityType.Reporting); if (oDLines != null) { foreach (OrganogramBasic oNode in oMLines) { if (oNode.EmployeeAssigned == true) { Employee emp = oNode.GetAssignedEmployee(); //System notification WFMovementTask otst = RefreshMovementTaskObj(emp.ID, oNode.ID, EnumWFNotifyType.SysNotification, false, sTaskRemarks, enumMailSendType.CC); oWFTasks.Add(otst); otst.Description = _MoveTran.ObjectDescription; //Email notification WFMovementTask otsts = RefreshMovementTaskObj(emp.ID, oNode.ID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.CC); oWFTasks.Add(otsts); otsts.Description = _MoveTran.ObjectDescription; } } } } #endregion #region find straight line and include them into to if (nTier > workflowConstants.WF_Initiator_Tier) { OrganogramBasic oBasic = WFMovementTran.Service.InitiatorNode(uniqueNumber); if (oBasic.EmployeeAssigned == true) { foreach (OrganogramEmployee enodeemp in oBasic.OrganEmployees) { //System notification string sapprover = ""; if (_MoveTran.Status != enumwfStatus.End && _MoveTran.Status != enumwfStatus.Decline) { sapprover = " and waiting for Approval of "; foreach (WFMovementNext onext in WFnexts) { if (onext.Status == enumwfStatus.Received) { Employee oemp = Employee.Get(onext.EmployeeID); sapprover = sapprover + oemp.Name + ", " + oemp.DescriptionText; } } } WFMovementTask otst = RefreshMovementTaskObj(enodeemp.EmployeeID, oBasic.ID, EnumWFNotifyType.SysNotification, false, sTaskRemarks, enumMailSendType.To); if (oWFTasks.GetItem(otst) == null) { oWFTasks.Add(otst); otst.Description = "Your " + sTaskRemarks + sapprover + "."; //Email notification WFMovementTask otsts = RefreshMovementTaskObj(enodeemp.EmployeeID, oBasic.ID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.To); oWFTasks.Add(otsts); otsts.Description = "Your " + sTaskRemarks + sapprover + "."; } } } foreach (WFMovementNext onext in WFnexts) { if (onext.Status == enumwfStatus.Received) { WFMovementTask otst = RefreshMovementTaskObj(onext.EmployeeID, onext.NodeID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.To); if (oWFTasks.GetItem(otst) == null) { otst.Description = _MoveTran.ObjectDescription + " " + sTaskRemarks + ". Your approval is also required. "; oWFTasks.Add(otst); } } } #region if application decline notify to all approver sequence if (ntrantype == enumwfStatus.Decline) { ObjectsTemplate[] oPaths = _wfSetup.GetFullPathOnTier(rule, nTier - 1, WFMovementTran.Service.InitiatorNode(uniqueNumber)); for (int i = 0; i < oPaths.Length; i++) { foreach (OrganogramBasic oNode in oPaths[i]) { if (oNode.EmployeeAssigned == false) continue; foreach (OrganogramEmployee enodeemp in oNode.OrganEmployees) { //System notification WFMovementTask otst = RefreshMovementTaskObj(enodeemp.EmployeeID, oNode.ID, EnumWFNotifyType.SysNotification, false, sTaskRemarks, enumMailSendType.To); if (oWFTasks.GetItem(otst) == null) { oWFTasks.Add(otst); //Email notification oWFTasks.Add(RefreshMovementTaskObj(enodeemp.EmployeeID, oNode.ID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.To)); } } } } } #endregion if application decline notify to all approver sequence } else { foreach (WFMovementNext onext in WFnexts) { if (onext.EmployeeID != _employee.ID) // For Initatior don't need send mail { WFMovementTask otst = RefreshMovementTaskObj(onext.EmployeeID, onext.NodeID, EnumWFNotifyType.Email, false, sTaskRemarks, enumMailSendType.To); if (oWFTasks.GetItem(otst) == null) { otst.Description = otst.Description + " Your approval is required."; oWFTasks.Add(otst); } } } } #endregion } catch (Exception ex) { throw new ServiceException(ex.Message); } return oWFTasks; } public void SendMail(WFMovementTran oTran) { MailSender sender = null; try { sender = new MailSender(); //Send Email With Link Employee nextemployee = null; foreach (WFMovementTask next in oTran.WFMTasks) { string sbody = ""; if (next.TasksType == EnumWFNotifyType.SysNotification) continue; nextemployee = new Employee(); nextemployee = Employee.Get(next.EmployeeID); sender = new MailSender(); sender.AddTo(nextemployee.EmailAddress); sbody = next.Description + ""; sender.Body = sbody; sender.Link = Ease.CoreV35.Utility.ConfigUtility.GetAppSettings("WebAddress"); //sender.Body = sender.Body.Replace("
", Environment.NewLine); sender.Subject = _wfSetup.WFType.Name + " approval work-flow mail."; string checkSendMail = Ease.CoreV35.Utility.ConfigUtility.GetAppSettings("SendMethod"); if (checkSendMail != "") { sender.SendMail(); oTran.UpdateSysNotification(next.ID , true); } } } catch (MailSenderException ex) { throw ex; } catch (Exception ex) { throw new ServiceException(ex.Message); //throw new Exception("Your application has been sent to Approvar but system can't send e-mail. you don't need to submit again."); } } public string IntApproversNames() { string sApprovars = ""; try { ObjectsTemplate oNextApps = Approvers(_wfSetup.GetNodeRule(_ogNode), workflowConstants.WF_Initiator_Tier + 1); foreach (WFMovementNext onext in oNextApps) { OrganogramBasic obasic = OrganogramBasic.Get(onext.NodeID); if (obasic.EmployeeAssigned == false) continue; foreach (OrganogramEmployee enemp in obasic.OrganEmployees) { sApprovars = sApprovars + "(" + enemp.Employee.EmployeeNo + ") " + enemp.Employee.Name; } } } catch (Exception ex) { sApprovars = ex.Message; } return sApprovars; } public string ApproversNames(int nTranID) { string sApprovars = ""; try { WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); if (oRule.HasNextApprovar(_ogNode, _MoveTran.Tier + 1)) { ObjectsTemplate oNextApps = Approvers(oRule, _MoveTran.Tier + 1); // there is a posiblity in rule manual, approvar and next approvar are same person. // so there is no need to flow two time same person. // for example emplaoyee is Department head and HR manager and work flow defined Emloyee >> LM >> Department Head >> HR Manager // while Department head approve work flow will be completed. if (oRule.WFRuleType == EnumWFRuleType.Manual && oNextApps.Count == 1) { if (oNextApps[0].EmployeeID == _employee.ID) { if (oRule.HasNextApprovar(_ogNode, _MoveTran.Tier + 2)) { oNextApps = this.Approvers(oRule, _MoveTran.Tier + 2); } else sApprovars = "After your approval Work flow will be completed"; } } foreach (WFMovementNext onext in oNextApps) { OrganogramBasic obasic = OrganogramBasic.Get(onext.NodeID); if (obasic.EmployeeAssigned == false) continue; foreach (OrganogramEmployee enemp in obasic.OrganEmployees) { sApprovars = sApprovars + "(" + enemp.Employee.EmployeeNo + ") " + enemp.Employee.Name; } } } else { sApprovars = "After your approval Work flow will be completed"; } } catch (Exception ex) { sApprovars = ex.Message; } return sApprovars; } public string RevertNodeName(int nTranID) { string sSender = ""; try { OrganogramBasic InitiatorNode = WFMovementTran.Service.InitiatorNode(_MoveTran.Uniquenumber); WFSetupRule oRule = _wfSetup.GetRule(_MoveTran.WFRuleID); OrganogramBasic oNode = _wfSetup.InitiatorToTierNode(InitiatorNode, oRule, _MoveTran.Tier - 1); sSender = "(" + oNode.GetAssignedEmployee().EmployeeNo + ")" + oNode.GetAssignedEmployee().Name; } catch (Exception ex) { sSender = "Error has been detected during looking for revert employee, Contract to system administrator; Error:" + ex.Message; } return sSender; } public string NotifiableNodes() { string sDotedNodes = ""; try { HashSet ohset = new HashSet(); ObjectsTemplate oDLines = _ogNode.GetAthorities(EnumAuthorityType.Doted); if (workflowConstants.WF_Initiator_Tier == _MoveTran.Tier) { if (oDLines != null) { foreach (OrganogramBasic dline in oDLines) { if (dline.EmployeeAssigned == true) { Employee emp = dline.GetAssignedEmployee(); sDotedNodes = "(" + emp.EmployeeNo + ")" + emp.Name; ohset.Add(emp.ID.Integer); } } } ObjectsTemplate oMLines = _ogNode.GetAthorities(EnumAuthorityType.Reporting); if (oDLines != null) { foreach (OrganogramBasic oNode in oMLines) { if (oNode.EmployeeAssigned == true) { Employee emp = oNode.GetAssignedEmployee(); sDotedNodes = "(" + emp.EmployeeNo + ")" + emp.Name; ohset.Add(emp.ID.Integer); } } } } //if (_MoveTran != null && _MoveTran.Tier > workflowConstants.WF_Initiator_Tier) //{ // WFSetupRule rule = _wfSetup.GetRule(_MoveTran.WFRuleID); // ObjectsTemplate[] oPaths = null; // oPaths = _wfSetup.GetFullPathOnTier(rule, _MoveTran.Tier - 1, WFMovementTran.Service.InitiatorNode(_MoveTran.Uniquenumber)); // for (int i = 0; i < oPaths.Length; i++) // { // //if ((_MoveTran.Tier - 2) == i) continue; //to employee doesn't need to include in cc // foreach (OrganogramBasic og in oPaths[i]) // { // if (og.EmployeeAssigned == true && og.ID.Integer != _ogNode.ID.Integer) // { // Employee emp = og.GetAssignedEmployee(); // if(ohset.Contains(emp.ID.Integer)==false) // sDotedNodes = sDotedNodes + " (" + emp.EmployeeNo + ")" + emp.Name; // } // } // } //} #region find straight line and include them into to if (_MoveTran != null && _MoveTran.Tier > workflowConstants.WF_Initiator_Tier) { OrganogramBasic oBasic = WFMovementTran.Service.InitiatorNode(_MoveTran.Uniquenumber); if (oBasic.EmployeeAssigned == true) { Employee emp = oBasic.GetAssignedEmployee(); //System notification if (ohset.Contains(emp.ID.Integer) == false) sDotedNodes = sDotedNodes + " (" + emp.EmployeeNo + ")" + emp.Name; } } #endregion } catch (Exception ex) { sDotedNodes = "Error has been detected during looking for doted-line employee(s), Contract to system administrator; Error:" + ex.Message; } return sDotedNodes; } public static WFMovementTran GetWFMovementTran(int nTranID) { try { WFMovementTran oMTran = WFMovementTran.Service.Get(ID.FromInteger(nTranID)); return oMTran; } catch { } return null; } public static int ObjectID(int nTranID) { string sDescription = string.Empty; try { WFMovementTran oMTran = WFMovementTran.Service.Get(ID.FromInteger(nTranID)); return oMTran.ObjectID.Integer; } catch { sDescription = "Error on getting WF Type. Contact your administrator."; } return -1; } } }