شركة التطبيقات المتكاملة لتصميم النظم البرمجية الخاصة ش.ش.و.

Integrated Applications Programming Company

Skip Navigation LinksHome » Code Library » VoipPstnUser

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 Optical Fiber Network (OFN) 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.Ngn.Cl.Model.Data.Huawei
   9:  {
  10:      ////////////////////////////////////////////////////////////////////////////
  11:   
  12:      /// <summary publish="true">
  13:      /// Huawei's EMS VOIP PSTN User support class of Optical Fiber Network (OFN) 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:      ///
  19:      /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
  20:      /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
  21:      ///
  22:      /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  23:      /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  24:      /// 
  25:      /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
  26:      /// 
  27:      /// Copyright notice: This notice may not be removed or altered from any source distribution.
  28:      /// </remarks> 
  29:      public class VoipPstnUser
  30:      {
  31:          /// <summary/>
  32:          public VoipPstnUser() { }
  33:   
  34:          ////////////////////////////////////////////////////////////////////////////
  35:   
  36:          /// <summary>
  37:          ///
  38:          /// </summary>
  39:          public static bool Update(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out Ia.Cl.Model.Result result)
  40:          {
  41:              bool isUpdated;
  42:              int did, queryFn, querySn, queryPn, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount, fn, sn, pn;
  43:              string id, queryCommand, queryDev, dn, nddOntIdOrMsanDevId;
  44:              DataColumnCollection columns;
  45:              DataRow columnDataRow;
  46:              Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
  47:              Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser voipPstnUser, newVoipPstnUser;
  48:              Ia.Ngn.Cl.Model.Huawei.EmsOnt emsOnt;
  49:              Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type emsDevType;
  50:              List<string> itemIdList;
  51:              List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> voipPstnUserList;
  52:   
  53:              isUpdated = false;
  54:              readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
  55:   
  56:              result = new Ia.Cl.Model.Result(); // remove initially then add to test all return paths
  57:   
  58:              queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
  59:   
  60:              //queryCommand = "LST-VOIPPSTNUSER::DEV=ARD_MSAN_Cabinet 1_Frame 0,FN=0,SN=2,PN=0:{ctag}::;";
  61:              //queryCommand = "LST-VOIPPSTNUSER::DEV=SAB_MSAN_Cabinet 4_Frame 0,FN=0,SN=3,PN=58:{ctag}::;";
  62:   
  63:              // LST-VOIPPSTNUSER::DEV=MDU-JBA-943-002,FN=0,SN=3,PN=10:{ctag}::;
  64:              // LST-VOIPPSTNUSER::DEV=ARD_MSAN_Cabinet 1_Frame 0,FN=0,SN=2,PN=0:{ctag}::;
  65:              queryDev = Ia.Cl.Model.Default.Match(queryCommand, @"DEV=(.+?),");
  66:              queryFn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"FN=(\d+)"));
  67:              querySn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"SN=(\d+)"));
  68:              queryPn = int.Parse(Ia.Cl.Model.Default.Match(queryCommand, @"PN=(\d+)"));
  69:   
  70:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
  71:              {
  72:                  if (response.CompletionCode == "COMPLD")
  73:                  {
  74:                      emsDevType = Ia.Ngn.Cl.Model.Data.Huawei.Dev.ReadTypeByDev(queryDev);
  75:   
  76:                      if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu || emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan)
  77:                      {
  78:                          if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu)
  79:                          {
  80:                              nddOnt = Ia.Ngn.Cl.Model.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(queryDev);
  81:   
  82:                              if (nddOnt != null)
  83:                              {
  84:                                  emsOnt = (from eo in db.EmsOnts where eo.Id == nddOnt.Id select eo).SingleOrDefault();
  85:   
  86:                                  if (emsOnt != null)
  87:                                  {
  88:                                      // this should always give a single value or none
  89:                                      voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
  90:                                                          where evpu.EmsOnt != null && evpu.EmsOnt.Id == emsOnt.Id && evpu.SN == querySn && evpu.PN == queryPn
  91:                                                          select evpu).ToList();
  92:   
  93:                                      nddOntIdOrMsanDevId = nddOnt.Id;
  94:                                  }
  95:                                  else
  96:                                  {
  97:                                      voipPstnUserList = null;
  98:                                      nddOntIdOrMsanDevId = string.Empty;
  99:   
 100:                                      result.AddWarning("EmsOnt is null for ont.Access.Name: " + nddOnt.Access.Name);
 101:                                  }
 102:                              }
 103:                              else
 104:                              {
 105:                                  voipPstnUserList = null;
 106:                                  nddOntIdOrMsanDevId = string.Empty;
 107:                              }
 108:                          }
 109:                          else //if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan)
 110:                          {
 111:                              var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
 112:                                             where m.Dev == queryDev
 113:                                             select m).SingleOrDefault();
 114:   
 115:                              nddOntIdOrMsanDevId = (msanDev != null) ? msanDev.Id : string.Empty;
 116:   
 117:                              voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
 118:                                                  where evpu.EmsOnt == null && evpu.Id.StartsWith(nddOntIdOrMsanDevId) && evpu.SN == querySn && evpu.PN == queryPn
 119:                                                  select evpu).ToList();
 120:                          }
 121:   
 122:                          if (voipPstnUserList != null)
 123:                          {
 124:                              existingItemCount = voipPstnUserList.Count;
 125:   
 126:                              if (response.QueryDataTable != null)
 127:                              {
 128:                                  if (response.QueryDataTable.Rows.Count >= 1)
 129:                                  {
 130:                                      itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
 131:   
 132:                                      columns = response.QueryDataTable.Columns;
 133:                                      readItemCount = response.QueryDataTable.Rows.Count;
 134:   
 135:                                      columnDataRow = response.QueryDataTable.Rows[0];
 136:   
 137:                                      foreach (DataRow dataRow in response.QueryDataTable.Rows)
 138:                                      {
 139:                                          did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
 140:                                          fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
 141:                                          sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
 142:                                          pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
 143:   
 144:                                          dn = columns.Contains("DN") ? dataRow[columns.IndexOf("DN")].ToString() : string.Empty;
 145:   
 146:                                          if (dn != "--") // "--" means empty
 147:                                          {
 148:                                              if (pn == queryPn && sn == querySn)
 149:                                              {
 150:                                                  // I'll check that the records are for a real 11 digit number, otherwise we will not send it to the database
 151:                                                  // for MDUs numbers will look like 96524805054
 152:                                                  // for MSAN numbers will look like +96524805054
 153:                                                  //if (
 154:                                                  //    Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn) && emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu
 155:                                                  //    ||
 156:                                                  //    Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn) && emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan
 157:                                                  //    )
 158:                                                  //{
 159:                                                  id = Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.VoipPstnUserId(nddOntIdOrMsanDevId, sn, pn);
 160:   
 161:                                                  voipPstnUser = (from eo in voipPstnUserList where eo.Id == id select eo).SingleOrDefault();
 162:   
 163:                                                  newVoipPstnUser = new Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser()
 164:                                                  {
 165:                                                      Id = id,
 166:                                                      DID = did,
 167:                                                      FN = fn,
 168:                                                      SN = sn,
 169:                                                      PN = pn,
 170:                                                      DN = dn.ToString(),
 171:                                                      MGID = columns.Contains("MGID") ? int.Parse(dataRow[columns.IndexOf("MGID")].ToString()) : 0,
 172:                                                      MGNAME = columns.Contains("MGNAME") ? dataRow[columns.IndexOf("MGNAME")].ToString() : string.Empty,
 173:                                                      TID = columns.Contains("TID") ? Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("TID", dataRow[columns.IndexOf("TID")].ToString()) : 0,
 174:                                                      LayeredConf = columns.Contains("LayeredConf") ? dataRow[columns.IndexOf("LayeredConf")].ToString() : string.Empty,
 175:                                                      HighLevelWidth = columns.Contains("HighLevelWidth") ? int.Parse(dataRow[columns.IndexOf("HighLevelWidth")].ToString()) : 0,
 176:                                                      LowerLevelWidth = columns.Contains("LowerLevelWidth") ? int.Parse(dataRow[columns.IndexOf("LowerLevelWidth")].ToString()) : 0,
 177:                                                      Voltage = columns.Contains("Voltage") ? dataRow[columns.IndexOf("Voltage")].ToString() : string.Empty,
 178:                                                      KCType = columns.Contains("KCType") ? dataRow[columns.IndexOf("KCType")].ToString() : string.Empty,
 179:                                                      VoiceGain = columns.Contains("VoiceGain") ? dataRow[columns.IndexOf("VoiceGain")].ToString() : string.Empty,
 180:                                                      LimitPulseDial = columns.Contains("LimitPulseDial") ? dataRow[columns.IndexOf("LimitPulseDial")].ToString() : string.Empty,
 181:                                                      RevPolarity = columns.Contains("RevPolarity") ? dataRow[columns.IndexOf("RevPolarity")].ToString() : string.Empty,
 182:                                                      RevPoleLevel = columns.Contains("RevPoleLevel") ? int.Parse(dataRow[columns.IndexOf("RevPoleLevel")].ToString()) : 0,
 183:                                                      RevPolePulse = columns.Contains("RevPolePulse") ? dataRow[columns.IndexOf("RevPolePulse")].ToString() : string.Empty,
 184:                                                      PSTAT = columns.Contains("PSTAT") ? dataRow[columns.IndexOf("PSTAT")].ToString() : string.Empty,
 185:                                                      ConfigStatus = columns.Contains("ConfigStatus") ? dataRow[columns.IndexOf("ConfigStatus")].ToString() : string.Empty,
 186:                                                      ServiceStatus = columns.Contains("ServiceStatus") ? dataRow[columns.IndexOf("ServiceStatus")].ToString() : string.Empty,
 187:                                                      ServiceType = columns.Contains("ServiceType") ? dataRow[columns.IndexOf("ServiceType")].ToString() : string.Empty,
 188:                                                      ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
 189:                                                      UserType = columns.Contains("UserType") ? dataRow[columns.IndexOf("UserType")].ToString() : string.Empty,
 190:                                                      Impedance = columns.Contains("Impedance") ? dataRow[columns.IndexOf("Impedance")].ToString() : string.Empty,
 191:                                                      Current = columns.Contains("Current") ? dataRow[columns.IndexOf("Current")].ToString() : string.Empty,
 192:                                                      DCTime = columns.Contains("DCTime") ? int.Parse(dataRow[columns.IndexOf("DCTime")].ToString()) : 0,
 193:                                                      PITime = columns.Contains("PITime") ? Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("PITime", dataRow[columns.IndexOf("PITime")].ToString()) : 0,
 194:                                                      FSKDelayInterval = columns.Contains("FSKDelayInterval") ? int.Parse(dataRow[columns.IndexOf("FSKDelayInterval")].ToString()) : 0,
 195:                                                      ActualVoiceGain = columns.Contains("ActualVoiceGain") ? dataRow[columns.IndexOf("ActualVoiceGain")].ToString() : string.Empty,
 196:                                                      CidTransWhen = columns.Contains("CidTransWhen") ? dataRow[columns.IndexOf("CidTransWhen")].ToString() : string.Empty,
 197:                                                      CidFormat = columns.Contains("CidFormat") ? dataRow[columns.IndexOf("CidFormat")].ToString() : string.Empty,
 198:                                                      OverloadPRI = columns.Contains("OverloadPRI") ? dataRow[columns.IndexOf("OverloadPRI")].ToString() : string.Empty,
 199:                                                      ImpedanceProfile = columns.Contains("ImpedanceProfile") ? dataRow[columns.IndexOf("ImpedanceProfile")].ToString() : string.Empty,
 200:                                                      SendVoiceGain = columns.Contains("SendVoiceGain") ? dataRow[columns.IndexOf("SendVoiceGain")].ToString() : string.Empty,
 201:                                                      RecvVoiceGain = columns.Contains("RecvVoiceGain") ? dataRow[columns.IndexOf("RecvVoiceGain")].ToString() : string.Empty,
 202:                                                      RevPolarityMode = columns.Contains("RevPolarityMode") ? dataRow[columns.IndexOf("RevPolarityMode")].ToString() : string.Empty,
 203:                                                      PortRunState = columns.Contains("PortRunState") ? dataRow[columns.IndexOf("PortRunState")].ToString() : string.Empty,
 204:                                                      PortTestState = columns.Contains("PortTestState") ? dataRow[columns.IndexOf("PortTestState")].ToString() : string.Empty,
 205:                                                      PortLineState = columns.Contains("PortLineState") ? dataRow[columns.IndexOf("PortLineState")].ToString() : string.Empty,
 206:                                                      PortLoopState = columns.Contains("PortLoopState") ? dataRow[columns.IndexOf("PortLoopState")].ToString() : string.Empty,
 207:                                                      ServiceRunState = columns.Contains("ServiceRunState") ? dataRow[columns.IndexOf("ServiceRunState")].ToString() : string.Empty,
 208:                                                      ServiceAdminState = columns.Contains("ServiceAdminState") ? dataRow[columns.IndexOf("ServiceAdminState")].ToString() : string.Empty,
 209:                                                      ActualSendVoiceGain = columns.Contains("ActualSendVoiceGain") ? dataRow[columns.IndexOf("ActualSendVoiceGain")].ToString() : string.Empty,
 210:                                                      ActualRecvVo = columns.Contains("ActualRecvVo") ? dataRow[columns.IndexOf("ActualRecvVo")].ToString() : string.Empty,
 211:                                                      AGCEnable = columns.Contains("AGCEnable") ? dataRow[columns.IndexOf("AGCEnable")].ToString() : string.Empty,
 212:                                                      AGCEnableLevel = columns.Contains("AGCEnableLevel") ? int.Parse(dataRow[columns.IndexOf("AGCEnableLevel")].ToString()) : 0,
 213:                                                      SNSEnable = columns.Contains("SNSEnable") ? dataRow[columns.IndexOf("SNSEnable")].ToString() : string.Empty,
 214:                                                      SNSEnableLevel = columns.Contains("SNSEnableLevel") ? int.Parse(dataRow[columns.IndexOf("SNSEnableLevel")].ToString()) : 0,
 215:                                                      NlpMode = columns.Contains("NlpMode") ? dataRow[columns.IndexOf("NlpMode")].ToString() : string.Empty,
 216:                                                      LineLockEnable = columns.Contains("LineLockEnable") ? dataRow[columns.IndexOf("LineLockEnable")].ToString() : string.Empty,
 217:                                                      DspInputGain = columns.Contains("DspInputGain") ? dataRow[columns.IndexOf("DspInputGain")].ToString() : string.Empty,
 218:                                                      DspOutputGain = columns.Contains("DspOutputGain") ? dataRow[columns.IndexOf("DspOutputGain")].ToString() : string.Empty,
 219:                                                      ClipReversePole = columns.Contains("ClipReversePole") ? dataRow[columns.IndexOf("ClipReversePole")].ToString() : string.Empty,
 220:                                                      DEFAULTCLI = columns.Contains("DEFAULTCLI") ? dataRow[columns.IndexOf("DEFAULTCLI")].ToString() : string.Empty,
 221:                                                      USERGROUPID = columns.Contains("USERGROUPID") ? int.Parse(dataRow[columns.IndexOf("USERGROUPID")].ToString()) : 0,
 222:                                                      ADJUSTFACTOR = columns.Contains("ADJUSTFACTOR") ? int.Parse(dataRow[columns.IndexOf("ADJUSTFACTOR")].ToString()) : 0,
 223:                                                      DSPPROFILE = columns.Contains("DSPPROFILE") ? dataRow[columns.IndexOf("DSPPROFILE")].ToString() : string.Empty,
 224:   
 225:                                                      EmsOnt = (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu) ? (from eo in db.EmsOnts where eo.Id == nddOntIdOrMsanDevId select eo).SingleOrDefault() : null
 226:                                                  };
 227:   
 228:                                                  if (voipPstnUser == null)
 229:                                                  {
 230:                                                      newVoipPstnUser.Created = newVoipPstnUser.Updated = DateTime.UtcNow.AddHours(3);
 231:   
 232:                                                      db.EmsVoipPstnUsers.Add(newVoipPstnUser);
 233:   
 234:                                                      insertedItemCount++;
 235:                                                  }
 236:                                                  else // update
 237:                                                  {
 238:                                                      // below: copy values from newVoipPstnUser to voipPstnUser
 239:   
 240:                                                      if (voipPstnUser.Update(newVoipPstnUser))
 241:                                                      {
 242:                                                          db.EmsVoipPstnUsers.Attach(voipPstnUser);
 243:                                                          db.Entry(voipPstnUser).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 244:   
 245:                                                          updatedItemCount++;
 246:                                                      }
 247:                                                  }
 248:   
 249:                                                  itemIdList.Add(id); // keep at the end
 250:                                                  //}
 251:                                                  //else
 252:                                                  //{
 253:                                                  //    result.AddError("dn:" + dn + ", emsDevType:" + emsDevType.ToString() + ". dn and emsDevtype values are inconsistent.");
 254:                                                  //}
 255:                                              }
 256:                                              else
 257:                                              {
 258:                                                  result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): pn != queryPn and/or sn != querySn.");
 259:                                              }
 260:                                          }
 261:                                          else
 262:                                          {
 263:                                              result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): dn is -- empty.");
 264:                                          }
 265:                                      }
 266:   
 267:                                      // below: this function will remove values that were not present in the reading
 268:                                      if (voipPstnUserList.Count > 0)
 269:                                      {
 270:                                          foreach (Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser v in voipPstnUserList)
 271:                                          {
 272:                                              if (!itemIdList.Contains(v.Id))
 273:                                              {
 274:                                                  voipPstnUser = (from evpu in db.EmsVoipPstnUsers
 275:                                                                  where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
 276:                                                                  select evpu).SingleOrDefault();
 277:   
 278:                                                  db.EmsVoipPstnUsers.Remove(voipPstnUser);
 279:   
 280:                                                  deletedItemCount++;
 281:                                              }
 282:                                          }
 283:                                      }
 284:                                  }
 285:                                  else //if (response.QueryDataTable.Rows.Count == 0)
 286:                                  {
 287:                                      if (voipPstnUserList.Count > 0)
 288:                                      {
 289:                                          foreach (Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser v in voipPstnUserList)
 290:                                          {
 291:                                              voipPstnUser = (from evpu in db.EmsVoipPstnUsers
 292:                                                              where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
 293:                                                              select evpu).SingleOrDefault();
 294:   
 295:                                              db.EmsVoipPstnUsers.Remove(voipPstnUser);
 296:   
 297:                                              deletedItemCount++;
 298:                                          }
 299:                                      }
 300:                                  }
 301:   
 302:                                  db.SaveChanges();
 303:   
 304:                                  if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
 305:                                  else isUpdated = false;
 306:   
 307:                                  result.AddSuccess("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
 308:                              }
 309:                              else
 310:                              {
 311:                                  result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
 312:                              }
 313:                          }
 314:                          else
 315:                          {
 316:                              result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): voipPstnUserList is null.");
 317:                          }
 318:                      }
 319:                      else
 320:                      {
 321:                          result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): for DEV: " + queryDev + " emsDevType is neither MDU nor MSAN.");
 322:                      }
 323:                  }
 324:                  else
 325:                  {
 326:                      result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
 327:                  }
 328:              }
 329:   
 330:              return isUpdated;
 331:          }
 332:   
 333:          ////////////////////////////////////////////////////////////////////////////
 334:   
 335:          /// <summary>
 336:          ///
 337:          /// </summary>
 338:          public static bool UpdateByDn(Ia.Ngn.Cl.Model.Business.Huawei.Ems.Response response, out string updatedService, out Ia.Cl.Model.Result result)
 339:          {
 340:              bool isUpdated;
 341:              int did, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount, fn, sn, pn;
 342:              string id, queryCommand, queryDn, dn, dev, nddOntIdOrMsanDevId;
 343:              DataColumnCollection columns;
 344:              DataRow columnDataRow;
 345:              Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
 346:              Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser voipPstnUser, newVoipPstnUser;
 347:              Ia.Ngn.Cl.Model.Huawei.EmsOnt emsOnt;
 348:              Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type emsDevType;
 349:              List<string> itemIdList;
 350:              List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> voipPstnUserList;
 351:   
 352:              isUpdated = false;
 353:              updatedService = string.Empty;
 354:              readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
 355:   
 356:              result = new Ia.Cl.Model.Result(); // remove initially then add to test all return paths
 357:   
 358:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 359:              {
 360:                  if (response.CompletionCode == "COMPLD")
 361:                  {
 362:                      //if (response.ResultCode == Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode.NoMatchingPortPleaseCheckTheDataSetting)
 363:                      //{
 364:                      //    result.AddWarning("LST-VOIPPSTNUSER: (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
 365:                      //}
 366:                      //else //if (response.ResultCode == Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode.Succeeded)
 367:                      //{
 368:                      queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
 369:   
 370:                      //queryCommand = "LST-VOIPPSTNUSER::DN=96524805054:{ctag}::;";
 371:   
 372:                      // LST-VOIPPSTNUSER::DN=+96524805054:{ctag}::;
 373:                      // LST-VOIPPSTNUSER::DN=96524805054:{ctag}::;
 374:                      queryDn = Ia.Cl.Model.Default.Match(queryCommand, @"DN=(.+?):");
 375:   
 376:                      // VoIP PSTN user of the device ARD_MSAN_Cabinet 1_Frame 0
 377:                      // VoIP PSTN user of the device MDU-MHL-2101-004
 378:                      dev = response.Title.Replace("VoIP PSTN user of the device ", "");
 379:   
 380:                      emsDevType = Ia.Ngn.Cl.Model.Data.Huawei.Dev.ReadTypeByDev(dev);
 381:   
 382:                      if (emsDevType != Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu && emsDevType != Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan)
 383:                      {
 384:                          emsDevType = Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.DevTypeFromDn(queryDn);
 385:                      }
 386:   
 387:                      if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu || emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan)
 388:                      {
 389:                          if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu)
 390:                          {
 391:                              nddOnt = Ia.Ngn.Cl.Model.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(dev);
 392:   
 393:                              nddOntIdOrMsanDevId = (nddOnt != null) ? nddOnt.Id : string.Empty;
 394:   
 395:                              if (nddOnt != null)
 396:                              {
 397:                                  emsOnt = (from eo in db.EmsOnts where eo.Id == nddOnt.Id select eo).SingleOrDefault();
 398:   
 399:                                  if (emsOnt != null)
 400:                                  {
 401:                                      // this should always give a single value or none
 402:                                      voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
 403:                                                          where evpu.EmsOnt != null && evpu.EmsOnt.Id == emsOnt.Id && evpu.DN == queryDn
 404:                                                          select evpu).ToList();
 405:                                  }
 406:                                  else
 407:                                  {
 408:                                      voipPstnUserList = new List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser>();
 409:                                  }
 410:                              }
 411:                              else
 412:                              {
 413:                                  voipPstnUserList = new List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser>();
 414:                              }
 415:                          }
 416:                          else //if (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Msan)
 417:                          {
 418:                              var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
 419:                                             where m.Dev == dev
 420:                                             select m).SingleOrDefault();
 421:   
 422:                              nddOntIdOrMsanDevId = (msanDev != null) ? msanDev.Id : string.Empty;
 423:   
 424:                              voipPstnUserList = (from evpu in db.EmsVoipPstnUsers
 425:                                                  where evpu.EmsOnt == null && evpu.Id.StartsWith(nddOntIdOrMsanDevId) && evpu.DN == queryDn
 426:                                                  select evpu).ToList();
 427:                          }
 428:   
 429:                          if (voipPstnUserList != null)
 430:                          {
 431:                              existingItemCount = voipPstnUserList.Count;
 432:   
 433:                              if (response.QueryDataTable != null)
 434:                              {
 435:                                  if (response.QueryDataTable.Rows.Count >= 1)
 436:                                  {
 437:                                      itemIdList = new List<string>(response.QueryDataTable.Rows.Count + 1);
 438:   
 439:                                      columns = response.QueryDataTable.Columns;
 440:                                      readItemCount = response.QueryDataTable.Rows.Count;
 441:   
 442:                                      columnDataRow = response.QueryDataTable.Rows[0];
 443:   
 444:                                      foreach (DataRow dataRow in response.QueryDataTable.Rows)
 445:                                      {
 446:                                          did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
 447:                                          fn = int.Parse(dataRow[columns.IndexOf("FN")].ToString());
 448:                                          sn = int.Parse(dataRow[columns.IndexOf("SN")].ToString());
 449:                                          pn = int.Parse(dataRow[columns.IndexOf("PN")].ToString());
 450:   
 451:                                          dn = columns.Contains("DN") ? dataRow[columns.IndexOf("DN")].ToString() : string.Empty;
 452:   
 453:                                          if (dn != "--") // "--" means empty
 454:                                          {
 455:                                              if (dn == queryDn)
 456:                                              {
 457:                                                  id = Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.VoipPstnUserId(nddOntIdOrMsanDevId, sn, pn);
 458:   
 459:                                                  voipPstnUser = (from eo in voipPstnUserList where eo.Id == id select eo).SingleOrDefault();
 460:   
 461:                                                  newVoipPstnUser = new Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser()
 462:                                                  {
 463:                                                      Id = id,
 464:                                                      DID = did,
 465:                                                      FN = fn,
 466:                                                      SN = sn,
 467:                                                      PN = pn,
 468:                                                      DN = dn.ToString(),
 469:                                                      MGID = columns.Contains("MGID") ? int.Parse(dataRow[columns.IndexOf("MGID")].ToString()) : 0,
 470:                                                      MGNAME = columns.Contains("MGNAME") ? dataRow[columns.IndexOf("MGNAME")].ToString() : string.Empty,
 471:                                                      TID = columns.Contains("TID") ? Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("TID", dataRow[columns.IndexOf("TID")].ToString()) : 0,
 472:                                                      LayeredConf = columns.Contains("LayeredConf") ? dataRow[columns.IndexOf("LayeredConf")].ToString() : string.Empty,
 473:                                                      HighLevelWidth = columns.Contains("HighLevelWidth") ? int.Parse(dataRow[columns.IndexOf("HighLevelWidth")].ToString()) : 0,
 474:                                                      LowerLevelWidth = columns.Contains("LowerLevelWidth") ? int.Parse(dataRow[columns.IndexOf("LowerLevelWidth")].ToString()) : 0,
 475:                                                      Voltage = columns.Contains("Voltage") ? dataRow[columns.IndexOf("Voltage")].ToString() : string.Empty,
 476:                                                      KCType = columns.Contains("KCType") ? dataRow[columns.IndexOf("KCType")].ToString() : string.Empty,
 477:                                                      VoiceGain = columns.Contains("VoiceGain") ? dataRow[columns.IndexOf("VoiceGain")].ToString() : string.Empty,
 478:                                                      LimitPulseDial = columns.Contains("LimitPulseDial") ? dataRow[columns.IndexOf("LimitPulseDial")].ToString() : string.Empty,
 479:                                                      RevPolarity = columns.Contains("RevPolarity") ? dataRow[columns.IndexOf("RevPolarity")].ToString() : string.Empty,
 480:                                                      RevPoleLevel = columns.Contains("RevPoleLevel") ? int.Parse(dataRow[columns.IndexOf("RevPoleLevel")].ToString()) : 0,
 481:                                                      RevPolePulse = columns.Contains("RevPolePulse") ? dataRow[columns.IndexOf("RevPolePulse")].ToString() : string.Empty,
 482:                                                      PSTAT = columns.Contains("PSTAT") ? dataRow[columns.IndexOf("PSTAT")].ToString() : string.Empty,
 483:                                                      ConfigStatus = columns.Contains("ConfigStatus") ? dataRow[columns.IndexOf("ConfigStatus")].ToString() : string.Empty,
 484:                                                      ServiceStatus = columns.Contains("ServiceStatus") ? dataRow[columns.IndexOf("ServiceStatus")].ToString() : string.Empty,
 485:                                                      ServiceType = columns.Contains("ServiceType") ? dataRow[columns.IndexOf("ServiceType")].ToString() : string.Empty,
 486:                                                      ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
 487:                                                      UserType = columns.Contains("UserType") ? dataRow[columns.IndexOf("UserType")].ToString() : string.Empty,
 488:                                                      Impedance = columns.Contains("Impedance") ? dataRow[columns.IndexOf("Impedance")].ToString() : string.Empty,
 489:                                                      Current = columns.Contains("Current") ? dataRow[columns.IndexOf("Current")].ToString() : string.Empty,
 490:                                                      DCTime = columns.Contains("DCTime") ? int.Parse(dataRow[columns.IndexOf("DCTime")].ToString()) : 0,
 491:                                                      PITime = columns.Contains("PITime") ? Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.SpecialIntegerParameterHandling("PITime", dataRow[columns.IndexOf("PITime")].ToString()) : 0,
 492:                                                      FSKDelayInterval = columns.Contains("FSKDelayInterval") ? int.Parse(dataRow[columns.IndexOf("FSKDelayInterval")].ToString()) : 0,
 493:                                                      ActualVoiceGain = columns.Contains("ActualVoiceGain") ? dataRow[columns.IndexOf("ActualVoiceGain")].ToString() : string.Empty,
 494:                                                      CidTransWhen = columns.Contains("CidTransWhen") ? dataRow[columns.IndexOf("CidTransWhen")].ToString() : string.Empty,
 495:                                                      CidFormat = columns.Contains("CidFormat") ? dataRow[columns.IndexOf("CidFormat")].ToString() : string.Empty,
 496:                                                      OverloadPRI = columns.Contains("OverloadPRI") ? dataRow[columns.IndexOf("OverloadPRI")].ToString() : string.Empty,
 497:                                                      ImpedanceProfile = columns.Contains("ImpedanceProfile") ? dataRow[columns.IndexOf("ImpedanceProfile")].ToString() : string.Empty,
 498:                                                      SendVoiceGain = columns.Contains("SendVoiceGain") ? dataRow[columns.IndexOf("SendVoiceGain")].ToString() : string.Empty,
 499:                                                      RecvVoiceGain = columns.Contains("RecvVoiceGain") ? dataRow[columns.IndexOf("RecvVoiceGain")].ToString() : string.Empty,
 500:                                                      RevPolarityMode = columns.Contains("RevPolarityMode") ? dataRow[columns.IndexOf("RevPolarityMode")].ToString() : string.Empty,
 501:                                                      PortRunState = columns.Contains("PortRunState") ? dataRow[columns.IndexOf("PortRunState")].ToString() : string.Empty,
 502:                                                      PortTestState = columns.Contains("PortTestState") ? dataRow[columns.IndexOf("PortTestState")].ToString() : string.Empty,
 503:                                                      PortLineState = columns.Contains("PortLineState") ? dataRow[columns.IndexOf("PortLineState")].ToString() : string.Empty,
 504:                                                      PortLoopState = columns.Contains("PortLoopState") ? dataRow[columns.IndexOf("PortLoopState")].ToString() : string.Empty,
 505:                                                      ServiceRunState = columns.Contains("ServiceRunState") ? dataRow[columns.IndexOf("ServiceRunState")].ToString() : string.Empty,
 506:                                                      ServiceAdminState = columns.Contains("ServiceAdminState") ? dataRow[columns.IndexOf("ServiceAdminState")].ToString() : string.Empty,
 507:                                                      ActualSendVoiceGain = columns.Contains("ActualSendVoiceGain") ? dataRow[columns.IndexOf("ActualSendVoiceGain")].ToString() : string.Empty,
 508:                                                      ActualRecvVo = columns.Contains("ActualRecvVo") ? dataRow[columns.IndexOf("ActualRecvVo")].ToString() : string.Empty,
 509:                                                      AGCEnable = columns.Contains("AGCEnable") ? dataRow[columns.IndexOf("AGCEnable")].ToString() : string.Empty,
 510:                                                      AGCEnableLevel = columns.Contains("AGCEnableLevel") ? int.Parse(dataRow[columns.IndexOf("AGCEnableLevel")].ToString()) : 0,
 511:                                                      SNSEnable = columns.Contains("SNSEnable") ? dataRow[columns.IndexOf("SNSEnable")].ToString() : string.Empty,
 512:                                                      SNSEnableLevel = columns.Contains("SNSEnableLevel") ? int.Parse(dataRow[columns.IndexOf("SNSEnableLevel")].ToString()) : 0,
 513:                                                      NlpMode = columns.Contains("NlpMode") ? dataRow[columns.IndexOf("NlpMode")].ToString() : string.Empty,
 514:                                                      LineLockEnable = columns.Contains("LineLockEnable") ? dataRow[columns.IndexOf("LineLockEnable")].ToString() : string.Empty,
 515:                                                      DspInputGain = columns.Contains("DspInputGain") ? dataRow[columns.IndexOf("DspInputGain")].ToString() : string.Empty,
 516:                                                      DspOutputGain = columns.Contains("DspOutputGain") ? dataRow[columns.IndexOf("DspOutputGain")].ToString() : string.Empty,
 517:                                                      ClipReversePole = columns.Contains("ClipReversePole") ? dataRow[columns.IndexOf("ClipReversePole")].ToString() : string.Empty,
 518:                                                      DEFAULTCLI = columns.Contains("DEFAULTCLI") ? dataRow[columns.IndexOf("DEFAULTCLI")].ToString() : string.Empty,
 519:                                                      USERGROUPID = columns.Contains("USERGROUPID") ? int.Parse(dataRow[columns.IndexOf("USERGROUPID")].ToString()) : 0,
 520:                                                      ADJUSTFACTOR = columns.Contains("ADJUSTFACTOR") ? int.Parse(dataRow[columns.IndexOf("ADJUSTFACTOR")].ToString()) : 0,
 521:                                                      DSPPROFILE = columns.Contains("DSPPROFILE") ? dataRow[columns.IndexOf("DSPPROFILE")].ToString() : string.Empty,
 522:   
 523:                                                      EmsOnt = (emsDevType == Ia.Ngn.Cl.Model.Business.Huawei.Dev.Type.Mdu) ? (from eo in db.EmsOnts where eo.Id == nddOntIdOrMsanDevId select eo).SingleOrDefault() : null
 524:                                                  };
 525:   
 526:                                                  if (voipPstnUser == null)
 527:                                                  {
 528:                                                      newVoipPstnUser.Created = newVoipPstnUser.Updated = DateTime.UtcNow.AddHours(3);
 529:   
 530:                                                      db.EmsVoipPstnUsers.Add(newVoipPstnUser);
 531:   
 532:                                                      insertedItemCount++;
 533:                                                  }
 534:                                                  else // update
 535:                                                  {
 536:                                                      // below: copy values from newVoipPstnUser to ontSipInfo
 537:   
 538:                                                      if (voipPstnUser.Update(newVoipPstnUser))
 539:                                                      {
 540:                                                          db.EmsVoipPstnUsers.Attach(voipPstnUser);
 541:                                                          db.Entry(voipPstnUser).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 542:   
 543:                                                          updatedItemCount++;
 544:                                                      }
 545:                                                  }
 546:   
 547:                                                  itemIdList.Add(id); // keep at the end
 548:   
 549:                                                  updatedService = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(dn);
 550:                                              }
 551:                                              else result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): dn not equal to queryDn.");
 552:                                          }
 553:                                          else result.AddWarning("LST-VOIPPSTNUSER (" + response.Ctag + "): dn is -- empty.");
 554:                                      }
 555:   
 556:                                      // below: this function will remove values that were not present in the reading
 557:                                      if (voipPstnUserList.Count > 0)
 558:                                      {
 559:                                          foreach (Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser v in voipPstnUserList)
 560:                                          {
 561:                                              if (!itemIdList.Contains(v.Id))
 562:                                              {
 563:                                                  voipPstnUser = (from evpu in db.EmsVoipPstnUsers
 564:                                                                  where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
 565:                                                                  select evpu).SingleOrDefault();
 566:   
 567:                                                  db.EmsVoipPstnUsers.Remove(voipPstnUser);
 568:   
 569:                                                  deletedItemCount++;
 570:   
 571:                                                  updatedService = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(voipPstnUser.DN);
 572:                                              }
 573:                                          }
 574:                                      }
 575:                                  }
 576:                                  else //if (response.QueryDataTable.Rows.Count == 0)
 577:                                  {
 578:                                      if (voipPstnUserList.Count > 0)
 579:                                      {
 580:                                          foreach (Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser v in voipPstnUserList)
 581:                                          {
 582:                                              voipPstnUser = (from evpu in db.EmsVoipPstnUsers
 583:                                                              where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
 584:                                                              select evpu).SingleOrDefault();
 585:   
 586:                                              db.EmsVoipPstnUsers.Remove(voipPstnUser);
 587:   
 588:                                              deletedItemCount++;
 589:   
 590:                                              updatedService = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(voipPstnUser.DN);
 591:                                          }
 592:                                      }
 593:                                  }
 594:                              }
 595:                              else
 596:                              {
 597:                                  if (voipPstnUserList.Count > 0)
 598:                                  {
 599:                                      foreach (Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser v in voipPstnUserList)
 600:                                      {
 601:                                          voipPstnUser = (from evpu in db.EmsVoipPstnUsers
 602:                                                          where /*evpu.EmsOnt != null &&*/ evpu.Id == v.Id
 603:                                                          select evpu).SingleOrDefault();
 604:   
 605:                                          db.EmsVoipPstnUsers.Remove(voipPstnUser);
 606:   
 607:                                          deletedItemCount++;
 608:   
 609:                                          updatedService = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(voipPstnUser.DN);
 610:                                      }
 611:                                  }
 612:                              }
 613:   
 614:                              db.SaveChanges();
 615:   
 616:                              if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
 617:                              else isUpdated = false;
 618:   
 619:                              result.AddSuccess("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
 620:                          }
 621:                          else
 622:                          {
 623:                              result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): voipPstnUserList is null.");
 624:                          }
 625:                      }
 626:                      else
 627:                      {
 628:                          result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): for DEV: " + dev + " emsDevType is neither MDU nor MSAN.");
 629:                      }
 630:                      //}
 631:                      //else
 632:                      //{
 633:                      //    result.AddError("LST-VOIPPSTNUSER: (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
 634:                      //}
 635:                  }
 636:                  else
 637:                  {
 638:                      result.AddError("LST-VOIPPSTNUSER (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
 639:                  }
 640:              }
 641:   
 642:              return isUpdated;
 643:          }
 644:   
 645:          ////////////////////////////////////////////////////////////////////////////
 646:   
 647:          /// <summary>
 648:          ///
 649:          /// </summary>
 650:          public static List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> List()
 651:          {
 652:              List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> list;
 653:   
 654:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 655:              {
 656:                  list = (from evpu in db.EmsVoipPstnUsers
 657:                              //where evpu.EmsOnt != null
 658:                          select evpu).ToList();
 659:              }
 660:   
 661:              return list;
 662:          }
 663:   
 664:          ////////////////////////////////////////////////////////////////////////////
 665:   
 666:          /// <summary>
 667:          ///
 668:          /// </summary>
 669:          public static List<string> ServiceList()
 670:          {
 671:              List<string> list;
 672:   
 673:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 674:              {
 675:                  var list0 = (from evpu in db.EmsVoipPstnUsers select evpu.DN).AsNoTracking().ToList();
 676:   
 677:                  list = (from l in list0 select Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l)).Distinct().ToList();
 678:              }
 679:   
 680:              return list;
 681:          }
 682:   
 683:          ////////////////////////////////////////////////////////////////////////////
 684:   
 685:          /// <summary>
 686:          ///
 687:          /// </summary>
 688:          public static List<string> DuplicateMduDnServiceWithCountryCodeOrMsanDnServiceImpuAidServiceList()
 689:          {
 690:              List<string> list;
 691:   
 692:              //var dummy = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
 693:   
 694:              // I'll check that the records are for a real 11 digit number, otherwise we will not send it to the database
 695:              // for MDUs numbers will look like 96524805054 Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn);
 696:              // for MSAN numbers will look like +96524805054 Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn)
 697:   
 698:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 699:              {
 700:                  var list0 = (from evpu1 in db.EmsVoipPstnUsers
 701:                               join evpu2 in db.EmsVoipPstnUsers on evpu1.DN equals evpu2.DN
 702:                               where evpu1.Id != evpu2.Id
 703:                               select new { Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(evpu1.DN) }).Distinct().ToList();
 704:   
 705:                  var list1 = (from evpu1 in db.EmsVoipPstnUsers
 706:                               join evpu2 in db.EmsVoipPstnUsers on evpu1.DN equals "+" + evpu2.DN
 707:                               where evpu1.Id != evpu2.Id
 708:                               select new { Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(evpu1.DN) }).Distinct().ToList();
 709:   
 710:                  var list2 = list0.Union(list1).Distinct().ToList();
 711:   
 712:                  list = (from l in list2 select l.Service).ToList();
 713:              }
 714:   
 715:              return list;
 716:          }
 717:   
 718:          ////////////////////////////////////////////////////////////////////////////
 719:   
 720:          /// <summary>
 721:          ///
 722:          /// </summary>
 723:          public static List<string> InconsistentRecordsWhereEmsOntIsNullAndDnIsImpuAidHasPlusFormatOrEmsOntIsNotNullAndDnIsInServiceWithCountryCodeNoPlusFormatList()
 724:          {
 725:              List<string> list;
 726:   
 727:              //var dummy = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
 728:   
 729:              // for MDUs numbers will look like 96524805054 Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToServiceWithCountryCode(dn);
 730:              // for MSAN numbers will look like +96524805054 Ia.Ngn.Cl.Model.Business.NumberFormatConverter.IsMatchToImpuAid(dn)
 731:   
 732:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 733:              {
 734:                  // select * from EmsVoipPstnUsers where EmsOnt_Id is not null and dn like '+%'
 735:                  var list0 = (from evpu in db.EmsVoipPstnUsers
 736:                               where evpu.EmsOnt != null && evpu.DN.StartsWith("+")
 737:                               select new { Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(evpu.DN) }).Distinct().ToList();
 738:   
 739:                  // select * from EmsVoipPstnUsers where EmsOnt_Id is null and dn not like '+%'
 740:                  var list1 = (from evpu in db.EmsVoipPstnUsers
 741:                               where evpu.EmsOnt == null && !evpu.DN.StartsWith("+")
 742:                               select new { Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(evpu.DN) }).Distinct().ToList();
 743:   
 744:                  var list2 = list0.Union(list1).Distinct().ToList();
 745:   
 746:                  list = (from l in list2 select l.Service).ToList();
 747:              }
 748:   
 749:              return list;
 750:          }
 751:   
 752:          ////////////////////////////////////////////////////////////////////////////
 753:   
 754:          /// <summary>
 755:          ///
 756:          /// </summary>
 757:          public static List<string> ServiceIdWithinSipOltList()
 758:          {
 759:              int serviceType;
 760:              string service, serviceId;
 761:              List<int> sipOltIdList;
 762:              List<string> list, serviceIdList;
 763:   
 764:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 765:              sipOltIdList = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.SipOltIdList;
 766:   
 767:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 768:              {
 769:                  list = (from evpu in db.EmsVoipPstnUsers
 770:                          where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
 771:                          select evpu.DN).AsNoTracking().ToList();
 772:              }
 773:   
 774:              if (list != null && list.Count > 0)
 775:              {
 776:                  serviceIdList = new List<string>(list.Count);
 777:   
 778:                  foreach (string s in list)
 779:                  {
 780:                      service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(s);
 781:   
 782:                      serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 783:   
 784:                      serviceIdList.Add(serviceId);
 785:                  }
 786:              }
 787:              else
 788:              {
 789:                  serviceIdList = new List<string>();
 790:              }
 791:   
 792:              return serviceIdList;
 793:          }
 794:   
 795:          ////////////////////////////////////////////////////////////////////////////
 796:   
 797:          /// <summary>
 798:          ///
 799:          /// </summary>
 800:          public static List<string> ServiceWithinEmsVoipPstnUserWhereEmsDevResultCodeDeviceOfflineError()
 801:          {
 802:              string service;
 803:              List<string> serviceList;
 804:   
 805:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 806:              {
 807:                  var list = (from evpu in db.EmsVoipPstnUsers
 808:                              where evpu.EmsOnt != null && evpu.EmsOnt.Access != null
 809:                              select new { evpu.DN, evpu.DID }).AsNoTracking().ToList();
 810:   
 811:                  if (list != null && list.Count > 0)
 812:                  {
 813:                      serviceList = new List<string>(list.Count);
 814:   
 815:                      var didToResultCodeDictionary = Ia.Ngn.Cl.Model.Data.Huawei.Dev.DidToResultCodeDictionary;
 816:   
 817:                      foreach (var evpu in list)
 818:                      {
 819:                          if (didToResultCodeDictionary.ContainsKey(evpu.DID))
 820:                          {
 821:                              var resultCode = didToResultCodeDictionary[evpu.DID];
 822:   
 823:                              if (resultCode == (long)Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode.DeviceOfflineError)
 824:                              {
 825:                                  service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(evpu.DN);
 826:   
 827:                                  serviceList.Add(service);
 828:                              }
 829:                          }
 830:                      }
 831:                  }
 832:                  else
 833:                  {
 834:                      serviceList = new List<string>();
 835:                  }
 836:              }
 837:   
 838:              return serviceList;
 839:          }
 840:   
 841:          ////////////////////////////////////////////////////////////////////////////
 842:   
 843:          /// <summary>
 844:          ///
 845:          /// </summary>
 846:          public static List<string> AccessNameWithinEmsVoipPstnUserWhereEmsDevResultCodeDeviceOfflineError()
 847:          {
 848:              string accessName;
 849:              List<string> accessNameList;
 850:   
 851:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 852:              {
 853:                  var list = (from evpu in db.EmsVoipPstnUsers
 854:                              where evpu.EmsOnt != null && evpu.EmsOnt.Access != null
 855:                              select new { evpu.EmsOnt.Access.Id, evpu.DID }).AsNoTracking().ToList();
 856:   
 857:                  if (list != null && list.Count > 0)
 858:                  {
 859:                      accessNameList = new List<string>(list.Count);
 860:   
 861:                      var didToResultCodeDictionary = Ia.Ngn.Cl.Model.Data.Huawei.Dev.DidToResultCodeDictionary;
 862:                      var ontAccessIdToOntAccessNameDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntAccessIdToOntAccessNameDictionary;
 863:   
 864:                      foreach (var accessIdDid in list)
 865:                      {
 866:                          if (didToResultCodeDictionary.ContainsKey(accessIdDid.DID))
 867:                          {
 868:                              var resultCode = didToResultCodeDictionary[accessIdDid.DID];
 869:   
 870:                              if (resultCode == (long)Ia.Ngn.Cl.Model.Client.Huawei.Ems.ResultCode.DeviceOfflineError)
 871:                              {
 872:                                  if (ontAccessIdToOntAccessNameDictionary.ContainsKey(accessIdDid.Id))
 873:                                  {
 874:                                      accessName = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntAccessIdToOntAccessNameDictionary[accessIdDid.Id];
 875:   
 876:                                      if (!accessNameList.Contains(accessName))
 877:                                      {
 878:                                          accessNameList.Add(accessName);
 879:                                      }
 880:                                  }
 881:                              }
 882:                          }
 883:                      }
 884:                  }
 885:                  else
 886:                  {
 887:                      accessNameList = new List<string>();
 888:                  }
 889:              }
 890:   
 891:              return accessNameList;
 892:          }
 893:   
 894:          ////////////////////////////////////////////////////////////////////////////
 895:   
 896:          /// <summary>
 897:          ///
 898:          /// </summary>
 899:          public static List<string> ServiceIdWithinAllowedSipOltToBeProvisionedOrMigratedList()
 900:          {
 901:              int serviceType;
 902:              string service, serviceId;
 903:              List<int> sipOltIdList;
 904:              List<string> list, serviceIdList;
 905:   
 906:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 907:              sipOltIdList = Ia.Ngn.Cl.Model.Data.Service.AllowedToBeProvisionedSipOltIdList.Union(Ia.Ngn.Cl.Model.Data.Service.AllowedToBeMigratedSipOltIdList).ToList();
 908:   
 909:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 910:              {
 911:                  list = (from evpu in db.EmsVoipPstnUsers
 912:                          where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
 913:                          select evpu.DN).ToList();
 914:              }
 915:   
 916:              if (list != null && list.Count > 0)
 917:              {
 918:                  serviceIdList = new List<string>(list.Count);
 919:   
 920:                  foreach (string s in list)
 921:                  {
 922:                      service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(s);
 923:   
 924:                      serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 925:   
 926:                      serviceIdList.Add(serviceId);
 927:                  }
 928:              }
 929:              else
 930:              {
 931:                  serviceIdList = new List<string>();
 932:              }
 933:   
 934:              return serviceIdList;
 935:          }
 936:   
 937:          ////////////////////////////////////////////////////////////////////////////
 938:   
 939:          /// <summary>
 940:          /// List of ServiceOnts within EmsVoipPstnUsers within a SIP allowed to be provisioned or migrated OLT
 941:          /// </summary>
 942:          public static List<Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated> ServiceOntWithinAllowedSipOltToBeProvisionedOrMigratedList()
 943:          {
 944:              int serviceType;
 945:              string service, serviceId;
 946:              List<int> sipOltIdList;
 947:              List<Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated> tempSipUserNamelist, serviceOntList;
 948:   
 949:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 950:              sipOltIdList = Ia.Ngn.Cl.Model.Data.Service.AllowedToBeProvisionedSipOltIdList.Union(Ia.Ngn.Cl.Model.Data.Service.AllowedToBeMigratedSipOltIdList).ToList();
 951:   
 952:              var ontAccessIdToOntForOltIdListDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntAccessIdToOntForOltIdListDictionary(sipOltIdList);
 953:   
 954:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
 955:              {
 956:                  tempSipUserNamelist = (from evpu in db.EmsVoipPstnUsers
 957:                                         where evpu.EmsOnt != null && evpu.EmsOnt.Access != null && sipOltIdList.Contains(evpu.EmsOnt.Access.Olt)
 958:                                         // select vpu.DN).ToList();
 959:                                         select new Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated { Service = evpu.DN, AccessId = evpu.EmsOnt.Access.Id, CreatedDateTime = evpu.Created }).AsNoTracking().ToList();
 960:              }
 961:   
 962:              if (tempSipUserNamelist != null && tempSipUserNamelist.Count > 0)
 963:              {
 964:                  serviceOntList = new List<Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated>(tempSipUserNamelist.Count);
 965:   
 966:                  foreach (var so in tempSipUserNamelist)
 967:                  {
 968:                      service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(so.Service); // so.Service here is vpu.DN
 969:   
 970:                      serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 971:   
 972:                      serviceOntList.Add(new Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated
 973:                      {
 974:                          ServiceId = serviceId,
 975:                          Service = service,
 976:                          AccessId = so.AccessId,
 977:                          Ont = ontAccessIdToOntForOltIdListDictionary.ContainsKey(so.AccessId) ? ontAccessIdToOntForOltIdListDictionary[so.AccessId] : null,
 978:                          CreatedDateTime = so.CreatedDateTime
 979:                      });
 980:                  }
 981:              }
 982:              else
 983:              {
 984:                  serviceOntList = new List<Ia.Ngn.Cl.Model.Business.ServiceAccessIpOntCreated>();
 985:              }
 986:   
 987:              return serviceOntList;
 988:          }
 989:   
 990:          ////////////////////////////////////////////////////////////////////////////
 991:   
 992:          /// <summary>
 993:          ///
 994:          /// </summary>
 995:          public static Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser Read(string id)
 996:          {
 997:              Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser item;
 998:   
 999:              using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                item = (from evpu in db.EmsVoipPstnUsers
                        where evpu.EmsOnt != null && evpu.Id == id
                        select evpu).Include(o => o.EmsOnt).SingleOrDefault();
            }
 
            return item;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> ReadByService(string service) //, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt)
        {
            string dn;
            List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> list;
 
            dn = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.ServiceWithCountryCode(service);
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        where evpu.EmsOnt != null && evpu.DN == dn
                        select evpu).Include(o => o.EmsOnt).ThenInclude(o => o.Access).ToList(); //.SingleOrDefault();
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> ReadByMsanService(string service)
        {
            string dn;
            List<Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser> list;
 
            dn = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.ImpuAid(service);
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        where /*evpu.EmsOnt != null &&*/ evpu.DN == dn
                        select evpu)/*.Include(o => o.EmsOnt).ThenInclude(o => o.Access)*/.ToList(); //.SingleOrDefault();
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.DidFnSnPnDn> DidFnSnPnDnMsanList()
        {
            List<Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.DidFnSnPnDn> list;
 
            //var dummy = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.ImpuAid("");
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        where evpu.DN.StartsWith("+" + Ia.Ngn.Cl.Model.Business.Service.CountryCode)
                        select new Ia.Ngn.Cl.Model.Business.Huawei.VoipPstnUser.DidFnSnPnDn
                        {
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                        }).ToList();
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> MsanServiceList
        {
            get
            {
                List<string> list;
 
#if DEBUG
                var dummyVarToDrawRefractorToBelow = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Dn("0000000");
#endif
 
                using (var db = new Ia.Ngn.Cl.Model.Ngn())
                {
                    var list0 = (from evpu in db.EmsVoipPstnUsers
                                 where evpu.EmsOnt == null && evpu.DN.StartsWith("+965")
                                 select evpu.DN).ToList();
 
                    list = new List<string>();
 
                    foreach (var s in list0)
                    {
                        list.Add(Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(s));
                    }
                }
 
                return list;
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Dictionary<string, bool> MsanServiceDictionary
        {
            get
            {
                string key;
                Dictionary<string, bool> dictionary;
 
#if DEBUG
                var dummyVarToDrawRefractorToBelow = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Dn("0000000");
#endif
 
                var list = Ia.Ngn.Cl.Model.Data.Huawei.VoipPstnUser.MsanServiceList;
 
                dictionary = new Dictionary<string, bool>();
 
                foreach (var s in list)
                {
                    key = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(s);
 
                    if (!string.IsNullOrEmpty(key)) dictionary[key] = true;
                }
 
                return dictionary;
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Dictionary<int, int> MsanDevDidToDnCountDictionary
        {
            get
            {
                Dictionary<int, int> dictionary;
 
                using (var db = new Ia.Ngn.Cl.Model.Ngn())
                {
                    /*
select ed.DID,count(0) from EmsVoipPstnUsers evpu
left outer join EmsDevs ed on ed.DID = evpu.DID 
where evpu.DN like '+%'
group by ed.DID
                     */
 
                    dictionary = (from evpu in db.EmsVoipPstnUsers
                                  join ed in db.EmsDevs on evpu.DID equals ed.DID
                                  where evpu.EmsOnt == null && evpu.DN.StartsWith("+965")
                                  group ed.DID by ed.DID into g
                                  select new { Did = g.Key, Count = g.Count() }).AsNoTracking().ToDictionary(u => u.Did, u => u.Count);
                }
 
                return dictionary.ToDictionary(u => u.Key, u => u.Value);
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> DnServiceListByMsanDevDidList(List<int> didList)
        {
            List<string> list;
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                var list0 = (from evpu in db.EmsVoipPstnUsers
                             join ed in db.EmsDevs on evpu.DID equals ed.DID
                             where evpu.EmsOnt == null && evpu.DN != null && evpu.DN.StartsWith("+965") && didList.Contains(ed.DID)
                             select evpu.DN).AsNoTracking().ToList();
 
                list = new List<string>();
 
                foreach (var s in list0)
                {
                    list.Add(Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(s));
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsan(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev msanDev;
            List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> list;
 
            var msanDevList = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Msan.Id == msan.Id
                               select m).ToList();
 
            var didList = msanDevList.Select(u => u.Did).ToList();
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        join ed in db.EmsDevs on evpu.DID equals ed.DID
                        where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
                        select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                        {
                            EmsVoipPstnUserId = evpu.Id,
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                            Created = evpu.Created,
                            Updated = evpu.Updated
                        }).AsNoTracking().ToList();
 
                foreach (var l in list)
                {
                    l.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l.Dn);
                    l.MsanId = msan.Id;
                    l.MsanNameSymbol = msan.NameSymbol;
 
                    msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 
                    l.MsanDevId = msanDev.Id;
                    l.MsanDevDev = msanDev.Dev;
                    l.Cabinet = msanDev.Cabinet;
                    l.Frame = msanDev.Frame;
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinet(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan, int cabinet)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev msanDev;
            List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> list;
 
            var msanDevList = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Msan.Id == msan.Id && m.Cabinet == cabinet
                               select m).ToList();
 
            var didList = msanDevList.Select(u => u.Did).ToList();
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        join ed in db.EmsDevs on evpu.DID equals ed.DID
                        where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
                        select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                        {
                            EmsVoipPstnUserId = evpu.Id,
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                            Created = evpu.Created,
                            Updated = evpu.Updated
                        }).AsNoTracking().ToList();
 
                foreach (var l in list)
                {
                    l.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l.Dn);
                    l.MsanId = msan.Id;
                    l.MsanNameSymbol = msan.NameSymbol;
 
                    msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 
                    l.MsanDevId = msanDev.Id;
                    l.MsanDevDev = msanDev.Dev;
                    l.Cabinet = msanDev.Cabinet;
                    l.Frame = msanDev.Frame;
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrame(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev msanDev;
            List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> list;
 
            var msanDevList = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
                               select m).ToList();
 
            var didList = msanDevList.Select(u => u.Did).ToList();
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        join ed in db.EmsDevs on evpu.DID equals ed.DID
                        where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID)
                        select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                        {
                            EmsVoipPstnUserId = evpu.Id,
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                            Created = evpu.Created,
                            Updated = evpu.Updated
                        }).AsNoTracking().ToList();
 
                foreach (var l in list)
                {
                    l.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l.Dn);
                    l.MsanId = msan.Id;
                    l.MsanNameSymbol = msan.NameSymbol;
 
                    msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 
                    l.MsanDevId = msanDev.Id;
                    l.MsanDevDev = msanDev.Dev;
                    l.Cabinet = msanDev.Cabinet;
                    l.Frame = msanDev.Frame;
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrameAndFn(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev msanDev;
            List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> list;
 
            var msanDevList = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
                               select m).ToList();
 
            var didList = msanDevList.Select(u => u.Did).ToList();
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        join ed in db.EmsDevs on evpu.DID equals ed.DID
                        where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID) && evpu.FN == fn
                        select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                        {
                            EmsVoipPstnUserId = evpu.Id,
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                            Created = evpu.Created,
                            Updated = evpu.Updated
                        }).AsNoTracking().ToList();
 
                foreach (var l in list)
                {
                    l.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l.Dn);
                    l.MsanId = msan.Id;
                    l.MsanNameSymbol = msan.NameSymbol;
 
                    msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 
                    l.MsanDevId = msanDev.Id;
                    l.MsanDevDev = msanDev.Dev;
                    l.Cabinet = msanDev.Cabinet;
                    l.Frame = msanDev.Frame;
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> MsanDevLicListByNddMsanAndCabinetAndFrameAndFnAndSn(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn, int sn)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev msanDev;
            List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic> list;
 
            var msanDevList = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
                               select m).ToList();
 
            var didList = msanDevList.Select(u => u.Did).ToList();
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                list = (from evpu in db.EmsVoipPstnUsers
                        join ed in db.EmsDevs on evpu.DID equals ed.DID
                        where evpu.EmsOnt == null /*&& evpu.DN.StartsWith("+965")*/ && didList.Contains(ed.DID) && evpu.FN == fn && evpu.SN == sn
                        select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                        {
                            EmsVoipPstnUserId = evpu.Id,
                            Did = evpu.DID,
                            Fn = evpu.FN,
                            Sn = evpu.SN,
                            Pn = evpu.PN,
                            Dn = evpu.DN,
                            Created = evpu.Created,
                            Updated = evpu.Updated
                        }).AsNoTracking().ToList();
 
                foreach (var l in list)
                {
                    l.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(l.Dn);
                    l.MsanId = msan.Id;
                    l.MsanNameSymbol = msan.NameSymbol;
 
                    msanDev = (from m in msanDevList where m.Did == l.Did select m).Single();
 
                    l.MsanDevId = msanDev.Id;
                    l.MsanDevDev = msanDev.Dev;
                    l.Cabinet = msanDev.Cabinet;
                    l.Frame = msanDev.Frame;
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic MsanDevLicByEmsVoipPstnUserId(string emsVoipPstnUserId)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic lic;
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                lic = (from evpu in db.EmsVoipPstnUsers
                       where evpu.Id == emsVoipPstnUserId
                       select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                       {
                           EmsVoipPstnUserId = evpu.Id,
                           Did = evpu.DID,
                           Fn = evpu.FN,
                           Sn = evpu.SN,
                           Pn = evpu.PN,
                           Dn = evpu.DN,
                           Created = evpu.Created,
                           Updated = evpu.Updated
                       }).AsNoTracking().SingleOrDefault();
 
                var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                               where m.Did == lic.Did
                               select m).Single();
 
                lic.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(lic.Dn);
                lic.MsanId = msanDev.Msan.Id;
                lic.MsanNameSymbol = msanDev.Msan.NameSymbol;
                lic.MsanDevId = msanDev.Id;
                lic.MsanDevDev = msanDev.Dev;
                lic.Cabinet = msanDev.Cabinet;
                lic.Frame = msanDev.Frame;
            }
 
            return lic;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic MsanDevLicByNddMsanAndCabinetAndFrameAndFnAndSnAndPn(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Msan msan, int cabinet, int frame, int fn, int sn, int pn)
        {
            Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic lic;
 
            var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Huawei.Default.MsanDevList
                           where m.Msan.Id == msan.Id && m.Cabinet == cabinet && m.Frame == frame
                           select m).SingleOrDefault();
 
            if (msanDev != null)
            {
                using (var db = new Ia.Ngn.Cl.Model.Ngn())
                {
                    lic = (from evpu in db.EmsVoipPstnUsers
                           join ed in db.EmsDevs on evpu.DID equals ed.DID
                           where evpu.EmsOnt == null && msanDev.Did == ed.DID && evpu.FN == fn && evpu.SN == sn && evpu.PN == pn
                           select new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MsanDev.Lic
                           {
                               EmsVoipPstnUserId = evpu.Id,
                               Did = evpu.DID,
                               Fn = evpu.FN,
                               Sn = evpu.SN,
                               Pn = evpu.PN,
                               Dn = evpu.DN,
                               Created = evpu.Created,
                               Updated = evpu.Updated
                           }).AsNoTracking().SingleOrDefault();
 
                    if (lic != null)
                    {
                        lic.Service = Ia.Ngn.Cl.Model.Business.NumberFormatConverter.Service(lic.Dn);
                        lic.MsanId = msanDev.Msan.Id;
                        lic.MsanNameSymbol = msanDev.Msan.NameSymbol;
                        lic.MsanDevId = msanDev.Id;
                        lic.MsanDevDev = msanDev.Dev;
                        lic.Cabinet = msanDev.Cabinet;
                        lic.Frame = msanDev.Frame;
                    }
                }
            }
            else lic = null;
 
            return lic;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Dictionary<string, string> IdToOntIdDictionary
        {
            get
            {
                Dictionary<string, string> dictionary;
 
                using (var db = new Ia.Ngn.Cl.Model.Ngn())
                {
                    dictionary = (from evpu in db.EmsVoipPstnUsers
                                  where evpu.EmsOnt != null
                                  select new { evpu.Id, OntId = evpu.EmsOnt.Id }).ToDictionary(u => u.Id, u => u.OntId);
                }
 
                return dictionary.ToDictionary(u => u.Key, u => u.Value);
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string ToSimpleTextString(Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser emsVoipPstnUser)
        {
            StringBuilder sb;
 
            sb = new StringBuilder();
 
            //sb.AppendLine("Vendor: " + Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Huawei.Name);
            sb.AppendLine("DID: " + emsVoipPstnUser.DID);
            sb.AppendLine("FN: " + emsVoipPstnUser.FN);
            sb.AppendLine("SN: " + emsVoipPstnUser.SN);
            sb.AppendLine("PN: " + emsVoipPstnUser.PN);
            sb.AppendLine("MGID: " + emsVoipPstnUser.MGID);
            sb.AppendLine("MGNAME: " + emsVoipPstnUser.MGNAME);
            sb.AppendLine("TID: " + emsVoipPstnUser.TID);
            sb.AppendLine("DN: " + emsVoipPstnUser.DN);
            sb.AppendLine("LayeredConf: " + emsVoipPstnUser.LayeredConf);
            sb.AppendLine("HighLevelWidth: " + emsVoipPstnUser.HighLevelWidth);
            sb.AppendLine("LowerLevelWidth: " + emsVoipPstnUser.LowerLevelWidth);
            sb.AppendLine("Voltage: " + emsVoipPstnUser.Voltage);
            sb.AppendLine("KCType: " + emsVoipPstnUser.KCType);
            sb.AppendLine("VoiceGain: " + emsVoipPstnUser.VoiceGain);
            sb.AppendLine("LimitPulseDial: " + emsVoipPstnUser.LimitPulseDial);
            sb.AppendLine("RevPolarity: " + emsVoipPstnUser.RevPolarity);
            sb.AppendLine("RevPoleLevel: " + emsVoipPstnUser.RevPoleLevel);
            sb.AppendLine("RevPolePulse: " + emsVoipPstnUser.RevPolePulse);
            sb.AppendLine("PSTAT: " + emsVoipPstnUser.PSTAT);
            sb.AppendLine("ConfigStatus: " + emsVoipPstnUser.ConfigStatus);
            sb.AppendLine("ServiceStatus: " + emsVoipPstnUser.ServiceStatus);
            sb.AppendLine("ServiceType: " + emsVoipPstnUser.ServiceType);
            sb.AppendLine("ALIAS: " + emsVoipPstnUser.ALIAS);
            sb.AppendLine("UserType: " + emsVoipPstnUser.UserType);
            sb.AppendLine("Impedance: " + emsVoipPstnUser.Impedance);
            sb.AppendLine("Current: " + emsVoipPstnUser.Current);
            sb.AppendLine("DCTime: " + emsVoipPstnUser.DCTime);
            sb.AppendLine("PITime: " + emsVoipPstnUser.PITime);
            sb.AppendLine("FSKDelayInterval: " + emsVoipPstnUser.FSKDelayInterval);
            sb.AppendLine("ActualVoiceGain: " + emsVoipPstnUser.ActualVoiceGain);
            sb.AppendLine("CidTransWhen: " + emsVoipPstnUser.CidTransWhen);
            sb.AppendLine("CidFormat: " + emsVoipPstnUser.CidFormat);
            sb.AppendLine("OverloadPRI: " + emsVoipPstnUser.OverloadPRI);
            sb.AppendLine("ImpedanceProfile: " + emsVoipPstnUser.ImpedanceProfile);
            sb.AppendLine("SendVoiceGain: " + emsVoipPstnUser.SendVoiceGain);
            sb.AppendLine("RecvVoiceGain: " + emsVoipPstnUser.RecvVoiceGain);
            sb.AppendLine("RevPolarityMode: " + emsVoipPstnUser.RevPolarityMode);
            sb.AppendLine("PortRunState: " + emsVoipPstnUser.PortRunState);
            sb.AppendLine("PortTestState: " + emsVoipPstnUser.PortTestState);
            sb.AppendLine("PortLineState: " + emsVoipPstnUser.PortLineState);
            sb.AppendLine("PortLoopState: " + emsVoipPstnUser.PortLoopState);
            sb.AppendLine("ServiceRunState: " + emsVoipPstnUser.ServiceRunState);
            sb.AppendLine("ServiceAdminState: " + emsVoipPstnUser.ServiceAdminState);
            sb.AppendLine("ActualSendVoiceGain: " + emsVoipPstnUser.ActualSendVoiceGain);
            sb.AppendLine("ActualRecvVo: " + emsVoipPstnUser.ActualRecvVo);
            sb.AppendLine("AGCEnable: " + emsVoipPstnUser.AGCEnable);
            sb.AppendLine("AGCEnableLevel: " + emsVoipPstnUser.AGCEnableLevel);
            sb.AppendLine("SNSEnable: " + emsVoipPstnUser.SNSEnable);
            sb.AppendLine("SNSEnableLevel: " + emsVoipPstnUser.SNSEnableLevel);
            sb.AppendLine("NlpMode: " + emsVoipPstnUser.NlpMode);
            sb.AppendLine("LineLockEnable: " + emsVoipPstnUser.LineLockEnable);
            sb.AppendLine("DspInputGain: " + emsVoipPstnUser.DspInputGain);
            sb.AppendLine("DspOutputGain: " + emsVoipPstnUser.DspOutputGain);
            sb.AppendLine("ClipReversePole: " + emsVoipPstnUser.ClipReversePole);
            sb.AppendLine("DEFAULTCLI: " + emsVoipPstnUser.DEFAULTCLI);
            sb.AppendLine("USERGROUPID: " + emsVoipPstnUser.USERGROUPID);
            sb.AppendLine("ADJUSTFACTOR: " + emsVoipPstnUser.ADJUSTFACTOR);
            sb.AppendLine("DSPPROFILE: " + emsVoipPstnUser.DSPPROFILE);
 
            return sb.ToString();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string ToSimpleDidFnSnPnTextString(Ia.Ngn.Cl.Model.Huawei.EmsVoipPstnUser emsVoipPstnUser)
        {
            var s = "DID: " + emsVoipPstnUser.DID + ", FN: " + emsVoipPstnUser.FN + ", SN: " + emsVoipPstnUser.SN + ", PN: " + emsVoipPstnUser.PN;
 
            return s;
        }
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
    }
 
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
}