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

Integrated Applications Programming Company

Skip Navigation LinksHome » Code Library » Ams

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

Access Management System (AMS) support class for Nokia's Optical Fiber Network (OFN) business model.

   1:  using Ia.Ngn.Cl.Model.Data;
   2:  using System;
   3:  using System.Collections;
   4:  using System.Collections.Generic;
   5:  using System.Configuration;
   6:  using System.Data;
   7:  using System.Linq;
   8:  using System.Text.RegularExpressions;
   9:   
  10:  namespace Ia.Ngn.Cl.Model.Business.Nokia
  11:  {
  12:      ////////////////////////////////////////////////////////////////////////////
  13:   
  14:      /// <summary publish="true">
  15:      /// Access Management System (AMS) support class for Nokia's Optical Fiber Network (OFN) business model.
  16:      /// </summary>
  17:      /// 
  18:      /// <value>
  19:      ///   <appSettings>
  20:      ///       <add key="amsServerHost" value="*" />
  21:      ///       <add key="amsServerPort" value="*" />
  22:      ///       <add key="amsServerActUser" value="ACT-USER:{amsName}:*:::*;" />
  23:      ///       <add key="amsServerCancUser" value="CANC-USER:{amsName}:*:;" />
  24:      ///   </appSettings>
  25:      /// </value>
  26:      /// 
  27:      /// <remarks> 
  28:      /// Copyright © 2007-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
  29:      ///
  30:      /// 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
  31:      /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
  32:      ///
  33:      /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  34:      /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  35:      /// 
  36:      /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
  37:      /// 
  38:      /// Copyright notice: This notice may not be removed or altered from any source distribution.
  39:      /// </remarks> 
  40:      public class Ams
  41:      {
  42:          // below: access data for Nokia AMS
  43:          private const string textToSkipInTelnetEndReceive = "IP 0\r\n<";
  44:          private static string lastSentCommand, receiveString;
  45:          private static string keepAliveCurrentAmsName = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList.PickRandom();
  46:   
  47:          private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure = new Ia.Ngn.Cl.Model.Business.Procedure(24, Ia.Ngn.Cl.Model.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
  48:          private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure = new Ia.Ngn.Cl.Model.Business.Procedure(0, Ia.Ngn.Cl.Model.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
  49:   
  50:          private static readonly Dictionary<string, int> associateServiceIdAndPortBetweenCreateAndReadDictionary = new Dictionary<string, int>();
  51:   
  52:          private static Dictionary<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> eventDictionary = new Dictionary<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool>();
  53:   
  54:          private static readonly Queue<string> priorityAmsCommandQueue = new Queue<string>();
  55:          private static Queue<string> amsCommandQueue = new Queue<string>();
  56:          private static readonly Queue<string> amsCreateOntCommandQueue = new Queue<string>();
  57:   
  58:          private static Ia.Ngn.Cl.Model.Client.Nokia.Ams ams = new Ia.Ngn.Cl.Model.Client.Nokia.Ams();
  59:   
  60:          private static List<string> priorityServiceList = new List<string>();
  61:   
  62:          /// <summary/>
  63:          public enum AmsOpcode
  64:          {
  65:              RtrvHdr, RtrvOnt, InitSys, RtrvServiceVoip, RtrvOntPots, RtrvAlmPon, EdOntDesc1, EdOntDesc1Annul, EdOntPotsCustinfo
  66:          }
  67:   
  68:          /// <summary/>
  69:          public enum BellcoreState { Undefined = 0, IsNr = 1, OosAu, OosMa, OosAuma };
  70:   
  71:          /// <summary/>
  72:          public static string Host { get { return ConfigurationManager.AppSettings["amsServerHost"].ToString(); } }
  73:   
  74:          /// <summary/>
  75:          public static int Port { get { return int.Parse(ConfigurationManager.AppSettings["amsServerPort"].ToString()); } }
  76:   
  77:          /// <summary/>
  78:          public static string ActUser(string amsName)
  79:          {
  80:              return PrepareCtaggedCommand(ConfigurationManager.AppSettings["amsServerActUser"].ToString().Replace("{amsName}", amsName));
  81:          }
  82:   
  83:          /// <summary/>
  84:          public static string CancUser(string amsName)
  85:          {
  86:              return PrepareCtaggedCommand(ConfigurationManager.AppSettings["amsServerCancUser"].ToString().Replace("{amsName}", amsName));
  87:          }
  88:   
  89:          /// <summary/>
  90:          public static string TextToSkipInTelnetEndReceive { get { return textToSkipInTelnetEndReceive; } }
  91:   
  92:          ////////////////////////////////////////////////////////////////////////////
  93:   
  94:          /// <summary>
  95:          ///
  96:          /// </summary>
  97:          public Ams()
  98:          {
  99:          }
 100:   
 101:          ////////////////////////////////////////////////////////////////////////////
 102:   
 103:          /// <summary>
 104:          ///
 105:          /// </summary>
 106:          public static void Connect(out Ia.Cl.Model.Result result)
 107:          {
 108:              if (ams != null && !ams.IsConnected)
 109:              {
 110:                  ams.Connect(out result);
 111:              }
 112:              else
 113:              {
 114:                  result = new Ia.Cl.Model.Result();
 115:   
 116:                  result.AddWarning("Warning: ams is already connected.");
 117:              }
 118:          }
 119:   
 120:          ////////////////////////////////////////////////////////////////////////////
 121:   
 122:          /// <summary>
 123:          ///
 124:          /// </summary>
 125:          public static void Disconnect(out Ia.Cl.Model.Result result)
 126:          {
 127:              if (ams != null && ams.IsConnected)
 128:              {
 129:                  ams.Disconnect(out result);
 130:              }
 131:              else
 132:              {
 133:                  result = new Ia.Cl.Model.Result();
 134:   
 135:                  result.AddWarning("Warning: ams is already disconnected.");
 136:              }
 137:          }
 138:   
 139:          ////////////////////////////////////////////////////////////////////////////
 140:   
 141:          /// <summary>
 142:          ///
 143:          /// </summary>
 144:          public static void Login()
 145:          {
 146:              foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList)
 147:              {
 148:                  ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.ActUser(amsName));
 149:              }
 150:          }
 151:   
 152:          ////////////////////////////////////////////////////////////////////////////
 153:   
 154:          /// <summary>
 155:          ///
 156:          /// </summary>
 157:          public static void Logout()
 158:          {
 159:              foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList)
 160:              {
 161:                  ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.CancUser(amsName));
 162:              }
 163:          }
 164:   
 165:          ////////////////////////////////////////////////////////////////////////////
 166:   
 167:          /// <summary>
 168:          ///
 169:          /// </summary>
 170:          public static Queue<string> ReceiveQueue
 171:          {
 172:              get
 173:              {
 174:                  return ams.ReceiveQueue;
 175:              }
 176:          }
 177:   
 178:          ////////////////////////////////////////////////////////////////////////////
 179:   
 180:          /// <summary>
 181:          ///
 182:          /// </summary>
 183:          public static Queue<string> SendQueue
 184:          {
 185:              get
 186:              {
 187:                  return ams.SendQueue;
 188:              }
 189:          }
 190:   
 191:          ////////////////////////////////////////////////////////////////////////////
 192:   
 193:          /// <summary>
 194:          ///
 195:          /// </summary>
 196:          public static bool IsConnected
 197:          {
 198:              get
 199:              {
 200:                  return ams != null && ams.IsConnected;
 201:              }
 202:          }
 203:   
 204:          ////////////////////////////////////////////////////////////////////////////
 205:   
 206:          /// <summary>
 207:          ///
 208:          /// </summary>
 209:          public static bool IsLoggedIn
 210:          {
 211:              get
 212:              {
 213:                  return ams.IsLoggedIn;
 214:              }
 215:          }
 216:   
 217:          ////////////////////////////////////////////////////////////////////////////
 218:   
 219:          /// <summary>
 220:          ///
 221:          /// </summary>
 222:          public static void Dispose()
 223:          {
 224:              ams.Dispose();
 225:          }
 226:   
 227:          ////////////////////////////////////////////////////////////////////////////
 228:          ////////////////////////////////////////////////////////////////////////////
 229:   
 230:          /// <summary>
 231:          ///
 232:          /// </summary>
 233:          public static Ia.Cl.Model.Result ManageReceiveQueue()
 234:          {
 235:              bool isUpdated;
 236:              string rowString, formattedString;
 237:              Ia.Cl.Model.Result updateDatabaseWithAmsCommandOutputResult;
 238:   
 239:              var result = new Ia.Cl.Model.Result();
 240:   
 241:              try
 242:              {
 243:                  while (ReceiveQueue.Count > 0)
 244:                  {
 245:                      rowString = ReceiveQueue.Dequeue();
 246:   
 247:                      formattedString = Ia.Cl.Model.Telnet.FormatAndCleanData(rowString);
 248:   
 249:                      isUpdated = Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithAmsCommandOutput(formattedString, out updateDatabaseWithAmsCommandOutputResult);
 250:   
 251:                      if (updateDatabaseWithAmsCommandOutputResult.IsSuccessful && !updateDatabaseWithAmsCommandOutputResult.HasWarning)
 252:                      {
 253:                          result.AddSuccess(updateDatabaseWithAmsCommandOutputResult.Message);
 254:                      }
 255:                      else
 256:                      {
 257:                          result.AddError("ManageReceiveQueue(): rowString: [" + rowString + "]");
 258:                      }
 259:   
 260:                      if (result.IsSuccessful)
 261:                      {
 262:                          AnalyzeReceivedData(formattedString);
 263:                      }
 264:                      else
 265:                      {
 266:                      }
 267:                  }
 268:              }
 269:              catch (Exception ex)
 270:              {
 271:                  result.AddError("ManageReceiveQueue: Exception: " + ex.Message);
 272:              }
 273:   
 274:              return result;
 275:          }
 276:   
 277:          ////////////////////////////////////////////////////////////////////////////
 278:   
 279:          /// <summary>
 280:          ///
 281:          /// </summary>
 282:          private static void AnalyzeReceivedData(string data)
 283:          {
 284:              string lastSentCommandWithoutSemiColon;
 285:   
 286:              //lastCommandEchoedBack = true;
 287:   
 288:              if (data.Contains("COMPLD"))
 289:              {
 290:                  if (lastSentCommand != null)
 291:                  {
 292:                      lastSentCommandWithoutSemiColon = lastSentCommand.Replace(";", "");
 293:   
 294:                      // below: detect the activation of user
 295:                      // debug
 296:                      //activated = true;
 297:                      //if (lastSentCommand == Ia.Ngn.Cl.Model.Business.Nokia.Ams.ActUser(olt.AmsName)) activated = true;
 298:                      //else if (lastSentCommand == Ia.Ngn.Cl.Model.Business.Nokia.Ams.CancUser(olt.AmsName)) activated = false;
 299:   
 300:                      /*
 301:                      if (data.Contains(lastSentCommandWithoutSemiColon)) lastCommandEchoedBack = true;
 302:                      else
 303:                      {
 304:                          //lastCommandEchoBackCounter = 5;
 305:                          lastCommandEchoedBack = false;
 306:                      }
 307:                      */
 308:                  }
 309:              }
 310:              else if (data.Contains("DENY")) { }
 311:              else if (data.Contains(Ia.Ngn.Cl.Model.Business.Nokia.Ams.TextToSkipInTelnetEndReceive)) { }
 312:              else if (data == "\r\n<") { }
 313:              /*
 314:              else
 315:              {
 316:                  lastCommandEchoBackCounter = 5;
 317:                  lastCommandEchoedBack = false;
 318:              }
 319:               */
 320:          }
 321:   
 322:          ////////////////////////////////////////////////////////////////////////////
 323:   
 324:          /// <summary>
 325:          ///
 326:          /// </summary>
 327:          public static string ManageSendQueue(out Ia.Cl.Model.Result result)
 328:          {
 329:              var command = string.Empty;
 330:              result = new Ia.Cl.Model.Result();
 331:   
 332:              try
 333:              {
 334:                  if (ams.SendQueue.Count > 0)
 335:                  {
 336:                      command = ams.SendQueue.Dequeue();
 337:   
 338:                      ams.Send(command, out Ia.Cl.Model.Result r);
 339:   
 340:                      if (r.IsSuccessful) result.AddSuccess(r.Message);
 341:                      else result.AddError(r.Message);
 342:                  }
 343:              }
 344:              catch (Exception ex)
 345:              {
 346:                  result.AddError("ManageSendQueue(): Exception: " + ex.Message);
 347:              }
 348:   
 349:              return result.IsSuccessful ? command : string.Empty;
 350:          }
 351:   
 352:          ////////////////////////////////////////////////////////////////////////////
 353:   
 354:          /// <summary>
 355:          ///
 356:          /// </summary>
 357:          public static Ia.Cl.Model.Result ManageSynchronizationBetweenAccessAndSwitchPast24Hours()
 358:          {
 359:              // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
 360:   
 361:              Ia.Ngn.Cl.Model.Business.Procedure.Process process;
 362:   
 363:              var result = new Ia.Cl.Model.Result();
 364:   
 365:              process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.NextProcess(priorityServiceList);
 366:   
 367:              if (priorityServiceList.Count > 50) priorityServiceList.Clear();
 368:   
 369:              if (process.Type != Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.None)
 370:              {
 371:                  if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Create)
 372:                  {
 373:                      result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
 374:   
 375:                      //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 376:                  }
 377:                  else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Read)
 378:                  {
 379:                      result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
 380:   
 381:                      //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 382:                  }
 383:                  else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Delete)
 384:                  {
 385:                      result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
 386:   
 387:                      //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 388:                  }
 389:                  else result.AddError("sync: undefined procedure. ");
 390:   
 391:                  // Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Updated() is in Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
 392:              }
 393:              else result.AddWarning("sync: undefined"); // nothing to create or delete");
 394:   
 395:              return result;
 396:          }
 397:   
 398:          ////////////////////////////////////////////////////////////////////////////
 399:   
 400:          /// <summary>
 401:          ///
 402:          /// </summary>
 403:          public static Ia.Cl.Model.Result ManageSynchronizationBetweenAccessAndSwitch()
 404:          {
 405:              // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
 406:   
 407:              Ia.Ngn.Cl.Model.Business.Procedure.Process process;
 408:   
 409:              var result = new Ia.Cl.Model.Result();
 410:   
 411:              // problem: I have put empty new List<string>() here because there is an exception: System.Exception: Undefined function
 412:              process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.NextProcess(new List<string>());
 413:   
 414:              if (process.Type != Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.None)
 415:              {
 416:                  if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Create)
 417:                  {
 418:                      result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
 419:   
 420:                      //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 421:                  }
 422:                  else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Read)
 423:                  {
 424:                      result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
 425:   
 426:                      //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 427:                  }
 428:                  else if (process.Type == Ia.Ngn.Cl.Model.Business.Procedure.ProcessType.Delete)
 429:                  {
 430:                      result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
 431:   
 432:                      //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
 433:                  }
 434:                  else result.AddError("sync: undefined procedure. ");
 435:   
 436:                  // Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Updated() is in Ia.Ngn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
 437:              }
 438:              else result.AddWarning("sync: undefined"); // nothing to create or delete");
 439:   
 440:              return result;
 441:          }
 442:   
 443:          ////////////////////////////////////////////////////////////////////////////
 444:          ////////////////////////////////////////////////////////////////////////////
 445:   
 446:          /*
 447:          ////////////////////////////////////////////////////////////////////////////
 448:          ////////////////////////////////////////////////////////////////////////////
 449:  
 450:          /// <summary>
 451:          ///
 452:          /// </summary>
 453:          public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
 454:          {
 455:              int serviceType;
 456:              string serviceId;
 457:              Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
 458:  
 459:              result = new Ia.Cl.Model.Result();
 460:  
 461:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 462:  
 463:              try
 464:              {
 465:                  if (!string.IsNullOrEmpty(service))
 466:                  {
 467:                      if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 468:                      {
 469:                          serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 470:  
 471:                          if (!string.IsNullOrEmpty(accessName))
 472:                          {
 473:                              nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 474:  
 475:                              if (nddOnt != null)
 476:                              {
 477:                                  Ia.Ngn.Cl.Model.Business.Nokia.Ams.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, nddOnt, port, ref result);
 478:                              }
 479:                              else result.AddError("NDD ONT is null for access name: " + accessName + ".");
 480:                          }
 481:                          else result.AddError("AccessName null or empty.");
 482:                      }
 483:                      else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 484:                  }
 485:                  else result.AddError("Service null or empty.");
 486:              }
 487:              catch (Exception ex)
 488:              {
 489:                  result.AddError("Exception: " + ex.ToString() + ".");
 490:              }
 491:          }
 492:  
 493:          ////////////////////////////////////////////////////////////////////////////
 494:  
 495:          /// <summary>
 496:          ///
 497:          /// </summary>
 498:          public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
 499:          {
 500:              Ia.Ngn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPnPort;
 501:              Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
 502:              Ia.Ngn.Cl.Model.Ont ont;
 503:  
 504:              if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 505:              {
 506:                  if (nddOnt != null)
 507:                  {
 508:                      if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 509:                      {
 510:                          ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
 511:  
 512:                          if (ont != null)
 513:                          {
 514:                              if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 515:                              {
 516:                                  if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 517:                                  {
 518:                                      var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
 519:  
 520:                                      if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
 521:                                      {
 522:                                          mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
 523:  
 524:                                          var vacantFnSnPnList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantMduFnSnPnForOntList(mduDev, ont);
 525:  
 526:                                          if (vacantFnSnPnList.Count > 0)
 527:                                          {
 528:                                              if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 529:                                              {
 530:                                                  fnSnPnPort = vacantFnSnPnList.Where(f => f.Port == port).SingleOrDefault();
 531:                                              }
 532:                                              else fnSnPnPort = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantMduFnSnPnForOnt(mduDev, ont);
 533:  
 534:                                              if (fnSnPnPort != null)
 535:                                              {
 536:                                                  var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
 537:  
 538:                                                  if (emsVoipPstnUserList.Count == 0)
 539:                                                  {
 540:                                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnUser(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
 541:  
 542:                                                      if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
 543:                                                      {
 544:                                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnAccount(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
 545:                                                      }
 546:  
 547:                                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
 548:  
 549:                                                      associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = fnSnPnPort.Port;
 550:  
 551:                                                      result.AddSuccess("command(s) sent...");
 552:                                                  }
 553:                                                  else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
 554:                                              }
 555:                                              else result.AddError("MDU sn and/or tel is invalid or does not exist.");
 556:                                          }
 557:                                          else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MDU.");
 558:                                      }
 559:                                      else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
 560:                                  }
 561:                                  else // SFU
 562:                                  {
 563:                                      var vacantList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantTelForOntList(ont);
 564:  
 565:                                      if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 566:                                      {
 567:                                          port = vacantList.Contains(port) ? port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
 568:                                      }
 569:                                      else port = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantTelForOnt(ont);
 570:  
 571:                                      if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 572:                                      {
 573:                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateOntSipInfo(ems, nddOnt, service, port);
 574:  
 575:                                          // Don't use SAVE-DEV here
 576:                                          //Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, ont.EmsPort.EmsBoard.EmsDev);
 577:  
 578:                                          associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = port;
 579:  
 580:                                          result.AddSuccess("command(s) sent...");
 581:                                      }
 582:                                      else result.AddError("port is invalid or does not exist.");
 583:                                  }
 584:                              }
 585:                              else result.AddError("OLT is not SIP, its H.248.");
 586:                          }
 587:                          else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
 588:                      }
 589:                      else result.AddError("access is not in an allowed to be provisioned OLT: " + nddOnt.Access.Name + ".");
 590:                  }
 591:                  else result.AddError("nddOnt is null, does not exist for service: " + service + ".");
 592:              }
 593:              else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 594:          }
 595:  
 596:          ////////////////////////////////////////////////////////////////////////////
 597:  
 598:          /// <summary>
 599:          ///
 600:          /// </summary>
 601:          public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, out Ia.Cl.Model.Result result)
 602:          {
 603:              ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, string.Empty, Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, out result);
 604:          }
 605:  
 606:          ////////////////////////////////////////////////////////////////////////////
 607:  
 608:          /// <summary>
 609:          ///
 610:          /// </summary>
 611:          public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
 612:          {
 613:              int serviceType;
 614:              string serviceId;
 615:  
 616:              result = new Ia.Cl.Model.Result();
 617:  
 618:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 619:  
 620:              try
 621:              {
 622:                  if (!string.IsNullOrEmpty(service))
 623:                  {
 624:                      if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 625:                      {
 626:                          serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 627:  
 628:                          if (!string.IsNullOrEmpty(accessName))
 629:                          {
 630:                              var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 631:  
 632:                              if (nddOnt != null)
 633:                              {
 634:                                  Ia.Ngn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, nddOnt, port, ref result);
 635:                              }
 636:                              else result.AddError("NDD ONT is null for access name: " + accessName + ".");
 637:                          }
 638:                          else
 639:                          {
 640:                              Ia.Ngn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, null, port, ref result);
 641:                          }
 642:                      }
 643:                      else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 644:                  }
 645:                  else result.AddError("Service null or empty.");
 646:              }
 647:              catch (Exception ex)
 648:              {
 649:                  result.AddError("Exception: " + ex.ToString() + ".");
 650:              }
 651:          }
 652:  
 653:          ////////////////////////////////////////////////////////////////////////////
 654:  
 655:          /// <summary>
 656:          ///
 657:          /// </summary>
 658:          public static void ReadOntSipInfoOrVoipPstnUser(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
 659:          {
 660:              Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
 661:              Ia.Ngn.Cl.Model.Ont ont;
 662:  
 663:              if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 664:              {
 665:                  if (nddOnt != null)
 666:                  {
 667:                      ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
 668:  
 669:                      if (ont != null)
 670:                      {
 671:                          if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 672:                          {
 673:                              var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
 674:  
 675:                              if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
 676:                              {
 677:                                  mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
 678:  
 679:                                  if (port != Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 680:                                  {
 681:                                      var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
 682:  
 683:                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
 684:                                  }
 685:                                  else if (associateServiceIdAndPortBetweenCreateAndReadDictionary.ContainsKey(service))
 686:                                  {
 687:                                      port = associateServiceIdAndPortBetweenCreateAndReadDictionary[service];
 688:  
 689:                                      var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
 690:  
 691:                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
 692:                                  }
 693:                                  else
 694:                                  {
 695:                                      foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
 696:                                      {
 697:                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
 698:                                      }
 699:                                  }
 700:  
 701:                                  result.AddSuccess("command(s) sent...");
 702:                              }
 703:                              else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
 704:                          }
 705:                          else // SFU
 706:                          {
 707:                              Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
 708:  
 709:                              result.AddSuccess("command(s) sent...");
 710:                          }
 711:                      }
 712:                      else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
 713:                  }
 714:                  else
 715:                  {
 716:                      var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
 717:  
 718:                      if (emsOntSipInfoList.Count > 0)
 719:                      {
 720:                          // SFU
 721:  
 722:                          foreach (var emsOntSipInfo in emsOntSipInfoList)
 723:                          {
 724:                              ont = emsOntSipInfo.EmsOnt;
 725:  
 726:                              if (ont.Access != null)
 727:                              {
 728:                                  nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
 729:  
 730:                                  if (nddOnt != null)
 731:                                  {
 732:                                      if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 733:                                      {
 734:                                          if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 735:                                          {
 736:                                              Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
 737:  
 738:                                              result.AddSuccess("command(s) sent...");
 739:                                          }
 740:                                          else result.AddError("OLT is not SIP, its H.248.");
 741:                                      }
 742:                                      else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 743:                                  }
 744:                                  else result.AddError("nddOnt is null, does not exist for service " + service + ".");
 745:                              }
 746:                              else result.AddError("ont.Access is null for service " + service + ".");
 747:                          }
 748:                      }
 749:  
 750:  
 751:                      var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
 752:  
 753:                      if (emsVoipPstnUserList.Count > 0)
 754:                      {
 755:                          // MDU
 756:  
 757:                          foreach (var emsVoipPstnUser in emsVoipPstnUserList)
 758:                          {
 759:                              ont = emsVoipPstnUser.EmsOnt;
 760:  
 761:                              if (ont.Access != null)
 762:                              {
 763:                                  nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
 764:  
 765:                                  if (nddOnt != null)
 766:                                  {
 767:                                      if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 768:                                      {
 769:                                          if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 770:                                          {
 771:                                              if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 772:                                              {
 773:                                                  var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
 774:  
 775:                                                  if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
 776:                                                  {
 777:                                                      mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
 778:  
 779:                                                      foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
 780:                                                      {
 781:                                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
 782:  
 783:                                                          result.AddSuccess("command(s) sent...");
 784:                                                      }
 785:                                                  }
 786:                                                  else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
 787:                                              }
 788:                                              else result.AddError("ONT family type is not MDU.");
 789:                                          }
 790:                                          else result.AddError("OLT is not SIP, its H.248.");
 791:                                      }
 792:                                      else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 793:                                  }
 794:                                  else result.AddError("nddOnt is null, does not exist for service " + service + ".");
 795:                              }
 796:                              else result.AddError("ont.Access is null for service " + service + ".");
 797:                          }
 798:  
 799:  
 800:                          var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
 801:  
 802:                          if (msanEmsVoipPstnUserList.Count > 0)
 803:                          {
 804:                              // MSAN
 805:  
 806:                              foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
 807:                              {
 808:                                  ReadVoipPstnUser(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 809:                              }
 810:  
 811:                              result.AddSuccess("command(s) sent...");
 812:                          }
 813:                      }
 814:                  }
 815:              }
 816:              else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 817:          }
 818:  
 819:          ////////////////////////////////////////////////////////////////////////////
 820:  
 821:          /// <summary>
 822:          ///
 823:          /// </summary>
 824:          public static string DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Model.Result result)
 825:          {
 826:              int serviceType;
 827:              string serviceId, vacatedAccessName;
 828:              Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
 829:  
 830:              result = new Ia.Cl.Model.Result();
 831:  
 832:              serviceType = Ia.Ngn.Cl.Model.Business.Service.ServiceType.ImsService;
 833:  
 834:              vacatedAccessName = string.Empty;
 835:  
 836:              try
 837:              {
 838:                  if (!string.IsNullOrEmpty(service))
 839:                  {
 840:                      if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 841:                      {
 842:                          serviceId = Ia.Ngn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
 843:  
 844:                          if (!string.IsNullOrEmpty(accessName))
 845:                          {
 846:                              var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 847:  
 848:                              if (nddOnt != null)
 849:                              {
 850:                                  vacatedNddOnt = Ia.Ngn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, nddOnt, port, ref result);
 851:  
 852:                                  vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
 853:                              }
 854:                              else result.AddError("NDD ONT is null for access name: " + accessName + ".");
 855:                          }
 856:                          else if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 857:                          {
 858:                              vacatedNddOnt = Ia.Ngn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, null, port, ref result);
 859:  
 860:                              vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
 861:                          }
 862:                          else result.AddError("accessName is empty or null and port is not PortUndefinedOrInvalidOrUnknown. NCE does not know how to handle vacation where nddOnt is null and port is defined.");
 863:                      }
 864:                      else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 865:                  }
 866:                  else result.AddError("Service null or empty.");
 867:              }
 868:              catch (Exception ex)
 869:              {
 870:                  result.AddError("Exception: " + ex.ToString() + ".");
 871:              }
 872:  
 873:              return vacatedAccessName;
 874:          }
 875:  
 876:          ////////////////////////////////////////////////////////////////////////////
 877:  
 878:          /// <summary>
 879:          ///
 880:          /// </summary>
 881:          public static Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(string service, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Model.Result result)
 882:          {
 883:              Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
 884:              Ia.Ngn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
 885:              Ia.Ngn.Cl.Model.Ont ont;
 886:  
 887:              vacatedNddOnt = nddOnt;
 888:  
 889:              if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 890:              {
 891:                  if (nddOnt != null)
 892:                  {
 893:                      if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 894:                      {
 895:                          if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 896:                          {
 897:                              ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
 898:  
 899:                              if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 900:                              {
 901:                                  var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
 902:  
 903:                                  if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
 904:                                  {
 905:                                      mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
 906:  
 907:                                      if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 908:                                      {
 909:                                          var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
 910:  
 911:                                          foreach (var emsVoipPstnUser in emsVoipPstnUserList)
 912:                                          {
 913:                                              if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
 914:                                              {
 915:                                                  Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 916:                                              }
 917:  
 918:                                              Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 919:  
 920:                                              result.AddSuccess("command(s) sent...");
 921:                                          }
 922:                                      }
 923:                                      else
 924:                                      {
 925:                                          var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
 926:  
 927:                                          if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
 928:                                          {
 929:                                              Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
 930:                                          }
 931:  
 932:                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
 933:  
 934:                                          result.AddSuccess("command(s) sent...");
 935:                                      }
 936:  
 937:                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
 938:                                  }
 939:                                  else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service " + service + " and access " + nddOnt.Access.Name + ".");
 940:                              }
 941:                              else // SFU
 942:                              {
 943:                                  if (port == Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
 944:                                  {
 945:                                      var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByService(service);
 946:  
 947:                                      foreach (var emsOntSipInfo in emsOntSipInfoList)
 948:                                      {
 949:                                          Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
 950:                                      }
 951:  
 952:                                      result.AddSuccess("command(s) sent...");
 953:                                  }
 954:                                  else
 955:                                  {
 956:                                      Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, port);
 957:  
 958:                                      result.AddSuccess("command(s) sent...");
 959:                                  }
 960:                              }
 961:                          }
 962:                          else result.AddError("OLT is not SIP, its H.248.");
 963:                      }
 964:                      else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 965:                  }
 966:                  else
 967:                  {
 968:                      var emsOntSipInfoList = Ia.Ngn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
 969:  
 970:                      if (emsOntSipInfoList.Count > 0)
 971:                      {
 972:                          // SFU
 973:  
 974:                          foreach (var emsOntSipInfo in emsOntSipInfoList)
 975:                          {
 976:                              ont = emsOntSipInfo.EmsOnt;
 977:  
 978:                              if (ont.Access != null)
 979:                              {
 980:                                  nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
 981:  
 982:                                  if (nddOnt != null)
 983:                                  {
 984:                                      if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 985:                                      {
 986:                                          if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 987:                                          {
 988:                                              Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
 989:  
 990:                                              result.AddSuccess("command(s) sent...");
 991:                                          }
 992:                                          else result.AddError("OLT is not SIP, its H.248.");
 993:                                      }
 994:                                      else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 995:                                  }
 996:                                  else result.AddError("nddOnt is null, does not exist for service " + service + ".");
 997:  
 998:                                  vacatedNddOnt = nddOnt;
 999:                              }
                            else result.AddError("ont.Access is null for service " + service + ".");
                        }
                    }
                    var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
                    if (emsVoipPstnUserList.Count > 0)
                    {
                        // MDU
                        foreach (var emsVoipPstnUser in emsVoipPstnUserList)
                        {
                            ont = emsVoipPstnUser.EmsOnt;
                            if (ont.Access != null)
                            {
                                nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
                                if (nddOnt != null)
                                {
                                    if (Ia.Ngn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
                                    {
                                        if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
                                        {
                                            if (ont.FamilyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
                                            {
                                                var accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
                                                if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
                                                {
                                                    mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
                                                    if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
                                                    {
                                                        Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
                                                    }
                                                    Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
                                                    Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
                                                    result.AddSuccess("command(s) sent...");
                                                }
                                                else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
                                            }
                                            else result.AddError("ONT family type is not MDU.");
                                        }
                                        else result.AddError("OLT is not SIP, its H.248.");
                                    }
                                    else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
                                }
                                else result.AddError("nddOnt is null, does not exist for service " + service + ".");
                                vacatedNddOnt = nddOnt;
                            }
                            else result.AddError("ont.Access is null for service " + service + ".");
                        }
                    }
                    else
                    {
                        var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
                        if (msanEmsVoipPstnUserList.Count > 0)
                        {
                            // MSAN
                            foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
                            {
                                DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
                            }
                            result.AddSuccess("command(s) sent...");
                        }
                        else result.AddWarning("Could not find service " + service + ".");
                    }
                }
            }
            else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
            return vacatedNddOnt;
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser2(string service, out Ia.Cl.Model.Result result)
        {
            Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic;
            result = new Ia.Cl.Model.Result();
            var licList = new List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
            if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
            {
                var msanEmsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
                if (msanEmsVoipPstnUserList.Count > 0)
                {
                    // MSAN
                    foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
                    {
                        DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
                        lic = Ia.Ngn.Cl.Model.Data.Nokia.Default.MsanDevLicByEmsVoipPstnUserId(emsVoipPstnUser.Id);
                        licList.Add(lic);
                    }
                    result.AddSuccess("command(s) sent...");
                }
                else result.AddWarning("Could not find service " + service + ".");
            }
            else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
            return licList;
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(string dev, int fn, int sn, int pn)
        {
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        private static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(int did, int fn, int sn, int pn)
        {
            var dev = Ia.Ngn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
        }
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static Ia.Cl.Model.Result CreateMsanVoipPstnUser(string msanDevId, int fn, int sn, int pn, string service)
        {
            Ia.Ngn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPn;
            var result = new Ia.Cl.Model.Result();
            if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
            {
                var msanDev = (from m in Ia.Ngn.Cl.Model.Data.Nokia.Default.MsanDevList where m.Id == msanDevId select m).Single();
                var vacantFnSnPnList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.VacantMsanFnSnPnListForMsanDev(msanDev);
                if (vacantFnSnPnList.Count > 0)
                {
                    fnSnPn = vacantFnSnPnList.Where(f => f.Fn == fn && f.Sn == sn && f.Pn == pn).SingleOrDefault();
                    if (fnSnPn == null) fnSnPn = Ia.Ngn.Cl.Model.Data.Nokia.Ams.NextVacantMsanFnSnPnForMsanDev(msanDev);
                    if (fnSnPn != null)
                    {
                        var emsVoipPstnUserList = Ia.Ngn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
                        if (emsVoipPstnUserList.Count == 0)
                        {
                            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendCreateMsanVoipPstnUser(ems, msanDev, fnSnPn.Fn, fnSnPn.Sn, fnSnPn.Pn, service);
                            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, msanDev);
                            result.AddSuccess("command(s) sent...");
                        }
                        else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ".");
                    }
                    else result.AddError("MDU sn and/or tel is invalid or does not exist.");
                }
                else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MSAN.");
            }
            else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
            return result;
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static void ReadVoipPstnUser(string dev, int fn, int sn, int pn)
        {
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static void ReadMsanVoipPstnUser(Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic)
        {
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, lic.MsanDevDev, lic.Sn, lic.Pn);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static void ReadVoipPstnUser(string service)
        {
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, service);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        private static void ReadVoipPstnUser(int did, int fn, int sn, int pn)
        {
            var dev = Ia.Ngn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static void DeleteVoipPstnUser(string dev, int fn, int sn, int pn)
        {
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
            Ia.Ngn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
        }
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        ///
        /// </summary>
        public static List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser(string service, out Ia.Cl.Model.Result result)
        {
            var licList = new List<Ia.Ngn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
            result = new Ia.Cl.Model.Result();
            try
            {
                if (!string.IsNullOrEmpty(service))
                {
                    if (Ia.Ngn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
                    {
                        licList = Ia.Ngn.Cl.Model.Business.Nokia.Nce.DeleteMsanVoipPstnUser2(service, out result);
                    }
                    else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
                }
                else result.AddError("Service null or empty.");
            }
            catch (Exception ex)
            {
                result.AddError("Exception: " + ex.ToString() + ".");
            }
            return licList;
        }
        */
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Ia.Cl.Model.Result ResetOntInEventsWithClassOntAndCauseInactAndSeverityNotClInLast24HoursList()
        {
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont;
            List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontResetSentList;
            Dictionary<string, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
 
            var result = new Ia.Cl.Model.Result();
 
            ontResetSentList = new List<Cl.Model.Business.NetworkDesignDocument.Ont>();
 
            var events = Ia.Ngn.Cl.Model.Data.Event.EventWithClassOntAndCauseInactAndLastRecordSeverityNotClAndOntAccessNotNullInLast24HoursList();
            ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
 
            if (events.Count > 0)
            {
                foreach (var @event in events)
                {
                    if (ontIdToOntDictionary.ContainsKey(@event.Ont.Id))
                    {
                        ont = ontIdToOntDictionary[@event.Ont.Id];
 
                        if (!eventDictionary.ContainsKey(ont))
                        {
                            eventDictionary[ont] = false;
                        }
                    }
                }
            }
            else
            {
 
            }
 
            foreach (KeyValuePair<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
            {
                if (!kvp.Value)
                {
                    ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.ResetOntCommand(kvp.Key));
 
                    if (result.IsSuccessful) ontResetSentList.Add(kvp.Key);
                }
            }
 
            return result;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        /// Enqueue all ONTs within the eventDictionary to make sure we read their state after the reset
        /// </summary>
        public static void EnqueueOntWithinEventDictionary()
        {
            foreach (KeyValuePair<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
            {
                //if (!kvp.Value)
                //{
                // this will read all reset ONT all day until eventDictionary is cleared.
                // eventDictionary[kvp.Value] = true;
 
                Ia.Ngn.Cl.Model.Data.Msmq.SecretaryApplication.Enqueue(Ia.Ngn.Cl.Model.Business.Msmq.Application.AmsApplication, Ia.Ngn.Cl.Model.Business.Msmq.Process.ReadAccess, kvp.Key.Access.Name);
                //}
            }
 
            // reset events dictionary
            eventDictionary.Clear();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static Ia.Cl.Model.Result ManageMsmqQueue()
        {
            var result = new Ia.Cl.Model.Result();
 
            var queueCount = Ia.Ngn.Cl.Model.Data.Msmq.AmsApplication.Count;
 
            if (queueCount > 0)
            {
                var message = Ia.Ngn.Cl.Model.Data.Msmq.AmsApplication.Dequeue;
 
                if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.ReadAccess)
                {
                    SendQueueEnqueueReadOnt(message.AccessName, out result);
                }
                else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.ResetAccess)
                {
                    SendQueueEnqueueResetOnt(message.AccessName, out result);
                }
                else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.CreateReadServiceAccessPort || message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.CreateReadNceOrAmsServiceAccessPort)
                {
                    var service = message.Service;
                    var accessName = message.AccessName;
                    var port = (message.Port > 0) ? message.Port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
 
                    var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 
                    if (nddOnt != null)
                    {
                        if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
                        {
                            //Ia.Ngn.Cl.Model.Business.Nokia.Nce.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result createResult);
 
                            //Ia.Ngn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result readResult);
 
                            result.AddSuccess("Create/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); // createResult.Message + "," + readResult.Message);
 
                            if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
                        }
                        else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
                    }
                    else result.AddError("NDD ONT is null for access name: " + accessName + ".");
                }
                else if (message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.DeleteReadServiceAccess || message.Process == Ia.Ngn.Cl.Model.Business.Msmq.Process.DeleteReadNceOrAmsServiceAccessPort)
                {
                    var service = message.Service;
                    var accessName = message.AccessName;
                    var port = (message.Port > 0) ? message.Port : Ia.Ngn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
 
                    var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 
                    if (nddOnt != null)
                    {
                        if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
                        {
                            //var vacatedAccessName = Ia.Ngn.Cl.Model.Business.Nokia.Nce.DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Model.Result deleteResult);
 
                            //Ia.Ngn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, vacatedAccessName, port, out Ia.Cl.Model.Result readResult);
 
                            result.AddSuccess("Delete/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); //  + deleteResult.Message + "," + readResult.Message);
 
                            if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
                        }
                        else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
                    }
                    else result.AddError("NDD ONT is null for access name: " + accessName + ".");
                }
                else
                {
                    throw new ArgumentOutOfRangeException("MSMQ process " + message.Process.ToString() + " is undefined");
                }
 
                result.AddSuccess(message.AccessName);
            }
 
            return result;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string ManageProperly()
        {
            var command = Ia.Ngn.Cl.Model.Business.Nokia.Ams.ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements();
 
            ams.SendQueue.Enqueue(command);
 
            return command;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static void KeepAliveOltAmsNameListItem()
        {
            keepAliveCurrentAmsName = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltAmsNameList.NextOf(keepAliveCurrentAmsName);
 
            ams.SendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsKeepAliveCommand(keepAliveCurrentAmsName));
 
            /*
            foreach (string amsName in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.IsNrNokiaOltAmsNameList)
            {
                sendQueue.Enqueue(Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsKeepAliveCommand(amsName));
            }
            */
        }
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static void SendQueueEnqueueReadOnt(string input, out Ia.Cl.Model.Result result)
        {
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor accessVendor;
            List<string> amsCommandList;
 
            result = new Ia.Cl.Model.Result();
 
            if (!string.IsNullOrEmpty(input))
            {
                if (input.Length > 0)
                {
                    input = input.Trim();
                    input = input.ToUpper();
 
                    if (Regex.IsMatch(input, @"^[a-zA-Z]{3}\s+\d{1,3}\s+\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\.\d{1,3}\.\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\/\d{1,3}\/\d{1,3}$"))
                    {
                        if (Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
                        {
                            accessVendor = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
 
                            if (accessVendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
                            {
                                amsCommandList = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(accessName);
 
                                if (amsCommandList != null && amsCommandList.Count > 0)
                                {
                                    if (Ia.Ngn.Cl.Model.Business.Nokia.Ams.IsConnected /*&& activated && !receivingData*/)
                                    {
                                        foreach (string s in amsCommandList)
                                        {
                                            //telnet.Send(s);
                                            ams.SendQueue.Enqueue(s);
                                        }
                                    }
 
                                    result.AddSuccess(accessName);
                                }
                            }
                            else
                            {
                                result.AddError("SendQueueEnqueueReadOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
                            }
                        }
                        else
                        {
                            result.AddError("SendQueueEnqueueReadOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
                        }
                    }
                    else
                    {
                        result.AddError("SendQueueEnqueueReadOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
                    }
                }
                else
                {
                    result.AddError("SendQueueEnqueueReadOnt(): Error: input is empty.");
                }
            }
            else
            {
                result.AddError("SendQueueEnqueueReadOnt(): Error: input is null or empty.");
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static void SendQueueEnqueueResetOnt(string input, out Ia.Cl.Model.Result result)
        {
            string amsCommand;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor accessVendor;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
            //List<string> amsCommandList;
 
            result = new Ia.Cl.Model.Result();
 
            if (!string.IsNullOrEmpty(input))
            {
                if (input.Length > 0)
                {
                    input = input.Trim();
                    input = input.ToUpper();
 
                    if (Regex.IsMatch(input, @"^[a-zA-Z]{3}\s+\d{1,3}\s+\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\.\d{1,3}\.\d{1,3}$") || Regex.IsMatch(input, @"^[a-zA-Z]{3}\/\d{1,3}\/\d{1,3}$"))
                    {
                        if (Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
                        {
                            accessVendor = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
 
                            nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 
                            if (accessVendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
                            {
                                amsCommand = Ia.Ngn.Cl.Model.Business.Nokia.Ams.ResetOntCommand(nddOnt);
 
                                if (!string.IsNullOrEmpty(amsCommand))
                                {
                                    ams.SendQueue.Enqueue(amsCommand);
                                    result.AddSuccess(accessName);
                                }
                            }
                            else
                            {
                                result.AddError("SendQueueEnqueueResetOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
                            }
                        }
                        else
                        {
                            result.AddError("SendQueueEnqueueResetOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
                        }
                    }
                    else
                    {
                        result.AddError("SendQueueEnqueueResetOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
                    }
                }
                else
                {
                    result.AddError("SendQueueEnqueueResetOnt(): Error: input is empty.");
                }
            }
            else
            {
                result.AddError("SendQueueEnqueueResetOnt(): Error: input is null or empty.");
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> PrepareCtaggedCommand(List<string> commandList)
        {
            List<string> ctaggedCommandList;
 
            if (commandList.Count > 0)
            {
                ctaggedCommandList = new List<string>(commandList.Count);
 
                foreach (string command in commandList)
                {
                    ctaggedCommandList.Add(PrepareCtaggedCommand(command));
                }
            }
            else ctaggedCommandList = new List<string>();
 
            return ctaggedCommandList;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static string PrepareCtaggedCommand(string command)
        {
            string ctaggedCommand, ctag;
 
            if (command.Contains("{ctag}"))
            {
                ctag = Ia.Cl.Model.Default.RandomNumber(6);
                // CTAG: The value of the CTAG is a non-zero integer of up to six characters. 
                // CTAG comes before ; or ::
 
                Ia.Ngn.Cl.Model.Data.Nokia.Ams.CorrelationTagDictionary[ctag] = command;
 
                ctaggedCommand = command.Replace("{ctag}", ctag);
            }
            else
            {
                ctaggedCommand = string.Empty;
            }
 
            return ctaggedCommand;
        }
 
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string AmsKeepAliveCommand(string amsName)
        {
            return FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string ResetOntCommand(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
        {
            return FormatAmsOntCommand(AmsOpcode.InitSys, ont);
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string AmsCommandOfARandomAmsKeepAlive()
        {
            var amsName = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList
                           where o.Odf.Vendor == Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia
                           select o.AmsName).ToList().PickRandom();
 
            var command = FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
 
            return command;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static void EnqueuePriorityAmsCommandQueue(string command)
        {
            priorityAmsCommandQueue.Enqueue(command);
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static void EnqueuePriorityAmsCommandQueue(List<string> amsCommandList)
        {
            if (amsCommandList != null && amsCommandList.Count > 0)
            {
                foreach (string s in amsCommandList) priorityAmsCommandQueue.Enqueue(s);
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements()
        {
            string command;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt;
            List<string> list;
 
            command = null;
 
            if (priorityAmsCommandQueue.Count > 0)
            {
                command = priorityAmsCommandQueue.Dequeue();
            }
            else
            {
                /*
                if (false && command == null && randomPercent < 60)
                {
                    if (amsCreateOntCommandQueue.Count == 0)
                    {
                        olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
                        list = AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(olt, true, false, out count);
                        amsCreateOntCommandQueue = new Queue<string>(list);
                    }
                    if (amsCreateOntCommandQueue.Count > 0) command = amsCreateOntCommandQueue.Dequeue();
                }
                */
 
                if (amsCommandQueue.Count == 0)
                {
                    //olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
                    olt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.PickRandom();
 
                    list = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(olt);
 
                    amsCommandQueue = new Queue<string>(list);
                }
 
                if (amsCommandQueue.Count > 0) command = amsCommandQueue.Dequeue();
 
                if (command == null) command = AmsCommandOfARandomAmsKeepAlive();
            }
 
            return command;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, string position)
        {
            return FormatAmsRtrvCommand(amsOpcode, 0, position);
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType, string position)
        {
            // Use this command with variable number of parameters
            string command, amsName;
            List<string> list;
 
            command = null;
 
            list = new List<string>(10);
 
            if (!string.IsNullOrEmpty(position))
            {
                AmsNameAndCardPortOntSquenceFromOntPosition(position, out amsName, out string pon);
 
                if (amsOpcode == AmsOpcode.RtrvOnt)
                {
                    command = "RTRV-ONT:" + amsName + ":ONT-1-1-" + pon + ";";
                    list.Add(command);
                }
                else if (amsOpcode == AmsOpcode.RtrvServiceVoip)
                {
                    command = "RTRV-SERVICE-VOIP:" + amsName + ":VOIP-1-1-" + pon + "-1;";
                    list.Add(command);
                }
                else if (amsOpcode == AmsOpcode.RtrvOntPots)
                {
                    foreach (string ontPotsCardPort in Ia.Ngn.Cl.Model.Business.Nokia.Ont.PossiblePotsCardPortConfigurationForOntFamilyTypeList(familyType))
                    {
                        command = "RTRV-ONTPOTS:" + amsName + ":ONTPOTS-1-1-" + pon + "-" + ontPotsCardPort + ";";
                        list.Add(command);
                    }
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static string FormatAmsOntCommand(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont)
        {
            string command;
 
            command = string.Empty;
 
            if (!string.IsNullOrEmpty(ont.Position))
            {
                AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
 
                if (amsOpcode == AmsOpcode.EdOntDesc1)
                {
                    command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=" + ont.Access.Name + @":;";
                    // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=ESH.4.26:;
                }
                else if (amsOpcode == AmsOpcode.EdOntDesc1Annul)
                {
                    //command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=:;"; // this has no effect on ONT DESC1
                    // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=:;
 
                    command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=NULL:;"; // you must send NULL to change ONT DESC1
                    // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=NULL:;
                }
                else if (amsOpcode == AmsOpcode.InitSys)
                {
                    command = "INIT-SYS:" + amsName + @":ONT-1-1-" + pon + ":::6;";
                    // INIT-SYS:SHD-SUR-LAG17:ONT-1-1-1-1-1:::6;
                }
            }
 
            return command;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> FormatAmsOntOntPotsCommandList(AmsOpcode amsOpcode, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType, string termination, string customerInformation)
        {
            string command;
            List<string> list;
 
            list = new List<string>(10);
 
            if (!string.IsNullOrEmpty(ont.Position))
            {
                AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
 
                termination = termination.Replace("td", "");
 
                if (int.TryParse(termination, out int td))
                {
                    Ia.Ngn.Cl.Model.Business.Nokia.Ont.ReturnOntPotsCardAndPortFromFamilyTypeAndTd(familyType, td, out int card, out int port);
 
                    if (amsOpcode == AmsOpcode.EdOntPotsCustinfo)
                    {
                        if (!string.IsNullOrEmpty(customerInformation))
                        {
                            command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=" + customerInformation + @":;";
                            // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=23632222:;\n";
                        }
                        else
                        {
                            command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=NULL:;";
                            // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=NULL:;\n";
                        }
 
                        list.Add(command);
                    }
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static string FormatAmsCommand(AmsOpcode amsOpcode, string amsName)
        {
            string command;
 
            if (amsOpcode == AmsOpcode.RtrvAlmPon)
            {
                command = "RTRV-ALM-PON:" + amsName + ":ALL:::MN,,NSA;";
 
            }
            else if (amsOpcode == AmsOpcode.RtrvHdr)
            {
                command = "RTRV-HDR:" + amsName + ":;";
            }
            else command = null;
 
            return command;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static void AmsNameAndCardPortOntSquenceFromOntServiceHsiPosition(string ontPosition, out string amsName, out string cardPortOntCardPortServiceSequence)
        {
            Match match;
 
            // SUR-1-1-1-1-1-1-1-1;
            match = Regex.Match(ontPosition, @"([a-zA-Z]{3}\-\d{1,2}\-\d{1,2})\-(\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2}\-\d{1,2})");
 
            amsName = match.Groups[1].Value;
            cardPortOntCardPortServiceSequence = match.Groups[2].Value;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static void AmsNameAndCardPortOntSquenceFromOntPosition(string ontPosition, out string amsName, out string pon)
        {
            Match match;
 
            if (!string.IsNullOrEmpty(ontPosition))
            {
                // SBN-ARD-Lag1-1-1-1;
                match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2}\-\d{1,2}\-\d{1,2})$");
 
                if (match.Success)
                {
                    amsName = match.Groups[1].Value;
                    pon = match.Groups[2].Value;
                }
                else
                {
                    amsName = string.Empty;
                    pon = string.Empty;
                }
            }
            else
            {
                amsName = string.Empty;
                pon = string.Empty;
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        /// Extract OLT Id, Card, Port, and ONT from ONT Position
        /// </summary>
        [Obsolete]
        public static void OltIdCardPortOntFromOntPosition(string ontPosition, out int oltId, out int card, out int port, out int ont)
        {
            string amsName;
            Match match;
 
            if (!string.IsNullOrEmpty(ontPosition))
            {
                // SBN-ARD-Lag1-1-1-1;
                match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2})\-(\d{1,2})\-(\d{1,2})$");
 
                if (match.Success)
                {
                    amsName = match.Groups[1].Value;
                    card = int.Parse(match.Groups[2].Value);
                    port = int.Parse(match.Groups[3].Value);
                    ont = int.Parse(match.Groups[4].Value);
 
                    oltId = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList
                             where o.AmsName == amsName
                             select o.Id).FirstOrDefault();
                }
                else
                {
                    amsName = string.Empty;
                    card = port = ont = 0;
 
                    oltId = 0;
                }
            }
            else
            {
                amsName = string.Empty;
                card = port = ont = 0;
 
                oltId = 0;
            }
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string OntPositionFromAmsNameAndCardPortOntSquence(string amsName, string cardPortOnt)
        {
            string ontPosition;
 
            ontPosition = amsName + "-" + cardPortOnt;
 
            return ontPosition;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            string accessName, ontId, ontDescription1;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
            List<string> list;
 
            var ontIdToOntAccessNameDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntAccessNameDictionary;
 
            var ontIdToDescription1ForNonNullAccessDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdToDescription1ForNonNullAccessDictionary;
 
            var ontIdToDescription1ForNullAccessDictionary = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdToDescription1ForNullAccessDictionary;
 
            //var ontIdWithNullAccessHashtable = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdWithNullAccessHashtable;
 
            var ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
 
            list = new List<string>();
 
            // insert descriptions for missing entries
            if (ontIdToDescription1ForNonNullAccessDictionary.Count > 0)
            {
                foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNonNullAccessDictionary) //Ia.Ngn.Cl.Model.Ont ont in ontList)
                {
                    ontId = kvp.Key;
                    ontDescription1 = kvp.Value;
 
                    if (ontIdToOntAccessNameDictionary.ContainsKey(ontId))
                    {
                        accessName = ontIdToOntAccessNameDictionary[ontId];
 
                        if (ontDescription1 != accessName)
                        {
                            nddOnt = ontIdToOntDictionary[ontId];
 
                            if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
                            {
                                list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1, nddOnt));
                            }
                        }
                        else
                        {
                        }
                    }
                }
            }
 
            // delete descriptions ONTs with missing access info
            if (ontIdToDescription1ForNullAccessDictionary.Count > 0)
            {
                foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNullAccessDictionary)
                {
                    ontId = kvp.Key;
                    ontDescription1 = kvp.Value;
 
                    if (!string.IsNullOrEmpty(ontDescription1))
                    {
                        if (ontIdToOntDictionary.ContainsKey(ontId))
                        {
                            nddOnt = ontIdToOntDictionary[ontId];
 
                            if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
                            {
                                list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
                            }
                        }
                    }
                }
            }
 
            return list.ToList();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            List<string> list;
            Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
 
            var ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
 
            var ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.OntOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList();
 
            list = new List<string>(ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count);
 
            // insert descriptions for missing entries
            if (ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count > 0)
            {
                foreach (var ontOntPotsService in ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList)
                {
                    if (ontIdToOntDictionary.ContainsKey(ontOntPotsService.OntId))
                    {
                        nddOnt = ontIdToOntDictionary[ontOntPotsService.OntId];
 
                        if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
                        {
                            familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ontOntPotsService.OntFamilyTypeId;
 
                            list.AddRange(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntOntPotsCommandList(AmsOpcode.EdOntPotsCustinfo, nddOnt, familyType, ontOntPotsService.Termination, ontOntPotsService.Service));
                        }
                    }
                }
            }
 
            var ontOntPotsCustomerExistsButSubPartyIsNullServiceList = Ia.Ngn.Cl.Model.Data.Nokia.Ams.OntOntPotsCustomerExistsButSubPartyIsNullServiceList();
 
            // delete descriptions of non existant entries
            if (ontOntPotsCustomerExistsButSubPartyIsNullServiceList.Count > 0)
            {
                foreach (var oops in ontOntPotsCustomerExistsButSubPartyIsNullServiceList)
                {
                    if (ontIdToOntDictionary.ContainsKey(oops.OntId))
                    {
                        nddOnt = ontIdToOntDictionary[oops.OntId];
 
                        if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
                        {
                            list.Add(Ia.Ngn.Cl.Model.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
                        }
                    }
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToPreprovisionAllOntsAsDefinedInNddDocumentWithinOltList(int oltId, bool edServiceVoipIsOos, out int count)
        {
            List<string> l, list;
            List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> nddOntList;
 
            count = 0;
            list = null;
 
            nddOntList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == oltId select o).ToList();
 
            if (nddOntList != null && nddOntList.Count > 0)
            {
                list = new List<string>(nddOntList.Count);
 
                foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
                {
                    l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
 
                    list.AddRange(l);
                    count++;
                }
            }
            else
            {
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, bool includeDisplayCommand, bool edServiceVoipIsOos, out int count)
        {
            List<string> l, list;
            List<string> ontIdList;
            List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> nddOntList;
 
            count = 0;
            list = null;
 
            using (var db = new Ia.Ngn.Cl.Model.Ngn())
            {
                nddOntList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
 
                ontIdList = Ia.Ngn.Cl.Model.Data.Nokia.Ont.IdList(olt.Id); //.ReadListByOltId(olt.Id);
 
                if (nddOntList != null && nddOntList.Count > 0)
                {
                    list = new List<string>(nddOntList.Count);
 
                    foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
                    {
                        if (!ontIdList.Contains(nddOnt.Id))
                        {
                            l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
                            list.AddRange(l);
 
                            if (includeDisplayCommand)
                            {
                                l = Ia.Ngn.Cl.Model.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(nddOnt.Access.Name);
                                list.AddRange(l);
                            }
 
                            count++;
                        }
                    }
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(string accessName)
        {
            //Random r;
            List<string> l1, l2, list;
 
            //r = new Random();
 
            l1 = AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(accessName);
 
            l2 = AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(accessName);
 
            list = new List<string>(l1.Count + l2.Count);
 
            foreach (var item in l1) list.Add(item);
            foreach (var item in l2) list.Add(item);
 
            return list.Distinct().ToList();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeAndForOtherOntsDefinedInNddDocumentList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            List<string> l1, l2, list;
 
            l1 = AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt);
 
            l2 = AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt);
 
            list = new List<string>(l1.Count + l2.Count);
 
            foreach (var item in l1) list.Add(item);
            foreach (var item in l2) list.Add(item);
 
            return list.Distinct().Shuffle().ToList();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            HashSet<string> hashSet1, hashSet2, hashSet3, hashSet4, hashSet;
 
            hashSet1 = new HashSet<string>(AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(olt));
 
            hashSet2 = new HashSet<string>(AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(olt));
 
            hashSet3 = new HashSet<string>(AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt));
 
            hashSet4 = new HashSet<string>(AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt));
 
            hashSet = new HashSet<string>(hashSet1);
            hashSet.UnionWith(hashSet2);
            hashSet.UnionWith(hashSet3);
            hashSet.UnionWith(hashSet4);
 
            return hashSet.ToList(); //.Shuffle().ToList();
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(string accessName)
        {
            List<string> list;
            Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
 
            list = new List<string>(5); // 5 is max number of commands from this function
 
            if (!string.IsNullOrEmpty(accessName))
            {
                nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 
                if (nddOnt != null)
                {
                    familyType = Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu;
 
                    list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> AmsCommandsToRetrieveOntsDefinedInNddDocumentList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
            List<string> list;
            List<Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontList;
 
            ontList = (from o in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
 
            familyType = Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu;
 
            list = new List<string>(ontList.Count);
 
            foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont ont in ontList)
            {
                list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, ont.Position));
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(string accessName)
        {
            List<string> list;
            Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
            Ia.Ngn.Cl.Model.Ont ont;
 
            list = new List<string>(5); // 5 is max number of commands from this function
 
            if (!string.IsNullOrEmpty(accessName))
            {
                nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
 
                if (nddOnt != null)
                {
                    ont = Ia.Ngn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
 
                    if (ont != null)
                    {
                        familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
 
                        list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
                        list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
                        list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
                    }
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        private static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt)
        {
            Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType;
            Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
            List<string> list;
            Dictionary<string, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
            List<Ia.Ngn.Cl.Model.Ont> ontList;
 
            ontList = Ia.Ngn.Cl.Model.Data.Nokia.Ont.NonNullAccessList(olt.Id);
 
            ontIdToOntDictionary = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdToOntDictionary;
 
            list = new List<string>(ontList.Count);
 
            foreach (Ia.Ngn.Cl.Model.Ont ont in ontList)
            {
                familyType = (Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
 
                if (ontIdToOntDictionary.ContainsKey(ont.Id))
                {
                    nddOnt = ontIdToOntDictionary[ont.Id];
 
                    //if (ont.Access != null) access is already non null
                    //{
                    list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
                    list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
                    list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
                    //}
                }
            }
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static ArrayList AmsCommandsToRetrieveNewOntAlarmsForOltArrayList()
        {
            ArrayList amsCommandArrayList;
 
            amsCommandArrayList = new ArrayList(Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList.Count);
 
            foreach (var olt in Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OltList)
            {
                amsCommandArrayList.Add(FormatAmsCommand(AmsOpcode.RtrvAlmPon, olt.AmsName));
            }
 
            return amsCommandArrayList;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static ArrayList AmsCommandsToUpdateOntServiceDescriptionWithItsIspNameArrayList()
        {
            ArrayList amsCommandArrayList;
 
            amsCommandArrayList = new ArrayList(100);
 
            return amsCommandArrayList;
        }
 
        /*
        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 
        /// </summary>
        public static int PositionOfHsiServiceForCardAndPortAndOntFamilyType(int card, int port, Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType familyType)
        {
            int position;
            if (familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu || familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
            {
                position = port;
            }
            else if (familyType == Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
            {
                position = (card - 1) * 4 + port;
            }
            else position = 0;
            return position;
        }
        */
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static bool UpdateDatabaseWithAmsCommandOutput(string rowData, out Ia.Cl.Model.Result result)
        {
            bool isUpdated;
            int readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
            string accessId, ontId, ontPosition;
            string line, amsName, cardPortOnt;
            DateTime eventTime;
            Match match;
            MatchCollection matchCollection;
            Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState state;
 
            //ponNameToPonIdHashtable = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.PonNameToPonIdHashtable;
 
            isUpdated = false;
            readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
            result = new Ia.Cl.Model.Result();
            //result.Content = rowData;
 
            // below: remove all '\' characters from rowData and reset NULL comments to ""
            rowData = rowData.Replace(@"\", "");
            rowData = rowData.Replace(@"NULL", "");
 
            if (rowData.Contains("RTRV-ONT:"))
            {
                #region RTRV-ONT
                Ia.Ngn.Cl.Model.Ont ont, dataOnt;
 
                /*
       SUR-1-1 08-07-10 09:35:07
    M  0 COMPLD
       / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1 * /
       / * -1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1- * /
       / * 1-1-8&ONT-1-1-1-1-9 * /
       "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
       DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
       SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
       SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
       POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
       SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
       EQUIPID=BVM3G00CRAO420EB    ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
       IS-NR"
       "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
       PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
       SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
       SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
       ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
       SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
       NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
       "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
       PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
       SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
       SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
       ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
       SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
       NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
                 */
 
                // below: information from the definition of "RTRV-ONT" in "AMS TL1 Commands Reference"
 
                /*
IP 0
<
 
   SUR-1-1 08-07-10 09:35:07
M  0 COMPLD
   / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1 * /
   / * -1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1- * /
   / * 1-1-8&ONT-1-1-1-1-9 * /
   "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
   DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
   SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
   SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
   POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
   SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
   EQUIPID=BVM3G00CRAO420EB    ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
   IS-NR"
   "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
   "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 
   / * More Output Follows * /
>
 
   SUR-1-1 08-07-10 09:35:07
M  0 COMPLD
   / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
   "ONT-1-1-1-1-3::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1C9BC,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
   "ONT-1-1-1-1-4::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1A47A,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
   "ONT-1-1-1-1-5::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1AE44,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 
   / * More Output Follows * /
>
 
   SUR-1-1 08-07-10 09:35:08
M  0 COMPLD
   / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
   "ONT-1-1-1-1-6::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1BE26,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
   "ONT-1-1-1-1-7::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1C94B,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
   "ONT-1-1-1-1-8::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1A484,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 
   / * More Output Follows * /
>
 
   SUR-1-1 08-07-10 09:35:08
M  0 COMPLD
   / * RTRV-ONT:SUR-1-1:ONT-1-1-1-1-1&ONT-1-1-1-1-10&ONT-1-1-1-1-2&ONT-1-1-1-1-3&ONT-1-1-1-1-4&ONT-1-1-1-1-5&ONT-1-1-1-1-6&ONT-1-1-1-1-7&ONT-1-1-1-1-8&ONT-1-1-1-1-9 * /
   "ONT-1-1-1-1-9::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
   PROVVERSION="*",SERNUM=ALCLA0A1A43E,SUBSLOCID="WILDCARD",
   SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
   SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
   ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
   SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
   NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
;
                */
 
                // below: read OntPosition
                match = Regex.Match(rowData, @"RTRV-ONT:([\w\d\-]+)", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
 
                match = Regex.Match(rowData, @"ONT-1-1-(\d{1,2}-\d{1,2}-\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    cardPortOnt = match.Groups[1].Value;
 
                    line = match.Groups[2].Value;
 
                    ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 
                    if (!string.IsNullOrEmpty(ontId))
                    {
                        dataOnt = new Ia.Ngn.Cl.Model.Ont();
 
                        dataOnt.Id = ontId;
                        dataOnt.BatteryBackupAvailable = (Ia.Cl.Model.Default.Match(line, @"BTRYBKUP=(\w+)") == "YES") ? true : false;
                        dataOnt.Description1 = Ia.Cl.Model.Default.Match(line, @"DESC1=""([^""]{1,64})""");
                        dataOnt.Description2 = Ia.Cl.Model.Default.Match(line, @"DESC2=""([^""]{1,64})""");
                        dataOnt.Serial = Ia.Cl.Model.Default.Match(line, @"SERNUM=(\w{12})");
                        dataOnt.PlannedSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERPLND=""(auto|AUTO|\w{14})""");
                        dataOnt.ActiveSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERACT=(\w{14})");
                        dataOnt.PassiveSoftware = Ia.Cl.Model.Default.Match(line, @"SWVERPSV=(\w{14})");
                        dataOnt.FamilyTypeId = (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyTypeIdFromActiveSoftwareAndPlannedSoftware(dataOnt.ActiveSoftware, dataOnt.PlannedSoftware);
                        dataOnt.VendorId = Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Vendor.VendorIdFromName(Ia.Cl.Model.Default.Match(line, @"VENDORID=(\w+)"));
                        dataOnt.EquipmentId = Ia.Cl.Model.Default.Match(line, @"EQUIPID=(\w{16})");
 
                        switch (match.Groups[3].Value)
                        {
                            case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
                            case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
                            case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
                            case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
                            default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
                        }
 
                        dataOnt.StateId = (int)state;
 
                        using (var db = new Ia.Ngn.Cl.Model.Ngn())
                        {
                            accessId = Ia.Ngn.Cl.Model.Business.Access.AccessId(ontId);
 
                            if (accessId != null) dataOnt.Access = (from a in db.Accesses where a.Id == accessId select a).SingleOrDefault();
 
                            ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
 
                            if (ont == null)
                            {
                                dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
 
                                db.Onts.Add(dataOnt);
 
                                insertedItemCount++;
                            }
                            else
                            {
                                existingItemCount++;
 
                                if (ont.Update(dataOnt))
                                {
                                    db.Onts.Attach(ont);
                                    db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 
                                    updatedItemCount++;
                                }
                            }
 
                            db.SaveChanges();
                        }
                    }
                    else
                    {
                        result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
                #endregion
            }
            else if (rowData.Contains("ED-ONT:"))
            {
                #region ED-ONT
                Ia.Ngn.Cl.Model.Ont ont, dataOnt;
 
                /*
   SUR-5-2 14-11-23 05:22:08
M  0 COMPLD
   / * ED-ONT:SUR-5-2:ONT-1-1-1-2-6::::DESC1=ZAH.2.6: * /
 
M  0 COMPLD
   / * ED-ONT:QRW-SLB-LAG2:ONT-1-1-3-2-10:98499:::DESC1=QRW.33.10: * /
;
                */
 
                // below: read OntPosition
                match = Regex.Match(rowData, @"ED-ONT:([\w\d\-]+)", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
 
                match = Regex.Match(rowData, @"ONT-1-1-(\d{1,2}-\d{1,2}-\d{1,2}):\d{0,6}:::(.+?):", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    cardPortOnt = match.Groups[1].Value;
 
                    line = match.Groups[2].Value;
 
                    ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 
                    if (!string.IsNullOrEmpty(ontId))
                    {
                        dataOnt = new Ia.Ngn.Cl.Model.Ont();
 
                        dataOnt.Id = ontId;
                        dataOnt.Description1 = Ia.Cl.Model.Default.Match(line, @"DESC1=(.{1,64})");
                        dataOnt.Description2 = Ia.Cl.Model.Default.Match(line, @"DESC2=(.{1,64})");
 
                        using (var db = new Ia.Ngn.Cl.Model.Ngn())
                        {
                            ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
 
                            if (ont == null)
                            {
                                // below: Don't create a new ONT in this ED-ONT function
                                //dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
 
                                //db.Onts.Add(dataOnt);
 
                                insertedItemCount++;
                            }
                            else
                            {
                                existingItemCount++;
 
                                if (ont.Update(dataOnt))
                                {
                                    db.Onts.Attach(ont);
                                    db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 
                                    updatedItemCount++;
                                }
                            }
 
                            db.SaveChanges();
                        }
                    }
                    else
                    {
                        result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
                #endregion
            }
            else if (rowData.Contains("RTRV-SERVICE-VOIP:"))
            {
                #region RTRV-SERVICE-VOIP
 
                string ontServiceVoipId;
                int card;
                Ia.Ngn.Cl.Model.OntServiceVoip ontServiceVoip, dataOntServiceVoip;
 
                // below: information from the definition of "RTRV-SERVICE-VOIP" in "AMS TL1 Commands Reference"
 
                /*
 
   SUR-1-1 08-07-09 09:43:13
M  0 COMPLD
   / * RTRV-SERVICE-VOIP:SUR-1-1:VOIP-1-1-1-1-1-1&VOIP-1-1-1-1-10-1&VOIP-1-1 * /
   / * -1-1-2-1&VOIP-1-1-1-1-3-1&VOIP-1-1-1-1-4-1&VOIP-1-1-1-1-5-1&VOIP-1-1- * /
   / * 1-1-6-1&VOIP-1-1-1-1-7-1&VOIP-1-1-1-1-8-1&VOIP-1-1-1-1-9-1 * /
   "VOIP-1-1-1-1-1-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
   BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
   IPADDRLOC=10.3.144.1,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
   IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
   VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
   CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
   SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
   SRCVLANID=0:IS-NR"
   "VOIP-1-1-1-1-10-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
   BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
   IPADDRLOC=10.3.144.10,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
   IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
   VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
   CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
   SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
   SRCVLANID=0:IS-NR"
   "VOIP-1-1-1-1-2-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
   BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
   IPADDRLOC=10.3.144.2,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
   IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
   VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
   CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
   SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
   SRCVLANID=0:IS-NR"
 
   / * More Output Follows * /
>
                */
 
                // below: read OntPosition
                match = Regex.Match(rowData, @"RTRV-SERVICE-VOIP:([\w\d\-]+)", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
 
                match = Regex.Match(rowData, @"VOIP-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    cardPortOnt = match.Groups[1].Value;
                    card = int.Parse(match.Groups[2].Value);
 
                    line = match.Groups[3].Value;
 
                    ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 
                    if (!string.IsNullOrEmpty(ontId))
                    {
                        ontServiceVoipId = Ia.Ngn.Cl.Model.Business.Nokia.OntServiceVoip.OntServiceVoipId(ontId, card);
 
                        dataOntServiceVoip = new Ia.Ngn.Cl.Model.OntServiceVoip();
 
                        dataOntServiceVoip.Id = ontServiceVoipId;
 
                        dataOntServiceVoip.ConfiguratinFile = Ia.Cl.Model.Default.Match(line, @"CONFIGFILE=(\w{1,}\.xml)");
                        dataOntServiceVoip.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTOMERID=""([^""]{1,62})""");
                        dataOntServiceVoip.FtpIp = Ia.Cl.Model.Default.Match(line, @"IPADDRFTP=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
                        dataOntServiceVoip.Ip = Ia.Cl.Model.Default.Match(line, @"IPADDRLOC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
                        dataOntServiceVoip.Label = Ia.Cl.Model.Default.Match(line, @"LABEL=""([^""]{1,80})""");
                        dataOntServiceVoip.MgcIp = Ia.Cl.Model.Default.Match(line, @"IPADDRMGC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
                        dataOntServiceVoip.MgcSecondaryIp = Ia.Cl.Model.Default.Match(line, @"IPADDRMGCSEC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 
                        switch (match.Groups[4].Value)
                        {
                            case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
                            case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
                            case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
                            case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
                            default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
                        }
 
                        dataOntServiceVoip.StateId = (int)state;
 
                        dataOntServiceVoip.Svlan = int.Parse(Ia.Cl.Model.Default.Match(line, @"SVLAN=(\d{1,3})"));
 
                        using (var db = new Ia.Ngn.Cl.Model.Ngn())
                        {
                            dataOntServiceVoip.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 
                            ontServiceVoip = (from osv in db.OntServiceVoips where osv.Id == dataOntServiceVoip.Id select osv).SingleOrDefault();
 
                            if (ontServiceVoip == null)
                            {
                                dataOntServiceVoip.Created = dataOntServiceVoip.Updated = DateTime.UtcNow.AddHours(3);
 
                                db.OntServiceVoips.Add(dataOntServiceVoip);
 
                                insertedItemCount++;
                            }
                            else
                            {
                                existingItemCount++;
 
                                if (ontServiceVoip.Update(dataOntServiceVoip))
                                {
                                    db.OntServiceVoips.Attach(ontServiceVoip);
                                    db.Entry(ontServiceVoip).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 
                                    updatedItemCount++;
                                }
                            }
 
                            db.SaveChanges();
                        }
                    }
                    else
                    {
                        result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
                #endregion
            }
            else if (rowData.Contains("RTRV-ONTPOTS:"))
            {
                #region RTRV-ONTPOTS
 
                string ontOntPotsId;
                int card, port, svlan;
                Ia.Ngn.Cl.Model.OntOntPots ontOntPots, dataOntOntPots;
 
                // below: information from the definition of "RTRV-ONTPOTS" in "AMS TL1 Commands Reference"
 
                /*
                 * ;RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1;
 
   SUR-1-1 14-03-13 08:15:46
M  0 COMPLD
   /* RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1 * /
   "ONTPOTS-1-1-1-1-1-2-1::VOIPSERV=1,TERMID=td1,POTSDSCP=46,POTSPWR=0,
   CALLHIST=DISABLED,PWROVERRIDE=FALSE,SIPMSGTOTH=0,BRRPKTLOSSTH=0,XJTTRTH=0,
   RXGAIN=0,TXGAIN=0:IS-NR"
;
*/
 
                // below: read OntPosition
                match = Regex.Match(rowData, @"RTRV-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
 
                match = Regex.Match(rowData, @"ONTPOTS-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})-(\d{1,2})::(.+?):\s*(IS-NR|OOS-AU|OOS-MA|OOS-AUMA)", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    cardPortOnt = match.Groups[1].Value;
                    card = int.Parse(match.Groups[2].Value);
                    port = int.Parse(match.Groups[3].Value);
 
                    line = match.Groups[4].Value;
 
                    ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 
                    if (!string.IsNullOrEmpty(ontId))
                    {
                        if (card >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumPortValue)
                        {
                            ontOntPotsId = Ia.Ngn.Cl.Model.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
 
                            dataOntOntPots = new Ia.Ngn.Cl.Model.OntOntPots();
 
                            dataOntOntPots.Id = ontOntPotsId;
 
                            dataOntOntPots.Card = card;
                            dataOntOntPots.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTINFO=(\w{1,80})");
                            dataOntOntPots.Port = port;
 
                            switch (match.Groups[5].Value)
                            {
                                case "IS-NR": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.IsNr; break;
                                case "OOS-AU": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAu; break;
                                case "OOS-MA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosMa; break;
                                case "OOS-AUMA": state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.OosAuma; break;
                                default: state = Ia.Ngn.Cl.Model.Business.Nokia.Ams.BellcoreState.Undefined; break;
                            }
 
                            dataOntOntPots.StateId = (int)state;
 
                            if (int.TryParse(Ia.Cl.Model.Default.Match(line, @"SVLAN=(\d{1,3})"), out svlan)) dataOntOntPots.Svlan = svlan;
 
                            dataOntOntPots.Termination = Ia.Cl.Model.Default.Match(line, @"TERMID=(\w{1,20})");
                            dataOntOntPots.Tn = Ia.Cl.Model.Default.Match(line, @"TN=(\w{1,16})");
                            dataOntOntPots.VoipClientIp = Ia.Cl.Model.Default.Match(line, @"VOIPCLIENTADDR=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 
                            using (var db = new Ia.Ngn.Cl.Model.Ngn())
                            {
                                dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 
                                ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
 
                                if (ontOntPots == null)
                                {
                                    dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
 
                                    db.OntOntPots.Add(dataOntOntPots);
 
                                    insertedItemCount++;
                                }
                                else
                                {
                                    existingItemCount++;
 
                                    if (ontOntPots.Update(dataOntOntPots))
                                    {
                                        db.OntOntPots.Attach(ontOntPots);
                                        db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 
                                        updatedItemCount++;
                                    }
                                }
 
                                db.SaveChanges();
                            }
                        }
                        else
                        {
                            result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
                        }
                    }
                    else
                    {
                        result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
 
                #endregion
            }
            else if (rowData.Contains("ED-ONTPOTS:"))
            {
                #region ED-ONTPOTS
 
                string ontOntPotsId;
                int card, port;
                Ia.Ngn.Cl.Model.OntOntPots ontOntPots, dataOntOntPots;
 
                /* ED-ONTPOTS:SUL-1-1:ONTPOTS-1-1-9-1-1-2-1:14614:::CUSTINFO=24977777: */
                /* ED-ONTPOTS:SJA-JHR-LAG14:ONTPOTS-1-1-1-6-4-0-0:2425:::CUSTINFO=24531914: */
 
                // below: read OntPosition
                match = Regex.Match(rowData, @"ED-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
 
                match = Regex.Match(rowData, @"ONTPOTS-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})-(\d{1,2}):(.+?):", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    cardPortOnt = match.Groups[1].Value;
                    card = int.Parse(match.Groups[2].Value);
                    port = int.Parse(match.Groups[3].Value);
 
                    line = match.Groups[4].Value;
 
                    ontId = Ia.Ngn.Cl.Model.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 
                    if (!string.IsNullOrEmpty(ontId))
                    {
                        if (card >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ngn.Cl.Model.Business.Nokia.Ont.MaximumPortValue)
                        {
                            ontOntPotsId = Ia.Ngn.Cl.Model.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
 
                            dataOntOntPots = new Ia.Ngn.Cl.Model.OntOntPots();
 
                            dataOntOntPots.Id = ontOntPotsId;
 
                            dataOntOntPots.Card = card;
                            dataOntOntPots.Customer = Ia.Cl.Model.Default.Match(line, @"CUSTINFO=(\w{1,80})");
                            dataOntOntPots.Port = port;
 
                            using (var db = new Ia.Ngn.Cl.Model.Ngn())
                            {
                                dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 
                                ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
 
                                if (ontOntPots == null)
                                {
                                    dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
 
                                    db.OntOntPots.Add(dataOntOntPots);
 
                                    insertedItemCount++;
                                }
                                else
                                {
                                    existingItemCount++;
 
                                    if (ontOntPots.Update(dataOntOntPots))
                                    {
                                        db.OntOntPots.Attach(ontOntPots);
                                        db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 
                                        updatedItemCount++;
                                    }
                                }
 
                                db.SaveChanges();
                            }
                        }
                        else
                        {
                            result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
                        }
                    }
                    else
                    {
                        result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
 
                #endregion
            }
            else if (rowData.Contains("RTRV-ALM-PON:"))
            {
                // Note: this RTRV-ALM-PON: commnad is never issued by code actally. New ONTs are detected below (see "REPT ALM") as part of regular events
                #region RTRV-ALM-PON
 
                Ia.Ngn.Cl.Model.Event @event;
 
                // below: important, remove all ''' char from string
                rowData = rowData.Replace(@"'", "");
 
                // below: read eventTime and amsName
                // QRW-1-1 14-03-31 06:15:20
                match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))", RegexOptions.Singleline);
 
                amsName = match.Groups[1].Value;
                eventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
 
                // old "PON-1-1-9-2,PON:MN,NEWONT,NSA,,,,: \"SERNUM =ALCLA0A2D17A, SLID =DEFAULT,\""
                // old matchCollection = Regex.Matches(rowData, @"""(PON-\d{1,2}-\d{1,2}-\d{1,2}-\d{1,2}),PON:MN,NEWONT,NSA,,,,:\s*\r\n\s*""(SERNUM\s*=\s*(ALCL\w{8}), SLID\s*=\s*DEFAULT,)""""", RegexOptions.Singleline);
 
                /*
    "PON-1-1-10-3:CL,NEWONT,NSA,5-26,23-8-36,,:,
    "SERNUM =ALCLA0A22564, SLID =DEFAULT                 ,
    LOID =                        , USRATE =1.25g""
                */
 
                matchCollection = Regex.Matches(rowData, @"""(PON-\d{1,2}-\d{1,2}-\d{1,2}-\d{1,2}):(CL|MN),NEWONT,NSA,\d{1,2}-\d{1,2},\d{1,2}-\d{1,2}-\d{1,2},,:,\s*\r\n\s*""(SERNUM\s*=\s*(ALCL\w{8}),\s*SLID\s*=\s*DEFAULT\s*,)\s*\r\n\s*.+?""""", RegexOptions.Singleline);
 
                if (matchCollection.Count > 0)
                {
                    using (var db = new Ia.Ngn.Cl.Model.Ngn())
                    {
                        foreach (Match m in matchCollection)
                        {
                            if (m.Success)
                            {
                                @event = new Ia.Ngn.Cl.Model.Event();
 
                                @event.Aid = m.Groups[1].Value;
                                @event.Cause = "NEWONT";
                                @event.Class = "ONT";
                                @event.Detail = m.Groups[3].Value;
                                @event.EventTime = eventTime;
                                @event.NodeTime = null;
                                @event.Number = 0;
                                @event.SeverityEffect = "NSA";
                                @event.Severity = m.Groups[2].Value;
                                @event.System = amsName;
                                @event.TypeId = 0;
 
                                @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
                                db.Events.Add(@event);
 
                                insertedItemCount++;
                            }
                        }
 
                        db.SaveChanges();
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
                }
 
                #endregion
            }
            else if (rowData.Contains("REPT ALM"))
            {
                #region REPT ALM
 
                string _class, aid;
                Ia.Ngn.Cl.Model.Event @event;
 
                // below: important, remove all ''' char from string
                rowData = rowData.Replace(@"'", "");
 
                // SUR-1-2 08-07-18 11:24:06 * 491 REPT ALM ONT "ONT-1-1-9-2-5:MN,INACT,SA,7-18,11-24-6:\"ONT is inactive\"" ;
 
                /*
   SLA-SUR-LAG16 18-06-24 18:21:01
A  37211 REPT ALM ONT
   "ONT-1-1-5-9-20:CL,DG,SA,6-24,18-21-1:
   "Received Dying Gasp indication from ONT","
;                 */
                // old: match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\r\n(.{1,10})\s+(\d{1,6}) REPT (ALM|EVT|ALM ENV|SW) (\w{1,20})\r\n\s+""(\w{1,20})-(\d{1,2})-(\d{1,2})-([^:]+?):(CR|MJ|MN|CL),(\w{1,20}),(SA|NSA|NR|Ind NR),((\d{1,2})-(\d{1,2})),((\d{1,2})-(\d{1,2})-(\d{1,2})).*:[\r\n\s]*""(.+?)""[,]{0,1}""\r\n;", RegexOptions.Singleline);
                match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))\r\n(.{1,10})\s+(\d{1,6}) REPT (ALM|EVT|ALM ENV|SW) (\w{1,20})\r\n\s+""(\w{1,20})-(\d{1,2})-(\d{1,2})-([^:]+?):(CR|MJ|MN|CL),(\w{1,20}),(SA|NSA|NR|Ind NR),((\d{1,2})-(\d{1,2})),((\d{1,2})-(\d{1,2})-(\d{1,2})).*:.*[\r\n\s]*""(.+?)""[,]{0,1}""\r\n;", RegexOptions.Singleline);
 
                if (match.Success)
                {
                    amsName = match.Groups[1].Value;
 
                    _class = match.Groups[12].Captures[0].Value;
                    aid = match.Groups[13].Captures[0].Value + "-" + match.Groups[14].Captures[0].Value + "-" + match.Groups[15].Captures[0].Value + "-" + match.Groups[16].Captures[0].Value;
 
                    ontPosition = CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(amsName, _class, aid);
                    ontId = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntIdByPosition(ontPosition);
 
                    @event = new Ia.Ngn.Cl.Model.Event();
 
                    @event.Aid = aid;
                    @event.Cause = match.Groups[18].Captures[0].Value;
                    @event.Class = _class;
                    @event.Detail = match.Groups[27].Captures[0].Value.Replace(@"""", "");
                    @event.EventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
                    @event.NodeTime = DateTime.ParseExact(match.Groups[3].Captures[0].Value + "-" + match.Groups[21].Captures[0].Value.PadLeft(2, '0') + "-" + match.Groups[22].Captures[0].Value.PadLeft(2, '0') + " " + match.Groups[24].Captures[0].Value.PadLeft(2, '0') + ":" + match.Groups[25].Captures[0].Value.PadLeft(2, '0') + ":" + match.Groups[26].Captures[0].Value.PadLeft(2, '0'), "yy-MM-dd HH:mm:ss", null);
                    @event.Number = int.Parse(match.Groups[10].Captures[0].Value);
                    @event.SeverityEffect = match.Groups[19].Captures[0].Value;
                    @event.Severity = match.Groups[17].Captures[0].Value;
                    @event.System = amsName;
                    @event.TypeId = 0;
 
                    using (var db = new Ia.Ngn.Cl.Model.Ngn())
                    {
                        if (ontId != null) @event.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 
                        @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
                        db.Events.Add(@event);
 
                        insertedItemCount++;
 
                        db.SaveChanges();
                    }
                }
                else
                {
                    result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: REPT ALM [" + rowData + "] was not matched.");
                }
 
                #endregion
            }
 
            if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
            else isUpdated = false;
 
            result.AddSuccess("(" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
 
            return isUpdated;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        /// 
        /// </summary>
        private static string CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(string amsName, string _class, string aid)
        {
            /*
--BRGPORT    BRGPORT-1-1-11-2-6-1-1
--PON    PON-1-1-13-1
--EQPT    LT-1-1-14
--ONTPOTS    ONTPOTS-1-1-8-1-17-2-2
--ONTVOIP    VOIP-1-1-13-2-22-1
--ONT    ONT-1-1-13-1-10
--ONTENET    ONTENET-1-1-2-1-20-1-1
--ONTCARD    ONTCARD-1-1-9-2-8-1
--ONTHSI    HSI-1-1-2-1-8-1-2-2
            */
 
            string ontPosition;
            Match match;
 
            ontPosition = string.Empty;
 
            if (!string.IsNullOrEmpty(aid) && !string.IsNullOrEmpty(_class))
            {
                if (_class == "BRGPORT")
                {
                    // BRGPORT    BRGPORT-1-1-11-2-6-1-1
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "PON")
                {
                    // PON    PON-1-1-13-1
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-1"; // I will assign the first ONT in the PON as indication to the PON
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "EQPT")
                {
                    // EQPT    LT-1-1-14
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-1"; // I will assign the first PON ONT in the PON as indication to the PON
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONTPOTS")
                {
                    // ONTPOTS    ONTPOTS-1-1-8-1-17-2-2
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONTVOIP")
                {
                    // ONTVOIP    VOIP-1-1-13-2-22-1
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONT")
                {
                    // ONT    ONT-1-1-13-1-10
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONTENET")
                {
                    // ONTENET    ONTENET-1-1-2-1-20-1-1
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONTCARD")
                {
                    // ONTCARD    ONTCARD-1-1-9-2-8-1
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else if (_class == "ONTHSI")
                {
                    // ONTHSI    HSI-1-1-2-1-8-1-2-2
                    match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 
                    if (match.Success)
                    {
                        ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
                    }
                    else
                    {
                        throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
                    }
                }
                else
                {
                    throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + ". Class is unknown.") { };
                }
            }
            else
            {
                throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): aid and/or class are null.") { };
            }
 
            return ontPosition;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public bool AddPot(string td)
        {
            bool b;
 
            b = true;
 
 
            return b;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string CommandsToDeleteAndCreateServiceVoipUsingNdd(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, Ia.Ngn.Cl.Model.Ont ont, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
        {
            string sa, cardPortOnt, voipServiceState;
 
            sa = string.Empty;
 
            foreach (Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.PonGroup ponGroup in olt.PonGroupList)
            {
                cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 
                if (edServiceVoipIsOos) voipServiceState = "OOS";
                else voipServiceState = "IS";
 
                sa = @"
# Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
 
                if (ont != null)
                {
                    if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Undefined)
                    {
                        sa += @"
 
# Delete ONTPOTS
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
 
# Delete VOIP
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 
# Create VOIP
ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Olt.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
                    }
                    else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
                    {
                        sa += @"
 
# Delete ONTPOTS
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
 
# Delete VOIP
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 
# Create VOIP
ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
                    }
                    else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gmdu)
                    {
                        sa += @"
 
# Delete ONTPOTS
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8:::::OOS;
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8:::::OOS;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8::;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8::;
 
# Delete VOIP
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 
# Create VOIP
ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=8,BWPROFDNID=8,PQPROFID=1,AESENABLE=DISABLE,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
 
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
 
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
                    }
                    else
                    {
                        throw new Exception("Unknown familyType") { };
                    }
                }
                else
                {
 
                    sa = @"
# Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
 
                    sa += @"
# ONT does not have an associated Access to it.";
 
                    sa += @"
 
# Delete ONTPOTS
ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
 
# Delete VOIP
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 
# Create VOIP
ENT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,LABEL=" + nddOnt.Access.Name + @",SVLAN=" /*+ ponGroup.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + ponGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=" + olt.Odf.Router.Oams.FirstOrDefault().ConfigFile + @":IS;
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
                }
            }
 
            return sa;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string CommandsToCreateOntPots(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Olt olt, Ia.Ngn.Cl.Model.Ont ont, Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
        {
            string sa, cardPortOnt, voipServiceState;
 
            cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 
            if (edServiceVoipIsOos) voipServiceState = "OOS";
            else voipServiceState = "IS";
 
            sa = @"
# Create ONTPOTS: " + ont.Access.Name + @" " + ont.Access.Position;
 
            if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu)
            {
                sa += @"
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
            }
            else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
            {
                sa += @"
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
            }
            else if (ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ngn.Cl.Model.Business.Nokia.Ont.FamilyType.Gmdu)
            {
                sa += @"
 
# Create ONTPOTS
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
 
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
 
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
 
# VOIP service state
ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 
 
";
            }
            else
            {
                sa += @"
 
# Unknown FamilyType
 
 
";
            }
 
            return sa;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static List<string> CommandsToPreprovisionOntWithinOlt(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
        {
            string cardPortOnt, voipServiceState;
            List<string> list;
 
            list = new List<string>();
 
            if (edServiceVoipIsOos) voipServiceState = "OOS";
            else voipServiceState = "IS";
 
            cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 
            //list.Add("# Preprovision an empty ONT on the network: " + nddOnt.Access.Name + @" " + nddOnt.Position + " (" + nddOnt.Ip + @");");
            list.Add("ENT-ONT:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONT-1-1-" + cardPortOnt + @"::::SWVERPLND=" + Ia.Ngn.Cl.Model.Data.Nokia.Ams.PlannedSoftware + @",DESC1=" + nddOnt.Access.Name + @",DESC2=""NULL"":OOS;");
 
            //list.Add("# Provision the VOIP service;");
            list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-2:::POTS::IS;");
            list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-1:::10_100BASET::IS;");
            list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-1::::SESSPROFID=1,MAXMACNUM=4:IS;");
            list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-2::::SESSPROFID=1,MAXMACNUM=4:IS;");
            list.Add("ENT-SERVICE-VOIP:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1::::BWPROFUPID=1,BWPROFDNID=1,PQPROFID=1,SVLAN=" /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @",IPADDRLOC=" + nddOnt.Ip + @",NETMASKLOC=" + nddOnt.MgcSubnetMask + @",DEFROUTER=" + nddOnt.Pon.PonGroup.GatewayIp + @",IPADDRMGC=" + nddOnt.MgcIp + @",IPADDRMGCSEC=" + nddOnt.MgcSecondaryIp + @",VOIPMODE=SSH248,CONFIGFILE=kuwait.xml:IS;");
            list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;");
            list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;");
            list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;");
            list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;");
 
            //list.Add("# VOIP service state");
            list.Add("ED-SERVICE-VOIP:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";");
 
            return list;
        }
 
        ////////////////////////////////////////////////////////////////////////////
 
        /// <summary>
        ///
        /// </summary>
        public static string CommandsToPreprovisionOntWithinOltUsingConfigureCommand(Ia.Ngn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
        {
            string sa, rackSubCardPortOnt;//, voipServiceState;
 
            //if (edServiceVoipIsOos) voipServiceState = "OOS";
            //else voipServiceState = "IS";
 
            rackSubCardPortOnt = nddOnt.Rack + "/" + nddOnt.Sub + "/" + nddOnt.CardSlot + "/" + nddOnt.Port + "/" + nddOnt.InternalNumber;
 
            sa = @"
configure equipment ont slot " + rackSubCardPortOnt + @"/1 planned-card-type 10_100base plndnumdataports 2 plndnumvoiceports 0
configure equipment ont slot " + rackSubCardPortOnt + @"/2 planned-card-type pots plndnumdataports 0 plndnumvoiceports 4
configure qos interface ont:" + rackSubCardPortOnt + @" us-num-queue 8
configure qos interface " + rackSubCardPortOnt + @"/voip upstream-queue 5 bandwidth-profile name:VOICE bandwidth-sharing ont-sharing 
configure bridge port " + rackSubCardPortOnt + @"/voip max-unicast-mac 8    
configure bridge port " + rackSubCardPortOnt + @"/voip vlan-id " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
configure bridge port " + rackSubCardPortOnt + @"/voip pvid " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
configure voice ont service " + rackSubCardPortOnt + @"/1 voip-mode softswitch-h248 mgc-ip-addr " + nddOnt.MgcIp + @" sec-mgc-ip-addr " + nddOnt.MgcSecondaryIp + @" conf-file-name " + nddOnt.Pon.PonGroup.Olt.Odf.Router.Oams.First().ConfigFile + @" ip-address " + nddOnt.Ip + @" net-mask 255.255.248.0 default-router " + nddOnt.Pon.PonGroup.GatewayIp + @" vlan " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
 
";
 
            return sa;
        }
 
        ////////////////////////////////////////////////////////////////////////////    
        ////////////////////////////////////////////////////////////////////////////    
    }
 
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////   
}