)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » VoipPstnUser (Ia.Ftn.Cl.Models.Data.Huawei)

Public general use code classes and xml files that we've compiled and used over the years:

Huawei's EMS VOIP PSTN User support class of Fixed Telecommunications Network (FTN) data model.

    1: using Microsoft.EntityFrameworkCore;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Data;
    5: using System.Linq;
    6: using System.Text;
    7:  
    8: namespace Ia.Ftn.Cl.Models.Data.Huawei
    9: {
   10:     ////////////////////////////////////////////////////////////////////////////
   11:  
   12:     /// <summary publish="true">
   13:     /// Huawei's EMS VOIP PSTN User support class of Fixed Telecommunications Network (FTN) data model.
   14:     /// </summary>
   15:     /// 
   16:     /// <remarks> 
   17:     /// Copyright © 2017-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   18:     /// </remarks> 
   19:     public class VoipPstnUser
   20:     {
   21:         /// <summary/>
   22:         public VoipPstnUser() { }
   23:  
   24:         ////////////////////////////////////////////////////////////////////////////
   25:  
   26:         /// <summary>
   27:         ///
   28:         /// </summary>
   29:         public static bool Update(Ia.Ftn.Cl.Models.Business.Huawei.Ems.Response response, out Ia.Cl.Models.Result result)
   30:         {
   31:             bool isUpdated;
   32:             int did, queryFn, querySn, queryPn, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount, fn, sn, pn;
   33:             string id, queryCommand, queryDev, dn, nddOntIdOrMsanDevId;
   34:             DataColumnCollection columns;
   35:             DataRow columnDataRow;
   36:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
   37:             Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser voipPstnUser, newVoipPstnUser;
   38:             Ia.Ftn.Cl.Models.Huawei.EmsOnt emsOnt;
   39:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type emsDevType;
   40:             List<string> itemIdList;
   41:             List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> voipPstnUserList;
   42:  
   43:             isUpdated = false;
   44:             readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
   45:  
   46:             result = new Ia.Cl.Models.Result(); // remove initially then add to test all return paths
   47:  
   48:             queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
   49:  
   50:             //queryCommand = "LST-VOIPPSTNUSER::DEV=ARD_MSAN_Cabinet 1_Frame 0,FN=0,SN=2,PN=0:{ctag}::;";
   51:             //queryCommand = "LST-VOIPPSTNUSER::DEV=SAB_MSAN_Cabinet 4_Frame 0,FN=0,SN=3,PN=58:{ctag}::;";
   52:  
   53:             // LST-VOIPPSTNUSER::DEV=MDU-JBA-943-002,FN=0,SN=3,PN=10:{ctag}::;
   54:             // LST-VOIPPSTNUSER::DEV=ARD_MSAN_Cabinet 1_Frame 0,FN=0,SN=2,PN=0:{ctag}::;
   55:             queryDev = Ia.Cl.Models.Default.Match(queryCommand, @"DEV=(.+?),");
   56:             queryFn = int.Parse(Ia.Cl.Models.Default.Match(queryCommand, @"FN=(\d+)"));
   57:             querySn = int.Parse(Ia.Cl.Models.Default.Match(queryCommand, @"SN=(\d+)"));
   58:             queryPn = int.Parse(Ia.Cl.Models.Default.Match(queryCommand, @"PN=(\d+)"));
   59:  
   60:             using (var db = new Ia.Ftn.Cl.Db())
   61:             {
   62:                 if (response.CompletionCode == "COMPLD")
   63:                 {
   64:                     emsDevType = Ia.Ftn.Cl.Models.Data.Huawei.Dev.ReadTypeByDev(queryDev);
   65:  
   66:                     if (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu || emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Msan)
   67:                     {
   68:                         if (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu)
   69:                         {
   70:                             nddOnt = Ia.Ftn.Cl.Models.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(queryDev);
   71:  
   72:                             if (nddOnt != null)
   73:                             {
   74:                                 emsOnt = (from eo in db.EmsOnts where eo.Id == nddOnt.Id select eo).SingleOrDefault();
   75:  
   76:                                 if (emsOnt != null)
   77:                                 {
   78:                                     // this should always give a single value or none
   79:                                     voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
   80:                                                         where evpu.EmsOnt != null && evpu.EmsOnt.Id == emsOnt.Id && evpu.SN == querySn && evpu.PN == queryPn
   81:                                                         select evpu).ToList();
   82:  
   83:                                     nddOntIdOrMsanDevId = nddOnt.Id;
   84:                                 }
   85:                                 else
   86:                                 {
   87:                                     voipPstnUserList = null;
   88:                                     nddOntIdOrMsanDevId = string.Empty;
   89:  
   90:                                     result.AddWarning("EmsOnt is null for ont.Access.Name: " + nddOnt.Access.Name);
   91:                                 }
   92:                             }
   93:                             else
   94:                             {
   95:                                 voipPstnUserList = null;
   96:                                 nddOntIdOrMsanDevId = string.Empty;
   97:                             }
   98:                         }
   99:                         else //if (emsDevType == Ia.Ftn.Cl.Model.Business.Huawei.Dev.Type.Msan)
  100:                         {
  101:                             var msanDev = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
  102:                                            where m.Dev == queryDev
  103:                                            select m).SingleOrDefault();
  104:  
  105:                             nddOntIdOrMsanDevId = (msanDev != null) ? msanDev.Id : string.Empty;
  106:  
  107:                             voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
  108:                                                 where evpu.EmsOnt == null && evpu.Id.StartsWith(nddOntIdOrMsanDevId) && evpu.SN == querySn && evpu.PN == queryPn
  109:                                                 select evpu).ToList();
  110:                         }
  111:  
  112:                         if (voipPstnUserList != null)
  113:                         {
  114:                             existingItemCount = voipPstnUserList.Count;
  115:  
  116:                             if (response.QueryDataTable != null)
  117:                             {
  118:                                 if (response.QueryDataTable.Rows.Count >= 1)
  119:                                 {
  120:                                     itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
  121:  
  122:                                     columns = response.QueryDataTable.Columns;
  123:                                     readItemCount = response.QueryDataTable.Rows.Count;
  124:  
  125:                                     columnDataRow = response.QueryDataTable.Rows[0];
  126:  
  127:                                     foreach (DataRow dataRow in response.QueryDataTable.Rows)
  128:                                     {
  129:                                         did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
  130:                                         fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
  131:                                         sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
  132:                                         pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
  133:  
  134:                                         dn = columns.Contains("DN") ? dataRow[columns.IndexOf("DN")].ToString() : string.Empty;
  135:  
  136:                                         if (dn != "--") // "--" means empty
  137:                                         {
  138:                                             if (pn == queryPn && sn == querySn)
  139:                                             {
  140:                                                 // I'll check that the records are for a real 11 digit number, otherwise we will not send it to the database
  141:                                                 // for MDUs numbers will look like 96524805054
  142:                                                 // for MSAN numbers will look like +96524805054
  143:                                                 //if (
  144:                                                 //    Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn) && emsDevType == Ia.Ftn.Cl.Model.Business.Huawei.Dev.Type.Mdu
  145:                                                 //    ||
  146:                                                 //    Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn) && emsDevType == Ia.Ftn.Cl.Model.Business.Huawei.Dev.Type.Msan
  147:                                                 //    )
  148:                                                 //{
  149:                                                 id = Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.VoipPstnUserId(nddOntIdOrMsanDevId, sn, pn);
  150:  
  151:                                                 voipPstnUser = (from eo in voipPstnUserList where eo.Id == id select eo).SingleOrDefault();
  152:  
  153:                                                 newVoipPstnUser = new Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser()
  154:                                                 {
  155:                                                     Id = id,
  156:                                                     DID = did,
  157:                                                     FN = fn,
  158:                                                     SN = sn,
  159:                                                     PN = pn,
  160:                                                     DN = dn.ToString(),
  161:                                                     MGID = columns.Contains("MGID") ? int.Parse(dataRow[columns.IndexOf("MGID")].ToString()) : 0,
  162:                                                     MGNAME = columns.Contains("MGNAME") ? dataRow[columns.IndexOf("MGNAME")].ToString() : string.Empty,
  163:                                                     TID = columns.Contains("TID") ? Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("TID", dataRow[columns.IndexOf("TID")].ToString()) : 0,
  164:                                                     LayeredConf = columns.Contains("LayeredConf") ? dataRow[columns.IndexOf("LayeredConf")].ToString() : string.Empty,
  165:                                                     HighLevelWidth = columns.Contains("HighLevelWidth") ? int.Parse(dataRow[columns.IndexOf("HighLevelWidth")].ToString()) : 0,
  166:                                                     LowerLevelWidth = columns.Contains("LowerLevelWidth") ? int.Parse(dataRow[columns.IndexOf("LowerLevelWidth")].ToString()) : 0,
  167:                                                     Voltage = columns.Contains("Voltage") ? dataRow[columns.IndexOf("Voltage")].ToString() : string.Empty,
  168:                                                     KCType = columns.Contains("KCType") ? dataRow[columns.IndexOf("KCType")].ToString() : string.Empty,
  169:                                                     VoiceGain = columns.Contains("VoiceGain") ? dataRow[columns.IndexOf("VoiceGain")].ToString() : string.Empty,
  170:                                                     LimitPulseDial = columns.Contains("LimitPulseDial") ? dataRow[columns.IndexOf("LimitPulseDial")].ToString() : string.Empty,
  171:                                                     RevPolarity = columns.Contains("RevPolarity") ? dataRow[columns.IndexOf("RevPolarity")].ToString() : string.Empty,
  172:                                                     RevPoleLevel = columns.Contains("RevPoleLevel") ? int.Parse(dataRow[columns.IndexOf("RevPoleLevel")].ToString()) : 0,
  173:                                                     RevPolePulse = columns.Contains("RevPolePulse") ? dataRow[columns.IndexOf("RevPolePulse")].ToString() : string.Empty,
  174:                                                     PSTAT = columns.Contains("PSTAT") ? dataRow[columns.IndexOf("PSTAT")].ToString() : string.Empty,
  175:                                                     ConfigStatus = columns.Contains("ConfigStatus") ? dataRow[columns.IndexOf("ConfigStatus")].ToString() : string.Empty,
  176:                                                     ServiceStatus = columns.Contains("ServiceStatus") ? dataRow[columns.IndexOf("ServiceStatus")].ToString() : string.Empty,
  177:                                                     ServiceType = columns.Contains("ServiceType") ? dataRow[columns.IndexOf("ServiceType")].ToString() : string.Empty,
  178:                                                     ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
  179:                                                     UserType = columns.Contains("UserType") ? dataRow[columns.IndexOf("UserType")].ToString() : string.Empty,
  180:                                                     Impedance = columns.Contains("Impedance") ? dataRow[columns.IndexOf("Impedance")].ToString() : string.Empty,
  181:                                                     Current = columns.Contains("Current") ? dataRow[columns.IndexOf("Current")].ToString() : string.Empty,
  182:                                                     DCTime = columns.Contains("DCTime") ? int.Parse(dataRow[columns.IndexOf("DCTime")].ToString()) : 0,
  183:                                                     PITime = columns.Contains("PITime") ? Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("PITime", dataRow[columns.IndexOf("PITime")].ToString()) : 0,
  184:                                                     FSKDelayInterval = columns.Contains("FSKDelayInterval") ? int.Parse(dataRow[columns.IndexOf("FSKDelayInterval")].ToString()) : 0,
  185:                                                     ActualVoiceGain = columns.Contains("ActualVoiceGain") ? dataRow[columns.IndexOf("ActualVoiceGain")].ToString() : string.Empty,
  186:                                                     CidTransWhen = columns.Contains("CidTransWhen") ? dataRow[columns.IndexOf("CidTransWhen")].ToString() : string.Empty,
  187:                                                     CidFormat = columns.Contains("CidFormat") ? dataRow[columns.IndexOf("CidFormat")].ToString() : string.Empty,
  188:                                                     OverloadPRI = columns.Contains("OverloadPRI") ? dataRow[columns.IndexOf("OverloadPRI")].ToString() : string.Empty,
  189:                                                     ImpedanceProfile = columns.Contains("ImpedanceProfile") ? dataRow[columns.IndexOf("ImpedanceProfile")].ToString() : string.Empty,
  190:                                                     SendVoiceGain = columns.Contains("SendVoiceGain") ? dataRow[columns.IndexOf("SendVoiceGain")].ToString() : string.Empty,
  191:                                                     RecvVoiceGain = columns.Contains("RecvVoiceGain") ? dataRow[columns.IndexOf("RecvVoiceGain")].ToString() : string.Empty,
  192:                                                     RevPolarityMode = columns.Contains("RevPolarityMode") ? dataRow[columns.IndexOf("RevPolarityMode")].ToString() : string.Empty,
  193:                                                     PortRunState = columns.Contains("PortRunState") ? dataRow[columns.IndexOf("PortRunState")].ToString() : string.Empty,
  194:                                                     PortTestState = columns.Contains("PortTestState") ? dataRow[columns.IndexOf("PortTestState")].ToString() : string.Empty,
  195:                                                     PortLineState = columns.Contains("PortLineState") ? dataRow[columns.IndexOf("PortLineState")].ToString() : string.Empty,
  196:                                                     PortLoopState = columns.Contains("PortLoopState") ? dataRow[columns.IndexOf("PortLoopState")].ToString() : string.Empty,
  197:                                                     ServiceRunState = columns.Contains("ServiceRunState") ? dataRow[columns.IndexOf("ServiceRunState")].ToString() : string.Empty,
  198:                                                     ServiceAdminState = columns.Contains("ServiceAdminState") ? dataRow[columns.IndexOf("ServiceAdminState")].ToString() : string.Empty,
  199:                                                     ActualSendVoiceGain = columns.Contains("ActualSendVoiceGain") ? dataRow[columns.IndexOf("ActualSendVoiceGain")].ToString() : string.Empty,
  200:                                                     ActualRecvVo = columns.Contains("ActualRecvVo") ? dataRow[columns.IndexOf("ActualRecvVo")].ToString() : string.Empty,
  201:                                                     AGCEnable = columns.Contains("AGCEnable") ? dataRow[columns.IndexOf("AGCEnable")].ToString() : string.Empty,
  202:                                                     AGCEnableLevel = columns.Contains("AGCEnableLevel") ? int.Parse(dataRow[columns.IndexOf("AGCEnableLevel")].ToString()) : 0,
  203:                                                     SNSEnable = columns.Contains("SNSEnable") ? dataRow[columns.IndexOf("SNSEnable")].ToString() : string.Empty,
  204:                                                     SNSEnableLevel = columns.Contains("SNSEnableLevel") ? int.Parse(dataRow[columns.IndexOf("SNSEnableLevel")].ToString()) : 0,
  205:                                                     NlpMode = columns.Contains("NlpMode") ? dataRow[columns.IndexOf("NlpMode")].ToString() : string.Empty,
  206:                                                     LineLockEnable = columns.Contains("LineLockEnable") ? dataRow[columns.IndexOf("LineLockEnable")].ToString() : string.Empty,
  207:                                                     DspInputGain = columns.Contains("DspInputGain") ? dataRow[columns.IndexOf("DspInputGain")].ToString() : string.Empty,
  208:                                                     DspOutputGain = columns.Contains("DspOutputGain") ? dataRow[columns.IndexOf("DspOutputGain")].ToString() : string.Empty,
  209:                                                     ClipReversePole = columns.Contains("ClipReversePole") ? dataRow[columns.IndexOf("ClipReversePole")].ToString() : string.Empty,
  210:                                                     DEFAULTCLI = columns.Contains("DEFAULTCLI") ? dataRow[columns.IndexOf("DEFAULTCLI")].ToString() : string.Empty,
  211:                                                     USERGROUPID = columns.Contains("USERGROUPID") ? int.Parse(dataRow[columns.IndexOf("USERGROUPID")].ToString()) : 0,
  212:                                                     ADJUSTFACTOR = columns.Contains("ADJUSTFACTOR") ? int.Parse(dataRow[columns.IndexOf("ADJUSTFACTOR")].ToString()) : 0,
  213:                                                     DSPPROFILE = columns.Contains("DSPPROFILE") ? dataRow[columns.IndexOf("DSPPROFILE")].ToString() : string.Empty,
  214:  
  215:                                                     EmsOnt = (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu) ? (from eo in db.EmsOnts where eo.Id == nddOntIdOrMsanDevId select eo).SingleOrDefault() : null
  216:                                                 };
  217:  
  218:                                                 if (voipPstnUser == null)
  219:                                                 {
  220:                                                     newVoipPstnUser.Created = newVoipPstnUser.Updated = DateTime.UtcNow.AddHours(3);
  221:  
  222:                                                     db.EmsVoipPstnUsers.Add(newVoipPstnUser);
  223:  
  224:                                                     insertedItemCount++;
  225:                                                 }
  226:                                                 else // update
  227:                                                 {
  228:                                                     // below: copy values from newVoipPstnUser to voipPstnUser
  229:  
  230:                                                     if (voipPstnUser.Update(newVoipPstnUser))
  231:                                                     {
  232:                                                         db.EmsVoipPstnUsers.Attach(voipPstnUser);
  233:                                                         db.Entry(voipPstnUser).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
  234:  
  235:                                                         updatedItemCount++;
  236:                                                     }
  237:                                                 }
  238:  
  239:                                                 itemIdList.Add(id); // keep at the end
  240:                                                 //}
  241:                                                 //else
  242:                                                 //{
  243:                                                 //    result.AddError("dn:" + dn + ", emsDevType:" + emsDevType.ToString() + ". dn and emsDevtype values are inconsistent.");
  244:                                                 //}
  245:                                             }
  246:                                             else
  247:                                             {
  248:                                                 result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): pn != queryPn and/or sn != querySn.");
  249:                                             }
  250:                                         }
  251:                                         else
  252:                                         {
  253:                                             result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): dn is -- empty.");
  254:                                         }
  255:                                     }
  256:  
  257:                                     // below: this function will remove values that were not present in the reading
  258:                                     if (voipPstnUserList.Count > 0)
  259:                                     {
  260:                                         foreach (Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser v in voipPstnUserList)
  261:                                         {
  262:                                             if (!itemIdList.Contains(v.Id))
  263:                                             {
  264:                                                 voipPstnUser = (from evpu in db.EmsVoipPstnUsers
  265:                                                                 where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
  266:                                                                 select evpu).SingleOrDefault();
  267:  
  268:                                                 db.EmsVoipPstnUsers.Remove(voipPstnUser);
  269:  
  270:                                                 deletedItemCount++;
  271:                                             }
  272:                                         }
  273:                                     }
  274:                                 }
  275:                                 else //if (response.QueryDataTable.Rows.Count == 0)
  276:                                 {
  277:                                     if (voipPstnUserList.Count > 0)
  278:                                     {
  279:                                         foreach (Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser v in voipPstnUserList)
  280:                                         {
  281:                                             voipPstnUser = (from evpu in db.EmsVoipPstnUsers
  282:                                                             where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
  283:                                                             select evpu).SingleOrDefault();
  284:  
  285:                                             db.EmsVoipPstnUsers.Remove(voipPstnUser);
  286:  
  287:                                             deletedItemCount++;
  288:                                         }
  289:                                     }
  290:                                 }
  291:  
  292:                                 db.SaveChanges();
  293:  
  294:                                 if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
  295:                                 else isUpdated = false;
  296:  
  297:                                 result.AddSuccess("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
  298:                             }
  299:                             else
  300:                             {
  301:                                 result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  302:                             }
  303:                         }
  304:                         else
  305:                         {
  306:                             result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): voipPstnUserList is null.");
  307:                         }
  308:                     }
  309:                     else
  310:                     {
  311:                         result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): for DEV: " + queryDev + " emsDevType is neither MDU nor MSAN.");
  312:                     }
  313:                 }
  314:                 else
  315:                 {
  316:                     result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  317:                 }
  318:             }
  319:  
  320:             return isUpdated;
  321:         }
  322:  
  323:         ////////////////////////////////////////////////////////////////////////////
  324:  
  325:         /// <summary>
  326:         ///
  327:         /// </summary>
  328:         public static bool UpdateByDn(Ia.Ftn.Cl.Models.Business.Huawei.Ems.Response response, out string updatedService, out Ia.Cl.Models.Result result)
  329:         {
  330:             bool isUpdated;
  331:             int did, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount, fn, sn, pn;
  332:             string id, queryCommand, queryDn, dn, dev, nddOntIdOrMsanDevId;
  333:             DataColumnCollection columns;
  334:             DataRow columnDataRow;
  335:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
  336:             Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser voipPstnUser, newVoipPstnUser;
  337:             Ia.Ftn.Cl.Models.Huawei.EmsOnt emsOnt;
  338:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type emsDevType;
  339:             List<string> itemIdList;
  340:             List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> voipPstnUserList;
  341:  
  342:             isUpdated = false;
  343:             updatedService = string.Empty;
  344:             readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
  345:  
  346:             result = new Ia.Cl.Models.Result(); // remove initially then add to test all return paths
  347:  
  348:             using (var db = new Ia.Ftn.Cl.Db())
  349:             {
  350:                 if (response.CompletionCode == "COMPLD")
  351:                 {
  352:                     //if (response.ResultCode == Ia.Ftn.Cl.Model.Client.Huawei.Ems.ResultCode.NoMatchingPortPleaseCheckTheDataSetting)
  353:                     //{
  354:                     //    result.AddWarning("LST-VOIPPSTNUSER: (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  355:                     //}
  356:                     //else //if (response.ResultCode == Ia.Ftn.Cl.Model.Client.Huawei.Ems.ResultCode.Succeeded)
  357:                     //{
  358:                     queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
  359:  
  360:                     //queryCommand = "LST-VOIPPSTNUSER::DN=96524805054:{ctag}::;";
  361:  
  362:                     // LST-VOIPPSTNUSER::DN=+96524805054:{ctag}::;
  363:                     // LST-VOIPPSTNUSER::DN=96524805054:{ctag}::;
  364:                     queryDn = Ia.Cl.Models.Default.Match(queryCommand, @"DN=(.+?):");
  365:  
  366:                     // VoIP PSTN user of the device ARD_MSAN_Cabinet 1_Frame 0
  367:                     // VoIP PSTN user of the device MDU-MHL-2101-004
  368:                     dev = response.Title.Replace("VoIP PSTN user of the device ", "");
  369:  
  370:                     emsDevType = Ia.Ftn.Cl.Models.Data.Huawei.Dev.ReadTypeByDev(dev);
  371:  
  372:                     if (emsDevType != Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu && emsDevType != Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Msan)
  373:                     {
  374:                         emsDevType = Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.DevTypeFromDn(queryDn);
  375:                     }
  376:  
  377:                     if (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu || emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Msan)
  378:                     {
  379:                         if (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu)
  380:                         {
  381:                             nddOnt = Ia.Ftn.Cl.Models.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(dev);
  382:  
  383:                             nddOntIdOrMsanDevId = (nddOnt != null) ? nddOnt.Id : string.Empty;
  384:  
  385:                             if (nddOnt != null)
  386:                             {
  387:                                 emsOnt = (from eo in db.EmsOnts where eo.Id == nddOnt.Id select eo).SingleOrDefault();
  388:  
  389:                                 if (emsOnt != null)
  390:                                 {
  391:                                     // this should always give a single value or none
  392:                                     voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
  393:                                                         where evpu.EmsOnt != null && evpu.EmsOnt.Id == emsOnt.Id && evpu.DN == queryDn
  394:                                                         select evpu).ToList();
  395:                                 }
  396:                                 else
  397:                                 {
  398:                                     voipPstnUserList = new List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser>();
  399:                                 }
  400:                             }
  401:                             else
  402:                             {
  403:                                 voipPstnUserList = new List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser>();
  404:                             }
  405:                         }
  406:                         else //if (emsDevType == Ia.Ftn.Cl.Model.Business.Huawei.Dev.Type.Msan)
  407:                         {
  408:                             var msanDev = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
  409:                                            where m.Dev == dev
  410:                                            select m).SingleOrDefault();
  411:  
  412:                             nddOntIdOrMsanDevId = (msanDev != null) ? msanDev.Id : string.Empty;
  413:  
  414:                             voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
  415:                                                 where evpu.EmsOnt == null && evpu.Id.StartsWith(nddOntIdOrMsanDevId) && evpu.DN == queryDn
  416:                                                 select evpu).ToList();
  417:                         }
  418:  
  419:                         if (voipPstnUserList != null)
  420:                         {
  421:                             existingItemCount = voipPstnUserList.Count;
  422:  
  423:                             if (response.QueryDataTable != null)
  424:                             {
  425:                                 if (response.QueryDataTable.Rows.Count >= 1)
  426:                                 {
  427:                                     itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
  428:  
  429:                                     columns = response.QueryDataTable.Columns;
  430:                                     readItemCount = response.QueryDataTable.Rows.Count;
  431:  
  432:                                     columnDataRow = response.QueryDataTable.Rows[0];
  433:  
  434:                                     foreach (DataRow dataRow in response.QueryDataTable.Rows)
  435:                                     {
  436:                                         did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
  437:                                         fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
  438:                                         sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
  439:                                         pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
  440:  
  441:                                         dn = columns.Contains("DN") ? dataRow[columns.IndexOf("DN")].ToString() : string.Empty;
  442:  
  443:                                         if (dn != "--") // "--" means empty
  444:                                         {
  445:                                             if (dn == queryDn)
  446:                                             {
  447:                                                 id = Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.VoipPstnUserId(nddOntIdOrMsanDevId, sn, pn);
  448:  
  449:                                                 voipPstnUser = (from eo in voipPstnUserList where eo.Id == id select eo).SingleOrDefault();
  450:  
  451:                                                 newVoipPstnUser = new Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser()
  452:                                                 {
  453:                                                     Id = id,
  454:                                                     DID = did,
  455:                                                     FN = fn,
  456:                                                     SN = sn,
  457:                                                     PN = pn,
  458:                                                     DN = dn.ToString(),
  459:                                                     MGID = columns.Contains("MGID") ? int.Parse(dataRow[columns.IndexOf("MGID")].ToString()) : 0,
  460:                                                     MGNAME = columns.Contains("MGNAME") ? dataRow[columns.IndexOf("MGNAME")].ToString() : string.Empty,
  461:                                                     TID = columns.Contains("TID") ? Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("TID", dataRow[columns.IndexOf("TID")].ToString()) : 0,
  462:                                                     LayeredConf = columns.Contains("LayeredConf") ? dataRow[columns.IndexOf("LayeredConf")].ToString() : string.Empty,
  463:                                                     HighLevelWidth = columns.Contains("HighLevelWidth") ? int.Parse(dataRow[columns.IndexOf("HighLevelWidth")].ToString()) : 0,
  464:                                                     LowerLevelWidth = columns.Contains("LowerLevelWidth") ? int.Parse(dataRow[columns.IndexOf("LowerLevelWidth")].ToString()) : 0,
  465:                                                     Voltage = columns.Contains("Voltage") ? dataRow[columns.IndexOf("Voltage")].ToString() : string.Empty,
  466:                                                     KCType = columns.Contains("KCType") ? dataRow[columns.IndexOf("KCType")].ToString() : string.Empty,
  467:                                                     VoiceGain = columns.Contains("VoiceGain") ? dataRow[columns.IndexOf("VoiceGain")].ToString() : string.Empty,
  468:                                                     LimitPulseDial = columns.Contains("LimitPulseDial") ? dataRow[columns.IndexOf("LimitPulseDial")].ToString() : string.Empty,
  469:                                                     RevPolarity = columns.Contains("RevPolarity") ? dataRow[columns.IndexOf("RevPolarity")].ToString() : string.Empty,
  470:                                                     RevPoleLevel = columns.Contains("RevPoleLevel") ? int.Parse(dataRow[columns.IndexOf("RevPoleLevel")].ToString()) : 0,
  471:                                                     RevPolePulse = columns.Contains("RevPolePulse") ? dataRow[columns.IndexOf("RevPolePulse")].ToString() : string.Empty,
  472:                                                     PSTAT = columns.Contains("PSTAT") ? dataRow[columns.IndexOf("PSTAT")].ToString() : string.Empty,
  473:                                                     ConfigStatus = columns.Contains("ConfigStatus") ? dataRow[columns.IndexOf("ConfigStatus")].ToString() : string.Empty,
  474:                                                     ServiceStatus = columns.Contains("ServiceStatus") ? dataRow[columns.IndexOf("ServiceStatus")].ToString() : string.Empty,
  475:                                                     ServiceType = columns.Contains("ServiceType") ? dataRow[columns.IndexOf("ServiceType")].ToString() : string.Empty,
  476:                                                     ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
  477:                                                     UserType = columns.Contains("UserType") ? dataRow[columns.IndexOf("UserType")].ToString() : string.Empty,
  478:                                                     Impedance = columns.Contains("Impedance") ? dataRow[columns.IndexOf("Impedance")].ToString() : string.Empty,
  479:                                                     Current = columns.Contains("Current") ? dataRow[columns.IndexOf("Current")].ToString() : string.Empty,
  480:                                                     DCTime = columns.Contains("DCTime") ? int.Parse(dataRow[columns.IndexOf("DCTime")].ToString()) : 0,
  481:                                                     PITime = columns.Contains("PITime") ? Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("PITime", dataRow[columns.IndexOf("PITime")].ToString()) : 0,
  482:                                                     FSKDelayInterval = columns.Contains("FSKDelayInterval") ? int.Parse(dataRow[columns.IndexOf("FSKDelayInterval")].ToString()) : 0,
  483:                                                     ActualVoiceGain = columns.Contains("ActualVoiceGain") ? dataRow[columns.IndexOf("ActualVoiceGain")].ToString() : string.Empty,
  484:                                                     CidTransWhen = columns.Contains("CidTransWhen") ? dataRow[columns.IndexOf("CidTransWhen")].ToString() : string.Empty,
  485:                                                     CidFormat = columns.Contains("CidFormat") ? dataRow[columns.IndexOf("CidFormat")].ToString() : string.Empty,
  486:                                                     OverloadPRI = columns.Contains("OverloadPRI") ? dataRow[columns.IndexOf("OverloadPRI")].ToString() : string.Empty,
  487:                                                     ImpedanceProfile = columns.Contains("ImpedanceProfile") ? dataRow[columns.IndexOf("ImpedanceProfile")].ToString() : string.Empty,
  488:                                                     SendVoiceGain = columns.Contains("SendVoiceGain") ? dataRow[columns.IndexOf("SendVoiceGain")].ToString() : string.Empty,
  489:                                                     RecvVoiceGain = columns.Contains("RecvVoiceGain") ? dataRow[columns.IndexOf("RecvVoiceGain")].ToString() : string.Empty,
  490:                                                     RevPolarityMode = columns.Contains("RevPolarityMode") ? dataRow[columns.IndexOf("RevPolarityMode")].ToString() : string.Empty,
  491:                                                     PortRunState = columns.Contains("PortRunState") ? dataRow[columns.IndexOf("PortRunState")].ToString() : string.Empty,
  492:                                                     PortTestState = columns.Contains("PortTestState") ? dataRow[columns.IndexOf("PortTestState")].ToString() : string.Empty,
  493:                                                     PortLineState = columns.Contains("PortLineState") ? dataRow[columns.IndexOf("PortLineState")].ToString() : string.Empty,
  494:                                                     PortLoopState = columns.Contains("PortLoopState") ? dataRow[columns.IndexOf("PortLoopState")].ToString() : string.Empty,
  495:                                                     ServiceRunState = columns.Contains("ServiceRunState") ? dataRow[columns.IndexOf("ServiceRunState")].ToString() : string.Empty,
  496:                                                     ServiceAdminState = columns.Contains("ServiceAdminState") ? dataRow[columns.IndexOf("ServiceAdminState")].ToString() : string.Empty,
  497:                                                     ActualSendVoiceGain = columns.Contains("ActualSendVoiceGain") ? dataRow[columns.IndexOf("ActualSendVoiceGain")].ToString() : string.Empty,
  498:                                                     ActualRecvVo = columns.Contains("ActualRecvVo") ? dataRow[columns.IndexOf("ActualRecvVo")].ToString() : string.Empty,
  499:                                                     AGCEnable = columns.Contains("AGCEnable") ? dataRow[columns.IndexOf("AGCEnable")].ToString() : string.Empty,
  500:                                                     AGCEnableLevel = columns.Contains("AGCEnableLevel") ? int.Parse(dataRow[columns.IndexOf("AGCEnableLevel")].ToString()) : 0,
  501:                                                     SNSEnable = columns.Contains("SNSEnable") ? dataRow[columns.IndexOf("SNSEnable")].ToString() : string.Empty,
  502:                                                     SNSEnableLevel = columns.Contains("SNSEnableLevel") ? int.Parse(dataRow[columns.IndexOf("SNSEnableLevel")].ToString()) : 0,
  503:                                                     NlpMode = columns.Contains("NlpMode") ? dataRow[columns.IndexOf("NlpMode")].ToString() : string.Empty,
  504:                                                     LineLockEnable = columns.Contains("LineLockEnable") ? dataRow[columns.IndexOf("LineLockEnable")].ToString() : string.Empty,
  505:                                                     DspInputGain = columns.Contains("DspInputGain") ? dataRow[columns.IndexOf("DspInputGain")].ToString() : string.Empty,
  506:                                                     DspOutputGain = columns.Contains("DspOutputGain") ? dataRow[columns.IndexOf("DspOutputGain")].ToString() : string.Empty,
  507:                                                     ClipReversePole = columns.Contains("ClipReversePole") ? dataRow[columns.IndexOf("ClipReversePole")].ToString() : string.Empty,
  508:                                                     DEFAULTCLI = columns.Contains("DEFAULTCLI") ? dataRow[columns.IndexOf("DEFAULTCLI")].ToString() : string.Empty,
  509:                                                     USERGROUPID = columns.Contains("USERGROUPID") ? int.Parse(dataRow[columns.IndexOf("USERGROUPID")].ToString()) : 0,
  510:                                                     ADJUSTFACTOR = columns.Contains("ADJUSTFACTOR") ? int.Parse(dataRow[columns.IndexOf("ADJUSTFACTOR")].ToString()) : 0,
  511:                                                     DSPPROFILE = columns.Contains("DSPPROFILE") ? dataRow[columns.IndexOf("DSPPROFILE")].ToString() : string.Empty,
  512:  
  513:                                                     EmsOnt = (emsDevType == Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Mdu) ? (from eo in db.EmsOnts where eo.Id == nddOntIdOrMsanDevId select eo).SingleOrDefault() : null
  514:                                                 };
  515:  
  516:                                                 if (voipPstnUser == null)
  517:                                                 {
  518:                                                     newVoipPstnUser.Created = newVoipPstnUser.Updated = DateTime.UtcNow.AddHours(3);
  519:  
  520:                                                     db.EmsVoipPstnUsers.Add(newVoipPstnUser);
  521:  
  522:                                                     insertedItemCount++;
  523:                                                 }
  524:                                                 else // update
  525:                                                 {
  526:                                                     // below: copy values from newVoipPstnUser to ontSipInfo
  527:  
  528:                                                     if (voipPstnUser.Update(newVoipPstnUser))
  529:                                                     {
  530:                                                         db.EmsVoipPstnUsers.Attach(voipPstnUser);
  531:                                                         db.Entry(voipPstnUser).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
  532:  
  533:                                                         updatedItemCount++;
  534:                                                     }
  535:                                                 }
  536:  
  537:                                                 itemIdList.Add(id); // keep at the end
  538:  
  539:                                                 updatedService = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(dn);
  540:                                             }
  541:                                             else result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): dn not equal to queryDn.");
  542:                                         }
  543:                                         else result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): dn is -- empty.");
  544:                                     }
  545:  
  546:                                     // below: this function will remove values that were not present in the reading
  547:                                     if (voipPstnUserList.Count > 0)
  548:                                     {
  549:                                         foreach (Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser v in voipPstnUserList)
  550:                                         {
  551:                                             if (!itemIdList.Contains(v.Id))
  552:                                             {
  553:                                                 voipPstnUser = (from evpu in db.EmsVoipPstnUsers
  554:                                                                 where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
  555:                                                                 select evpu).SingleOrDefault();
  556:  
  557:                                                 db.EmsVoipPstnUsers.Remove(voipPstnUser);
  558:  
  559:                                                 deletedItemCount++;
  560:  
  561:                                                 updatedService = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(voipPstnUser.DN);
  562:                                             }
  563:                                         }
  564:                                     }
  565:                                 }
  566:                                 else //if (response.QueryDataTable.Rows.Count == 0)
  567:                                 {
  568:                                     if (voipPstnUserList.Count > 0)
  569:                                     {
  570:                                         foreach (Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser v in voipPstnUserList)
  571:                                         {
  572:                                             voipPstnUser = (from evpu in db.EmsVoipPstnUsers
  573:                                                             where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
  574:                                                             select evpu).SingleOrDefault();
  575:  
  576:                                             db.EmsVoipPstnUsers.Remove(voipPstnUser);
  577:  
  578:                                             deletedItemCount++;
  579:  
  580:                                             updatedService = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(voipPstnUser.DN);
  581:                                         }
  582:                                     }
  583:                                 }
  584:                             }
  585:                             else
  586:                             {
  587:                                 if (voipPstnUserList.Count > 0)
  588:                                 {
  589:                                     foreach (Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser v in voipPstnUserList)
  590:                                     {
  591:                                         voipPstnUser = (from evpu in db.EmsVoipPstnUsers
  592:                                                         where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
  593:                                                         select evpu).SingleOrDefault();
  594:  
  595:                                         db.EmsVoipPstnUsers.Remove(voipPstnUser);
  596:  
  597:                                         deletedItemCount++;
  598:  
  599:                                         updatedService = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(voipPstnUser.DN);
  600:                                     }
  601:                                 }
  602:                             }
  603:  
  604:                             db.SaveChanges();
  605:  
  606:                             if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
  607:                             else isUpdated = false;
  608:  
  609:                             result.AddSuccess("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
  610:                         }
  611:                         else
  612:                         {
  613:                             result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): voipPstnUserList is null.");
  614:                         }
  615:                     }
  616:                     else
  617:                     {
  618:                         result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): for DEV: " + dev + " emsDevType is neither MDU nor MSAN.");
  619:                     }
  620:                     //}
  621:                     //else
  622:                     //{
  623:                     //    result.AddError("LST-VOIPPSTNUSER: (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  624:                     //}
  625:                 }
  626:                 else
  627:                 {
  628:                     result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  629:                 }
  630:             }
  631:  
  632:             return isUpdated;
  633:         }
  634:  
  635:         ////////////////////////////////////////////////////////////////////////////
  636:  
  637:         /// <summary>
  638:         ///
  639:         /// </summary>
  640:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> List()
  641:         {
  642:             List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> list;
  643:  
  644:             using (var db = new Ia.Ftn.Cl.Db())
  645:             {
  646:                 list = (from evpu in db.EmsVoipPstnUsers
  647:                             //where evpu.EmsOnt != null
  648:                         select evpu).ToList();
  649:             }
  650:  
  651:             return list;
  652:         }
  653:  
  654:         ////////////////////////////////////////////////////////////////////////////
  655:  
  656:         /// <summary>
  657:         ///
  658:         /// </summary>
  659:         public static List<string> ServiceList()
  660:         {
  661:             List<string> list;
  662:  
  663:             using (var db = new Ia.Ftn.Cl.Db())
  664:             {
  665:                 var list0 = (from evpu in db.EmsVoipPstnUsers select evpu.DN).AsNoTracking().ToList();
  666:  
  667:                 list = (from l in list0 select Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l)).Distinct().ToList();
  668:             }
  669:  
  670:             return list;
  671:         }
  672:  
  673:         ////////////////////////////////////////////////////////////////////////////
  674:  
  675:         /// <summary>
  676:         ///
  677:         /// </summary>
  678:         public static List<string> DuplicateMduDnServiceWithCountryCodeOrMsanDnServiceImpuAidServiceList()
  679:         {
  680:             List<string> list;
  681:  
  682:             //var dummy = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
  683:  
  684:             // I'll check that the records are for a real 11 digit number, otherwise we will not send it to the database
  685:             // for MDUs numbers will look like 96524805054 Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn);
  686:             // for MSAN numbers will look like +96524805054 Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn)
  687:  
  688:             using (var db = new Ia.Ftn.Cl.Db())
  689:             {
  690:                 var list0 = (from evpu1 in db.EmsVoipPstnUsers
  691:                              join evpu2 in db.EmsVoipPstnUsers on evpu1.DN equals evpu2.DN
  692:                              where evpu1.Id != evpu2.Id
  693:                              select new { Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(evpu1.DN) }).Distinct().ToList();
  694:  
  695:                 var list1 = (from evpu1 in db.EmsVoipPstnUsers
  696:                              join evpu2 in db.EmsVoipPstnUsers on evpu1.DN equals "+" + evpu2.DN
  697:                              where evpu1.Id != evpu2.Id
  698:                              select new { Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(evpu1.DN) }).Distinct().ToList();
  699:  
  700:                 var list2 = list0.Union(list1).Distinct().ToList();
  701:  
  702:                 list = (from l in list2 select l.Service).ToList();
  703:             }
  704:  
  705:             return list;
  706:         }
  707:  
  708:         ////////////////////////////////////////////////////////////////////////////
  709:  
  710:         /// <summary>
  711:         ///
  712:         /// </summary>
  713:         public static List<string> InconsistentRecordsWhereEmsOntIsNullAndDnIsImpuAidHasPlusFormatOrEmsOntIsNotNullAndDnIsInServiceWithCountryCodeNoPlusFormatList()
  714:         {
  715:             List<string> list;
  716:  
  717:             //var dummy = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
  718:  
  719:             // for MDUs numbers will look like 96524805054 Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn);
  720:             // for MSAN numbers will look like +96524805054 Ia.Ftn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn)
  721:  
  722:             using (var db = new Ia.Ftn.Cl.Db())
  723:             {
  724:                 // select * from EmsVoipPstnUsers where EmsOnt_Id is not null and dn like '+%'
  725:                 var list0 = (from evpu in db.EmsVoipPstnUsers
  726:                              where evpu.EmsOnt != null && evpu.DN.StartsWith("+")
  727:                              select new { Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(evpu.DN) }).Distinct().ToList();
  728:  
  729:                 // select * from EmsVoipPstnUsers where EmsOnt_Id is null and dn not like '+%'
  730:                 var list1 = (from evpu in db.EmsVoipPstnUsers
  731:                              where evpu.EmsOnt == null && !evpu.DN.StartsWith("+")
  732:                              select new { Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(evpu.DN) }).Distinct().ToList();
  733:  
  734:                 var list2 = list0.Union(list1).Distinct().ToList();
  735:  
  736:                 list = (from l in list2 select l.Service).ToList();
  737:             }
  738:  
  739:             return list;
  740:         }
  741:  
  742:         ////////////////////////////////////////////////////////////////////////////
  743:  
  744:         /// <summary>
  745:         ///
  746:         /// </summary>
  747:         public static List<string> ServiceIdWithinSipOltList()
  748:         {
  749:             int serviceType;
  750:             string service, serviceId;
  751:             List<int> sipOltIdList;
  752:             List<string> list, serviceIdList;
  753:  
  754:             serviceType = Ia.Ftn.Cl.Models.Business.Service.ServiceType.ImsService;
  755:             sipOltIdList = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.SipOltIdList;
  756:  
  757:             using (var db = new Ia.Ftn.Cl.Db())
  758:             {
  759:                 list = (from evpu in db.EmsVoipPstnUsers
  760:                         where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
  761:                         select evpu.DN).AsNoTracking().ToList();
  762:             }
  763:  
  764:             if (list != null && list.Count > 0)
  765:             {
  766:                 serviceIdList = new List<string>(list.Count);
  767:  
  768:                 foreach (string s in list)
  769:                 {
  770:                     service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s);
  771:  
  772:                     serviceId = Ia.Ftn.Cl.Models.Business.Service.ServiceToServiceId(service, serviceType);
  773:  
  774:                     serviceIdList.Add(serviceId);
  775:                 }
  776:             }
  777:             else
  778:             {
  779:                 serviceIdList = new List<string>();
  780:             }
  781:  
  782:             return serviceIdList;
  783:         }
  784:  
  785:         ////////////////////////////////////////////////////////////////////////////
  786:  
  787:         /// <summary>
  788:         ///
  789:         /// </summary>
  790:         public static List<string> ServiceWithinEmsVoipPstnUserWhereEmsDevResultCodeDeviceOfflineError()
  791:         {
  792:             string service;
  793:             List<string> serviceList;
  794:  
  795:             using (var db = new Ia.Ftn.Cl.Db())
  796:             {
  797:                 var list = (from evpu in db.EmsVoipPstnUsers
  798:                             where evpu.EmsOnt != null && evpu.EmsOnt.Access != null
  799:                             select new { evpu.DN, evpu.DID }).AsNoTracking().ToList();
  800:  
  801:                 if (list != null && list.Count > 0)
  802:                 {
  803:                     serviceList = new List<string>(list.Count);
  804:  
  805:                     var didToResultCodeDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DidToResultCodeDictionary;
  806:  
  807:                     foreach (var evpu in list)
  808:                     {
  809:                         if (didToResultCodeDictionary.ContainsKey(evpu.DID))
  810:                         {
  811:                             var resultCode = didToResultCodeDictionary[evpu.DID];
  812:  
  813:                             if (resultCode == (long)Ia.Ftn.Cl.Models.Client.Huawei.Ems.ResultCode.DeviceOfflineError)
  814:                             {
  815:                                 service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(evpu.DN);
  816:  
  817:                                 serviceList.Add(service);
  818:                             }
  819:                         }
  820:                     }
  821:                 }
  822:                 else
  823:                 {
  824:                     serviceList = new List<string>();
  825:                 }
  826:             }
  827:  
  828:             return serviceList;
  829:         }
  830:  
  831:         ////////////////////////////////////////////////////////////////////////////
  832:  
  833:         /// <summary>
  834:         ///
  835:         /// </summary>
  836:         public static List<string> AccessNameWithinEmsVoipPstnUserWhereEmsDevResultCodeDeviceOfflineError()
  837:         {
  838:             string accessName;
  839:             List<string> accessNameList;
  840:  
  841:             using (var db = new Ia.Ftn.Cl.Db())
  842:             {
  843:                 var list = (from evpu in db.EmsVoipPstnUsers
  844:                             where evpu.EmsOnt != null && evpu.EmsOnt.Access != null
  845:                             select new { evpu.EmsOnt.Access.Id, evpu.DID }).AsNoTracking().ToList();
  846:  
  847:                 if (list != null && list.Count > 0)
  848:                 {
  849:                     accessNameList = new List<string>(list.Count);
  850:  
  851:                     var didToResultCodeDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DidToResultCodeDictionary;
  852:                     var ontAccessIdToOntAccessNameDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntAccessIdToOntAccessNameDictionary;
  853:  
  854:                     foreach (var accessIdDid in list)
  855:                     {
  856:                         if (didToResultCodeDictionary.ContainsKey(accessIdDid.DID))
  857:                         {
  858:                             var resultCode = didToResultCodeDictionary[accessIdDid.DID];
  859:  
  860:                             if (resultCode == (long)Ia.Ftn.Cl.Models.Client.Huawei.Ems.ResultCode.DeviceOfflineError)
  861:                             {
  862:                                 if (ontAccessIdToOntAccessNameDictionary.ContainsKey(accessIdDid.Id))
  863:                                 {
  864:                                     accessName = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntAccessIdToOntAccessNameDictionary[accessIdDid.Id];
  865:  
  866:                                     if (!accessNameList.Contains(accessName))
  867:                                     {
  868:                                         accessNameList.Add(accessName);
  869:                                     }
  870:                                 }
  871:                             }
  872:                         }
  873:                     }
  874:                 }
  875:                 else
  876:                 {
  877:                     accessNameList = new List<string>();
  878:                 }
  879:             }
  880:  
  881:             return accessNameList;
  882:         }
  883:  
  884:         ////////////////////////////////////////////////////////////////////////////
  885:  
  886:         /// <summary>
  887:         ///
  888:         /// </summary>
  889:         public static List<string> ServiceIdWithinAllowedSipOltToBeProvisionedOrMigratedList()
  890:         {
  891:             int serviceType;
  892:             string service, serviceId;
  893:             List<int> sipOltIdList;
  894:             List<string> list, serviceIdList;
  895:  
  896:             serviceType = Ia.Ftn.Cl.Models.Business.Service.ServiceType.ImsService;
  897:             sipOltIdList = Ia.Ftn.Cl.Models.Data.Service.AllowedToBeProvisionedSipOltIdList.Union(Ia.Ftn.Cl.Models.Data.Service.AllowedToBeMigratedSipOltIdList).ToList();
  898:  
  899:             using (var db = new Ia.Ftn.Cl.Db())
  900:             {
  901:                 list = (from evpu in db.EmsVoipPstnUsers
  902:                         where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
  903:                         select evpu.DN).ToList();
  904:             }
  905:  
  906:             if (list != null && list.Count > 0)
  907:             {
  908:                 serviceIdList = new List<string>(list.Count);
  909:  
  910:                 foreach (string s in list)
  911:                 {
  912:                     service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s);
  913:  
  914:                     serviceId = Ia.Ftn.Cl.Models.Business.Service.ServiceToServiceId(service, serviceType);
  915:  
  916:                     serviceIdList.Add(serviceId);
  917:                 }
  918:             }
  919:             else
  920:             {
  921:                 serviceIdList = new List<string>();
  922:             }
  923:  
  924:             return serviceIdList;
  925:         }
  926:  
  927:         ////////////////////////////////////////////////////////////////////////////
  928:  
  929:         /// <summary>
  930:         /// List of ServiceOnts within EmsVoipPstnUsers within a SIP allowed to be provisioned or migrated OLT
  931:         /// </summary>
  932:         public static List<Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated> ServiceOntWithinAllowedSipOltToBeProvisionedOrMigratedList()
  933:         {
  934:             int serviceType;
  935:             string service, serviceId;
  936:             List<int> sipOltIdList;
  937:             List<Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated> tempSipUserNamelist, serviceOntList;
  938:  
  939:             serviceType = Ia.Ftn.Cl.Models.Business.Service.ServiceType.ImsService;
  940:             sipOltIdList = Ia.Ftn.Cl.Models.Data.Service.AllowedToBeProvisionedSipOltIdList.Union(Ia.Ftn.Cl.Models.Data.Service.AllowedToBeMigratedSipOltIdList).ToList();
  941:  
  942:             var ontAccessIdToOntForOltIdListDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntAccessIdToOntForOltIdListDictionary(sipOltIdList);
  943:  
  944:             using (var db = new Ia.Ftn.Cl.Db())
  945:             {
  946:                 tempSipUserNamelist = (from evpu in db.EmsVoipPstnUsers
  947:                                        where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
  948:                                        // select vpu.DN).ToList();
  949:                                        select new Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated { Service = evpu.DN, AccessId = evpu.EmsOnt.Access.Id, CreatedDateTime = evpu.Created }).AsNoTracking().ToList();
  950:             }
  951:  
  952:             if (tempSipUserNamelist != null && tempSipUserNamelist.Count > 0)
  953:             {
  954:                 serviceOntList = new List<Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated>(tempSipUserNamelist.Count);
  955:  
  956:                 foreach (var so in tempSipUserNamelist)
  957:                 {
  958:                     service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(so.Service); // so.Service here is vpu.DN
  959:  
  960:                     serviceId = Ia.Ftn.Cl.Models.Business.Service.ServiceToServiceId(service, serviceType);
  961:  
  962:                     serviceOntList.Add(new Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated
  963:                     {
  964:                         ServiceId = serviceId,
  965:                         Service = service,
  966:                         AccessId = so.AccessId,
  967:                         Ont = ontAccessIdToOntForOltIdListDictionary.ContainsKey(so.AccessId) ? ontAccessIdToOntForOltIdListDictionary[so.AccessId] : null,
  968:                         CreatedDateTime = so.CreatedDateTime
  969:                     });
  970:                 }
  971:             }
  972:             else
  973:             {
  974:                 serviceOntList = new List<Ia.Ftn.Cl.Models.Business.ServiceAccessIpOntCreated>();
  975:             }
  976:  
  977:             return serviceOntList;
  978:         }
  979:  
  980:         ////////////////////////////////////////////////////////////////////////////
  981:  
  982:         /// <summary>
  983:         ///
  984:         /// </summary>
  985:         public static Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser Read(string id)
  986:         {
  987:             Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser item;
  988:  
  989:             using (var db = new Ia.Ftn.Cl.Db())
  990:             {
  991:                 item = (from evpu in db.EmsVoipPstnUsers
  992:                         where evpu.EmsOnt != null && evpu.Id == id
  993:                         select evpu).Include(o => o.EmsOnt).SingleOrDefault();
  994:             }
  995:  
  996:             return item;
  997:         }
  998:  
  999:         ////////////////////////////////////////////////////////////////////////////
 1000:  
 1001:         /// <summary>
 1002:         ///
 1003:         /// </summary>
 1004:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> ReadByService(string service) //, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt)
 1005:         {
 1006:             string dn;
 1007:             List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> list;
 1008:  
 1009:             dn = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.ServiceWithCountryCode(service);
 1010:  
 1011:             using (var db = new Ia.Ftn.Cl.Db())
 1012:             {
 1013:                 list = (from evpu in db.EmsVoipPstnUsers
 1014:                         where evpu.EmsOnt != null && evpu.DN == dn
 1015:                         select evpu).Include(o => o.EmsOnt).ThenInclude(o => o.Access).ToList(); //.SingleOrDefault();
 1016:             }
 1017:  
 1018:             return list;
 1019:         }
 1020:  
 1021:         ////////////////////////////////////////////////////////////////////////////
 1022:  
 1023:         /// <summary>
 1024:         ///
 1025:         /// </summary>
 1026:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> ReadByMsanService(string service)
 1027:         {
 1028:             string dn;
 1029:             List<Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser> list;
 1030:  
 1031:             dn = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.ImpuAid(service);
 1032:  
 1033:             using (var db = new Ia.Ftn.Cl.Db())
 1034:             {
 1035:                 list = (from evpu in db.EmsVoipPstnUsers
 1036:                         where /*evpu.EmsOnt != null &&*/ evpu.DN == dn
 1037:                         select evpu)/*.Include(o => o.EmsOnt).ThenInclude(o => o.Access)*/.ToList(); //.SingleOrDefault();
 1038:             }
 1039:  
 1040:             return list;
 1041:         }
 1042:  
 1043:         ////////////////////////////////////////////////////////////////////////////
 1044:  
 1045:         /// <summary>
 1046:         ///
 1047:         /// </summary>
 1048:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.DidFnSnPnDn> DidFnSnPnDnMsanList()
 1049:         {
 1050:             List<Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.DidFnSnPnDn> list;
 1051:  
 1052:             //var dummy = Ia.Ftn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
 1053:  
 1054:             using (var db = new Ia.Ftn.Cl.Db())
 1055:             {
 1056:                 list = (from evpu in db.EmsVoipPstnUsers
 1057:                         where evpu.DN.StartsWith("+" + Ia.Ftn.Cl.Models.Business.Service.CountryCode)
 1058:                         select new Ia.Ftn.Cl.Models.Business.Huawei.VoipPstnUser.DidFnSnPnDn
 1059:                         {
 1060:                             Did = evpu.DID,
 1061:                             Fn = evpu.FN,
 1062:                             Sn = evpu.SN,
 1063:                             Pn = evpu.PN,
 1064:                             Dn = evpu.DN,
 1065:                         }).ToList();
 1066:             }
 1067:  
 1068:             return list;
 1069:         }
 1070:  
 1071:         ////////////////////////////////////////////////////////////////////////////
 1072:  
 1073:         /// <summary>
 1074:         ///
 1075:         /// </summary>
 1076:         public static List<string> MsanServiceList
 1077:         {
 1078:             get
 1079:             {
 1080:                 List<string> list;
 1081:  
 1082: #if DEBUG
 1083:                 var dummyVarToDrawRefractorToBelow = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Dn("0000000");
 1084: #endif
 1085:  
 1086:                 using (var db = new Ia.Ftn.Cl.Db())
 1087:                 {
 1088:                     var list0 = (from evpu in db.EmsVoipPstnUsers
 1089:                                  where evpu.EmsOnt == null && evpu.DN.StartsWith("+965")
 1090:                                  select evpu.DN).ToList();
 1091:  
 1092:                     list = new List<string>();
 1093:  
 1094:                     foreach (var s in list0)
 1095:                     {
 1096:                         list.Add(Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s));
 1097:                     }
 1098:                 }
 1099:  
 1100:                 return list;
 1101:             }
 1102:         }
 1103:  
 1104:         ////////////////////////////////////////////////////////////////////////////
 1105:  
 1106:         /// <summary>
 1107:         ///
 1108:         /// </summary>
 1109:         public static Dictionary<string, bool> MsanServiceDictionary
 1110:         {
 1111:             get
 1112:             {
 1113:                 string key;
 1114:                 Dictionary<string, bool> dictionary;
 1115:  
 1116: #if DEBUG
 1117:                 var dummyVarToDrawRefractorToBelow = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Dn("0000000");
 1118: #endif
 1119:  
 1120:                 var list = Ia.Ftn.Cl.Models.Data.Huawei.VoipPstnUser.MsanServiceList;
 1121:  
 1122:                 dictionary = new Dictionary<string, bool>();
 1123:  
 1124:                 foreach (var s in list)
 1125:                 {
 1126:                     key = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s);
 1127:  
 1128:                     if (!string.IsNullOrEmpty(key)) dictionary[key] = true;
 1129:                 }
 1130:  
 1131:                 return dictionary;
 1132:             }
 1133:         }
 1134:  
 1135:         ////////////////////////////////////////////////////////////////////////////
 1136:  
 1137:         /// <summary>
 1138:         ///
 1139:         /// </summary>
 1140:         public static Dictionary<int, int> MsanDevDidToDnCountDictionary
 1141:         {
 1142:             get
 1143:             {
 1144:                 Dictionary<int, int> dictionary;
 1145:  
 1146:                 using (var db = new Ia.Ftn.Cl.Db())
 1147:                 {
 1148:                     /*
 1149: select ed.DID,count(0) from EmsVoipPstnUsers evpu
 1150: left outer join EmsDevs ed on ed.DID = evpu.DID 
 1151: where evpu.DN like '+%'
 1152: group by ed.DID
 1153:                      */
 1154:  
 1155:                     dictionary = (from evpu in db.EmsVoipPstnUsers
 1156:                                   join ed in db.EmsDevs on evpu.DID equals ed.DID
 1157:                                   where evpu.EmsOnt == null && evpu.DN.StartsWith("+965")
 1158:                                   group ed.DID by ed.DID into g
 1159:                                   select new { Did = g.Key, Count = g.Count() }).AsNoTracking().ToDictionary(u => u.Did, u => u.Count);
 1160:                 }
 1161:  
 1162:                 return dictionary.ToDictionary(u => u.Key, u => u.Value);
 1163:             }
 1164:         }
 1165:  
 1166:         ////////////////////////////////////////////////////////////////////////////
 1167:  
 1168:         /// <summary>
 1169:         ///
 1170:         /// </summary>
 1171:         public static List<string> DnServiceListByMsanDevDidList(List<int> didList)
 1172:         {
 1173:             List<string> list;
 1174:  
 1175:             using (var db = new Ia.Ftn.Cl.Db())
 1176:             {
 1177:                 var list0 = (from evpu in db.EmsVoipPstnUsers
 1178:                              join ed in db.EmsDevs on evpu.DID equals ed.DID
 1179:                              where evpu.EmsOnt == null && evpu.DN != null && evpu.DN.StartsWith("+965") && didList.Contains(ed.DID)
 1180:                              select evpu.DN).AsNoTracking().ToList();
 1181:  
 1182:                 list = new List<string>();
 1183:  
 1184:                 foreach (var s in list0)
 1185:                 {
 1186:                     list.Add(Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(s));
 1187:                 }
 1188:             }
 1189:  
 1190:             return list;
 1191:         }
 1192:  
 1193:         ////////////////////////////////////////////////////////////////////////////
 1194:  
 1195:         /// <summary>
 1196:         ///
 1197:         /// </summary>
 1198:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsan(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan)
 1199:         {
 1200:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev msanDev;
 1201:             List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> list;
 1202:  
 1203:             var msanDevList = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1204:                                where m.Msan.Id == msan.Id
 1205:                                select m).ToList();
 1206:  
 1207:             var didList = msanDevList.Select(u => u.Did).ToList();
 1208:  
 1209:             using (var db = new Ia.Ftn.Cl.Db())
 1210:             {
 1211:                 list = (from evpu in db.EmsVoipPstnUsers
 1212:                         join ed in db.EmsDevs on evpu.DID equals ed.DID
 1213:                         where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
 1214:                         select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1215:                         {
 1216:                             EmsVoipPstnUserId = evpu.Id,
 1217:                             Did = evpu.DID,
 1218:                             Fn = evpu.FN,
 1219:                             Sn = evpu.SN,
 1220:                             Pn = evpu.PN,
 1221:                             Dn = evpu.DN,
 1222:                             Created = evpu.Created,
 1223:                             Updated = evpu.Updated
 1224:                         }).AsNoTracking().ToList();
 1225:  
 1226:                 foreach (var l in list)
 1227:                 {
 1228:                     l.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l.Dn);
 1229:                     l.MsanId = msan.Id;
 1230:                     l.MsanNameSymbol = msan.NameSymbol;
 1231:  
 1232:                     msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 1233:  
 1234:                     l.MsanDevId = msanDev.Id;
 1235:                     l.MsanDevDev = msanDev.Dev;
 1236:                     l.Cabinet = msanDev.Cabinet;
 1237:                     l.Frame = msanDev.Frame;
 1238:                 }
 1239:             }
 1240:  
 1241:             return list;
 1242:         }
 1243:  
 1244:         ////////////////////////////////////////////////////////////////////////////
 1245:  
 1246:         /// <summary>
 1247:         ///
 1248:         /// </summary>
 1249:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinet(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, int cabinet)
 1250:         {
 1251:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev msanDev;
 1252:             List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> list;
 1253:  
 1254:             var msanDevList = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1255:                                where m.Msan.Id == msan.Id && m.Cabinet == cabinet
 1256:                                select m).ToList();
 1257:  
 1258:             var didList = msanDevList.Select(u => u.Did).ToList();
 1259:  
 1260:             using (var db = new Ia.Ftn.Cl.Db())
 1261:             {
 1262:                 list = (from evpu in db.EmsVoipPstnUsers
 1263:                         join ed in db.EmsDevs on evpu.DID equals ed.DID
 1264:                         where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
 1265:                         select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1266:                         {
 1267:                             EmsVoipPstnUserId = evpu.Id,
 1268:                             Did = evpu.DID,
 1269:                             Fn = evpu.FN,
 1270:                             Sn = evpu.SN,
 1271:                             Pn = evpu.PN,
 1272:                             Dn = evpu.DN,
 1273:                             Created = evpu.Created,
 1274:                             Updated = evpu.Updated
 1275:                         }).AsNoTracking().ToList();
 1276:  
 1277:                 foreach (var l in list)
 1278:                 {
 1279:                     l.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l.Dn);
 1280:                     l.MsanId = msan.Id;
 1281:                     l.MsanNameSymbol = msan.NameSymbol;
 1282:  
 1283:                     msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 1284:  
 1285:                     l.MsanDevId = msanDev.Id;
 1286:                     l.MsanDevDev = msanDev.Dev;
 1287:                     l.Cabinet = msanDev.Cabinet;
 1288:                     l.Frame = msanDev.Frame;
 1289:                 }
 1290:             }
 1291:  
 1292:             return list;
 1293:         }
 1294:  
 1295:         ////////////////////////////////////////////////////////////////////////////
 1296:  
 1297:         /// <summary>
 1298:         ///
 1299:         /// </summary>
 1300:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrame(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame)
 1301:         {
 1302:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev msanDev;
 1303:             List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> list;
 1304:  
 1305:             var msanDevList = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1306:                                where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
 1307:                                select m).ToList();
 1308:  
 1309:             var didList = msanDevList.Select(u => u.Did).ToList();
 1310:  
 1311:             using (var db = new Ia.Ftn.Cl.Db())
 1312:             {
 1313:                 list = (from evpu in db.EmsVoipPstnUsers
 1314:                         join ed in db.EmsDevs on evpu.DID equals ed.DID
 1315:                         where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
 1316:                         select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1317:                         {
 1318:                             EmsVoipPstnUserId = evpu.Id,
 1319:                             Did = evpu.DID,
 1320:                             Fn = evpu.FN,
 1321:                             Sn = evpu.SN,
 1322:                             Pn = evpu.PN,
 1323:                             Dn = evpu.DN,
 1324:                             Created = evpu.Created,
 1325:                             Updated = evpu.Updated
 1326:                         }).AsNoTracking().ToList();
 1327:  
 1328:                 foreach (var l in list)
 1329:                 {
 1330:                     l.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l.Dn);
 1331:                     l.MsanId = msan.Id;
 1332:                     l.MsanNameSymbol = msan.NameSymbol;
 1333:  
 1334:                     msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 1335:  
 1336:                     l.MsanDevId = msanDev.Id;
 1337:                     l.MsanDevDev = msanDev.Dev;
 1338:                     l.Cabinet = msanDev.Cabinet;
 1339:                     l.Frame = msanDev.Frame;
 1340:                 }
 1341:             }
 1342:  
 1343:             return list;
 1344:         }
 1345:  
 1346:         ////////////////////////////////////////////////////////////////////////////
 1347:  
 1348:         /// <summary>
 1349:         ///
 1350:         /// </summary>
 1351:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrameAndFn(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn)
 1352:         {
 1353:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev msanDev;
 1354:             List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> list;
 1355:  
 1356:             var msanDevList = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1357:                                where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
 1358:                                select m).ToList();
 1359:  
 1360:             var didList = msanDevList.Select(u => u.Did).ToList();
 1361:  
 1362:             using (var db = new Ia.Ftn.Cl.Db())
 1363:             {
 1364:                 list = (from evpu in db.EmsVoipPstnUsers
 1365:                         join ed in db.EmsDevs on evpu.DID equals ed.DID
 1366:                         where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID) && evpu.FN == fn
 1367:                         select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1368:                         {
 1369:                             EmsVoipPstnUserId = evpu.Id,
 1370:                             Did = evpu.DID,
 1371:                             Fn = evpu.FN,
 1372:                             Sn = evpu.SN,
 1373:                             Pn = evpu.PN,
 1374:                             Dn = evpu.DN,
 1375:                             Created = evpu.Created,
 1376:                             Updated = evpu.Updated
 1377:                         }).AsNoTracking().ToList();
 1378:  
 1379:                 foreach (var l in list)
 1380:                 {
 1381:                     l.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l.Dn);
 1382:                     l.MsanId = msan.Id;
 1383:                     l.MsanNameSymbol = msan.NameSymbol;
 1384:  
 1385:                     msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 1386:  
 1387:                     l.MsanDevId = msanDev.Id;
 1388:                     l.MsanDevDev = msanDev.Dev;
 1389:                     l.Cabinet = msanDev.Cabinet;
 1390:                     l.Frame = msanDev.Frame;
 1391:                 }
 1392:             }
 1393:  
 1394:             return list;
 1395:         }
 1396:  
 1397:         ////////////////////////////////////////////////////////////////////////////
 1398:  
 1399:         /// <summary>
 1400:         ///
 1401:         /// </summary>
 1402:         public static List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrameAndFnAndSn(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn, int sn)
 1403:         {
 1404:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev msanDev;
 1405:             List<Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic> list;
 1406:  
 1407:             var msanDevList = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1408:                                where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
 1409:                                select m).ToList();
 1410:  
 1411:             var didList = msanDevList.Select(u => u.Did).ToList();
 1412:  
 1413:             using (var db = new Ia.Ftn.Cl.Db())
 1414:             {
 1415:                 list = (from evpu in db.EmsVoipPstnUsers
 1416:                         join ed in db.EmsDevs on evpu.DID equals ed.DID
 1417:                         where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID) && evpu.FN == fn && evpu.SN == sn
 1418:                         select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1419:                         {
 1420:                             EmsVoipPstnUserId = evpu.Id,
 1421:                             Did = evpu.DID,
 1422:                             Fn = evpu.FN,
 1423:                             Sn = evpu.SN,
 1424:                             Pn = evpu.PN,
 1425:                             Dn = evpu.DN,
 1426:                             Created = evpu.Created,
 1427:                             Updated = evpu.Updated
 1428:                         }).AsNoTracking().ToList();
 1429:  
 1430:                 foreach (var l in list)
 1431:                 {
 1432:                     l.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(l.Dn);
 1433:                     l.MsanId = msan.Id;
 1434:                     l.MsanNameSymbol = msan.NameSymbol;
 1435:  
 1436:                     msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 1437:  
 1438:                     l.MsanDevId = msanDev.Id;
 1439:                     l.MsanDevDev = msanDev.Dev;
 1440:                     l.Cabinet = msanDev.Cabinet;
 1441:                     l.Frame = msanDev.Frame;
 1442:                 }
 1443:             }
 1444:  
 1445:             return list;
 1446:         }
 1447:  
 1448:         ////////////////////////////////////////////////////////////////////////////
 1449:  
 1450:         /// <summary>
 1451:         ///
 1452:         /// </summary>
 1453:         public static Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic MsanDevLicByEmsVoipPstnUserId(string emsVoipPstnUserId)
 1454:         {
 1455:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic lic;
 1456:  
 1457:             using (var db = new Ia.Ftn.Cl.Db())
 1458:             {
 1459:                 lic = (from evpu in db.EmsVoipPstnUsers
 1460:                        where evpu.Id == emsVoipPstnUserId
 1461:                        select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1462:                        {
 1463:                            EmsVoipPstnUserId = evpu.Id,
 1464:                            Did = evpu.DID,
 1465:                            Fn = evpu.FN,
 1466:                            Sn = evpu.SN,
 1467:                            Pn = evpu.PN,
 1468:                            Dn = evpu.DN,
 1469:                            Created = evpu.Created,
 1470:                            Updated = evpu.Updated
 1471:                        }).AsNoTracking().SingleOrDefault();
 1472:  
 1473:                 var msanDev = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1474:                                where m.Did == lic.Did
 1475:                                select m).Single();
 1476:  
 1477:                 lic.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(lic.Dn);
 1478:                 lic.MsanId = msanDev.Msan.Id;
 1479:                 lic.MsanNameSymbol = msanDev.Msan.NameSymbol;
 1480:                 lic.MsanDevId = msanDev.Id;
 1481:                 lic.MsanDevDev = msanDev.Dev;
 1482:                 lic.Cabinet = msanDev.Cabinet;
 1483:                 lic.Frame = msanDev.Frame;
 1484:             }
 1485:  
 1486:             return lic;
 1487:         }
 1488:  
 1489:         ////////////////////////////////////////////////////////////////////////////
 1490:  
 1491:         /// <summary>
 1492:         ///
 1493:         /// </summary>
 1494:         public static Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic MsanDevLicByNddMsanAndCabinetAndFrameAndFnAndSnAndPn(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn, int sn, int pn)
 1495:         {
 1496:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic lic;
 1497:  
 1498:             var msanDev = (from m in Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList
 1499:                            where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
 1500:                            select m).SingleOrDefault();
 1501:  
 1502:             if (msanDev != null)
 1503:             {
 1504:                 using (var db = new Ia.Ftn.Cl.Db())
 1505:                 {
 1506:                     lic = (from evpu in db.EmsVoipPstnUsers
 1507:                            join ed in db.EmsDevs on evpu.DID equals ed.DID
 1508:                            where evpu.EmsOnt == null && msanDev.Did == ed.DID && evpu.FN == fn && evpu.SN == sn && evpu.PN == pn
 1509:                            select new Ia.Ftn.Cl.Models.Business.Huawei.Dev.MsanDev.Lic
 1510:                            {
 1511:                                EmsVoipPstnUserId = evpu.Id,
 1512:                                Did = evpu.DID,
 1513:                                Fn = evpu.FN,
 1514:                                Sn = evpu.SN,
 1515:                                Pn = evpu.PN,
 1516:                                Dn = evpu.DN,
 1517:                                Created = evpu.Created,
 1518:                                Updated = evpu.Updated
 1519:                            }).AsNoTracking().SingleOrDefault();
 1520:  
 1521:                     if (lic != null)
 1522:                     {
 1523:                         lic.Service = Ia.Ftn.Cl.Models.Business.NumberFormatConverter.Service(lic.Dn);
 1524:                         lic.MsanId = msanDev.Msan.Id;
 1525:                         lic.MsanNameSymbol = msanDev.Msan.NameSymbol;
 1526:                         lic.MsanDevId = msanDev.Id;
 1527:                         lic.MsanDevDev = msanDev.Dev;
 1528:                         lic.Cabinet = msanDev.Cabinet;
 1529:                         lic.Frame = msanDev.Frame;
 1530:                     }
 1531:                 }
 1532:             }
 1533:             else lic = null;
 1534:  
 1535:             return lic;
 1536:         }
 1537:  
 1538:         ////////////////////////////////////////////////////////////////////////////
 1539:  
 1540:         /// <summary>
 1541:         ///
 1542:         /// </summary>
 1543:         public static Dictionary<string, string> IdToOntIdDictionary
 1544:         {
 1545:             get
 1546:             {
 1547:                 Dictionary<string, string> dictionary;
 1548:  
 1549:                 using (var db = new Ia.Ftn.Cl.Db())
 1550:                 {
 1551:                     dictionary = (from evpu in db.EmsVoipPstnUsers
 1552:                                   where evpu.EmsOnt != null
 1553:                                   select new { evpu.Id, OntId = evpu.EmsOnt.Id }).ToDictionary(u => u.Id, u => u.OntId);
 1554:                 }
 1555:  
 1556:                 return dictionary.ToDictionary(u => u.Key, u => u.Value);
 1557:             }
 1558:         }
 1559:  
 1560:         ////////////////////////////////////////////////////////////////////////////
 1561:         ////////////////////////////////////////////////////////////////////////////
 1562:  
 1563:         /// <summary>
 1564:         ///
 1565:         /// </summary>
 1566:         public static string ToSimpleTextString(Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser emsVoipPstnUser)
 1567:         {
 1568:             StringBuilder sb;
 1569:  
 1570:             sb = new StringBuilder();
 1571:  
 1572:             //sb.AppendLine("Vendor: " + Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Vendor.Huawei.Name);
 1573:             sb.AppendLine("DID: " + emsVoipPstnUser.DID);
 1574:             sb.AppendLine("FN: " + emsVoipPstnUser.FN);
 1575:             sb.AppendLine("SN: " + emsVoipPstnUser.SN);
 1576:             sb.AppendLine("PN: " + emsVoipPstnUser.PN);
 1577:             sb.AppendLine("MGID: " + emsVoipPstnUser.MGID);
 1578:             sb.AppendLine("MGNAME: " + emsVoipPstnUser.MGNAME);
 1579:             sb.AppendLine("TID: " + emsVoipPstnUser.TID);
 1580:             sb.AppendLine("DN: " + emsVoipPstnUser.DN);
 1581:             sb.AppendLine("LayeredConf: " + emsVoipPstnUser.LayeredConf);
 1582:             sb.AppendLine("HighLevelWidth: " + emsVoipPstnUser.HighLevelWidth);
 1583:             sb.AppendLine("LowerLevelWidth: " + emsVoipPstnUser.LowerLevelWidth);
 1584:             sb.AppendLine("Voltage: " + emsVoipPstnUser.Voltage);
 1585:             sb.AppendLine("KCType: " + emsVoipPstnUser.KCType);
 1586:             sb.AppendLine("VoiceGain: " + emsVoipPstnUser.VoiceGain);
 1587:             sb.AppendLine("LimitPulseDial: " + emsVoipPstnUser.LimitPulseDial);
 1588:             sb.AppendLine("RevPolarity: " + emsVoipPstnUser.RevPolarity);
 1589:             sb.AppendLine("RevPoleLevel: " + emsVoipPstnUser.RevPoleLevel);
 1590:             sb.AppendLine("RevPolePulse: " + emsVoipPstnUser.RevPolePulse);
 1591:             sb.AppendLine("PSTAT: " + emsVoipPstnUser.PSTAT);
 1592:             sb.AppendLine("ConfigStatus: " + emsVoipPstnUser.ConfigStatus);
 1593:             sb.AppendLine("ServiceStatus: " + emsVoipPstnUser.ServiceStatus);
 1594:             sb.AppendLine("ServiceType: " + emsVoipPstnUser.ServiceType);
 1595:             sb.AppendLine("ALIAS: " + emsVoipPstnUser.ALIAS);
 1596:             sb.AppendLine("UserType: " + emsVoipPstnUser.UserType);
 1597:             sb.AppendLine("Impedance: " + emsVoipPstnUser.Impedance);
 1598:             sb.AppendLine("Current: " + emsVoipPstnUser.Current);
 1599:             sb.AppendLine("DCTime: " + emsVoipPstnUser.DCTime);
 1600:             sb.AppendLine("PITime: " + emsVoipPstnUser.PITime);
 1601:             sb.AppendLine("FSKDelayInterval: " + emsVoipPstnUser.FSKDelayInterval);
 1602:             sb.AppendLine("ActualVoiceGain: " + emsVoipPstnUser.ActualVoiceGain);
 1603:             sb.AppendLine("CidTransWhen: " + emsVoipPstnUser.CidTransWhen);
 1604:             sb.AppendLine("CidFormat: " + emsVoipPstnUser.CidFormat);
 1605:             sb.AppendLine("OverloadPRI: " + emsVoipPstnUser.OverloadPRI);
 1606:             sb.AppendLine("ImpedanceProfile: " + emsVoipPstnUser.ImpedanceProfile);
 1607:             sb.AppendLine("SendVoiceGain: " + emsVoipPstnUser.SendVoiceGain);
 1608:             sb.AppendLine("RecvVoiceGain: " + emsVoipPstnUser.RecvVoiceGain);
 1609:             sb.AppendLine("RevPolarityMode: " + emsVoipPstnUser.RevPolarityMode);
 1610:             sb.AppendLine("PortRunState: " + emsVoipPstnUser.PortRunState);
 1611:             sb.AppendLine("PortTestState: " + emsVoipPstnUser.PortTestState);
 1612:             sb.AppendLine("PortLineState: " + emsVoipPstnUser.PortLineState);
 1613:             sb.AppendLine("PortLoopState: " + emsVoipPstnUser.PortLoopState);
 1614:             sb.AppendLine("ServiceRunState: " + emsVoipPstnUser.ServiceRunState);
 1615:             sb.AppendLine("ServiceAdminState: " + emsVoipPstnUser.ServiceAdminState);
 1616:             sb.AppendLine("ActualSendVoiceGain: " + emsVoipPstnUser.ActualSendVoiceGain);
 1617:             sb.AppendLine("ActualRecvVo: " + emsVoipPstnUser.ActualRecvVo);
 1618:             sb.AppendLine("AGCEnable: " + emsVoipPstnUser.AGCEnable);
 1619:             sb.AppendLine("AGCEnableLevel: " + emsVoipPstnUser.AGCEnableLevel);
 1620:             sb.AppendLine("SNSEnable: " + emsVoipPstnUser.SNSEnable);
 1621:             sb.AppendLine("SNSEnableLevel: " + emsVoipPstnUser.SNSEnableLevel);
 1622:             sb.AppendLine("NlpMode: " + emsVoipPstnUser.NlpMode);
 1623:             sb.AppendLine("LineLockEnable: " + emsVoipPstnUser.LineLockEnable);
 1624:             sb.AppendLine("DspInputGain: " + emsVoipPstnUser.DspInputGain);
 1625:             sb.AppendLine("DspOutputGain: " + emsVoipPstnUser.DspOutputGain);
 1626:             sb.AppendLine("ClipReversePole: " + emsVoipPstnUser.ClipReversePole);
 1627:             sb.AppendLine("DEFAULTCLI: " + emsVoipPstnUser.DEFAULTCLI);
 1628:             sb.AppendLine("USERGROUPID: " + emsVoipPstnUser.USERGROUPID);
 1629:             sb.AppendLine("ADJUSTFACTOR: " + emsVoipPstnUser.ADJUSTFACTOR);
 1630:             sb.AppendLine("DSPPROFILE: " + emsVoipPstnUser.DSPPROFILE);
 1631:  
 1632:             return sb.ToString();
 1633:         }
 1634:  
 1635:         ////////////////////////////////////////////////////////////////////////////
 1636:  
 1637:         /// <summary>
 1638:         ///
 1639:         /// </summary>
 1640:         public static string ToSimpleDidFnSnPnTextString(Ia.Ftn.Cl.Models.Huawei.EmsVoipPstnUser emsVoipPstnUser)
 1641:         {
 1642:             var s = "DID: " + emsVoipPstnUser.DID + ", FN: " + emsVoipPstnUser.FN + ", SN: " + emsVoipPstnUser.SN + ", PN: " + emsVoipPstnUser.PN;
 1643:  
 1644:             return s;
 1645:         }
 1646:  
 1647:         ////////////////////////////////////////////////////////////////////////////
 1648:         ////////////////////////////////////////////////////////////////////////////
 1649:     }
 1650:  
 1651:     ////////////////////////////////////////////////////////////////////////////
 1652:     ////////////////////////////////////////////////////////////////////////////
 1653: }