906 lines
40 KiB
C#
906 lines
40 KiB
C#
using Ease.Core.DataAccess;
|
|
using HRM.BO;
|
|
using HRM.BO.Configuration;
|
|
using Microsoft.Extensions.Configuration;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
namespace HRM.DA
|
|
{
|
|
// do not change any code discuss shamim
|
|
public class WFManager<T> where T : IworkflowInterface
|
|
{
|
|
#region class variable
|
|
private Employee _employee = null;
|
|
private WFRule _wfSetup = null;
|
|
private WFMovementTran _MoveTran = null;
|
|
private T _wfinterface;
|
|
|
|
private object _sourceObject;
|
|
private WFType _wfType = null;
|
|
#endregion class variable
|
|
|
|
public WFManager()
|
|
{
|
|
}
|
|
public WFManager(object sourceObject)
|
|
{
|
|
this._sourceObject = sourceObject;
|
|
}
|
|
#region constructor
|
|
private T ConvertToT<T>(IworkflowInterface oTran) where T : IworkflowInterface
|
|
{
|
|
return (T)oTran;
|
|
}
|
|
#endregion constructor
|
|
|
|
public WFRule InitiatorRuleSelection(TransactionContext tc, int employeeid, WFType wftype)
|
|
{
|
|
List<WFRule> moduleRules = new WFRuleService().GetRules(tc, wftype.ID);
|
|
|
|
List<WFRule> selectedRules = new List<WFRule>();
|
|
List<WFRule.WFStep.WFStepActor> otherPositionTypeActors = new List<WFRule.WFStep.WFStepActor>();
|
|
foreach (WFRule orule in moduleRules)
|
|
{
|
|
|
|
int stepNo = orule.Steps.Select(x => x.StepNo).Min();
|
|
WFRule.WFStep step = orule.Steps.FirstOrDefault(x => x.StepNo == stepNo);
|
|
foreach (WFRule.WFStep.WFStepActor actor in step.Actors)
|
|
{
|
|
switch (actor.WFActorType)
|
|
{
|
|
case EnumWFActorType.AnyEmployee:
|
|
selectedRules.Add(orule);
|
|
break;
|
|
case EnumWFActorType.LineManager:
|
|
if (_employee.LineManagerID != null)
|
|
{
|
|
actor.ObjectID = (int)_employee.LineManagerID;
|
|
selectedRules.Add(orule);
|
|
}
|
|
break;
|
|
case EnumWFActorType.Employee:
|
|
if (actor.ObjectID == employeeid)
|
|
selectedRules.Add(orule);
|
|
break;
|
|
case EnumWFActorType.OrganogramNode:
|
|
break;
|
|
case EnumWFActorType.PositionType:
|
|
{
|
|
actor.ObjectID = 0;
|
|
List<Employee> emps = new List<Employee>();
|
|
if (emps.Count > 1)
|
|
{
|
|
for (int i = 0; i < emps.Count; i++)
|
|
{
|
|
if (emps[i].DepartmentID == _employee.DepartmentID)
|
|
{
|
|
actor.ObjectID = emps[i].ID;
|
|
break;
|
|
}
|
|
}
|
|
if (actor.ObjectID == 0)
|
|
throw new Exception("Didn't find Position type approver");
|
|
}
|
|
else if (emps.Count == 1)
|
|
actor.ObjectID = emps[0].ID;
|
|
else throw new Exception("Didn't find Position type approver");
|
|
}
|
|
break;
|
|
case EnumWFActorType.ListField:
|
|
// string objid = this.GetListObjectValue(actor.ListFieldName, 0);
|
|
// if (objid != "") actor.ObjectID = Convert.ToInt32(objid);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
WFRule sorule = null;
|
|
if (selectedRules.Count > 0)
|
|
{
|
|
int weight = selectedRules.Max(x => x.Weightage);
|
|
sorule = selectedRules.First(x => x.Weightage == weight);
|
|
|
|
}
|
|
|
|
return sorule;
|
|
}
|
|
|
|
private void Actionresult(WFRule.WFStep ostep, ref bool Iscomplete, ref int gotoStep, ref int recomendationEmpID)
|
|
{
|
|
Iscomplete = false;
|
|
gotoStep = 0;
|
|
recomendationEmpID = 0;
|
|
if (ostep.Action == EnumwfLogicAction.Complete)
|
|
Iscomplete = true;
|
|
if (ostep.Action == EnumwfLogicAction.GoToStep)
|
|
gotoStep = ostep.GoToStepNo;
|
|
if (ostep.Action == EnumwfLogicAction.Recomendation)
|
|
{
|
|
recomendationEmpID = (int)ostep.RecomendationEmpID;
|
|
}
|
|
}
|
|
public void ExecuteLogic(WFRule orule, int employeeid, int Stepindex,
|
|
ref bool Iscomplete, ref int gotoStep, ref int recomendationEmpID)
|
|
{
|
|
if (orule.Steps.Count == Stepindex)
|
|
{
|
|
Iscomplete = true;
|
|
return;
|
|
}
|
|
|
|
WFRule.WFStep ostep = orule.Steps[Stepindex];
|
|
if (ostep == null) throw new Exception((" Er:" + "Invalid Step No"));
|
|
|
|
if (ostep.Amount != 0)
|
|
{
|
|
double listAmount = 0;
|
|
switch (ostep.Operator)
|
|
{
|
|
case EnumwfLogicOperator.No_Operator:
|
|
break;
|
|
case EnumwfLogicOperator.Equal:
|
|
if (listAmount == ostep.Amount && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
case EnumwfLogicOperator.Greater:
|
|
if (listAmount > ostep.Amount && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
case EnumwfLogicOperator.Less:
|
|
if (listAmount < ostep.Amount && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
case EnumwfLogicOperator.LessOrEqual:
|
|
if (listAmount <= ostep.Amount && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
case EnumwfLogicOperator.Not_Null:
|
|
{
|
|
object val = null;
|
|
if (val != null && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
}
|
|
case EnumwfLogicOperator.Null:
|
|
{
|
|
object val = null;
|
|
if (val == null && ostep.Action == EnumwfLogicAction.Complete)
|
|
this.Actionresult(ostep, ref Iscomplete, ref gotoStep, ref recomendationEmpID);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
public List<WFRule.WFStep.WFStepActor> GetApprovers(TransactionContext tc, WFRule orule, int employeeid, int stepIndex)
|
|
{
|
|
|
|
List<WFRule.WFStep.WFStepActor> approvers = new List<WFRule.WFStep.WFStepActor>();
|
|
|
|
WFRule.WFStep ostep = orule.Steps[stepIndex];
|
|
|
|
foreach (WFRule.WFStep.WFStepActor actor in ostep.Actors)
|
|
{
|
|
switch (actor.WFActorType)
|
|
{
|
|
case EnumWFActorType.AnyEmployee:
|
|
throw new Exception((" Er:" + "Approver can't be Any-Employee"));
|
|
|
|
case EnumWFActorType.LineManager:
|
|
|
|
if (_employee.LineManagerID != null)
|
|
{
|
|
actor.ObjectID = Convert.ToInt32(_employee.LineManagerID);
|
|
approvers.Add(actor);
|
|
}
|
|
else throw new Exception(("Line manager not defined in the system, please contact to system Administrator"));
|
|
break;
|
|
case EnumWFActorType.Employee:
|
|
approvers.Add(actor);
|
|
break;
|
|
case EnumWFActorType.OrganogramNode:
|
|
break;
|
|
case EnumWFActorType.PositionType:
|
|
switch ((EnumOGPositionType)actor.ObjectID)
|
|
{
|
|
|
|
case EnumOGPositionType.CEO:
|
|
List<OrganogramBasicTemp> CEOtemp = new OrganogramEmployeeService().getTopHiararchy(tc, employeeid);
|
|
if (CEOtemp == null || CEOtemp.Count == 0) throw new Exception("CEO not found in the organogram");
|
|
|
|
OrganogramBasicTemp ceohead = CEOtemp.FirstOrDefault(x => x.positionType == EnumOGPositionType.CEO);
|
|
if (ceohead == null) throw new Exception("CEO not found for the Organogram");
|
|
|
|
if (ceohead.EmployeeID == null)
|
|
throw new Exception("CEO Node/Post is vacant");
|
|
else
|
|
{
|
|
actor.ObjectID = Convert.ToInt32(ceohead.EmployeeID);
|
|
approvers.Add(actor);
|
|
}
|
|
break;
|
|
case EnumOGPositionType.HOHR:
|
|
List<OrganogramEmployee> ogemps = new OrganogramEmployeeService().GetByPositionType(tc, EnumOGPositionType.HOHR);
|
|
if (ogemps == null || ogemps.Count == 0)
|
|
throw new Exception("'Head of HR' not found for the Organogram");
|
|
OrganogramEmployee ogemp = ogemps[0];
|
|
actor.ObjectID = Convert.ToInt32(ogemp.EmployeeID);
|
|
approvers.Add(actor);
|
|
|
|
break;
|
|
case EnumOGPositionType.DH:
|
|
|
|
List<OrganogramBasicTemp> temp = new OrganogramEmployeeService().getTopHiararchy(tc, employeeid);
|
|
if (temp == null || temp.Count == 0) throw new Exception("Department Head not found for the initiated employee");
|
|
|
|
OrganogramBasicTemp head = temp.FirstOrDefault(x => x.positionType == EnumOGPositionType.DH);
|
|
if (head == null) throw new Exception("Department Head not found for the initiated employee");
|
|
|
|
if (head.EmployeeID == null)
|
|
throw new Exception("Department Head Post/Node is Vacant");
|
|
else
|
|
{
|
|
actor.ObjectID = Convert.ToInt32(head.EmployeeID);
|
|
approvers.Add(actor);
|
|
}
|
|
break;
|
|
case EnumOGPositionType.BM:
|
|
break;
|
|
case EnumOGPositionType.Man_COM:
|
|
break;
|
|
case EnumOGPositionType.Others:
|
|
break;
|
|
case EnumOGPositionType.Trusty:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case EnumWFActorType.ListField:
|
|
var appid = new WFMovementTranService().GetListFieldApprover(tc, orule.WFTypeID, _MoveTran.ObjectID, actor.ListFieldName);
|
|
if(appid ==null)
|
|
{
|
|
throw new Exception("Failed to get approver from the source");
|
|
}
|
|
actor.ObjectID = Convert.ToInt32(appid);
|
|
approvers.Add(actor);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return approvers;
|
|
}
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="tc">connection string</param>
|
|
/// <param name="empid">initiator employee-id</param>
|
|
/// <param name="wftypeid">workflow type id</param>
|
|
/// <param name="objectID">object primary key</param>
|
|
/// <param name="sRemarks">Next approver notification, optional</param>
|
|
/// <param name="subject"> mail body</param>
|
|
// do not change following function code without discuss shamim
|
|
public void InitiateProcess(TransactionContext tc, int empid, int wftypeid, int objectID, string sRemarks, string subject)
|
|
{
|
|
// do not change following function code without discuss shamim
|
|
try
|
|
{
|
|
WFRule oRule = null;
|
|
WFType owftype = new WFTypeService().Get(tc, wftypeid);
|
|
this._employee = new EmployeeService().Get(tc, empid);
|
|
WFMovementTran oTran = new WFMovementTran();
|
|
oTran.Status = EnumwfStatus.Received;
|
|
oTran.FromEmployeeID = empid;
|
|
oTran.Tier = 1;
|
|
WFMovementNext initiator = new WFMovementNext();
|
|
initiator.EmployeeID = empid;
|
|
initiator.Status = EnumwfStatus.Initiate;
|
|
initiator.Remarks = sRemarks;
|
|
oTran.ObjectDescription = subject;
|
|
oTran.WFMNexts = new List<WFMovementNext>();
|
|
oTran.WFMNexts.Add(initiator);
|
|
oTran.WFTypeID = wftypeid;
|
|
oRule = this.InitiatorRuleSelection(tc, empid, owftype);
|
|
oTran.WFRuleID = oRule.ID;
|
|
// do not change following function code without discuss shamim
|
|
|
|
oTran.ObjectID = objectID;
|
|
_MoveTran = oTran;
|
|
|
|
oTran.WFMNexts.InsertRange(1, this.GetNextApprovers(tc, empid, oRule, sRemarks, 0));
|
|
if (oTran.WFMNexts.Count == 2) oTran.Tier = this.checkSameApproverInNext(tc, oRule, oTran.WFMNexts[1].EmployeeID, oTran.Tier);
|
|
oTran.WFMTasks = this.MoveMentTasks(oTran, 0, subject);
|
|
oTran.UniqueNumber = new WFMovementTranService().GetUniqueNumber(tc);
|
|
|
|
|
|
|
|
new WFMovementTranService().Save(tc, _MoveTran);
|
|
|
|
this._MoveTran.WFMTasks.ForEach(x =>
|
|
{
|
|
//for mail purpose
|
|
if (x.TasksType == EnumWFNotifyType.Email && x.employee == null)
|
|
x.employee = new EmployeeService().Get(tc, x.EmployeeID);
|
|
|
|
});
|
|
this.ThreadSendMail(_MoveTran);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception(ex.Message);
|
|
}
|
|
}
|
|
|
|
public WFMovementTran GetCurrentMovemenTran()
|
|
{
|
|
return _MoveTran;
|
|
}
|
|
// do not change following function code without discuss shamim
|
|
public int checkSameApproverInNext(TransactionContext tc, WFRule orule, int approverEmpID, int stepinstepIndex)
|
|
{
|
|
int nextTier = stepinstepIndex;
|
|
if (orule.Steps.Count - 1 > stepinstepIndex + 1)
|
|
{
|
|
for (int i = stepinstepIndex + 1; i < orule.Steps.Count; i++)
|
|
{
|
|
if (orule.Steps[i].Actors.Count == 1 &&
|
|
orule.Steps[i].Actors[0].WFActorType == EnumWFActorType.PositionType)
|
|
{
|
|
List<WFRule.WFStep.WFStepActor> pactor = new List<WFRule.WFStep.WFStepActor>();
|
|
pactor = this.GetApprovers(tc, orule, approverEmpID, i);
|
|
if (pactor.Count == 1 && pactor[0].ObjectID == approverEmpID)
|
|
{
|
|
|
|
stepinstepIndex = i;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return stepinstepIndex;
|
|
}
|
|
// do not change following function code without discuss shamim
|
|
private List<WFMovementNext> GetNextApprovers(TransactionContext tc, int aproverpOfEmpID, WFRule oRule, string sRemarks, int stepIndex)
|
|
{
|
|
bool isComplete = false;
|
|
int gotoStep = 0;
|
|
int recomendationid = 0;
|
|
int employeeid = aproverpOfEmpID;
|
|
List<WFMovementNext> approvers = new List<WFMovementNext>();
|
|
|
|
this.ExecuteLogic(oRule, aproverpOfEmpID, stepIndex, ref isComplete, ref gotoStep, ref recomendationid);
|
|
|
|
|
|
if (recomendationid != 0)
|
|
{
|
|
WFMovementNext Recomendation = new WFMovementNext();
|
|
Recomendation.EmployeeID = recomendationid;
|
|
Recomendation.Status = EnumwfStatus.Received;
|
|
Recomendation.Remarks = sRemarks;
|
|
approvers.Add(Recomendation);
|
|
}
|
|
else
|
|
{
|
|
int stepNo = stepIndex + 1;
|
|
//if (gotoStep != 0)
|
|
//{
|
|
// stepNo = gotoStep;
|
|
// otran.RuleStepNo = stepNo;
|
|
//}
|
|
//else otran.RuleStepNo = otran.RuleStepNo + 1;
|
|
|
|
List<WFRule.WFStep.WFStepActor> oSteps = new List<WFRule.WFStep.WFStepActor>();
|
|
oSteps = this.GetApprovers(tc, oRule, employeeid, stepNo);
|
|
|
|
|
|
|
|
foreach (WFRule.WFStep.WFStepActor item in oSteps)
|
|
{
|
|
|
|
WFMovementNext gtStep = new WFMovementNext();
|
|
gtStep.EmployeeID = (int)item.ObjectID;
|
|
gtStep.Status = EnumwfStatus.Received;
|
|
|
|
//gtStep.Viewed = true;
|
|
//gtStep.Remarks = sRemarks; //prev
|
|
gtStep.Remarks = ""; //new Added
|
|
approvers.Add(gtStep);
|
|
}
|
|
}
|
|
|
|
return approvers;
|
|
}
|
|
|
|
//private string GetListObjectValue(string listObjectFiledName, long objectID)
|
|
//{
|
|
// #region Get Source Object
|
|
// if (_sourceObject == null)
|
|
// {
|
|
// object nstatus = null;
|
|
// Type ty = null;
|
|
// ty = System.Reflection.Assembly.GetCallingAssembly().GetType("Ease.PPIC.BO" + this._wfType.SourceObjectName.Trim());
|
|
|
|
// object sourceObject = System.Activator.CreateInstance(ty);
|
|
// if (sourceObject == null) throw new Exception("unable to create object instance from object name:" + this._wfType.SourceObjectName
|
|
// + ". please check availability of the object in the Payroll.Report assembly.");
|
|
|
|
|
|
// System.Type[] pararemterTypes = new System.Type[1];
|
|
// pararemterTypes[0] = typeof(long);
|
|
|
|
// System.Reflection.MethodInfo methodInfoDel = (sourceObject.GetType()).GetMethod(this._wfType.PKGetFunctionName, pararemterTypes);
|
|
// object[] parameterValue = new object[1];
|
|
// parameterValue[0] = objectID;
|
|
// if (methodInfoDel != null)
|
|
// sourceObject = methodInfoDel.Invoke(sourceObject, parameterValue);
|
|
// else throw new Exception("function: " + this._wfType.PKGetFunctionName + "( long PKID)"
|
|
// + "is not exist in the object:" + this._wfType.PKGetFunctionName);
|
|
|
|
// // parameterValue[0] = this.SetSourceObjectStatus;
|
|
// System.Reflection.MethodInfo sourceStatusMenthod = (sourceObject.GetType()).GetMethod("GetStatusbyWf");
|
|
// if (sourceStatusMenthod != null)
|
|
// nstatus = sourceStatusMenthod.Invoke(sourceObject, parameterValue);
|
|
// else throw new Exception("function: GetStatusbyWf is not exist in the object:" + this._wfType.SourceObjectName);
|
|
|
|
// // this._wfType.SourceObjectStatus = (int)nstatus;
|
|
// }
|
|
// #endregion
|
|
// Type myType = this._sourceObject.GetType();
|
|
// // Get the PropertyInfo object by passing the property name.
|
|
// PropertyInfo myPropInfo = myType.GetProperty(listObjectFiledName);
|
|
|
|
// if (myPropInfo != null)
|
|
// return myPropInfo.GetValue(_sourceObject, null).ToString();
|
|
|
|
// return "";
|
|
//}
|
|
|
|
public void SetSourceObjectStatus()
|
|
{
|
|
//object nstatus = null;
|
|
//Type ty = null;
|
|
//ConfigurationManager omanager = new ConfigurationManager();
|
|
//ty = System.Reflection.Assembly.GetCallingAssembly().GetType("Payroll.BO." + this.WFSetup.WFType.SourceObjectName.Trim());
|
|
|
|
//object sourceObject = System.Activator.CreateInstance(ty);
|
|
//if (sourceObject == null) throw new ServiceException("unable to create object instance from object name:" + this.WFSetup.WFType.SourceObjectName
|
|
// + ". please check availability of the object in the Payroll.Report assembly.");
|
|
|
|
|
|
//System.Type[] pararemterTypes = new System.Type[1];
|
|
//pararemterTypes[0] = ID.GetType();
|
|
|
|
//System.Reflection.MethodInfo methodInfoDel = (sourceObject.GetType()).GetMethod("Get", pararemterTypes);
|
|
//object[] parameterValue = new object[1];
|
|
//parameterValue[0] = this.ObjectID;
|
|
//if (methodInfoDel != null)
|
|
// sourceObject = methodInfoDel.Invoke(sourceObject, parameterValue);
|
|
//else throw new ServiceException("function: Get(ID) is not exist in the object:" + this.WFSetup.WFType.SourceObjectName);
|
|
|
|
//parameterValue[0] = this.Status;
|
|
//System.Reflection.MethodInfo sourceStatusMenthod = (sourceObject.GetType()).GetMethod("GetStatusbyWf");
|
|
//if (sourceStatusMenthod != null)
|
|
// nstatus = sourceStatusMenthod.Invoke(sourceObject, parameterValue);
|
|
//else throw new ServiceException("function: GetStatusbyWf is not exist in the object:" + this.WFSetup.WFType.SourceObjectName);
|
|
|
|
//this.WFSetup.WFType.SourceObjectStatus = (int)nstatus;
|
|
}
|
|
|
|
// do not change following function code without discuss shamim
|
|
public WFMovementTran Approve(TransactionContext tc, int nTranID, int approveEmpID,
|
|
string Remarks, string subject)
|
|
{
|
|
WFRule owfrulesrv = new WFRule();
|
|
WFMovementTranService tranService = new WFMovementTranService();
|
|
WFMovementTran NextTran = null;
|
|
WFMovementTran LastTran = tranService.Get(tc, nTranID);
|
|
|
|
WFRule oRule = new WFRuleService().Get(tc, LastTran.WFRuleID);
|
|
|
|
WFRule.WFStep currentStep = oRule.Steps.FirstOrDefault(x => x.StepSequeceNo == LastTran.Tier);
|
|
//if (currentStep.ReqAppAll == true && LastTran.WFMNexts.Count(x => x.Status == EnumwfStatus.Approve)
|
|
// != LastTran.WFMNexts.Count)
|
|
//{
|
|
// WFMovementNext onext = _MoveTran.WFMNexts.FirstOrDefault(x => x.EmployeeID == approveEmpID);
|
|
// onext.Status = EnumwfStatus.Approve;
|
|
// new WFMovementTranService().u(tc, LastTran);
|
|
//}
|
|
bool isComplete = false;
|
|
int gotoStep = 0;
|
|
int recomendationid = 0;
|
|
this.ExecuteLogic(oRule, approveEmpID, LastTran.Tier + 1, ref isComplete, ref gotoStep, ref recomendationid);
|
|
|
|
if (isComplete == true)
|
|
{
|
|
LastTran.ObjectDescription = subject;
|
|
LastTran.Status = EnumwfStatus.End;
|
|
LastTran.WFMNexts.ForEach(c =>
|
|
{
|
|
if (c.EmployeeID == approveEmpID)
|
|
{
|
|
c.Status = EnumwfStatus.Approve;
|
|
c.StatusUpdateTime = DateTime.Now;
|
|
c.Remarks = Remarks; // new added
|
|
}
|
|
});
|
|
|
|
int employeeid = LastTran.FromEmployeeID;
|
|
if (LastTran.Tier != 1)
|
|
{
|
|
employeeid = new WFMovementTranService().InitiatorEmpID(tc, LastTran.UniqueNumber);
|
|
}
|
|
LastTran.WFMTasks = new List<WFMovementTask>();
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(employeeid, 0, EnumWFNotifyType.Email, false, subject, enumMailSendType.To));
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(employeeid, 0, EnumWFNotifyType.SysNotification, false, subject, enumMailSendType.To));
|
|
|
|
new WFMovementTranService().Save(tc, LastTran);
|
|
|
|
|
|
LastTran.WFMTasks.ForEach(x =>
|
|
{
|
|
//for mail purpose
|
|
if (x.TasksType == EnumWFNotifyType.Email && x.employee == null)
|
|
x.employee = new EmployeeService().Get(tc, x.EmployeeID);
|
|
|
|
});
|
|
this.ThreadSendMail(LastTran);
|
|
|
|
return LastTran;
|
|
}
|
|
|
|
LastTran.Status = EnumwfStatus.Approve;
|
|
LastTran.WFMNexts.ForEach(c =>
|
|
{
|
|
if (c.EmployeeID == approveEmpID)
|
|
{
|
|
c.Status = EnumwfStatus.Approve;
|
|
c.StatusUpdateTime = DateTime.Now;
|
|
c.Remarks = Remarks;// new added
|
|
}
|
|
});
|
|
this._employee = new EmployeeService().Get(tc, approveEmpID);
|
|
_MoveTran = NextTran;
|
|
|
|
NextTran = new WFMovementTran();
|
|
NextTran.Tier = LastTran.Tier + 1;
|
|
NextTran.ObjectDescription = LastTran.ObjectDescription;
|
|
NextTran.WFRuleID = LastTran.WFRuleID;
|
|
NextTran.UniqueNumber = LastTran.UniqueNumber;
|
|
NextTran.FromEmployeeID = approveEmpID;
|
|
NextTran.ObjectID = LastTran.ObjectID;
|
|
NextTran.WFTypeID = LastTran.WFTypeID;
|
|
NextTran.Status = EnumwfStatus.Received;
|
|
NextTran.WFMNexts = this.GetNextApprovers(tc, approveEmpID, oRule, Remarks, LastTran.Tier);
|
|
|
|
if (NextTran.WFMNexts.Count == 1) NextTran.Tier = this.checkSameApproverInNext(tc, oRule, (int)NextTran.WFMNexts[0].EmployeeID, NextTran.Tier);
|
|
|
|
|
|
int empid = new WFMovementTranService().InitiatorEmpID(tc, LastTran.UniqueNumber);
|
|
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(empid, 0, EnumWFNotifyType.Email, false, subject, enumMailSendType.To));
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(empid, 0, EnumWFNotifyType.SysNotification, false, subject, enumMailSendType.To));
|
|
|
|
NextTran.WFMTasks = new List<WFMovementTask>();
|
|
foreach (WFMovementNext item in NextTran.WFMNexts)
|
|
{
|
|
NextTran.WFMTasks.Add(RefreshMovementTaskObj(item.EmployeeID, item.NodeID, EnumWFNotifyType.Email, false, NextTran.ObjectDescription, enumMailSendType.To));
|
|
NextTran.WFMTasks.Add(RefreshMovementTaskObj(item.EmployeeID, item.NodeID, EnumWFNotifyType.SysNotification, false, NextTran.ObjectDescription, enumMailSendType.To));
|
|
}
|
|
|
|
new WFMovementTranService().Submit(tc, LastTran, NextTran);
|
|
|
|
NextTran.WFMTasks.ForEach(x =>
|
|
{
|
|
//for mail purpose
|
|
if (x.TasksType == EnumWFNotifyType.Email && x.employee == null)
|
|
x.employee = new EmployeeService().Get(tc, x.EmployeeID);
|
|
|
|
});
|
|
this.ThreadSendMail(NextTran);
|
|
|
|
return NextTran;
|
|
}
|
|
|
|
public void Reject(TransactionContext tc, int nTranID, int rejectEmpID, string Remarks, string subject)
|
|
{
|
|
try
|
|
{
|
|
WFMovementTranService tranService = new WFMovementTranService();
|
|
WFMovementTran LastTran = tranService.Get(tc, nTranID);
|
|
|
|
LastTran.Status = EnumwfStatus.Reject;
|
|
List<WFMovementNext> onexts = new List<WFMovementNext>();
|
|
LastTran.WFMNexts.ForEach(c =>
|
|
{
|
|
if (c.EmployeeID == rejectEmpID)
|
|
{
|
|
c.Status = EnumwfStatus.Reject;
|
|
c.Remarks = Remarks;
|
|
onexts.Add(c);
|
|
}
|
|
});
|
|
LastTran.WFMNexts = onexts;
|
|
LastTran.ObjectDescription = subject;
|
|
LastTran.WFMTasks = new List<WFMovementTask>();
|
|
|
|
int employeeid = LastTran.FromEmployeeID;
|
|
if (LastTran.Tier != 1)
|
|
employeeid = new WFMovementTranService().InitiatorEmpID(tc, LastTran.UniqueNumber);
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(employeeid, 0, EnumWFNotifyType.Email, false, subject, enumMailSendType.To));
|
|
LastTran.WFMTasks.Add(RefreshMovementTaskObj(employeeid, 0, EnumWFNotifyType.SysNotification, false, subject, enumMailSendType.To));
|
|
new WFMovementTranService().Save(tc, LastTran);
|
|
|
|
LastTran.WFMTasks.ForEach(x =>
|
|
{
|
|
//for mail purpose
|
|
if (x.TasksType == EnumWFNotifyType.Email && x.employee == null)
|
|
x.employee = new EmployeeService().Get(tc, x.EmployeeID);
|
|
|
|
});
|
|
|
|
this.ThreadSendMail(LastTran);
|
|
}
|
|
catch (Exception Ex)
|
|
{
|
|
throw new Exception(Ex.Message);
|
|
}
|
|
}
|
|
|
|
public void Revert(TransactionContext tc, int nTranID, int revertEmpID, string Remarks, string subject)
|
|
{
|
|
try
|
|
{
|
|
|
|
WFMovementTranService tranService = new WFMovementTranService();
|
|
WFMovementTran LastTran = tranService.Get(tc, nTranID);
|
|
|
|
LastTran.Status = EnumwfStatus.Revert;
|
|
LastTran.WFMNexts.ForEach(c =>
|
|
{
|
|
if (c.EmployeeID == revertEmpID)
|
|
{
|
|
c.Status = EnumwfStatus.Revert;
|
|
c.Remarks = Remarks;
|
|
}
|
|
|
|
});
|
|
|
|
WFMovementTran oNextApprovar = new WFMovementTran();
|
|
|
|
oNextApprovar.FromEmployeeID = _employee.ID;
|
|
oNextApprovar.Remarks = Remarks; //_employee.Name + ": " + Remarks;
|
|
|
|
oNextApprovar.WFTypeID = LastTran.WFTypeID;
|
|
oNextApprovar.WFRuleID = LastTran.WFRuleID;
|
|
oNextApprovar.UniqueNumber = LastTran.UniqueNumber;
|
|
/*For Initiator Tier will be one*/
|
|
oNextApprovar.Tier = LastTran.Tier > workflowConstants.WF_Initiator_Tier ? LastTran.Tier - 1 : LastTran.Tier;
|
|
oNextApprovar.ObjectID = LastTran.ObjectID;
|
|
WFMovementNext onext = new WFMovementNext();
|
|
onext.EmployeeID = LastTran.FromEmployeeID;
|
|
onext.Remarks = subject;
|
|
onext.ReceiveStatus = EnumWFReceiveStatus.NOT_YET_OPEN;
|
|
onext.Status = EnumwfStatus.Received;
|
|
|
|
oNextApprovar.WFMNexts = new List<WFMovementNext>();
|
|
oNextApprovar.WFMNexts.Add(onext);
|
|
|
|
// oNextApprovar.WFMTasks = this.MoveMentTasks(oNextApprovar.WFMNexts, oRule, _MoveTran.Tier, _MoveTran.Uniquenumber, enumwfStatus.Revert, sTaskRemrks);
|
|
oNextApprovar.Status = EnumwfStatus.Received;
|
|
oNextApprovar.ObjectDescription = subject;// _wfinterface.ObjectDescription; // get the object description from interface
|
|
oNextApprovar.WFMTasks = this.MoveMentTasks(oNextApprovar, 0, subject);
|
|
new WFMovementTranService().Submit(tc, LastTran, oNextApprovar);
|
|
this.ThreadSendMail(oNextApprovar);
|
|
//if (Notification != null)
|
|
//{
|
|
// Notification(oNextApprovar);
|
|
//}
|
|
//SendMail(oNextApprovar);
|
|
|
|
|
|
}
|
|
catch (Exception Ex)
|
|
{
|
|
throw new Exception(Ex.Message);
|
|
}
|
|
}
|
|
|
|
private WFMovementTask RefreshMovementTaskObj(int empID, int 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 List<WFMovementTask> MoveMentTasks(WFMovementTran otran, int CurrentStepNo, string subject)
|
|
{
|
|
List<WFMovementTask> oWFTasks = new List<WFMovementTask>();
|
|
foreach (WFMovementNext item in otran.WFMNexts)
|
|
{
|
|
if (otran.FromEmployeeID == item.EmployeeID) continue;
|
|
oWFTasks.Add(RefreshMovementTaskObj(item.EmployeeID, item.NodeID, EnumWFNotifyType.Email, false, subject, enumMailSendType.To));
|
|
oWFTasks[oWFTasks.Count - 1].employee = item.employee;
|
|
oWFTasks.Add(RefreshMovementTaskObj(item.EmployeeID, item.NodeID, EnumWFNotifyType.SysNotification, false, subject, enumMailSendType.To));
|
|
oWFTasks[oWFTasks.Count - 1].employee = item.employee;
|
|
}
|
|
|
|
return oWFTasks;
|
|
}
|
|
public string ApproveEmpsNames(int nTranID, int employeeid)
|
|
{
|
|
List<SearchEmployee> items = this.ApproveEmps(nTranID, employeeid);
|
|
string names = "";
|
|
names = "After your approval workflow will be completed";
|
|
if (items != null && items.Count > 0)
|
|
{
|
|
names = "";
|
|
items.ForEach(x =>
|
|
{
|
|
names = names + x.EmployeeNo + "-" + x.Name + ", ";
|
|
|
|
});
|
|
if (names.Length > 0) names = names.Substring(0, names.Length - 2);
|
|
}
|
|
return names;
|
|
}
|
|
|
|
public void ThreadSendMail(WFMovementTran oTran)
|
|
{
|
|
Thread myNewThread = new Thread(() => SendMail(oTran));
|
|
myNewThread.Start();
|
|
|
|
// new WFMovementTranService().UpdateSysNotification(next.ID, true);
|
|
|
|
}
|
|
|
|
private void IsCCApplicable(ref MailSender oMailSender, IConfiguration Configuration, int empId)
|
|
{
|
|
if (Configuration.GetSection("SalesEmpEmail").Value != null)
|
|
{
|
|
string companyCode = "SP_1";
|
|
string listOfSalesEmail = Configuration.GetSection("SalesEmpEmail").Value;
|
|
if (listOfSalesEmail != string.Empty)
|
|
{
|
|
string[] salesEmail = listOfSalesEmail.Split(','); // first one is for sales head, others are cc
|
|
bool result = new EmployeeService().IsCCApplicable(empId, companyCode, salesEmail[0]);
|
|
if (result)
|
|
{
|
|
oMailSender.AddCC(listOfSalesEmail);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SendMail(WFMovementTran oTran)
|
|
{
|
|
MailSender sender = null;
|
|
EmailSettings st = new EmailSettings();
|
|
|
|
|
|
try
|
|
{
|
|
var builder = new ConfigurationBuilder()
|
|
.SetBasePath(Directory.GetCurrentDirectory())
|
|
.AddJsonFile("appsettings.json");
|
|
|
|
IConfiguration Configuration = builder.Build();
|
|
Configuration.GetSection("EmailSettings").Bind(st);
|
|
sender = new MailSender();
|
|
|
|
|
|
//Send Email With Link
|
|
foreach (WFMovementTask next in oTran.WFMTasks)
|
|
{
|
|
Thread.Sleep(200);
|
|
string sbody = "";
|
|
if (next.employee == null)
|
|
{
|
|
// it is another process, so a new TC will need to create
|
|
next.employee = new EmployeeService().Get(next.EmployeeID);
|
|
}
|
|
if (next.employee.EmailAddress == string.Empty || next.employee.EmailAddress == null) continue;
|
|
if (next.TasksType == EnumWFNotifyType.SysNotification) continue;
|
|
|
|
sender = new MailSender();
|
|
sender.AddTo(next.employee.EmailAddress.Trim());
|
|
sbody = "Dear " + next.employee.Name + "," + "<br/><br/>" + next.Description + "";
|
|
sender.Body = sbody;
|
|
|
|
sender.Link = st.WebAddress;
|
|
sender.Subject = next.Description;
|
|
// IsCCApplicable(ref sender, Configuration, next.employee.ID); it was write for sanofi
|
|
sender.SendMail(st);
|
|
// new WFMovementTranService().UpdateSysNotification(next.ID, true);
|
|
|
|
// Mail Logger for Mail
|
|
MailLog("Mail Sent to " + sender.To + ", From: " + sender.From + ", CC: " + sender.CC + ". Subject: " + sender.Subject + ". Body: " + sender.Body);
|
|
}
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//throw new ServiceException(ex.Message);
|
|
// throw new CustomException(EnumExceptionType.Informational, "Successfully submitted but system could not send E-mail. You do not need to submit it again.");
|
|
}
|
|
|
|
}
|
|
private void MailLog(string message)
|
|
{
|
|
using (StreamWriter writer = File.AppendText("Maillog.txt"))
|
|
{
|
|
writer.WriteLine("[" + DateTime.Now.ToString("dd-MMM-yyyy hh:mm:ss tt") + "] - " + message);
|
|
writer.Flush();
|
|
writer.Close();
|
|
}
|
|
}
|
|
public List<SearchEmployee> ApproveEmps(int nTranID, int employeeid)
|
|
{
|
|
WFMovementTranService tranService = new WFMovementTranService();
|
|
WFMovementTran LastTran = tranService.Get(nTranID);
|
|
WFRule oRule = new WFRuleService().Get(LastTran.WFRuleID);
|
|
|
|
List<SearchEmployee> approvars = new List<SearchEmployee>();
|
|
try
|
|
{
|
|
bool isComplete = false;
|
|
int gotoStep = 0;
|
|
int recomendationid = 0;
|
|
this.ExecuteLogic(oRule, employeeid, LastTran.Tier + 1, ref isComplete, ref gotoStep, ref recomendationid);
|
|
this._employee = new EmployeeService().Get(employeeid);
|
|
if (isComplete == true) return null;
|
|
TransactionContext tc = TransactionContext.Begin();
|
|
List<WFMovementNext> nexts = this.GetNextApprovers(tc, employeeid, oRule, "", LastTran.Tier);
|
|
tc.End();
|
|
|
|
//WFMovementNext nx = nexts.FirstOrDefault(x => x.EmployeeID == employeeid);
|
|
//if(nx !=null) // next approver and current approver are same
|
|
//{
|
|
// this.ExecuteLogic(oRule, nx.EmployeeID, LastTran.Tier + 2, ref isComplete, ref gotoStep, ref recomendationid);
|
|
// if (isComplete == true) return null;
|
|
// else
|
|
// {
|
|
// this._employee = new EmployeeService().Get(employeeid);
|
|
// nexts = this.GetNextApprovers(nx.EmployeeID, oRule, "", LastTran.Tier + 1);
|
|
// }
|
|
//}
|
|
|
|
foreach (WFMovementNext item in nexts)
|
|
{
|
|
SearchEmployee s = new SearchEmployeeService().get(item.EmployeeID);
|
|
if (s != null)
|
|
approvars.Add(s);
|
|
}
|
|
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
throw new Exception(ex.Message);
|
|
}
|
|
|
|
return approvars;
|
|
}
|
|
|
|
}
|
|
} |