CEL_Payroll/Payroll.BO/Workflow/WFManager.cs

799 lines
34 KiB
C#
Raw Normal View History

2024-09-17 14:30:13 +06:00
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<T> 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<OrganogramEmployee> 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<T>(IworkflowInterface oTran) where T : IworkflowInterface
{
return (T)oTran;
}
public WFManager(int nTranID, Employee oEmployee)
{
_MoveTran = WFMovementTran.Get(ID.FromInteger(nTranID));
_wfinterface = this.ConvertToT<T>(_MoveTran);
_employee = oEmployee;
ObjectsTemplate<OrganogramEmployee> 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<OrganogramBasic>[] Path()
{
ObjectsTemplate<OrganogramBasic>[] oPath = _wfSetup.GetFullPath(_ogNode);
return oPath;
}
public ObjectsTemplate<OrganogramBasic>[] Path(WFMovementTran wfTran)
{
ObjectsTemplate<OrganogramBasic>[] 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<WFMovementNext> onextItems = new ObjectsTemplate<WFMovementNext>();
onextItems = Approvers(oRule, workflowConstants.WF_Initiator_Tier + 1);
oTran.WFMNexts = new ObjectsTemplate<WFMovementNext>();
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<WFMovementNext> Approvers(WFSetupRule oWFRule, int nTier)
{
ObjectsTemplate<WFMovementNext> oNextApps = new ObjectsTemplate<WFMovementNext>();
WFSetupRule oRule = oWFRule;
ObjectsTemplate<OrganogramBasic> 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<WFMovementNext> RevertApprovers()
{
ObjectsTemplate<WFMovementNext> oNextApps = new ObjectsTemplate<WFMovementNext>();
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<WFMovementTask> MoveMentTasks(ObjectsTemplate<WFMovementNext> WFnexts, WFSetupRule rule, int nTier, int uniqueNumber, enumwfStatus ntrantype, string sTaskRemarks)
{
ObjectsTemplate<WFMovementTask> oWFTasks = new ObjectsTemplate<WFMovementTask>();
try
{
#region find the doted line and include them into cc
if (workflowConstants.WF_Initiator_Tier == nTier)
{
ObjectsTemplate<OrganogramBasic> 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<OrganogramBasic> 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<OrganogramBasic>[] 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("<br>", 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<WFMovementNext> 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<WFMovementNext> 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<int> ohset = new HashSet<int>();
ObjectsTemplate<OrganogramBasic> 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<OrganogramBasic> 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<OrganogramBasic>[] 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;
}
}
}