You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
413 lines
22 KiB
413 lines
22 KiB
namespace CounsellorBL
|
|
{
|
|
using CounsellorBL.BLStructure;
|
|
using CounsellorBL.Common;
|
|
using CounsellorBL.ConstDefinition;
|
|
using CounsellorBL.Helper;
|
|
using Microsoft.Extensions.Caching.Memory;
|
|
using MonumentDefine;
|
|
using OT.COM.ArsenalDB;
|
|
using OT.COM.SignalerMessage;
|
|
using SoldierData.EnterprizeV4;
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Linq;
|
|
|
|
public partial class AuthorityService : DBService
|
|
{
|
|
public override string MainTable => null;
|
|
|
|
[Auth(false)]
|
|
public CResponseMessage HandShake(CRequestMessage i_crmInput)
|
|
{
|
|
CResponseMessage crmRes = new CSuccessResponseMessage(null, i_crmInput);
|
|
crmRes.param[BLWording.TOKEN] = Guid.NewGuid().ToString();
|
|
return crmRes;
|
|
}
|
|
|
|
[Auth(false)]
|
|
public CResponseMessage Login(CRequestMessage i_crmInput)
|
|
{
|
|
int nExpMinute = Convert.ToInt32(CustomizeDBMgr.SettingData[BLWording.TOKEN_EXP_MINUTE], CultureInfo.CurrentCulture);
|
|
string sMsg = null;
|
|
CResponseMessage crmRes = null;
|
|
|
|
do
|
|
{
|
|
List<Dictionary<string, object>> lDic = getQryParameterList(i_crmInput);
|
|
|
|
IMemoryCache imc = GetMemoryCache();
|
|
|
|
if (imc != null)
|
|
{
|
|
lock (imc)
|
|
{
|
|
if (imc.TryGetValue(BLWording.TOKENMAP, out ConcurrentDictionary<string, tb_sys_session> dicMap))
|
|
{
|
|
List<string> lKeys = dicMap.Keys.ToList();
|
|
DateTime dtLast = DateTime.Now.AddMinutes(-1 * nExpMinute);
|
|
|
|
foreach (string sKey in lKeys)
|
|
{
|
|
tb_sys_session s = dicMap[sKey];
|
|
if (s.update_date < dtLast)
|
|
{
|
|
dicMap.TryRemove(sKey, out _);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (lDic != null && lDic.Count == 1)
|
|
{
|
|
Dictionary<string, object> dicLoginInfo = lDic[0];
|
|
bool bIsAD = false;
|
|
if (dicLoginInfo.ContainsKey(BLWording.ENTERCODE) && dicLoginInfo.ContainsKey(BLWording.AUTOENTER))
|
|
{
|
|
string sEnterCode = dicLoginInfo[BLWording.ENTERCODE].ToString();
|
|
string sAutoCode = dicLoginInfo[BLWording.AUTOENTER].ToString();
|
|
|
|
int nLen = sEnterCode.Length;
|
|
int nIdex = 0;
|
|
if (nLen > 0 && nLen == sAutoCode.Length)
|
|
{
|
|
for (nIdex = 0; nIdex < nLen; nIdex++)
|
|
{
|
|
if (sEnterCode[nIdex] != sAutoCode[nLen - nIdex - 1])
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
bIsAD = nIdex == nLen;
|
|
}
|
|
|
|
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
|
|
|
|
QueryJsonElement qjeA = lBlocks.GetInst();
|
|
qjeA.table = tb_sys_user.TABLENAME;
|
|
qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
|
|
new WhereNode(tb_sys_user.CN_ACCOUNT, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user), dicLoginInfo[tb_sys_user.CN_ACCOUNT]),
|
|
new WhereNode(tb_sys_user.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user), BLWording.STATUS_FLAG_ON)
|
|
);
|
|
qjeA.displaycols = new List<string>() { tb_sys_user.CN_UID };
|
|
lBlocks.Add(qjeA);
|
|
|
|
QueryJsonElement qjeEmp = lBlocks.GetInst();
|
|
qjeEmp.table = tb_hr_employee.TABLENAME;
|
|
qjeEmp.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeEmp.joincols = new Dictionary<string, string>()
|
|
{ {tb_hr_employee.CN_UID, tb_sys_user.CN_UID } };
|
|
qjeEmp.jointable = qjeA;
|
|
lBlocks.Add(qjeEmp);
|
|
|
|
QueryJsonElement qjeB = lBlocks.GetInst();
|
|
qjeB.table = tb_sys_user2entercode.TABLENAME;
|
|
qjeB.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeB.joincols = new Dictionary<string, string>()
|
|
{ {tb_sys_user2entercode.CN_USER_UID, tb_sys_user.CN_UID } };
|
|
qjeB.jointable = qjeA;
|
|
|
|
sMsg = EncryptHelper.Encrypt(dicLoginInfo[BLWording.ENTERCODE].ToString(), out string sEnc);
|
|
if (sMsg != null)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (!bIsAD)
|
|
{
|
|
qjeB.wherecols = new WhereNode(tb_sys_user2entercode.CN_USER_ENTERCODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user2entercode), sEnc);
|
|
}
|
|
lBlocks.Add(qjeB);
|
|
|
|
QueryJsonElement qjeC = lBlocks.GetInst();
|
|
qjeC.table = tb_sys_user2role.TABLENAME;
|
|
qjeC.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeC.displaycols = new List<string>() { tb_sys_user2role.CN_ROLE_UID, tb_sys_user2role.CN_STATUS_FLAG };
|
|
qjeC.joincols = new Dictionary<string, string>()
|
|
{ {tb_sys_user2role.CN_USER_UID, tb_sys_user.CN_UID } };
|
|
qjeC.jointable = qjeA;
|
|
//qjeC.wherecols = new WhereNode(tb_sys_user2role.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user2role), BLWording.STATUS_FLAG_ON);
|
|
lBlocks.Add(qjeC);
|
|
|
|
|
|
// QueryJsonElement qjeD = lBlocks.GetInst();
|
|
// qjeD.table = tb_sys_role2org.TABLENAME;
|
|
// qjeD.jointype = QueryJsonElement.LEFT_JOIN;
|
|
// qjeD.joincols = new Dictionary<string, string>()
|
|
//{ {tb_sys_role2org.CN_ROLE_UID, tb_sys_user2role.CN_ROLE_UID } };
|
|
// qjeD.jointable = qjeC;
|
|
// qjeD.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
|
|
// new WhereNode(tb_sys_role2org.CN_ORG_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_role2org), dicLoginInfo[BLWording.ORGANIZATION]),
|
|
// new WhereNode(tb_sys_role2org.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_role2org), BLWording.STATUS_FLAG_ON));
|
|
// lBlocks.Add(qjeD);
|
|
|
|
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cSelect);
|
|
|
|
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
|
|
List<tb_sys_user2role> lRes = ai.RunQueryList<tb_sys_user2role>(cSelect, null);
|
|
//QueryDataSet lRes = ai.RunQueryDataSet(cSelect, null);
|
|
if (!cSelect.IsSuccess)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (!lRes.Any())
|
|
{
|
|
sMsg = BseMessageWording.NO_MATCHED_ACCOUNT;
|
|
break;
|
|
}
|
|
|
|
string sRoleName = "NoRole";
|
|
if (!string.IsNullOrEmpty(lRes[0].role_uid) && lRes[0].status_flag == BLWording.STATUS_FLAG_ON)
|
|
{
|
|
tb_sys_role rData = new tb_sys_role();
|
|
rData.SetDirty(tb_sys_role.CN_NAME);
|
|
tb_sys_role rCond = new tb_sys_role() { uid = lRes[0].role_uid };
|
|
Command cSelectRoleName = Command.SetupSelectCmd(rData, rCond);
|
|
List<tb_sys_role> lRole = ai.RunQueryList<tb_sys_role>(cSelectRoleName, null);
|
|
sRoleName = lRole[0].name;
|
|
}
|
|
|
|
List<Command> lCmds = new List<Command>();
|
|
DateTime dtNow = DateTime.Now.AddMinutes(-1 * Convert.ToInt32(CustomizeDBMgr.SettingData[BLWording.TOKEN_EXP_MINUTE], CultureInfo.CurrentCulture));
|
|
WhereNode wn = new WhereNode(tb_sys_session.CN_UPDATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_sys_session), dtNow);
|
|
|
|
Command cDelete = Command.SetupDeleteCmd(wn);
|
|
lCmds.Add(cDelete);
|
|
tb_sys_session s = new tb_sys_session();
|
|
s.create_user_uid = s.update_user_uid = lRes[0].uid;
|
|
s.create_org_uid = s.update_org_uid = dicLoginInfo[BLWording.ORGANIZATION].ToString();
|
|
s.role_name = sRoleName;
|
|
s.uid = Guid.NewGuid().ToString();
|
|
Command cInsert = Command.SetupInsertCmd(s);
|
|
|
|
lCmds.Add(cInsert);
|
|
ai.RunEditCmds(lCmds);
|
|
|
|
if (!cInsert.IsSuccess)
|
|
{
|
|
sMsg = cInsert.LastErrorCode;
|
|
break;
|
|
}
|
|
|
|
// Privilidges
|
|
List<string> lRoles = new List<string>();
|
|
foreach (tb_sys_user2role r in lRes)
|
|
{
|
|
lRoles.Add(r.role_uid);
|
|
}
|
|
|
|
lBlocks.Clear();
|
|
|
|
QueryJsonElement qjeAp = lBlocks.GetInst();
|
|
qjeAp.table = tb_sys_program2action_grant.TABLENAME;
|
|
qjeAp.displaycols = new List<string>() { tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID, tb_sys_program2action_grant.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID };
|
|
qjeAp.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
|
|
new WhereNode(tb_sys_program2action_grant.CN_GRANT_TYPE, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), BLWording.ROLE_ID),
|
|
new WhereNode(tb_sys_program2action_grant.CN_GRANT_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), lRoles.ToArray()),
|
|
new WhereNode(tb_sys_program2action_grant.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.STATUS_FLAG_ON)
|
|
);
|
|
|
|
lBlocks.Add(qjeAp);
|
|
|
|
QueryJsonElement qjeBp = lBlocks.GetInst();
|
|
qjeBp.table = tb_sys_program2action.TABLENAME;
|
|
qjeBp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program2action.CN_ACTION_NAME, new List<string>() { "action_name" } } };
|
|
qjeBp.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeBp.jointable = qjeAp;
|
|
qjeBp.joincols = new Dictionary<string, string>() {
|
|
{ tb_sys_program2action.CN_UID,tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID }};
|
|
|
|
lBlocks.Add(qjeBp);
|
|
|
|
QueryJsonElement qjeCp = lBlocks.GetInst();
|
|
qjeCp.table = tb_sys_program.TABLENAME;
|
|
qjeCp.displaycols = new List<string>() { tb_sys_program.CN_ROUT_PATH, tb_sys_program.CN_MODULE_UID, tb_sys_program.CN_SEQ, tb_sys_program.CN_ICON, tb_sys_program.CN_MENUDISPLAY };
|
|
qjeCp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program.CN_NAME, new List<string>() { "program_name" } }, { tb_sys_program.CN_UID, new List<string>() { "program_id" } } };
|
|
qjeCp.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeCp.joincols = new Dictionary<string, string>()
|
|
{ {tb_sys_program.CN_UID, tb_sys_program2action.CN_PROGRAM_UID } };
|
|
qjeCp.jointable = qjeBp;
|
|
qjeCp.wherecols = new WhereNode(tb_sys_program.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program), BLWording.STATUS_FLAG_ON);
|
|
|
|
lBlocks.Add(qjeCp);
|
|
|
|
QueryJsonElement qjeDp = lBlocks.GetInst();
|
|
qjeDp.table = tb_sys_role.TABLENAME;
|
|
qjeDp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_role.CN_NAME, new List<string>() { "role_name" } } };
|
|
qjeDp.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeDp.joincols = new Dictionary<string, string>()
|
|
{ {tb_sys_role.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID } };
|
|
qjeDp.jointable = qjeAp;
|
|
|
|
lBlocks.Add(qjeDp);
|
|
|
|
qjeAp.ordercols = new List<Tuple<QueryJsonElement, string, string>>() {
|
|
Tuple.Create<QueryJsonElement, string, string>(qjeCp, tb_sys_program.CN_SEQ, BLWording.ORDER_ASC),
|
|
Tuple.Create<QueryJsonElement, string, string>(qjeBp, tb_sys_program2action.CN_SEQUENCE, BLWording.ORDER_ASC)
|
|
};
|
|
|
|
sMsg = MakeSelectJoinByBlocks(lBlocks, out cSelect);
|
|
|
|
QueryDataSet qds = ai.RunQueryDataSet(cSelect, null);
|
|
|
|
|
|
lBlocks.Clear();
|
|
QueryJsonElement qjeUser = lBlocks.GetInst();
|
|
qjeUser.table = tb_sys_program2action_grant.TABLENAME;
|
|
qjeUser.displaycols = new List<string>() { tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID, tb_sys_program2action_grant.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID };
|
|
qjeUser.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
|
|
new WhereNode(tb_sys_program2action_grant.CN_GRANT_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.USER_ID),
|
|
new WhereNode(tb_sys_program2action_grant.CN_GRANT_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), lRes.Select(x => x.user_uid).FirstOrDefault()),
|
|
new WhereNode(tb_sys_program2action_grant.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.STATUS_FLAG_ON)
|
|
);
|
|
|
|
lBlocks.Add(qjeUser);
|
|
|
|
QueryJsonElement qjeUserA = lBlocks.GetInst();
|
|
qjeUserA.table = tb_sys_program2action.TABLENAME;
|
|
qjeUserA.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program2action.CN_ACTION_NAME, new List<string>() { "action_name" } } };
|
|
qjeUserA.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeUserA.jointable = qjeUser;
|
|
qjeUserA.joincols = new Dictionary<string, string>() {
|
|
{ tb_sys_program2action.CN_UID,tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID }};
|
|
lBlocks.Add(qjeUserA);
|
|
|
|
QueryJsonElement qjeUserP = lBlocks.GetInst();
|
|
qjeUserP.table = tb_sys_program.TABLENAME;
|
|
qjeUserP.displaycols = new List<string>() { tb_sys_program.CN_ROUT_PATH, tb_sys_program.CN_MODULE_UID, tb_sys_program.CN_SEQ, tb_sys_program.CN_ICON, tb_sys_program.CN_MENUDISPLAY };
|
|
qjeUserP.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program.CN_NAME, new List<string>() { "program_name" } }, { tb_sys_program.CN_UID, new List<string>() { "program_id" } } };
|
|
qjeUserP.jointype = QueryJsonElement.LEFT_JOIN;
|
|
qjeUserP.joincols = new Dictionary<string, string>()
|
|
{ {tb_sys_program.CN_UID, tb_sys_program2action.CN_PROGRAM_UID } };
|
|
qjeUserP.jointable = qjeUserA;
|
|
qjeUserP.wherecols = new WhereNode(tb_sys_program.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program), "1");
|
|
lBlocks.Add(qjeUserP);
|
|
|
|
qjeUser.ordercols = new List<Tuple<QueryJsonElement, string, string>>() {
|
|
Tuple.Create(qjeUserP, tb_sys_program.CN_SEQ, BLWording.ORDER_ASC),
|
|
Tuple.Create(qjeUserA, tb_sys_program2action.CN_SEQUENCE, BLWording.ORDER_ASC)
|
|
};
|
|
|
|
cSelect = null;
|
|
sMsg = MakeSelectJoinByBlocks(lBlocks, out cSelect);
|
|
QueryDataSet qdsUser = ai.RunQueryDataSet(cSelect, null);
|
|
|
|
var roleData = new QueryResponse(qds).Records;
|
|
var userData = new QueryResponse(qdsUser).Records;
|
|
var qrsPrivilidge = roleData.Union(userData).ToList();
|
|
|
|
crmRes = new CSuccessResponseMessage(null, i_crmInput);
|
|
crmRes.param[BLWording.TOKEN] = s.uid;
|
|
crmRes.param[BLWording.PRIVILEGES] = qrsPrivilidge;
|
|
crmRes.param["rolename"] = sRoleName;
|
|
}
|
|
}
|
|
while (false);
|
|
|
|
if (sMsg != null)
|
|
{
|
|
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
|
|
}
|
|
return crmRes;
|
|
}
|
|
private class VarificationModel
|
|
{
|
|
public string ip_address { get; set; }
|
|
public string create_user_uid { get; set; }
|
|
public string branch_name { get; set; }
|
|
|
|
}
|
|
public CResponseMessage VerifyIPAddress(CRequestMessage i_crmInput)
|
|
{
|
|
string sMsg = null;
|
|
CResponseMessage crmRes = null;
|
|
|
|
do
|
|
{
|
|
List<Dictionary<string, object>> lDic = getQryParameterList(i_crmInput);
|
|
var receive_branch_uid = ProjectHelper.GetLoginUser(i_crmInput).receive_branch_uid;
|
|
|
|
if (lDic != null && lDic.Count == 1)
|
|
{
|
|
if (i_crmInput == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(i_crmInput));
|
|
}
|
|
var token = i_crmInput.token;
|
|
if (!string.IsNullOrEmpty(token))
|
|
{
|
|
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
|
|
|
|
QueryJsonElement qjeSession = lBlocks.GetInst();
|
|
qjeSession.table = tb_sys_session.TABLENAME;
|
|
qjeSession.wherecols = new WhereNode(tb_sys_session.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_session), token);
|
|
qjeSession.displaycols = new List<string> { tb_sys_session.CN_CREATE_USER_UID };
|
|
// 人員資訊
|
|
QueryJsonElement qjeEmployee = lBlocks.GetInst();
|
|
qjeEmployee.table = tb_hr_employee.TABLENAME;
|
|
qjeEmployee.jointype = QueryJsonElement.JOIN;
|
|
qjeEmployee.joincols = new Dictionary<string, string>() { { tb_hr_employee.CN_UID, tb_sys_session.CN_CREATE_USER_UID } };
|
|
qjeEmployee.jointable = qjeSession;
|
|
|
|
// 所屬社團
|
|
QueryJsonElement qjeEmp2Branch = lBlocks.GetInst();
|
|
qjeEmp2Branch.table = tb_hr_employee2branch.TABLENAME;
|
|
qjeEmp2Branch.jointype = QueryJsonElement.JOIN;
|
|
qjeEmp2Branch.joincols = new Dictionary<string, string>() { { tb_hr_employee2branch.CN_UID, tb_hr_employee.CN_UID } };
|
|
qjeEmp2Branch.jointable = qjeEmployee;
|
|
|
|
|
|
// 社團資訊
|
|
QueryJsonElement qjeBranch = lBlocks.GetInst();
|
|
qjeBranch.table = tb_grp_branch.TABLENAME;
|
|
qjeBranch.jointype = QueryJsonElement.JOIN;
|
|
qjeBranch.joincols = new Dictionary<string, string>() { { tb_grp_branch.CN_UID, tb_hr_employee2branch.CN_BRANCH_UID } };
|
|
qjeBranch.wherecols = new WhereNode(tb_grp_branch.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_branch), receive_branch_uid);
|
|
qjeBranch.jointable = qjeEmp2Branch;
|
|
qjeBranch.displaycols = new List<string>() {
|
|
tb_grp_branch.CN_BRANCH_NAME,
|
|
tb_grp_branch.CN_IP_ADDRESS,
|
|
};
|
|
lBlocks.Add(qjeSession);
|
|
lBlocks.Add(qjeEmployee);
|
|
lBlocks.Add(qjeEmp2Branch);
|
|
lBlocks.Add(qjeBranch);
|
|
|
|
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
|
|
|
|
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
|
|
var qds = ai.RunQueryList<VarificationModel>(cRes);
|
|
List<string> ipList = new List<string>();
|
|
foreach (var item in qds)
|
|
{
|
|
if (!string.IsNullOrEmpty(item.ip_address))
|
|
{
|
|
ipList.AddRange(item.ip_address.Split(',').ToList());
|
|
}
|
|
}
|
|
var count = ipList.Count(x => x == i_crmInput.clientip);
|
|
Logger.Info("IP_Address = " + i_crmInput.clientip);
|
|
if (ipList.Count > 0 && count < 1 && i_crmInput.clientip != "::1" && i_crmInput.clientip != "127.0.0.1")
|
|
{
|
|
sMsg = "IP address invalid";
|
|
break;
|
|
}
|
|
}
|
|
crmRes = new CSuccessResponseMessage(null, i_crmInput);
|
|
}
|
|
}
|
|
while (false);
|
|
|
|
if (sMsg != null)
|
|
{
|
|
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
|
|
}
|
|
return crmRes;
|
|
}
|
|
}
|
|
}
|