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

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 Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections;
    3: using System.Collections.Generic;
    4: using System.Configuration;
    5: using System.Data;
    6: using System.Linq;
    7: using System.Text.RegularExpressions;
    8: using System.Threading.Tasks;
    9:  
   10: namespace Ia.Ftn.Cl.Models.Business.Nokia
   11: {
   12:     ////////////////////////////////////////////////////////////////////////////
   13:  
   14:     /// <summary publish="true">
   15:     /// Access Management System (AMS) support class for Nokia's Fixed Telecommunications Network (FTN) business model.
   16:     /// </summary>
   17:     /// 
   18:     /// "AppSettings": {
   19:     /// "AmsServerHost": "********",
   20:     /// "AmsServerPort": "****",
   21:     /// "AmsServerActUser": "ACT-USER:{amsName}:********:{ctag}::********;",
   22:     /// "AmsServerCancUser": "CANC-USER:{amsName}:********:{ctag};"
   23:     /// }
   24:     /// 
   25:     /// <remarks> 
   26:     /// Copyright © 2007-2024 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   27:     /// </remarks> 
   28:     public class Ams
   29:     {
   30:         // below: access data for Nokia AMS
   31:         private const string textToSkipInTelnetEndReceive = "IP 0\r\n<";
   32:         private static string lastSentCommand;
   33:         private static string keepAliveCurrentAmsName = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.NokiaOltAmsNameList.PickRandom();
   34:  
   35:         private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure = new Ia.Ftn.Cl.Models.Business.Procedure(24, Ia.Ftn.Cl.Models.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
   36:         private static readonly Procedure serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure = new Ia.Ftn.Cl.Models.Business.Procedure(0, Ia.Ftn.Cl.Models.Business.Provision._ServiceOntToCreateAndToDeleteInEmsOntSipInfoOrVoipPstnUserListFromThePastNHourList);
   37:  
   38:         private static readonly Dictionary<string, int> associateServiceIdAndPortBetweenCreateAndReadDictionary = new Dictionary<string, int>();
   39:  
   40:         private static Dictionary<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont, bool> eventDictionary = new Dictionary<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont, bool>();
   41:  
   42:         private static readonly Queue<string> priorityAmsCommandQueue = new Queue<string>();
   43:         private static Queue<string> amsCommandQueue = new Queue<string>();
   44:         private static readonly Queue<string> amsCreateOntCommandQueue = new Queue<string>();
   45:  
   46:         private static Ia.Ftn.Cl.Models.Client.Nokia.Ams ams = new Ia.Ftn.Cl.Models.Client.Nokia.Ams();
   47:  
   48:         private static List<string> priorityServiceList = new List<string>();
   49:  
   50:         /// <summary/>
   51:         public enum AmsOpcode
   52:         {
   53:             /// <summary/>
   54:             RtrvHdr,
   55:  
   56:             /// <summary/>
   57:             RtrvOnt,
   58:  
   59:             /// <summary/>
   60:             InitSys,
   61:  
   62:             /// <summary/>
   63:             RtrvServiceVoip,
   64:  
   65:             /// <summary/>
   66:             RtrvOntPots,
   67:  
   68:             /// <summary/>
   69:             RtrvAlmPon,
   70:  
   71:             /// <summary/>
   72:             EdOntDesc1,
   73:  
   74:             /// <summary/>
   75:             EdOntDesc1Annul,
   76:  
   77:             /// <summary/>
   78:             EdOntPotsCustinfo
   79:         }
   80:  
   81:         /// <summary/>
   82:         public enum BellcoreState
   83:         {
   84:             /// <summary/>
   85:             Undefined = 0,
   86:  
   87:             /// <summary/>
   88:             IsNr = 1,
   89:  
   90:             /// <summary/>
   91:             OosAu,
   92:  
   93:             /// <summary/>
   94:             OosMa,
   95:  
   96:             /// <summary/>
   97:             OosAuma
   98:         };
   99:  
  100:         /// <summary/>
  101:         public static string Host { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AmsServerHost"); } }
  102:  
  103:         /// <summary/>
  104:         public static int Port { get { return int.Parse(Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AmsServerPort")); } }
  105:  
  106:         /// <summary/>
  107:         public static string ActUser(string amsName)
  108:         {
  109:             return PrepareCtaggedCommand(Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AmsServerActUser").Replace("{amsName}", amsName));
  110:         }
  111:  
  112:         /// <summary/>
  113:         public static string CancUser(string amsName)
  114:         {
  115:             return PrepareCtaggedCommand(Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:AmsServerCancUser").Replace("{amsName}", amsName));
  116:         }
  117:  
  118:         /// <summary/>
  119:         public static string TextToSkipInTelnetEndReceive { get { return textToSkipInTelnetEndReceive; } }
  120:  
  121:         ////////////////////////////////////////////////////////////////////////////
  122:  
  123:         /// <summary>
  124:         ///
  125:         /// </summary>
  126:         public Ams()
  127:         {
  128:         }
  129:  
  130:         ////////////////////////////////////////////////////////////////////////////
  131:  
  132:         /// <summary>
  133:         ///
  134:         /// </summary>
  135:         public static void Connect(out Ia.Cl.Models.Result result)
  136:         {
  137:             if (ams != null && !ams.IsConnected)
  138:             {
  139:                 result = ams.Connect();
  140:             }
  141:             else
  142:             {
  143:                 result = new Ia.Cl.Models.Result();
  144:  
  145:                 result.AddWarning("Warning: ams is already connected.");
  146:             }
  147:         }
  148:  
  149:         ////////////////////////////////////////////////////////////////////////////
  150:  
  151:         /// <summary>
  152:         ///
  153:         /// </summary>
  154:         public static void Disconnect(out Ia.Cl.Models.Result result)
  155:         {
  156:             if (ams != null && ams.IsConnected)
  157:             {
  158:                 result = ams.Disconnect();
  159:             }
  160:             else
  161:             {
  162:                 result = new Ia.Cl.Models.Result();
  163:  
  164:                 result.AddWarning("Warning: ams is already disconnected.");
  165:             }
  166:         }
  167:  
  168:         ////////////////////////////////////////////////////////////////////////////
  169:  
  170:         /// <summary>
  171:         ///
  172:         /// </summary>
  173:         public static void Login()
  174:         {
  175:             foreach (string amsName in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.NokiaOltAmsNameList)
  176:             {
  177:                 ams.SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Nokia.Ams.ActUser(amsName));
  178:             }
  179:         }
  180:  
  181:         ////////////////////////////////////////////////////////////////////////////
  182:  
  183:         /// <summary>
  184:         ///
  185:         /// </summary>
  186:         public static void Logout()
  187:         {
  188:             foreach (string amsName in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.NokiaOltAmsNameList)
  189:             {
  190:                 ams.SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Nokia.Ams.CancUser(amsName));
  191:             }
  192:         }
  193:  
  194:         ////////////////////////////////////////////////////////////////////////////
  195:  
  196:         /// <summary>
  197:         ///
  198:         /// </summary>
  199:         public static Queue<string> ReceiveQueue
  200:         {
  201:             get
  202:             {
  203:                 return ams.ReceiveQueue;
  204:             }
  205:         }
  206:  
  207:         ////////////////////////////////////////////////////////////////////////////
  208:  
  209:         /// <summary>
  210:         ///
  211:         /// </summary>
  212:         public static Queue<string> SendQueue
  213:         {
  214:             get
  215:             {
  216:                 return ams.SendQueue;
  217:             }
  218:         }
  219:  
  220:         ////////////////////////////////////////////////////////////////////////////
  221:  
  222:         /// <summary>
  223:         ///
  224:         /// </summary>
  225:         public static bool IsConnected
  226:         {
  227:             get
  228:             {
  229:                 return (ams != null && ams.IsConnected);
  230:             }
  231:         }
  232:  
  233:         ////////////////////////////////////////////////////////////////////////////
  234:  
  235:         /// <summary>
  236:         ///
  237:         /// </summary>
  238:         public static bool IsLoggedIn
  239:         {
  240:             get
  241:             {
  242:                 return ams.IsLoggedIn;
  243:             }
  244:         }
  245:  
  246:         ////////////////////////////////////////////////////////////////////////////
  247:         ////////////////////////////////////////////////////////////////////////////
  248:  
  249:         /// <summary>
  250:         ///
  251:         /// </summary>
  252:         public static Ia.Cl.Models.Result ManageReceiveQueue()
  253:         {
  254:             bool isUpdated;
  255:             string rowString, formattedString;
  256:             Ia.Cl.Models.Result updateDatabaseWithAmsCommandOutputResult;
  257:  
  258:             var result = new Ia.Cl.Models.Result();
  259:  
  260:             try
  261:             {
  262:                 while (ReceiveQueue.Count > 0)
  263:                 {
  264:                     rowString = ReceiveQueue.Dequeue();
  265:  
  266:                     formattedString = Ia.Cl.Models.Telnet.FormatAndCleanData(rowString);
  267:  
  268:                     isUpdated = Ia.Ftn.Cl.Models.Business.Nokia.Ams.UpdateDatabaseWithAmsCommandOutput(formattedString, out updateDatabaseWithAmsCommandOutputResult);
  269:  
  270:                     if (updateDatabaseWithAmsCommandOutputResult.IsSuccessful && !updateDatabaseWithAmsCommandOutputResult.HasWarning)
  271:                     {
  272:                         result.AddSuccess(updateDatabaseWithAmsCommandOutputResult.Message + ": formattedString: [" + formattedString + "]");
  273:                     }
  274:                     else
  275:                     {
  276:                         result.AddError("ManageReceiveQueue(): formattedString: [" + formattedString + "]");
  277:                     }
  278:  
  279:                     if (result.IsSuccessful)
  280:                     {
  281:                         AnalyzeReceivedData(formattedString);
  282:                     }
  283:                     else
  284:                     {
  285:                     }
  286:                 }
  287:             }
  288:             catch (Exception ex)
  289:             {
  290:                 result.AddError("ManageReceiveQueue: Exception: " + ex.Message);
  291:             }
  292:  
  293:             return result;
  294:         }
  295:  
  296:         ////////////////////////////////////////////////////////////////////////////
  297:  
  298:         /// <summary>
  299:         ///
  300:         /// </summary>
  301:         private static void AnalyzeReceivedData(string data)
  302:         {
  303:             string lastSentCommandWithoutSemiColon;
  304:  
  305:             //lastCommandEchoedBack = true;
  306:  
  307:             if (data.Contains("COMPLD"))
  308:             {
  309:                 if (lastSentCommand != null)
  310:                 {
  311:                     lastSentCommandWithoutSemiColon = lastSentCommand.Replace(";", "");
  312:  
  313:                     // below: detect the activation of user
  314:                     // debug
  315:                     //activated = true;
  316:                     //if (lastSentCommand == Ia.Ftn.Cl.Model.Business.Nokia.Ams.ActUser(olt.AmsName)) activated = true;
  317:                     //else if (lastSentCommand == Ia.Ftn.Cl.Model.Business.Nokia.Ams.CancUser(olt.AmsName)) activated = false;
  318:  
  319:                     /*
  320:                     if (data.Contains(lastSentCommandWithoutSemiColon)) lastCommandEchoedBack = true;
  321:                     else
  322:                     {
  323:                         //lastCommandEchoBackCounter = 5;
  324:                         lastCommandEchoedBack = false;
  325:                     }
  326:                     */
  327:                 }
  328:             }
  329:             else if (data.Contains("DENY")) { }
  330:             else if (data.Contains(Ia.Ftn.Cl.Models.Business.Nokia.Ams.TextToSkipInTelnetEndReceive)) { }
  331:             else if (data == "\r\n<") { }
  332:             /*
  333:             else
  334:             {
  335:                 lastCommandEchoBackCounter = 5;
  336:                 lastCommandEchoedBack = false;
  337:             }
  338:              */
  339:         }
  340:  
  341:         ////////////////////////////////////////////////////////////////////////////
  342:  
  343:         /// <summary>
  344:         ///
  345:         /// </summary>
  346:         public static string ManageSendQueue(out Ia.Cl.Models.Result result)
  347:         {
  348:             var command = string.Empty;
  349:             result = new Ia.Cl.Models.Result();
  350:  
  351:             try
  352:             {
  353:                 if (ams.SendQueue.Count > 0)
  354:                 {
  355:                     command = ams.SendQueue.Dequeue();
  356:  
  357:                     result = ams.Send(command);
  358:                 }
  359:             }
  360:             catch (Exception ex)
  361:             {
  362:                 result.AddError("ManageSendQueue(): Exception: " + ex.Message);
  363:             }
  364:  
  365:             return result.IsSuccessful ? command : string.Empty;
  366:         }
  367:  
  368:         ////////////////////////////////////////////////////////////////////////////
  369:  
  370:         /// <summary>
  371:         ///
  372:         /// </summary>
  373:         public static Ia.Cl.Models.Result ManageSynchronizationBetweenAccessAndSwitchPast24Hours()
  374:         {
  375:             // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
  376:  
  377:             Ia.Ftn.Cl.Models.Business.Procedure.Process process;
  378:  
  379:             var result = new Ia.Cl.Models.Result();
  380:  
  381:             process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.NextProcess(priorityServiceList);
  382:  
  383:             if (priorityServiceList.Count > 50) priorityServiceList.Clear();
  384:  
  385:             if (process.Type != Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.None)
  386:             {
  387:                 if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Create)
  388:                 {
  389:                     result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
  390:  
  391:                     //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  392:                 }
  393:                 else if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Read)
  394:                 {
  395:                     result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
  396:  
  397:                     //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  398:                 }
  399:                 else if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Delete)
  400:                 {
  401:                     result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserOfServiceFromThePast24HourProcedure.ProgressCounterString);
  402:  
  403:                     //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  404:                 }
  405:                 else result.AddError("sync: undefined procedure");
  406:  
  407:                 // Ia.Ftn.Cl.Model.Data.MessageQueue.SecretaryApplication.Updated() is in Ia.Ftn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
  408:             }
  409:             else result.AddWarning("sync: undefined"); // nothing to create or delete");
  410:  
  411:             return result;
  412:         }
  413:  
  414:         ////////////////////////////////////////////////////////////////////////////
  415:  
  416:         /// <summary>
  417:         ///
  418:         /// </summary>
  419:         public static Ia.Cl.Models.Result ManageSynchronizationBetweenAccessAndSwitch()
  420:         {
  421:             // See: ManageSynchronizationBetweenAccessAndSwitchPastHour(), ManageSynchronizationBetweenAccessAndSwitchPast24Hours(), ManageSynchronizationBetweenAccessAndSwitch()
  422:  
  423:             Ia.Ftn.Cl.Models.Business.Procedure.Process process;
  424:  
  425:             var result = new Ia.Cl.Models.Result();
  426:  
  427:             // problem: I have put empty new List<string>() here because there is an exception: System.Exception: Undefined function
  428:             process = serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.NextProcess(new List<string>());
  429:  
  430:             if (process.Type != Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.None)
  431:             {
  432:                 if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Create)
  433:                 {
  434:                     result.AddSuccess("create: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
  435:  
  436:                     //CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  437:                 }
  438:                 else if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Read)
  439:                 {
  440:                     result.AddSuccess("read: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
  441:  
  442:                     //ReadOntSipInfoOrVoipPstnUser(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  443:                 }
  444:                 else if (process.Type == Ia.Ftn.Cl.Models.Business.Procedure.ProcessType.Delete)
  445:                 {
  446:                     result.AddSuccess("delete: " + process.ServiceId + " " + serviceOntToCreateOrDeleteInEmsOntSipInfoOrVoipPstnUserProcedure.ProgressCounterString);
  447:  
  448:                     //_ = VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(process.Service, process.Ont, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, ref result);
  449:                 }
  450:                 else result.AddError("sync: undefined procedure");
  451:  
  452:                 // Ia.Ftn.Cl.Model.Data.MessageQueue.SecretaryApplication.Updated() is in Ia.Ftn.Cl.Model.Business.Nokia.Ams.UpdateDatabaseWithEmsCommandOutput();
  453:             }
  454:             else result.AddWarning("sync: undefined"); // nothing to create or delete");
  455:  
  456:             return result;
  457:         }
  458:  
  459:         ////////////////////////////////////////////////////////////////////////////
  460:         ////////////////////////////////////////////////////////////////////////////
  461:  
  462:         /*
  463:         ////////////////////////////////////////////////////////////////////////////
  464:         ////////////////////////////////////////////////////////////////////////////
  465: 
  466:         /// <summary>
  467:         ///
  468:         /// </summary>
  469:         public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Models.Result result)
  470:         {
  471:             int serviceType;
  472:             string serviceId;
  473:             Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt;
  474: 
  475:             result = new Ia.Cl.Models.Result();
  476: 
  477:             serviceType = Ia.Ftn.Cl.Model.Business.Service.ServiceType.ImsService;
  478: 
  479:             try
  480:             {
  481:                 if (!string.IsNullOrEmpty(service))
  482:                 {
  483:                     if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  484:                     {
  485:                         serviceId = Ia.Ftn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
  486: 
  487:                         if (!string.IsNullOrEmpty(accessName))
  488:                         {
  489:                             nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  490: 
  491:                             if (nddOnt != null)
  492:                             {
  493:                                 Ia.Ftn.Cl.Model.Business.Nokia.Ams.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, nddOnt, port, ref result);
  494:                             }
  495:                             else result.AddError("NDD ONT is null for access name: " + accessName + ".");
  496:                         }
  497:                         else result.AddError("AccessName null or empty.");
  498:                     }
  499:                     else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
  500:                 }
  501:                 else result.AddError("Service null or empty.");
  502:             }
  503:             catch (Exception ex)
  504:             {
  505:                 result.AddError("Exception: " + ex.ToString() + ".");
  506:             }
  507:         }
  508: 
  509:         ////////////////////////////////////////////////////////////////////////////
  510: 
  511:         /// <summary>
  512:         ///
  513:         /// </summary>
  514:         public static void CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Models.Result result)
  515:         {
  516:             Ia.Ftn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPnPort;
  517:             Ia.Ftn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
  518:             Ia.Ftn.Cl.Model.Ont ont;
  519: 
  520:             if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  521:             {
  522:                 if (nddOnt != null)
  523:                 {
  524:                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
  525:                     {
  526:                         ont = Ia.Ftn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
  527: 
  528:                         if (ont != null)
  529:                         {
  530:                             if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
  531:                             {
  532:                                 if (ont.FamilyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
  533:                                 {
  534:                                     var accessNameToMduDevDictionary = Ia.Ftn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
  535: 
  536:                                     if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
  537:                                     {
  538:                                         mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
  539: 
  540:                                         var vacantFnSnPnList = Ia.Ftn.Cl.Model.Data.Nokia.Ams.VacantMduFnSnPnForOntList(mduDev, ont);
  541: 
  542:                                         if (vacantFnSnPnList.Count > 0)
  543:                                         {
  544:                                             if (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  545:                                             {
  546:                                                 fnSnPnPort = vacantFnSnPnList.Where(f => f.Port == port).SingleOrDefault();
  547:                                             }
  548:                                             else fnSnPnPort = Ia.Ftn.Cl.Model.Data.Nokia.Ams.NextVacantMduFnSnPnForOnt(mduDev, ont);
  549: 
  550:                                             if (fnSnPnPort != null)
  551:                                             {
  552:                                                 var emsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
  553: 
  554:                                                 if (emsVoipPstnUserList.Count == 0)
  555:                                                 {
  556:                                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnUser(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
  557: 
  558:                                                     if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
  559:                                                     {
  560:                                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendCreateVoipPstnAccount(ems, mduDev, nddOnt, service, fnSnPnPort.Sn, fnSnPnPort.Pn);
  561:                                                     }
  562: 
  563:                                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
  564: 
  565:                                                     associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = fnSnPnPort.Port;
  566: 
  567:                                                     result.AddSuccess("command(s) sent...");
  568:                                                 }
  569:                                                 else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
  570:                                             }
  571:                                             else result.AddError("MDU sn and/or tel is invalid or does not exist.");
  572:                                         }
  573:                                         else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MDU.");
  574:                                     }
  575:                                     else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
  576:                                 }
  577:                                 else // SFU
  578:                                 {
  579:                                     var vacantList = Ia.Ftn.Cl.Model.Data.Nokia.Ams.VacantTelForOntList(ont);
  580: 
  581:                                     if (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  582:                                     {
  583:                                         port = vacantList.Contains(port) ? port : Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown;
  584:                                     }
  585:                                     else port = Ia.Ftn.Cl.Model.Data.Nokia.Ams.NextVacantTelForOnt(ont);
  586: 
  587:                                     if (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  588:                                     {
  589:                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendCreateOntSipInfo(ems, nddOnt, service, port);
  590: 
  591:                                         // Don't use SAVE-DEV here
  592:                                         //Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, ont.EmsPort.EmsBoard.EmsDev);
  593: 
  594:                                         associateServiceIdAndPortBetweenCreateAndReadDictionary[service] = port;
  595: 
  596:                                         result.AddSuccess("command(s) sent...");
  597:                                     }
  598:                                     else result.AddError("port is invalid or does not exist.");
  599:                                 }
  600:                             }
  601:                             else result.AddError("OLT is not SIP, its H.248.");
  602:                         }
  603:                         else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
  604:                     }
  605:                     else result.AddError("access is not in an allowed to be provisioned OLT: " + nddOnt.Access.Name + ".");
  606:                 }
  607:                 else result.AddError("nddOnt is null, does not exist for service: " + service + ".");
  608:             }
  609:             else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
  610:         }
  611: 
  612:         ////////////////////////////////////////////////////////////////////////////
  613: 
  614:         /// <summary>
  615:         ///
  616:         /// </summary>
  617:         public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, out Ia.Cl.Models.Result result)
  618:         {
  619:             ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, string.Empty, Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown, out result);
  620:         }
  621: 
  622:         ////////////////////////////////////////////////////////////////////////////
  623: 
  624:         /// <summary>
  625:         ///
  626:         /// </summary>
  627:         public static void ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Models.Result result)
  628:         {
  629:             int serviceType;
  630:             string serviceId;
  631: 
  632:             result = new Ia.Cl.Models.Result();
  633: 
  634:             serviceType = Ia.Ftn.Cl.Model.Business.Service.ServiceType.ImsService;
  635: 
  636:             try
  637:             {
  638:                 if (!string.IsNullOrEmpty(service))
  639:                 {
  640:                     if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  641:                     {
  642:                         serviceId = Ia.Ftn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
  643: 
  644:                         if (!string.IsNullOrEmpty(accessName))
  645:                         {
  646:                             var nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  647: 
  648:                             if (nddOnt != null)
  649:                             {
  650:                                 Ia.Ftn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, nddOnt, port, ref result);
  651:                             }
  652:                             else result.AddError("NDD ONT is null for access name: " + accessName + ".");
  653:                         }
  654:                         else
  655:                         {
  656:                             Ia.Ftn.Cl.Model.Business.Nokia.Ams.ReadOntSipInfoOrVoipPstnUser(service, null, port, ref result);
  657:                         }
  658:                     }
  659:                     else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
  660:                 }
  661:                 else result.AddError("Service null or empty.");
  662:             }
  663:             catch (Exception ex)
  664:             {
  665:                 result.AddError("Exception: " + ex.ToString() + ".");
  666:             }
  667:         }
  668: 
  669:         ////////////////////////////////////////////////////////////////////////////
  670: 
  671:         /// <summary>
  672:         ///
  673:         /// </summary>
  674:         public static void ReadOntSipInfoOrVoipPstnUser(string service, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Models.Result result)
  675:         {
  676:             Ia.Ftn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
  677:             Ia.Ftn.Cl.Model.Ont ont;
  678: 
  679:             if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  680:             {
  681:                 if (nddOnt != null)
  682:                 {
  683:                     ont = Ia.Ftn.Cl.Model.Data.Nokia.Ont.Read(nddOnt.Id);
  684: 
  685:                     if (ont != null)
  686:                     {
  687:                         if (ont.FamilyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
  688:                         {
  689:                             var accessNameToMduDevDictionary = Ia.Ftn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
  690: 
  691:                             if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
  692:                             {
  693:                                 mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
  694: 
  695:                                 if (port != Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  696:                                 {
  697:                                     var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
  698: 
  699:                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
  700:                                 }
  701:                                 else if (associateServiceIdAndPortBetweenCreateAndReadDictionary.ContainsKey(service))
  702:                                 {
  703:                                     port = associateServiceIdAndPortBetweenCreateAndReadDictionary[service];
  704: 
  705:                                     var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
  706: 
  707:                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
  708:                                 }
  709:                                 else
  710:                                 {
  711:                                     foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
  712:                                     {
  713:                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
  714:                                     }
  715:                                 }
  716: 
  717:                                 result.AddSuccess("command(s) sent...");
  718:                             }
  719:                             else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
  720:                         }
  721:                         else // SFU
  722:                         {
  723:                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
  724: 
  725:                             result.AddSuccess("command(s) sent...");
  726:                         }
  727:                     }
  728:                     else result.AddError("ont is null, does not exist for access: " + nddOnt.Access.Name + ".");
  729:                 }
  730:                 else
  731:                 {
  732:                     var emsOntSipInfoList = Ia.Ftn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
  733: 
  734:                     if (emsOntSipInfoList.Count > 0)
  735:                     {
  736:                         // SFU
  737: 
  738:                         foreach (var emsOntSipInfo in emsOntSipInfoList)
  739:                         {
  740:                             ont = emsOntSipInfo.EmsOnt;
  741: 
  742:                             if (ont.Access != null)
  743:                             {
  744:                                 nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
  745: 
  746:                                 if (nddOnt != null)
  747:                                 {
  748:                                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
  749:                                     {
  750:                                         if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
  751:                                         {
  752:                                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadOntSipInfo(ems, nddOnt);
  753: 
  754:                                             result.AddSuccess("command(s) sent...");
  755:                                         }
  756:                                         else result.AddError("OLT is not SIP, its H.248.");
  757:                                     }
  758:                                     else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
  759:                                 }
  760:                                 else result.AddError("nddOnt is null, does not exist for service " + service + ".");
  761:                             }
  762:                             else result.AddError("ont.Access is null for service " + service + ".");
  763:                         }
  764:                     }
  765: 
  766: 
  767:                     var emsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
  768: 
  769:                     if (emsVoipPstnUserList.Count > 0)
  770:                     {
  771:                         // MDU
  772: 
  773:                         foreach (var emsVoipPstnUser in emsVoipPstnUserList)
  774:                         {
  775:                             ont = emsVoipPstnUser.EmsOnt;
  776: 
  777:                             if (ont.Access != null)
  778:                             {
  779:                                 nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
  780: 
  781:                                 if (nddOnt != null)
  782:                                 {
  783:                                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
  784:                                     {
  785:                                         if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
  786:                                         {
  787:                                             if (ont.FamilyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
  788:                                             {
  789:                                                 var accessNameToMduDevDictionary = Ia.Ftn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
  790: 
  791:                                                 if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
  792:                                                 {
  793:                                                     mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
  794: 
  795:                                                     foreach (var fnSnPnPort in mduDev.PossibleFnSnPnPortList)
  796:                                                     {
  797:                                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, mduDev.Dev, fnSnPnPort.Sn, fnSnPnPort.Pn);
  798: 
  799:                                                         result.AddSuccess("command(s) sent...");
  800:                                                     }
  801:                                                 }
  802:                                                 else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
  803:                                             }
  804:                                             else result.AddError("ONT family type is not MDU.");
  805:                                         }
  806:                                         else result.AddError("OLT is not SIP, its H.248.");
  807:                                     }
  808:                                     else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
  809:                                 }
  810:                                 else result.AddError("nddOnt is null, does not exist for service " + service + ".");
  811:                             }
  812:                             else result.AddError("ont.Access is null for service " + service + ".");
  813:                         }
  814: 
  815: 
  816:                         var msanEmsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
  817: 
  818:                         if (msanEmsVoipPstnUserList.Count > 0)
  819:                         {
  820:                             // MSAN
  821: 
  822:                             foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
  823:                             {
  824:                                 ReadVoipPstnUser(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
  825:                             }
  826: 
  827:                             result.AddSuccess("command(s) sent...");
  828:                         }
  829:                     }
  830:                 }
  831:             }
  832:             else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
  833:         }
  834: 
  835:         ////////////////////////////////////////////////////////////////////////////
  836: 
  837:         /// <summary>
  838:         ///
  839:         /// </summary>
  840:         public static string DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(string service, string accessName, int port, out Ia.Cl.Models.Result result)
  841:         {
  842:             int serviceType;
  843:             string serviceId, vacatedAccessName;
  844:             Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
  845: 
  846:             result = new Ia.Cl.Models.Result();
  847: 
  848:             serviceType = Ia.Ftn.Cl.Model.Business.Service.ServiceType.ImsService;
  849: 
  850:             vacatedAccessName = string.Empty;
  851: 
  852:             try
  853:             {
  854:                 if (!string.IsNullOrEmpty(service))
  855:                 {
  856:                     if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  857:                     {
  858:                         serviceId = Ia.Ftn.Cl.Model.Business.Service.ServiceToServiceId(service, serviceType);
  859: 
  860:                         if (!string.IsNullOrEmpty(accessName))
  861:                         {
  862:                             var nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  863: 
  864:                             if (nddOnt != null)
  865:                             {
  866:                                 vacatedNddOnt = Ia.Ftn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, nddOnt, port, ref result);
  867: 
  868:                                 vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
  869:                             }
  870:                             else result.AddError("NDD ONT is null for access name: " + accessName + ".");
  871:                         }
  872:                         else if (port == Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  873:                         {
  874:                             vacatedNddOnt = Ia.Ftn.Cl.Model.Business.Nokia.Ams.VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(service, null, port, ref result);
  875: 
  876:                             vacatedAccessName = (vacatedNddOnt != null) ? vacatedNddOnt.Access.Name : string.Empty;
  877:                         }
  878:                         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.");
  879:                     }
  880:                     else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
  881:                 }
  882:                 else result.AddError("Service null or empty.");
  883:             }
  884:             catch (Exception ex)
  885:             {
  886:                 result.AddError("Exception: " + ex.ToString() + ".");
  887:             }
  888: 
  889:             return vacatedAccessName;
  890:         }
  891: 
  892:         ////////////////////////////////////////////////////////////////////////////
  893: 
  894:         /// <summary>
  895:         ///
  896:         /// </summary>
  897:         public static Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont VacateOntSipInfoOrDeleteVoipPstnUserAndOrVacateVoipPstnAccount(string service, Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont nddOnt, int port, ref Ia.Cl.Models.Result result)
  898:         {
  899:             Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Ont vacatedNddOnt;
  900:             Ia.Ftn.Cl.Model.Business.Nokia.Dev.MduDev mduDev;
  901:             Ia.Ftn.Cl.Model.Ont ont;
  902: 
  903:             vacatedNddOnt = nddOnt;
  904: 
  905:             if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
  906:             {
  907:                 if (nddOnt != null)
  908:                 {
  909:                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
  910:                     {
  911:                         if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
  912:                         {
  913:                             ont = Ia.Ftn.Cl.Model.Data.Nokia.Ont.ReadIncludeAccess(nddOnt.Id);
  914: 
  915:                             if (ont.FamilyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
  916:                             {
  917:                                 var accessNameToMduDevDictionary = Ia.Ftn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
  918: 
  919:                                 if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
  920:                                 {
  921:                                     mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
  922: 
  923:                                     if (port == Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  924:                                     {
  925:                                         var emsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
  926: 
  927:                                         foreach (var emsVoipPstnUser in emsVoipPstnUserList)
  928:                                         {
  929:                                             if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
  930:                                             {
  931:                                                 Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
  932:                                             }
  933: 
  934:                                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
  935: 
  936:                                             result.AddSuccess("command(s) sent...");
  937:                                         }
  938:                                     }
  939:                                     else
  940:                                     {
  941:                                         var fnSnPnPort = mduDev.PossibleFnSnPnPortList.Where(f => f.Port == port).SingleOrDefault();
  942: 
  943:                                         if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
  944:                                         {
  945:                                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
  946:                                         }
  947: 
  948:                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, mduDev.FirstFnSnPnPort.Sn, fnSnPnPort.Pn);
  949: 
  950:                                         result.AddSuccess("command(s) sent...");
  951:                                     }
  952: 
  953:                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
  954:                                 }
  955:                                 else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service " + service + " and access " + nddOnt.Access.Name + ".");
  956:                             }
  957:                             else // SFU
  958:                             {
  959:                                 if (port == Ia.Ftn.Cl.Model.Business.Default.PortUndefinedOrInvalidOrUnknown)
  960:                                 {
  961:                                     var emsOntSipInfoList = Ia.Ftn.Cl.Model.Data.Nokia.OntSipInfo.ReadByService(service);
  962: 
  963:                                     foreach (var emsOntSipInfo in emsOntSipInfoList)
  964:                                     {
  965:                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
  966:                                     }
  967: 
  968:                                     result.AddSuccess("command(s) sent...");
  969:                                 }
  970:                                 else
  971:                                 {
  972:                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, port);
  973: 
  974:                                     result.AddSuccess("command(s) sent...");
  975:                                 }
  976:                             }
  977:                         }
  978:                         else result.AddError("OLT is not SIP, its H.248.");
  979:                     }
  980:                     else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
  981:                 }
  982:                 else
  983:                 {
  984:                     var emsOntSipInfoList = Ia.Ftn.Cl.Model.Data.Nokia.OntSipInfo.ReadByServiceIncludeEmsOntAndAccess(service);
  985: 
  986:                     if (emsOntSipInfoList.Count > 0)
  987:                     {
  988:                         // SFU
  989: 
  990:                         foreach (var emsOntSipInfo in emsOntSipInfoList)
  991:                         {
  992:                             ont = emsOntSipInfo.EmsOnt;
  993: 
  994:                             if (ont.Access != null)
  995:                             {
  996:                                 nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
  997: 
  998:                                 if (nddOnt != null)
  999:                                 {
 1000:                                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 1001:                                     {
 1002:                                         if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 1003:                                         {
 1004:                                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateOntSipInfo(ems, nddOnt, service, emsOntSipInfo.TEL);
 1005: 
 1006:                                             result.AddSuccess("command(s) sent...");
 1007:                                         }
 1008:                                         else result.AddError("OLT is not SIP, its H.248.");
 1009:                                     }
 1010:                                     else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 1011:                                 }
 1012:                                 else result.AddError("nddOnt is null, does not exist for service " + service + ".");
 1013: 
 1014:                                 vacatedNddOnt = nddOnt;
 1015:                             }
 1016:                             else result.AddError("ont.Access is null for service " + service + ".");
 1017:                         }
 1018:                     }
 1019: 
 1020: 
 1021:                     var emsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
 1022: 
 1023:                     if (emsVoipPstnUserList.Count > 0)
 1024:                     {
 1025:                         // MDU
 1026: 
 1027:                         foreach (var emsVoipPstnUser in emsVoipPstnUserList)
 1028:                         {
 1029:                             ont = emsVoipPstnUser.EmsOnt;
 1030: 
 1031:                             if (ont.Access != null)
 1032:                             {
 1033:                                 nddOnt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntByOntAccessId(ont.Access.Id);
 1034: 
 1035:                                 if (nddOnt != null)
 1036:                                 {
 1037:                                     if (Ia.Ftn.Cl.Model.Business.Service.OltIsWithinAllowedToBeProvisionedOrMigratedOltList(nddOnt.Pon.PonGroup.Olt))
 1038:                                     {
 1039:                                         if (nddOnt.Pon.PonGroup.Olt.IsSip == true)
 1040:                                         {
 1041:                                             if (ont.FamilyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 1042:                                             {
 1043:                                                 var accessNameToMduDevDictionary = Ia.Ftn.Cl.Model.Data.Nokia.Default.AccessNameToMduDevDictionary;
 1044: 
 1045:                                                 if (accessNameToMduDevDictionary.ContainsKey(nddOnt.Access.Name))
 1046:                                                 {
 1047:                                                     mduDev = accessNameToMduDevDictionary[nddOnt.Access.Name];
 1048: 
 1049:                                                     if (nddOnt.Pon.PonGroup.Olt.Odf.Router.Vendor == Ia.Ftn.Cl.Model.Business.NetworkDesignDocument.Vendor.Nokia)
 1050:                                                     {
 1051:                                                         Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 1052:                                                     }
 1053: 
 1054:                                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, mduDev, nddOnt, service, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 1055: 
 1056:                                                     Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, mduDev);
 1057: 
 1058:                                                     result.AddSuccess("command(s) sent...");
 1059:                                                 }
 1060:                                                 else result.AddError("ont.FamilyType is MDU but AccessNameToMduDevDictionary does not contain key: " + nddOnt.Access.Name + " for service: " + service + ", and access: " + nddOnt.Access.Name + ".");
 1061:                                             }
 1062:                                             else result.AddError("ONT family type is not MDU.");
 1063:                                         }
 1064:                                         else result.AddError("OLT is not SIP, its H.248.");
 1065:                                     }
 1066:                                     else result.AddError("nddOnt.Access.Name " + nddOnt.Access.Name + " is not in an allowed to be provisioned OLT.");
 1067:                                 }
 1068:                                 else result.AddError("nddOnt is null, does not exist for service " + service + ".");
 1069: 
 1070:                                 vacatedNddOnt = nddOnt;
 1071:                             }
 1072:                             else result.AddError("ont.Access is null for service " + service + ".");
 1073:                         }
 1074:                     }
 1075:                     else
 1076:                     {
 1077:                         var msanEmsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
 1078: 
 1079:                         if (msanEmsVoipPstnUserList.Count > 0)
 1080:                         {
 1081:                             // MSAN
 1082: 
 1083:                             foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
 1084:                             {
 1085:                                 DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 1086:                             }
 1087: 
 1088:                             result.AddSuccess("command(s) sent...");
 1089:                         }
 1090:                         else result.AddWarning("Could not find service " + service + ".");
 1091:                     }
 1092:                 }
 1093:             }
 1094:             else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 1095: 
 1096:             return vacatedNddOnt;
 1097:         }
 1098: 
 1099:         ////////////////////////////////////////////////////////////////////////////
 1100: 
 1101:         /// <summary>
 1102:         ///
 1103:         /// </summary>
 1104:         public static List<Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser2(string service, out Ia.Cl.Models.Result result)
 1105:         {
 1106:             Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic;
 1107: 
 1108:             result = new Ia.Cl.Models.Result();
 1109: 
 1110:             var licList = new List<Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
 1111: 
 1112:             if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 1113:             {
 1114:                 var msanEmsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByMsanService(service);
 1115: 
 1116:                 if (msanEmsVoipPstnUserList.Count > 0)
 1117:                 {
 1118:                     // MSAN
 1119: 
 1120:                     foreach (var emsVoipPstnUser in msanEmsVoipPstnUserList)
 1121:                     {
 1122:                         DeleteVoipPstnUserAndOrVacateVoipPstnAccount(emsVoipPstnUser.DID, emsVoipPstnUser.FN, emsVoipPstnUser.SN, emsVoipPstnUser.PN);
 1123: 
 1124:                         lic = Ia.Ftn.Cl.Model.Data.Nokia.Default.MsanDevLicByEmsVoipPstnUserId(emsVoipPstnUser.Id);
 1125: 
 1126:                         licList.Add(lic);
 1127:                     }
 1128: 
 1129:                     result.AddSuccess("command(s) sent...");
 1130:                 }
 1131:                 else result.AddWarning("Could not find service " + service + ".");
 1132:             }
 1133:             else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 1134: 
 1135:             return licList;
 1136:         }
 1137: 
 1138:         ////////////////////////////////////////////////////////////////////////////
 1139: 
 1140:         /// <summary>
 1141:         ///
 1142:         /// </summary>
 1143:         public static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(string dev, int fn, int sn, int pn)
 1144:         {
 1145:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
 1146: 
 1147:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
 1148: 
 1149:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
 1150:         }
 1151: 
 1152:         ////////////////////////////////////////////////////////////////////////////
 1153: 
 1154:         /// <summary>
 1155:         ///
 1156:         /// </summary>
 1157:         private static void DeleteVoipPstnUserAndOrVacateVoipPstnAccount(int did, int fn, int sn, int pn)
 1158:         {
 1159:             var dev = Ia.Ftn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
 1160: 
 1161:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendVacateVoipPstnAccount(ems, dev, fn, sn, pn);
 1162: 
 1163:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
 1164: 
 1165:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
 1166:         }
 1167: 
 1168:         ////////////////////////////////////////////////////////////////////////////
 1169:         ////////////////////////////////////////////////////////////////////////////
 1170: 
 1171:         /// <summary>
 1172:         ///
 1173:         /// </summary>
 1174:         public static Ia.Cl.Models.Result CreateMsanVoipPstnUser(string msanDevId, int fn, int sn, int pn, string service)
 1175:         {
 1176:             Ia.Ftn.Cl.Model.Business.Nokia.Default.FnSnPnPort fnSnPn;
 1177: 
 1178:             var result = new Ia.Cl.Models.Result();
 1179: 
 1180:             if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 1181:             {
 1182:                 var msanDev = (from m in Ia.Ftn.Cl.Model.Data.Nokia.Default.MsanDevList where m.Id == msanDevId select m).Single();
 1183: 
 1184:                 var vacantFnSnPnList = Ia.Ftn.Cl.Model.Data.Nokia.Ams.VacantMsanFnSnPnListForMsanDev(msanDev);
 1185: 
 1186:                 if (vacantFnSnPnList.Count > 0)
 1187:                 {
 1188:                     fnSnPn = vacantFnSnPnList.Where(f => f.Fn == fn && f.Sn == sn && f.Pn == pn).SingleOrDefault();
 1189: 
 1190:                     if (fnSnPn == null) fnSnPn = Ia.Ftn.Cl.Model.Data.Nokia.Ams.NextVacantMsanFnSnPnForMsanDev(msanDev);
 1191: 
 1192:                     if (fnSnPn != null)
 1193:                     {
 1194:                         var emsVoipPstnUserList = Ia.Ftn.Cl.Model.Data.Nokia.VoipPstnUser.ReadByService(service);
 1195: 
 1196:                         if (emsVoipPstnUserList.Count == 0)
 1197:                         {
 1198:                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendCreateMsanVoipPstnUser(ems, msanDev, fnSnPn.Fn, fnSnPn.Sn, fnSnPn.Pn, service);
 1199: 
 1200:                             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, msanDev);
 1201: 
 1202:                             result.AddSuccess("command(s) sent...");
 1203:                         }
 1204:                         else result.AddError("emsVoipPstnUserList count != 0. Value must be zero before the operation is executed for service: " + service + ".");
 1205:                     }
 1206:                     else result.AddError("MDU sn and/or tel is invalid or does not exist.");
 1207:                 }
 1208:                 else result.AddError("vacantFnSnPnList.Count is 0. There are no vacant ports in MSAN.");
 1209:             }
 1210:             else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 1211: 
 1212:             return result;
 1213:         }
 1214: 
 1215:         ////////////////////////////////////////////////////////////////////////////
 1216: 
 1217:         /// <summary>
 1218:         ///
 1219:         /// </summary>
 1220:         public static void ReadVoipPstnUser(string dev, int fn, int sn, int pn)
 1221:         {
 1222:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
 1223:         }
 1224: 
 1225:         ////////////////////////////////////////////////////////////////////////////
 1226: 
 1227:         /// <summary>
 1228:         ///
 1229:         /// </summary>
 1230:         public static void ReadMsanVoipPstnUser(Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic lic)
 1231:         {
 1232:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, lic.MsanDevDev, lic.Sn, lic.Pn);
 1233:         }
 1234: 
 1235:         ////////////////////////////////////////////////////////////////////////////
 1236: 
 1237:         /// <summary>
 1238:         ///
 1239:         /// </summary>
 1240:         public static void ReadVoipPstnUser(string service)
 1241:         {
 1242:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, service);
 1243:         }
 1244: 
 1245:         ////////////////////////////////////////////////////////////////////////////
 1246: 
 1247:         /// <summary>
 1248:         ///
 1249:         /// </summary>
 1250:         private static void ReadVoipPstnUser(int did, int fn, int sn, int pn)
 1251:         {
 1252:             var dev = Ia.Ftn.Cl.Model.Data.Nokia.Dev.DidToDevDictionary[did];
 1253: 
 1254:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendReadVoipPstnUser(ems, dev, sn, pn);
 1255:         }
 1256: 
 1257:         ////////////////////////////////////////////////////////////////////////////
 1258: 
 1259:         /// <summary>
 1260:         ///
 1261:         /// </summary>
 1262:         public static void DeleteVoipPstnUser(string dev, int fn, int sn, int pn)
 1263:         {
 1264:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendDeleteVoipPstnUser(ems, dev, fn, sn, pn);
 1265: 
 1266:             Ia.Ftn.Cl.Model.Data.Nokia.Ams.SendSaveDev(ems, dev);
 1267:         }
 1268: 
 1269:         ////////////////////////////////////////////////////////////////////////////
 1270: 
 1271:         /// <summary>
 1272:         ///
 1273:         /// </summary>
 1274:         public static List<Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic> DeleteMsanVoipPstnUser(string service, out Ia.Cl.Models.Result result)
 1275:         {
 1276:             var licList = new List<Ia.Ftn.Cl.Model.Business.Nokia.Dev.MsanDev.Lic>();
 1277: 
 1278:             result = new Ia.Cl.Models.Result();
 1279: 
 1280:             try
 1281:             {
 1282:                 if (!string.IsNullOrEmpty(service))
 1283:                 {
 1284:                     if (Ia.Ftn.Cl.Model.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(service))
 1285:                     {
 1286:                         licList = Ia.Ftn.Cl.Model.Business.Nokia.Nce.DeleteMsanVoipPstnUser2(service, out result);
 1287:                     }
 1288:                     else result.AddError("Service number " + service + " does not belong to allowed domain lists.");
 1289:                 }
 1290:                 else result.AddError("Service null or empty.");
 1291:             }
 1292:             catch (Exception ex)
 1293:             {
 1294:                 result.AddError("Exception: " + ex.ToString() + ".");
 1295:             }
 1296: 
 1297:             return licList;
 1298:         }
 1299:         */
 1300:  
 1301:         ////////////////////////////////////////////////////////////////////////////
 1302:         ////////////////////////////////////////////////////////////////////////////
 1303:  
 1304:         /// <summary>
 1305:         ///
 1306:         /// </summary>
 1307:         public static Ia.Cl.Models.Result ResetOntInEventsWithClassOntAndCauseInactAndSeverityNotClInLast24HoursList()
 1308:         {
 1309:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont ont;
 1310:             List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> ontResetSentList;
 1311:             Dictionary<string, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
 1312:  
 1313:             var result = new Ia.Cl.Models.Result();
 1314:  
 1315:             ontResetSentList = new List<Cl.Models.Business.NetworkDesignDocument.Ont>();
 1316:  
 1317:             var events = Ia.Ftn.Cl.Models.Data.Event.EventWithClassOntAndCauseInactAndLastRecordSeverityNotClAndOntAccessNotNullInLast24HoursList();
 1318:             ontIdToOntDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdToOntDictionary;
 1319:  
 1320:             if (events.Count > 0)
 1321:             {
 1322:                 foreach (var @event in events)
 1323:                 {
 1324:                     if (ontIdToOntDictionary.ContainsKey(@event.Ont.Id))
 1325:                     {
 1326:                         ont = ontIdToOntDictionary[@event.Ont.Id];
 1327:  
 1328:                         if (!eventDictionary.ContainsKey(ont))
 1329:                         {
 1330:                             eventDictionary[ont] = false;
 1331:                         }
 1332:                     }
 1333:                 }
 1334:             }
 1335:             else
 1336:             {
 1337:  
 1338:             }
 1339:  
 1340:             foreach (KeyValuePair<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
 1341:             {
 1342:                 if (!kvp.Value)
 1343:                 {
 1344:                     ams.SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Nokia.Ams.ResetOntCommand(kvp.Key));
 1345:  
 1346:                     if (result.IsSuccessful) ontResetSentList.Add(kvp.Key);
 1347:                 }
 1348:             }
 1349:  
 1350:             return result;
 1351:         }
 1352:  
 1353:         ////////////////////////////////////////////////////////////////////////////
 1354:  
 1355:         /// <summary>
 1356:         /// Enqueue all ONTs within the eventDictionary to make sure we read their state after the reset
 1357:         /// </summary>
 1358:         public static void EnqueueOntWithinEventDictionary()
 1359:         {
 1360:             foreach (KeyValuePair<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont, bool> kvp in eventDictionary)
 1361:             {
 1362:                 //if (!kvp.Value)
 1363:                 //{
 1364:                 // this will read all reset ONT all day until eventDictionary is cleared.
 1365:                 // eventDictionary[kvp.Value] = true;
 1366:  
 1367:                 Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.AmsApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadAccess, kvp.Key.Access.Name);
 1368:                 //}
 1369:             }
 1370:  
 1371:             // reset events dictionary
 1372:             eventDictionary.Clear();
 1373:         }
 1374:  
 1375:         ////////////////////////////////////////////////////////////////////////////
 1376:  
 1377:         /// <summary>
 1378:         ///
 1379:         /// </summary>
 1380:         public static async Task<Ia.Cl.Models.Result> ManageMessageQueue()
 1381:         {
 1382:             var result = new Ia.Cl.Models.Result();
 1383:  
 1384:             var count = await Ia.Ftn.Cl.Models.Data.MessageQueue.AmsApplication.CountAsync;
 1385:  
 1386:             if (count > 0)
 1387:             {
 1388:                 var message = await Ia.Ftn.Cl.Models.Data.MessageQueue.AmsApplication.DequeueAsync;
 1389:  
 1390:                 if (message != null)
 1391:                 {
 1392:                     if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadAccess)
 1393:                     {
 1394:                         SendQueueEnqueueReadOnt(message.AccessName, out result);
 1395:                     }
 1396:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ResetAccess)
 1397:                     {
 1398:                         SendQueueEnqueueResetOnt(message.AccessName, out result);
 1399:                     }
 1400:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.CreateReadServiceAccessPort || message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.CreateReadNceOrAmsServiceAccessPort)
 1401:                     {
 1402:                         var service = message.Service;
 1403:                         var accessName = message.AccessName;
 1404:                         var port = (message.Port > 0) ? message.Port : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
 1405:  
 1406:                         var nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
 1407:  
 1408:                         if (nddOnt != null)
 1409:                         {
 1410:                             if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia)
 1411:                             {
 1412:                                 //Ia.Ftn.Cl.Model.Business.Nokia.Nce.CreateOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Models.Result createResult);
 1413:  
 1414:                                 //Ia.Ftn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Models.Result readResult);
 1415:  
 1416:                                 result.AddSuccess("Create/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); // createResult.Message + "," + readResult.Message);
 1417:  
 1418:                                 if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
 1419:                             }
 1420:                             else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
 1421:                         }
 1422:                         else result.AddError("NDD ONT is null for access name: " + accessName + ".");
 1423:                     }
 1424:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.DeleteReadServiceAccess || message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.DeleteReadNceOrAmsServiceAccessPort)
 1425:                     {
 1426:                         var service = message.Service;
 1427:                         var accessName = message.AccessName;
 1428:                         var port = (message.Port > 0) ? message.Port : Ia.Ftn.Cl.Models.Business.Default.PortUndefinedOrInvalidOrUnknown;
 1429:  
 1430:                         var nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
 1431:  
 1432:                         if (nddOnt != null)
 1433:                         {
 1434:                             if (nddOnt.Pon.PonGroup.Olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia)
 1435:                             {
 1436:                                 //var vacatedAccessName = Ia.Ftn.Cl.Model.Business.Nokia.Nce.DeleteOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, accessName, port, out Ia.Cl.Models.Result deleteResult);
 1437:  
 1438:                                 //Ia.Ftn.Cl.Model.Business.Nokia.Nce.ReadOntSipInfoOrVoipPstnUserAndOrVoipPstnAccount(service, vacatedAccessName, port, out Ia.Cl.Models.Result readResult);
 1439:  
 1440:                                 result.AddSuccess("Delete/Read: " + service + "|" + accessName + "|" + port + ": " + " Hu-No SIP undefined"); //  + deleteResult.Message + "," + readResult.Message);
 1441:  
 1442:                                 if (!priorityServiceList.Contains(service)) priorityServiceList.Add(service);
 1443:                             }
 1444:                             else result.AddError("Access vendor is not Nokia. Access name: " + accessName + ".");
 1445:                         }
 1446:                         else result.AddError("NDD ONT is null for access name: " + accessName + ".");
 1447:                     }
 1448:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ActiveApplicationRunningPermissionState)
 1449:                     {
 1450:                         Ia.Ftn.Cl.Models.Business.Default.PermitActiveApplicationsToRun = message.State;
 1451:  
 1452:                         result.AddSuccess("PermitActiveApplicationsToRun: " + message.State);
 1453:                     }
 1454:                     else
 1455:                     {
 1456:                         throw new ArgumentOutOfRangeException("MessageQueue process " + message.Process.ToString() + " is undefined");
 1457:                     }
 1458:  
 1459:                     result.AddSuccess(message.AccessName);
 1460:                 }
 1461:                 else
 1462:                 {
 1463:                 }
 1464:             }
 1465:  
 1466:             return result;
 1467:         }
 1468:  
 1469:         ////////////////////////////////////////////////////////////////////////////
 1470:  
 1471:         /// <summary>
 1472:         ///
 1473:         /// </summary>
 1474:         public static string ManageProperly()
 1475:         {
 1476:             var command = Ia.Ftn.Cl.Models.Business.Nokia.Ams.ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements();
 1477:  
 1478:             ams.SendQueue.Enqueue(command);
 1479:  
 1480:             return command;
 1481:         }
 1482:  
 1483:         ////////////////////////////////////////////////////////////////////////////
 1484:  
 1485:         /// <summary>
 1486:         ///
 1487:         /// </summary>
 1488:         public static void KeepAliveOltAmsNameListItem()
 1489:         {
 1490:             keepAliveCurrentAmsName = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.NokiaOltAmsNameList.NextOf(keepAliveCurrentAmsName);
 1491:  
 1492:             ams.SendQueue.Enqueue(Ia.Ftn.Cl.Models.Business.Nokia.Ams.AmsKeepAliveCommand(keepAliveCurrentAmsName));
 1493:  
 1494:             /*
 1495:             foreach (string amsName in Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.IsNrNokiaOltAmsNameList)
 1496:             {
 1497:                 sendQueue.Enqueue(Ia.Ftn.Cl.Model.Business.Nokia.Ams.AmsKeepAliveCommand(amsName));
 1498:             }
 1499:             */
 1500:         }
 1501:  
 1502:         ////////////////////////////////////////////////////////////////////////////
 1503:         ////////////////////////////////////////////////////////////////////////////
 1504:  
 1505:         /// <summary>
 1506:         ///
 1507:         /// </summary>
 1508:         public static void SendQueueEnqueueReadOnt(string input, out Ia.Cl.Models.Result result)
 1509:         {
 1510:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor accessVendor;
 1511:             List<string> amsCommandList;
 1512:  
 1513:             result = new Ia.Cl.Models.Result();
 1514:  
 1515:             if (!string.IsNullOrEmpty(input))
 1516:             {
 1517:                 if (input.Length > 0)
 1518:                 {
 1519:                     input = input.Trim();
 1520:                     input = input.ToUpper();
 1521:  
 1522:                     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}$"))
 1523:                     {
 1524:                         if (Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
 1525:                         {
 1526:                             accessVendor = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
 1527:  
 1528:                             if (accessVendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia)
 1529:                             {
 1530:                                 amsCommandList = Ia.Ftn.Cl.Models.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(accessName);
 1531:  
 1532:                                 if (amsCommandList != null && amsCommandList.Count > 0)
 1533:                                 {
 1534:                                     if (Ia.Ftn.Cl.Models.Business.Nokia.Ams.IsConnected /*&& activated && !receivingData*/)
 1535:                                     {
 1536:                                         foreach (string s in amsCommandList)
 1537:                                         {
 1538:                                             //telnet.Send(s);
 1539:                                             ams.SendQueue.Enqueue(s);
 1540:                                         }
 1541:                                     }
 1542:  
 1543:                                     result.AddSuccess(accessName);
 1544:                                 }
 1545:                             }
 1546:                             else
 1547:                             {
 1548:                                 result.AddError("SendQueueEnqueueReadOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
 1549:                             }
 1550:                         }
 1551:                         else
 1552:                         {
 1553:                             result.AddError("SendQueueEnqueueReadOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
 1554:                         }
 1555:                     }
 1556:                     else
 1557:                     {
 1558:                         result.AddError("SendQueueEnqueueReadOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
 1559:                     }
 1560:                 }
 1561:                 else
 1562:                 {
 1563:                     result.AddError("SendQueueEnqueueReadOnt(): Error: input is empty.");
 1564:                 }
 1565:             }
 1566:             else
 1567:             {
 1568:                 result.AddError("SendQueueEnqueueReadOnt(): Error: input is null or empty.");
 1569:             }
 1570:         }
 1571:  
 1572:         ////////////////////////////////////////////////////////////////////////////
 1573:  
 1574:         /// <summary>
 1575:         ///
 1576:         /// </summary>
 1577:         public static void SendQueueEnqueueResetOnt(string input, out Ia.Cl.Models.Result result)
 1578:         {
 1579:             string amsCommand;
 1580:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor accessVendor;
 1581:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 1582:             //List<string> amsCommandList;
 1583:  
 1584:             result = new Ia.Cl.Models.Result();
 1585:  
 1586:             if (!string.IsNullOrEmpty(input))
 1587:             {
 1588:                 if (input.Length > 0)
 1589:                 {
 1590:                     input = input.Trim();
 1591:                     input = input.ToUpper();
 1592:  
 1593:                     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}$"))
 1594:                     {
 1595:                         if (Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out string accessName))
 1596:                         {
 1597:                             accessVendor = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessVendorByAccessName(accessName);
 1598:  
 1599:                             nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
 1600:  
 1601:                             if (accessVendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia)
 1602:                             {
 1603:                                 amsCommand = Ia.Ftn.Cl.Models.Business.Nokia.Ams.ResetOntCommand(nddOnt);
 1604:  
 1605:                                 if (!string.IsNullOrEmpty(amsCommand))
 1606:                                 {
 1607:                                     ams.SendQueue.Enqueue(amsCommand);
 1608:                                     result.AddSuccess(accessName);
 1609:                                 }
 1610:                             }
 1611:                             else
 1612:                             {
 1613:                                 result.AddError("SendQueueEnqueueResetOnt(): Error: access [" + accessName + "] is not a valid Nokia access ONT.");
 1614:                             }
 1615:                         }
 1616:                         else
 1617:                         {
 1618:                             result.AddError("SendQueueEnqueueResetOnt(): Error: input AccessName [" + accessName + "] is not within allowed ONT list.");
 1619:                         }
 1620:                     }
 1621:                     else
 1622:                     {
 1623:                         result.AddError("SendQueueEnqueueResetOnt(): Error: input: [" + input + "] is not a valid OntName or AccessName.");
 1624:                     }
 1625:                 }
 1626:                 else
 1627:                 {
 1628:                     result.AddError("SendQueueEnqueueResetOnt(): Error: input is empty.");
 1629:                 }
 1630:             }
 1631:             else
 1632:             {
 1633:                 result.AddError("SendQueueEnqueueResetOnt(): Error: input is null or empty.");
 1634:             }
 1635:         }
 1636:  
 1637:         ////////////////////////////////////////////////////////////////////////////
 1638:         ////////////////////////////////////////////////////////////////////////////
 1639:  
 1640:         /// <summary>
 1641:         ///
 1642:         /// </summary>
 1643:         private static List<string> PrepareCtaggedCommand(List<string> commandList)
 1644:         {
 1645:             List<string> ctaggedCommandList;
 1646:  
 1647:             if (commandList.Count > 0)
 1648:             {
 1649:                 ctaggedCommandList = new List<string>(commandList.Count);
 1650:  
 1651:                 foreach (string command in commandList)
 1652:                 {
 1653:                     ctaggedCommandList.Add(PrepareCtaggedCommand(command));
 1654:                 }
 1655:             }
 1656:             else ctaggedCommandList = new List<string>();
 1657:  
 1658:             return ctaggedCommandList;
 1659:         }
 1660:  
 1661:         ////////////////////////////////////////////////////////////////////////////
 1662:  
 1663:         /// <summary>
 1664:         ///
 1665:         /// </summary>
 1666:         private static string PrepareCtaggedCommand(string command)
 1667:         {
 1668:             string ctaggedCommand, ctag;
 1669:  
 1670:             if (command.Contains("{ctag}"))
 1671:             {
 1672:                 ctag = Ia.Cl.Models.Default.RandomNumber(6);
 1673:                 // CTAG: The value of the CTAG is a non-zero integer of up to six characters. 
 1674:                 // CTAG comes before ; or ::
 1675:  
 1676:                 Ia.Ftn.Cl.Models.Data.Nokia.Ams.CorrelationTagDictionary[ctag] = command;
 1677:  
 1678:                 ctaggedCommand = command.Replace("{ctag}", ctag);
 1679:             }
 1680:             else
 1681:             {
 1682:                 ctaggedCommand = string.Empty;
 1683:             }
 1684:  
 1685:             return ctaggedCommand;
 1686:         }
 1687:  
 1688:         ////////////////////////////////////////////////////////////////////////////
 1689:         ////////////////////////////////////////////////////////////////////////////
 1690:  
 1691:         /// <summary>
 1692:         ///
 1693:         /// </summary>
 1694:         public static string AmsKeepAliveCommand(string amsName)
 1695:         {
 1696:             return FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
 1697:         }
 1698:  
 1699:         ////////////////////////////////////////////////////////////////////////////
 1700:  
 1701:         /// <summary>
 1702:         ///
 1703:         /// </summary>
 1704:         public static string ResetOntCommand(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont ont)
 1705:         {
 1706:             return FormatAmsOntCommand(AmsOpcode.InitSys, ont);
 1707:         }
 1708:  
 1709:         ////////////////////////////////////////////////////////////////////////////
 1710:  
 1711:         /// <summary>
 1712:         ///
 1713:         /// </summary>
 1714:         public static string AmsCommandOfARandomAmsKeepAlive()
 1715:         {
 1716:             var amsName = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList
 1717:                            where o.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia
 1718:                            select o.AmsName).ToList().PickRandom();
 1719:  
 1720:             var command = FormatAmsCommand(AmsOpcode.RtrvHdr, amsName);
 1721:  
 1722:             return command;
 1723:         }
 1724:  
 1725:         ////////////////////////////////////////////////////////////////////////////
 1726:  
 1727:         /// <summary>
 1728:         ///
 1729:         /// </summary>
 1730:         public static void EnqueuePriorityAmsCommandQueue(string command)
 1731:         {
 1732:             priorityAmsCommandQueue.Enqueue(command);
 1733:         }
 1734:  
 1735:         ////////////////////////////////////////////////////////////////////////////
 1736:  
 1737:         /// <summary>
 1738:         ///
 1739:         /// </summary>
 1740:         public static void EnqueuePriorityAmsCommandQueue(List<string> amsCommandList)
 1741:         {
 1742:             if (amsCommandList != null && amsCommandList.Count > 0)
 1743:             {
 1744:                 foreach (string s in amsCommandList) priorityAmsCommandQueue.Enqueue(s);
 1745:             }
 1746:         }
 1747:  
 1748:         ////////////////////////////////////////////////////////////////////////////
 1749:  
 1750:         /// <summary>
 1751:         ///
 1752:         /// </summary>
 1753:         public static string ProperlySelectedSingleAmsCommandToManageOntVoipPotsNetworkElements()
 1754:         {
 1755:             string command;
 1756:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt;
 1757:             List<string> list;
 1758:  
 1759:             command = null;
 1760:  
 1761:             if (priorityAmsCommandQueue.Count > 0)
 1762:             {
 1763:                 command = priorityAmsCommandQueue.Dequeue();
 1764:             }
 1765:             else
 1766:             {
 1767:                 /*
 1768:                 if (false && command == null && randomPercent < 60)
 1769:                 {
 1770:                     if (amsCreateOntCommandQueue.Count == 0)
 1771:                     {
 1772:                         olt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
 1773: 
 1774:                         list = AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(olt, true, false, out count);
 1775: 
 1776:                         amsCreateOntCommandQueue = new Queue<string>(list);
 1777:                     }
 1778: 
 1779:                     if (amsCreateOntCommandQueue.Count > 0) command = amsCreateOntCommandQueue.Dequeue();
 1780:                 }
 1781:                 */
 1782:  
 1783:                 if (amsCommandQueue.Count == 0)
 1784:                 {
 1785:                     //olt = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.NokiaOltList.Where(o => o.StateId == (int)Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.BellcoreState.IsNr).PickRandom();
 1786:                     olt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.NokiaOltList.PickRandom();
 1787:  
 1788:                     list = Ia.Ftn.Cl.Models.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(olt);
 1789:  
 1790:                     amsCommandQueue = new Queue<string>(list);
 1791:                 }
 1792:  
 1793:                 if (amsCommandQueue.Count > 0) command = amsCommandQueue.Dequeue();
 1794:  
 1795:                 if (command == null) command = AmsCommandOfARandomAmsKeepAlive();
 1796:             }
 1797:  
 1798:             return command;
 1799:         }
 1800:  
 1801:         ////////////////////////////////////////////////////////////////////////////
 1802:  
 1803:         /// <summary>
 1804:         ///
 1805:         /// </summary>
 1806:         private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, string position)
 1807:         {
 1808:             return FormatAmsRtrvCommand(amsOpcode, 0, position);
 1809:         }
 1810:  
 1811:         ////////////////////////////////////////////////////////////////////////////
 1812:  
 1813:         /// <summary>
 1814:         ///
 1815:         /// </summary>
 1816:         private static List<string> FormatAmsRtrvCommand(AmsOpcode amsOpcode, Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType, string position)
 1817:         {
 1818:             // Use this command with variable number of parameters
 1819:             string command, amsName;
 1820:             List<string> list;
 1821:  
 1822:             command = null;
 1823:  
 1824:             list = new List<string>(10);
 1825:  
 1826:             if (!string.IsNullOrEmpty(position))
 1827:             {
 1828:                 AmsNameAndCardPortOntSquenceFromOntPosition(position, out amsName, out string pon);
 1829:  
 1830:                 if (amsOpcode == AmsOpcode.RtrvOnt)
 1831:                 {
 1832:                     command = "RTRV-ONT:" + amsName + ":ONT-1-1-" + pon + ";";
 1833:                     list.Add(command);
 1834:                 }
 1835:                 else if (amsOpcode == AmsOpcode.RtrvServiceVoip)
 1836:                 {
 1837:                     command = "RTRV-SERVICE-VOIP:" + amsName + ":VOIP-1-1-" + pon + "-1;";
 1838:                     list.Add(command);
 1839:                 }
 1840:                 else if (amsOpcode == AmsOpcode.RtrvOntPots)
 1841:                 {
 1842:                     foreach (string ontPotsCardPort in Ia.Ftn.Cl.Models.Business.Nokia.Ont.PossiblePotsCardPortConfigurationForOntFamilyTypeList(familyType))
 1843:                     {
 1844:                         command = "RTRV-ONTPOTS:" + amsName + ":ONTPOTS-1-1-" + pon + "-" + ontPotsCardPort + ";";
 1845:                         list.Add(command);
 1846:                     }
 1847:                 }
 1848:             }
 1849:  
 1850:             return list;
 1851:         }
 1852:  
 1853:         ////////////////////////////////////////////////////////////////////////////
 1854:  
 1855:         /// <summary>
 1856:         ///
 1857:         /// </summary>
 1858:         private static string FormatAmsOntCommand(AmsOpcode amsOpcode, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont ont)
 1859:         {
 1860:             string command;
 1861:  
 1862:             command = string.Empty;
 1863:  
 1864:             if (!string.IsNullOrEmpty(ont.Position))
 1865:             {
 1866:                 AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
 1867:  
 1868:                 if (amsOpcode == AmsOpcode.EdOntDesc1)
 1869:                 {
 1870:                     command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=" + ont.Access.Name + @":;";
 1871:                     // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=ESH.4.26:;
 1872:                 }
 1873:                 else if (amsOpcode == AmsOpcode.EdOntDesc1Annul)
 1874:                 {
 1875:                     //command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=:;"; // this has no effect on ONT DESC1
 1876:                     // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=:;
 1877:  
 1878:                     command = "ED-ONT:" + amsName + @":ONT-1-1-" + pon + "::::DESC1=NULL:;"; // you must send NULL to change ONT DESC1
 1879:                                                                                              // ED-ONT:ESH-1-1:ONT-1-1-2-2-26::::DESC1=NULL:;
 1880:                 }
 1881:                 else if (amsOpcode == AmsOpcode.InitSys)
 1882:                 {
 1883:                     command = "INIT-SYS:" + amsName + @":ONT-1-1-" + pon + ":::6;";
 1884:                     // INIT-SYS:SHD-SUR-LAG17:ONT-1-1-1-1-1:::6;
 1885:                 }
 1886:             }
 1887:  
 1888:             return command;
 1889:         }
 1890:  
 1891:         ////////////////////////////////////////////////////////////////////////////
 1892:  
 1893:         /// <summary>
 1894:         ///
 1895:         /// </summary>
 1896:         private static List<string> FormatAmsOntOntPotsCommandList(AmsOpcode amsOpcode, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont ont, Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType, string termination, string customerInformation)
 1897:         {
 1898:             string command;
 1899:             List<string> list;
 1900:  
 1901:             list = new List<string>(10);
 1902:  
 1903:             if (!string.IsNullOrEmpty(ont.Position))
 1904:             {
 1905:                 AmsNameAndCardPortOntSquenceFromOntPosition(ont.Position, out string amsName, out string pon);
 1906:  
 1907:                 termination = termination.Replace("td", "");
 1908:  
 1909:                 if (int.TryParse(termination, out int td))
 1910:                 {
 1911:                     Ia.Ftn.Cl.Models.Business.Nokia.Ont.ReturnOntPotsCardAndPortFromFamilyTypeAndTd(familyType, td, out int card, out int port);
 1912:  
 1913:                     if (amsOpcode == AmsOpcode.EdOntPotsCustinfo)
 1914:                     {
 1915:                         if (!string.IsNullOrEmpty(customerInformation))
 1916:                         {
 1917:                             command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=" + customerInformation + @":;";
 1918:                             // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=23632222:;\n";
 1919:                         }
 1920:                         else
 1921:                         {
 1922:                             command = "ED-ONTPOTS:" + amsName + @":ONTPOTS-1-1-" + pon + "-" + card + "-" + port + "::::CUSTINFO=NULL:;";
 1923:                             // ED-ONTPOTS:ESH-1-1:ONTPOTS-1-1-1-1-1-2-1::::CUSTINFO=NULL:;\n";
 1924:                         }
 1925:  
 1926:                         list.Add(command);
 1927:                     }
 1928:                 }
 1929:             }
 1930:  
 1931:             return list;
 1932:         }
 1933:  
 1934:         ////////////////////////////////////////////////////////////////////////////
 1935:  
 1936:         /// <summary>
 1937:         ///
 1938:         /// </summary>
 1939:         private static string FormatAmsCommand(AmsOpcode amsOpcode, string amsName)
 1940:         {
 1941:             string command;
 1942:  
 1943:             if (amsOpcode == AmsOpcode.RtrvAlmPon)
 1944:             {
 1945:                 command = "RTRV-ALM-PON:" + amsName + ":ALL:::MN,,NSA;";
 1946:  
 1947:             }
 1948:             else if (amsOpcode == AmsOpcode.RtrvHdr)
 1949:             {
 1950:                 command = "RTRV-HDR:" + amsName + ":;";
 1951:             }
 1952:             else command = null;
 1953:  
 1954:             return command;
 1955:         }
 1956:  
 1957:         ////////////////////////////////////////////////////////////////////////////
 1958:  
 1959:         /// <summary>
 1960:         ///
 1961:         /// </summary>
 1962:         private static void AmsNameAndCardPortOntSquenceFromOntServiceHsiPosition(string ontPosition, out string amsName, out string cardPortOntCardPortServiceSequence)
 1963:         {
 1964:             Match match;
 1965:  
 1966:             // SUR-1-1-1-1-1-1-1-1;
 1967:             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})");
 1968:  
 1969:             amsName = match.Groups[1].Value;
 1970:             cardPortOntCardPortServiceSequence = match.Groups[2].Value;
 1971:         }
 1972:  
 1973:         ////////////////////////////////////////////////////////////////////////////
 1974:  
 1975:         /// <summary>
 1976:         ///
 1977:         /// </summary>
 1978:         private static void AmsNameAndCardPortOntSquenceFromOntPosition(string ontPosition, out string amsName, out string pon)
 1979:         {
 1980:             Match match;
 1981:  
 1982:             if (!string.IsNullOrEmpty(ontPosition))
 1983:             {
 1984:                 // SBN-ARD-Lag1-1-1-1;
 1985:                 match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2}\-\d{1,2}\-\d{1,2})$");
 1986:  
 1987:                 if (match.Success)
 1988:                 {
 1989:                     amsName = match.Groups[1].Value;
 1990:                     pon = match.Groups[2].Value;
 1991:                 }
 1992:                 else
 1993:                 {
 1994:                     amsName = string.Empty;
 1995:                     pon = string.Empty;
 1996:                 }
 1997:             }
 1998:             else
 1999:             {
 2000:                 amsName = string.Empty;
 2001:                 pon = string.Empty;
 2002:             }
 2003:         }
 2004:  
 2005:         ////////////////////////////////////////////////////////////////////////////
 2006:  
 2007:         /// <summary>
 2008:         /// Extract OLT Id, Card, Port, and ONT from ONT Position
 2009:         /// </summary>
 2010:         [Obsolete]
 2011:         public static void OltIdCardPortOntFromOntPosition(string ontPosition, out int oltId, out int card, out int port, out int ont)
 2012:         {
 2013:             string amsName;
 2014:             Match match;
 2015:  
 2016:             if (!string.IsNullOrEmpty(ontPosition))
 2017:             {
 2018:                 // SBN-ARD-Lag1-1-1-1;
 2019:                 match = Regex.Match(ontPosition, @"^([\w\d\-]+)\-(\d{1,2})\-(\d{1,2})\-(\d{1,2})$");
 2020:  
 2021:                 if (match.Success)
 2022:                 {
 2023:                     amsName = match.Groups[1].Value;
 2024:                     card = int.Parse(match.Groups[2].Value);
 2025:                     port = int.Parse(match.Groups[3].Value);
 2026:                     ont = int.Parse(match.Groups[4].Value);
 2027:  
 2028:                     oltId = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList
 2029:                              where o.AmsName == amsName
 2030:                              select o.Id).FirstOrDefault();
 2031:                 }
 2032:                 else
 2033:                 {
 2034:                     amsName = string.Empty;
 2035:                     card = port = ont = 0;
 2036:  
 2037:                     oltId = 0;
 2038:                 }
 2039:             }
 2040:             else
 2041:             {
 2042:                 amsName = string.Empty;
 2043:                 card = port = ont = 0;
 2044:  
 2045:                 oltId = 0;
 2046:             }
 2047:         }
 2048:  
 2049:         ////////////////////////////////////////////////////////////////////////////
 2050:  
 2051:         /// <summary>
 2052:         ///
 2053:         /// </summary>
 2054:         public static string OntPositionFromAmsNameAndCardPortOntSquence(string amsName, string cardPortOnt)
 2055:         {
 2056:             string ontPosition;
 2057:  
 2058:             ontPosition = amsName + "-" + cardPortOnt;
 2059:  
 2060:             return ontPosition;
 2061:         }
 2062:  
 2063:         ////////////////////////////////////////////////////////////////////////////
 2064:  
 2065:         /// <summary>
 2066:         ///
 2067:         /// </summary>
 2068:         public static List<string> AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2069:         {
 2070:             string accessName, ontId, ontDescription1;
 2071:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 2072:             List<string> list;
 2073:  
 2074:             var ontIdToOntAccessNameDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdToOntAccessNameDictionary;
 2075:  
 2076:             var ontIdToDescription1ForNonNullAccessDictionary = Ia.Ftn.Cl.Models.Data.Nokia.Ont.IdToDescription1ForNonNullAccessDictionary;
 2077:  
 2078:             var ontIdToDescription1ForNullAccessDictionary = Ia.Ftn.Cl.Models.Data.Nokia.Ont.IdToDescription1ForNullAccessDictionary;
 2079:  
 2080:             //var ontIdWithNullAccessHashtable = Ia.Ftn.Cl.Model.Data.Nokia.Ont.IdWithNullAccessHashtable;
 2081:  
 2082:             var ontIdToOntDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdToOntDictionary;
 2083:  
 2084:             list = new List<string>();
 2085:  
 2086:             // insert descriptions for missing entries
 2087:             if (ontIdToDescription1ForNonNullAccessDictionary.Count > 0)
 2088:             {
 2089:                 foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNonNullAccessDictionary) //Ia.Ftn.Cl.Model.Ont ont in ontList)
 2090:                 {
 2091:                     ontId = kvp.Key;
 2092:                     ontDescription1 = kvp.Value;
 2093:  
 2094:                     if (ontIdToOntAccessNameDictionary.ContainsKey(ontId))
 2095:                     {
 2096:                         accessName = ontIdToOntAccessNameDictionary[ontId];
 2097:  
 2098:                         if (ontDescription1 != accessName)
 2099:                         {
 2100:                             nddOnt = ontIdToOntDictionary[ontId];
 2101:  
 2102:                             if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
 2103:                             {
 2104:                                 list.Add(Ia.Ftn.Cl.Models.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1, nddOnt));
 2105:                             }
 2106:                         }
 2107:                         else
 2108:                         {
 2109:                         }
 2110:                     }
 2111:                 }
 2112:             }
 2113:  
 2114:             // delete descriptions ONTs with missing access info
 2115:             if (ontIdToDescription1ForNullAccessDictionary.Count > 0)
 2116:             {
 2117:                 foreach (KeyValuePair<string, string> kvp in ontIdToDescription1ForNullAccessDictionary)
 2118:                 {
 2119:                     ontId = kvp.Key;
 2120:                     ontDescription1 = kvp.Value;
 2121:  
 2122:                     if (!string.IsNullOrEmpty(ontDescription1))
 2123:                     {
 2124:                         if (ontIdToOntDictionary.ContainsKey(ontId))
 2125:                         {
 2126:                             nddOnt = ontIdToOntDictionary[ontId];
 2127:  
 2128:                             if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
 2129:                             {
 2130:                                 list.Add(Ia.Ftn.Cl.Models.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
 2131:                             }
 2132:                         }
 2133:                     }
 2134:                 }
 2135:             }
 2136:  
 2137:             return list.ToList();
 2138:         }
 2139:  
 2140:         ////////////////////////////////////////////////////////////////////////////
 2141:  
 2142:         /// <summary>
 2143:         ///
 2144:         /// </summary>
 2145:         public static List<string> AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2146:         {
 2147:             List<string> list;
 2148:             Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType;
 2149:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 2150:  
 2151:             var ontIdToOntDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdToOntDictionary;
 2152:  
 2153:             var ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList = Ia.Ftn.Cl.Models.Data.Nokia.Ams.OntOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList();
 2154:  
 2155:             list = new List<string>(ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count);
 2156:  
 2157:             // insert descriptions for missing entries
 2158:             if (ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList.Count > 0)
 2159:             {
 2160:                 foreach (var ontOntPotsService in ontOntPotsCustomerNoEqualToSubPartyDisplayNameServiceList)
 2161:                 {
 2162:                     if (ontIdToOntDictionary.ContainsKey(ontOntPotsService.OntId))
 2163:                     {
 2164:                         nddOnt = ontIdToOntDictionary[ontOntPotsService.OntId];
 2165:  
 2166:                         if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
 2167:                         {
 2168:                             familyType = (Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType)ontOntPotsService.OntFamilyTypeId;
 2169:  
 2170:                             list.AddRange(Ia.Ftn.Cl.Models.Business.Nokia.Ams.FormatAmsOntOntPotsCommandList(AmsOpcode.EdOntPotsCustinfo, nddOnt, familyType, ontOntPotsService.Termination, ontOntPotsService.Service));
 2171:                         }
 2172:                     }
 2173:                 }
 2174:             }
 2175:  
 2176:             var ontOntPotsCustomerExistsButSubPartyIsNullServiceList = Ia.Ftn.Cl.Models.Data.Nokia.Ams.OntOntPotsCustomerExistsButSubPartyIsNullServiceList();
 2177:  
 2178:             // delete descriptions of non existant entries
 2179:             if (ontOntPotsCustomerExistsButSubPartyIsNullServiceList.Count > 0)
 2180:             {
 2181:                 foreach (var oops in ontOntPotsCustomerExistsButSubPartyIsNullServiceList)
 2182:                 {
 2183:                     if (ontIdToOntDictionary.ContainsKey(oops.OntId))
 2184:                     {
 2185:                         nddOnt = ontIdToOntDictionary[oops.OntId];
 2186:  
 2187:                         if (nddOnt.Pon.PonGroup.Olt.Id == olt.Id)
 2188:                         {
 2189:                             list.Add(Ia.Ftn.Cl.Models.Business.Nokia.Ams.FormatAmsOntCommand(AmsOpcode.EdOntDesc1Annul, nddOnt));
 2190:                         }
 2191:                     }
 2192:                 }
 2193:             }
 2194:  
 2195:             return list;
 2196:         }
 2197:  
 2198:         ////////////////////////////////////////////////////////////////////////////
 2199:  
 2200:         /// <summary>
 2201:         ///
 2202:         /// </summary>
 2203:         public static List<string> AmsCommandsToPreprovisionAllOntsAsDefinedInNddDocumentWithinOltList(int oltId, bool edServiceVoipIsOos, out int count)
 2204:         {
 2205:             List<string> l, list;
 2206:             List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> nddOntList;
 2207:  
 2208:             count = 0;
 2209:             list = null;
 2210:  
 2211:             nddOntList = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == oltId select o).ToList();
 2212:  
 2213:             if (nddOntList != null && nddOntList.Count > 0)
 2214:             {
 2215:                 list = new List<string>(nddOntList.Count);
 2216:  
 2217:                 foreach (Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
 2218:                 {
 2219:                     l = Ia.Ftn.Cl.Models.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
 2220:  
 2221:                     list.AddRange(l);
 2222:                     count++;
 2223:                 }
 2224:             }
 2225:             else
 2226:             {
 2227:             }
 2228:  
 2229:             return list;
 2230:         }
 2231:  
 2232:         ////////////////////////////////////////////////////////////////////////////
 2233:  
 2234:         /// <summary>
 2235:         ///
 2236:         /// </summary>
 2237:         public static List<string> AmsCommandsToPreprovisionOntThatAreNotProvisionedAsDefinedInNddDocumentWithinAnOltList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt, bool includeDisplayCommand, bool edServiceVoipIsOos, out int count)
 2238:         {
 2239:             List<string> l, list;
 2240:             List<string> ontIdList;
 2241:             List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> nddOntList;
 2242:  
 2243:             count = 0;
 2244:             list = null;
 2245:  
 2246:             using (var db = new Ia.Ftn.Cl.Db())
 2247:             {
 2248:                 nddOntList = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
 2249:  
 2250:                 ontIdList = Ia.Ftn.Cl.Models.Data.Nokia.Ont.IdList(olt.Id); //.ReadListByOltId(olt.Id);
 2251:  
 2252:                 if (nddOntList != null && nddOntList.Count > 0)
 2253:                 {
 2254:                     list = new List<string>(nddOntList.Count);
 2255:  
 2256:                     foreach (Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt in nddOntList)
 2257:                     {
 2258:                         if (!ontIdList.Contains(nddOnt.Id))
 2259:                         {
 2260:                             l = Ia.Ftn.Cl.Models.Business.Nokia.Ams.CommandsToPreprovisionOntWithinOlt(nddOnt, edServiceVoipIsOos);
 2261:                             list.AddRange(l);
 2262:  
 2263:                             if (includeDisplayCommand)
 2264:                             {
 2265:                                 l = Ia.Ftn.Cl.Models.Business.Nokia.Ams.AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(nddOnt.Access.Name);
 2266:                                 list.AddRange(l);
 2267:                             }
 2268:  
 2269:                             count++;
 2270:                         }
 2271:                     }
 2272:                 }
 2273:             }
 2274:  
 2275:             return list;
 2276:         }
 2277:  
 2278:         ////////////////////////////////////////////////////////////////////////////
 2279:  
 2280:         /// <summary>
 2281:         ///
 2282:         /// </summary>
 2283:         public static List<string> AmsCommandsToRetrieveOntVoipPotsForASingleOntWithDefinedFamilyTypeAndForItIfThisSingleOntDefinedInNddDocumentList(string accessName)
 2284:         {
 2285:             //Random r;
 2286:             List<string> l1, l2, list;
 2287:  
 2288:             //r = new Random();
 2289:  
 2290:             l1 = AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(accessName);
 2291:  
 2292:             l2 = AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(accessName);
 2293:  
 2294:             list = new List<string>(l1.Count + l2.Count);
 2295:  
 2296:             foreach (var item in l1) list.Add(item);
 2297:             foreach (var item in l2) list.Add(item);
 2298:  
 2299:             return list.Distinct().ToList();
 2300:         }
 2301:  
 2302:         ////////////////////////////////////////////////////////////////////////////
 2303:  
 2304:         /// <summary>
 2305:         ///
 2306:         /// </summary>
 2307:         public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeAndForOtherOntsDefinedInNddDocumentList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2308:         {
 2309:             List<string> l1, l2, list;
 2310:  
 2311:             l1 = AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt);
 2312:  
 2313:             l2 = AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt);
 2314:  
 2315:             list = new List<string>(l1.Count + l2.Count);
 2316:  
 2317:             foreach (var item in l1) list.Add(item);
 2318:             foreach (var item in l2) list.Add(item);
 2319:  
 2320:             return list.Distinct().Shuffle().ToList();
 2321:         }
 2322:  
 2323:         ////////////////////////////////////////////////////////////////////////////
 2324:  
 2325:         /// <summary>
 2326:         ///
 2327:         /// </summary>
 2328:         public static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyType_AmsCommandsToRetrieveOntsDefinedInNddDocument_AmsCommandsToUpdateAndDisplayOntDescriptionWithItsAccessName_AmsCommandsToUpdateOntOntPotsCustomerWithItsConnectedServiceNumberList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2329:         {
 2330:             HashSet<string> hashSet1, hashSet2, hashSet3, hashSet4, hashSet;
 2331:  
 2332:             hashSet1 = new HashSet<string>(AmsCommandsToUpdateOntDescriptionWithItsAccessNameList(olt));
 2333:  
 2334:             hashSet2 = new HashSet<string>(AmsCommandsToUpdateCustInfoWithServiceNumberInOntOntPotsList(olt));
 2335:  
 2336:             hashSet3 = new HashSet<string>(AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(olt));
 2337:  
 2338:             hashSet4 = new HashSet<string>(AmsCommandsToRetrieveOntsDefinedInNddDocumentList(olt));
 2339:  
 2340:             hashSet = new HashSet<string>(hashSet1);
 2341:             hashSet.UnionWith(hashSet2);
 2342:             hashSet.UnionWith(hashSet3);
 2343:             hashSet.UnionWith(hashSet4);
 2344:  
 2345:             return hashSet.ToList(); //.Shuffle().ToList();
 2346:         }
 2347:  
 2348:         ////////////////////////////////////////////////////////////////////////////
 2349:  
 2350:         /// <summary>
 2351:         ///
 2352:         /// </summary>
 2353:         private static List<string> AmsCommandToRetrieveSingleOntDefinedInNddDocumentList(string accessName)
 2354:         {
 2355:             List<string> list;
 2356:             Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType;
 2357:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 2358:  
 2359:             list = new List<string>(5); // 5 is max number of commands from this function
 2360:  
 2361:             if (!string.IsNullOrEmpty(accessName))
 2362:             {
 2363:                 nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
 2364:  
 2365:                 if (nddOnt != null)
 2366:                 {
 2367:                     familyType = Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Sfu;
 2368:  
 2369:                     list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
 2370:                 }
 2371:             }
 2372:  
 2373:             return list;
 2374:         }
 2375:  
 2376:         ////////////////////////////////////////////////////////////////////////////
 2377:  
 2378:         /// <summary>
 2379:         ///
 2380:         /// </summary>
 2381:         private static List<string> AmsCommandsToRetrieveOntsDefinedInNddDocumentList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2382:         {
 2383:             Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType;
 2384:             List<string> list;
 2385:             List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> ontList;
 2386:  
 2387:             ontList = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntList where o.Pon.PonGroup.Olt.Id == olt.Id select o).ToList();
 2388:  
 2389:             familyType = Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Sfu;
 2390:  
 2391:             list = new List<string>(ontList.Count);
 2392:  
 2393:             foreach (Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont ont in ontList)
 2394:             {
 2395:                 list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, ont.Position));
 2396:             }
 2397:  
 2398:             return list;
 2399:         }
 2400:  
 2401:         ////////////////////////////////////////////////////////////////////////////
 2402:  
 2403:         /// <summary>
 2404:         ///
 2405:         /// </summary>
 2406:         private static List<string> AmsCommandsToRetrieveOntVoipPotsForSingleOntsWithDefinedFamilyTypeList(string accessName)
 2407:         {
 2408:             List<string> list;
 2409:             Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType;
 2410:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 2411:             Ia.Ftn.Cl.Models.Ont ont;
 2412:  
 2413:             list = new List<string>(5); // 5 is max number of commands from this function
 2414:  
 2415:             if (!string.IsNullOrEmpty(accessName))
 2416:             {
 2417:                 nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
 2418:  
 2419:                 if (nddOnt != null)
 2420:                 {
 2421:                     ont = Ia.Ftn.Cl.Models.Data.Nokia.Ont.Read(nddOnt.Id);
 2422:  
 2423:                     if (ont != null)
 2424:                     {
 2425:                         familyType = (Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
 2426:  
 2427:                         list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
 2428:                         list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
 2429:                         list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
 2430:                     }
 2431:                 }
 2432:             }
 2433:  
 2434:             return list;
 2435:         }
 2436:  
 2437:         ////////////////////////////////////////////////////////////////////////////
 2438:  
 2439:         /// <summary>
 2440:         ///
 2441:         /// </summary>
 2442:         private static List<string> AmsCommandsToRetrieveOntVoipPotsForOntsWithDefinedFamilyTypeList(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt)
 2443:         {
 2444:             Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType familyType;
 2445:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
 2446:             List<string> list;
 2447:             Dictionary<string, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont> ontIdToOntDictionary;
 2448:             List<Ia.Ftn.Cl.Models.Ont> ontList;
 2449:  
 2450:             ontList = Ia.Ftn.Cl.Models.Data.Nokia.Ont.NonNullAccessList(olt.Id);
 2451:  
 2452:             ontIdToOntDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdToOntDictionary;
 2453:  
 2454:             list = new List<string>(ontList.Count);
 2455:  
 2456:             foreach (Ia.Ftn.Cl.Models.Ont ont in ontList)
 2457:             {
 2458:                 familyType = (Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType)ont.FamilyTypeId;
 2459:  
 2460:                 if (ontIdToOntDictionary.ContainsKey(ont.Id))
 2461:                 {
 2462:                     nddOnt = ontIdToOntDictionary[ont.Id];
 2463:  
 2464:                     //if (ont.Access != null) access is already non null
 2465:                     //{
 2466:                     list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOnt, familyType, nddOnt.Position));
 2467:                     list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvServiceVoip, familyType, nddOnt.Position));
 2468:                     list.AddRange(FormatAmsRtrvCommand(AmsOpcode.RtrvOntPots, familyType, nddOnt.Position));
 2469:                     //}
 2470:                 }
 2471:             }
 2472:  
 2473:             return list;
 2474:         }
 2475:  
 2476:         ////////////////////////////////////////////////////////////////////////////
 2477:  
 2478:         /// <summary>
 2479:         ///
 2480:         /// </summary>
 2481:         public static ArrayList AmsCommandsToRetrieveNewOntAlarmsForOltArrayList()
 2482:         {
 2483:             ArrayList amsCommandArrayList;
 2484:  
 2485:             amsCommandArrayList = new ArrayList(Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList.Count);
 2486:  
 2487:             foreach (var olt in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList)
 2488:             {
 2489:                 amsCommandArrayList.Add(FormatAmsCommand(AmsOpcode.RtrvAlmPon, olt.AmsName));
 2490:             }
 2491:  
 2492:             return amsCommandArrayList;
 2493:         }
 2494:  
 2495:         ////////////////////////////////////////////////////////////////////////////
 2496:  
 2497:         /// <summary>
 2498:         ///
 2499:         /// </summary>
 2500:         public static ArrayList AmsCommandsToUpdateOntServiceDescriptionWithItsIspNameArrayList()
 2501:         {
 2502:             ArrayList amsCommandArrayList;
 2503:  
 2504:             amsCommandArrayList = new ArrayList(100);
 2505:  
 2506:             return amsCommandArrayList;
 2507:         }
 2508:  
 2509:         /*
 2510:         ////////////////////////////////////////////////////////////////////////////
 2511: 
 2512:         /// <summary>
 2513:         /// 
 2514:         /// </summary>
 2515:         public static int PositionOfHsiServiceForCardAndPortAndOntFamilyType(int card, int port, Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType familyType)
 2516:         {
 2517:             int position;
 2518: 
 2519:             if (familyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Sfu || familyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Gfu || familyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Soho)
 2520:             {
 2521:                 position = port;
 2522:             }
 2523:             else if (familyType == Ia.Ftn.Cl.Model.Business.Nokia.Ont.FamilyType.Mdu)
 2524:             {
 2525:                 position = (card - 1) * 4 + port;
 2526:             }
 2527:             else position = 0;
 2528: 
 2529:             return position;
 2530:         }
 2531:         */
 2532:  
 2533:         ////////////////////////////////////////////////////////////////////////////
 2534:  
 2535:         /// <summary>
 2536:         ///
 2537:         /// </summary>
 2538:         public static bool UpdateDatabaseWithAmsCommandOutput(string rowData, out Ia.Cl.Models.Result result)
 2539:         {
 2540:             bool isUpdated;
 2541:             int readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
 2542:             string accessId, ontId, ontPosition;
 2543:             string line, amsName, cardPortOnt;
 2544:             DateTime eventTime;
 2545:             Match match;
 2546:             MatchCollection matchCollection;
 2547:             Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState state;
 2548:  
 2549:             //ponNameToPonIdHashtable = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.PonNameToPonIdHashtable;
 2550:  
 2551:             isUpdated = false;
 2552:             readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
 2553:             result = new Ia.Cl.Models.Result();
 2554:             //result.Content = rowData;
 2555:  
 2556:             // below: remove all '\' characters from rowData and reset NULL comments to ""
 2557:             rowData = rowData.Replace(@"\", "");
 2558:             rowData = rowData.Replace(@"NULL", "");
 2559:  
 2560:             if (rowData.Contains("RTRV-ONT:"))
 2561:             {
 2562:                 #region RTRV-ONT
 2563:                 Ia.Ftn.Cl.Models.Ont ont, dataOnt;
 2564:  
 2565:                 /*
 2566:        SUR-1-1 08-07-10 09:35:07
 2567:     M  0 COMPLD
 2568:        / * 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 * /
 2569:        / * -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- * /
 2570:        / * 1-1-8&ONT-1-1-1-1-9 * /
 2571:        "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
 2572:        DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
 2573:        SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
 2574:        SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
 2575:        POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
 2576:        SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
 2577:        EQUIPID=BVM3G00CRAO420EB    ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
 2578:        IS-NR"
 2579:        "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2580:        PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
 2581:        SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2582:        SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2583:        ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
 2584:        SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2585:        NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2586:        "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2587:        PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
 2588:        SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2589:        SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2590:        ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2591:        SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2592:        NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2593:                  */
 2594:  
 2595:                 // below: information from the definition of "RTRV-ONT" in "AMS TL1 Commands Reference"
 2596:  
 2597:                 /*
 2598:     IP 0
 2599:     <
 2600:  
 2601:     SUR-1-1 08-07-10 09:35:07
 2602:     M  0 COMPLD
 2603:     / * 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 * /
 2604:     / * -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- * /
 2605:     / * 1-1-8&ONT-1-1-1-1-9 * /
 2606:     "ONT-1-1-1-1-1::BTRYBKUP=NO,BERINT=8000,DESC1="SLA.1.1",
 2607:     DESC2="all is well",PROVVERSION="*",SERNUM=ALCLA0A1A5F8,
 2608:     SUBSLOCID="WILDCARD",SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,
 2609:     SCHEDPROFID=1,SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,
 2610:     POWERSHEDPROFNM="NULL",ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,
 2611:     SWVERACT=3FE50853AFMA07,SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,
 2612:     EQUIPID=BVM3G00CRAO420EB    ,NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:
 2613:     IS-NR"
 2614:     "ONT-1-1-1-1-10::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2615:     PROVVERSION="*",SERNUM=ALCLA0A1A479,SUBSLOCID="WILDCARD",
 2616:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2617:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2618:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
 2619:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2620:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2621:     "ONT-1-1-1-1-2::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2622:     PROVVERSION="*",SERNUM=ALCLA0A261BB,SUBSLOCID="WILDCARD",
 2623:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2624:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2625:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2626:     SWVERPSV=3FE50853AAAA22,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2627:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2628:  
 2629:     / * More Output Follows * /
 2630:     >
 2631:  
 2632:     SUR-1-1 08-07-10 09:35:07
 2633:     M  0 COMPLD
 2634:     / * 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 * /
 2635:     "ONT-1-1-1-1-3::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2636:     PROVVERSION="*",SERNUM=ALCLA0A1C9BC,SUBSLOCID="WILDCARD",
 2637:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2638:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2639:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2640:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2641:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2642:     "ONT-1-1-1-1-4::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2643:     PROVVERSION="*",SERNUM=ALCLA0A1A47A,SUBSLOCID="WILDCARD",
 2644:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2645:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2646:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
 2647:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2648:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2649:     "ONT-1-1-1-1-5::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2650:     PROVVERSION="*",SERNUM=ALCLA0A1AE44,SUBSLOCID="WILDCARD",
 2651:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2652:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2653:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2654:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2655:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2656:  
 2657:     / * More Output Follows * /
 2658:     >
 2659:  
 2660:     SUR-1-1 08-07-10 09:35:08
 2661:     M  0 COMPLD
 2662:     / * 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 * /
 2663:     "ONT-1-1-1-1-6::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2664:     PROVVERSION="*",SERNUM=ALCLA0A1BE26,SUBSLOCID="WILDCARD",
 2665:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2666:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2667:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2668:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2669:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2670:     "ONT-1-1-1-1-7::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2671:     PROVVERSION="*",SERNUM=ALCLA0A1C94B,SUBSLOCID="WILDCARD",
 2672:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2673:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2674:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAB01,SWVERACT=3FE50853AFMA07,
 2675:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2676:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2677:     "ONT-1-1-1-1-8::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2678:     PROVVERSION="*",SERNUM=ALCLA0A1A484,SUBSLOCID="WILDCARD",
 2679:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2680:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2681:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
 2682:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2683:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2684:  
 2685:     / * More Output Follows * /
 2686:     >
 2687:  
 2688:     SUR-1-1 08-07-10 09:35:08
 2689:     M  0 COMPLD
 2690:     / * 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 * /
 2691:     "ONT-1-1-1-1-9::BTRYBKUP=NO,BERINT=8000,DESC1="NULL",DESC2="NULL",
 2692:     PROVVERSION="*",SERNUM=ALCLA0A1A43E,SUBSLOCID="WILDCARD",
 2693:     SWVERPLND="3FE50853AFMA07",FECUP=DISABLE,SCHEDPROFID=1,
 2694:     SCHEDPROFNM="defSubSchedProf",POWERSHEDPROFID=0,POWERSHEDPROFNM="NULL",
 2695:     ONTENABLE=AUTO,EQPTVERNUM=3FE50683ADAA01,SWVERACT=3FE50853AFMA07,
 2696:     SWVERPSV=3FE50853AFKA03,VENDORID=ALCL,EQUIPID=BVM3G00CRAO420EB    ,
 2697:     NUMSLOTS=2,NUMTCONT=22,NUMTRFSCH=22,NUMPQ=22:IS-NR"
 2698:     ;
 2699:                 */
 2700:  
 2701:                 // below: read OntPosition
 2702:                 match = Regex.Match(rowData, @"RTRV-ONT:([\w\d\-]+)", RegexOptions.Singleline);
 2703:  
 2704:                 amsName = match.Groups[1].Value;
 2705:  
 2706:                 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);
 2707:  
 2708:                 if (match.Success)
 2709:                 {
 2710:                     cardPortOnt = match.Groups[1].Value;
 2711:  
 2712:                     line = match.Groups[2].Value;
 2713:  
 2714:                     ontId = Ia.Ftn.Cl.Models.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 2715:  
 2716:                     if (!string.IsNullOrEmpty(ontId))
 2717:                     {
 2718:                         dataOnt = new Ia.Ftn.Cl.Models.Ont();
 2719:  
 2720:                         dataOnt.Id = ontId;
 2721:                         dataOnt.BatteryBackupAvailable = (Ia.Cl.Models.Default.Match(line, @"BTRYBKUP=(\w+)") == "YES") ? true : false;
 2722:                         dataOnt.Description1 = Ia.Cl.Models.Default.Match(line, @"DESC1=""([^""]{1,64})""");
 2723:                         dataOnt.Description2 = Ia.Cl.Models.Default.Match(line, @"DESC2=""([^""]{1,64})""");
 2724:                         dataOnt.Serial = Ia.Cl.Models.Default.Match(line, @"SERNUM=(\w{12})");
 2725:                         dataOnt.PlannedSoftware = Ia.Cl.Models.Default.Match(line, @"SWVERPLND=""(auto|AUTO|\w{14})""");
 2726:                         dataOnt.ActiveSoftware = Ia.Cl.Models.Default.Match(line, @"SWVERACT=(\w{14})");
 2727:                         dataOnt.PassiveSoftware = Ia.Cl.Models.Default.Match(line, @"SWVERPSV=(\w{14})");
 2728:                         dataOnt.FamilyTypeId = (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyTypeIdFromActiveSoftwareAndPlannedSoftware(dataOnt.ActiveSoftware, dataOnt.PlannedSoftware);
 2729:                         dataOnt.VendorId = Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.VendorIdFromName(Ia.Cl.Models.Default.Match(line, @"VENDORID=(\w+)"));
 2730:                         dataOnt.EquipmentId = Ia.Cl.Models.Default.Match(line, @"EQUIPID=(\w{16})");
 2731:  
 2732:                         switch (match.Groups[3].Value)
 2733:                         {
 2734:                             case "IS-NR": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.IsNr; break;
 2735:                             case "OOS-AU": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAu; break;
 2736:                             case "OOS-MA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosMa; break;
 2737:                             case "OOS-AUMA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAuma; break;
 2738:                             default: state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.Undefined; break;
 2739:                         }
 2740:  
 2741:                         dataOnt.StateId = (int)state;
 2742:  
 2743:                         using (var db = new Ia.Ftn.Cl.Db())
 2744:                         {
 2745:                             accessId = Ia.Ftn.Cl.Models.Business.Access.AccessId(ontId);
 2746:  
 2747:                             if (accessId != null) dataOnt.Access = (from a in db.Accesses where a.Id == accessId select a).SingleOrDefault();
 2748:  
 2749:                             ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
 2750:  
 2751:                             if (ont == null)
 2752:                             {
 2753:                                 dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
 2754:  
 2755:                                 db.Onts.Add(dataOnt);
 2756:  
 2757:                                 insertedItemCount++;
 2758:                             }
 2759:                             else
 2760:                             {
 2761:                                 existingItemCount++;
 2762:  
 2763:                                 if (ont.Update(dataOnt))
 2764:                                 {
 2765:                                     db.Onts.Attach(ont);
 2766:                                     db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 2767:  
 2768:                                     updatedItemCount++;
 2769:                                 }
 2770:                             }
 2771:  
 2772:                             db.SaveChanges();
 2773:                         }
 2774:                     }
 2775:                     else
 2776:                     {
 2777:                         result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
 2778:                     }
 2779:                 }
 2780:                 else
 2781:                 {
 2782:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 2783:                 }
 2784:                 #endregion
 2785:             }
 2786:             else if (rowData.Contains("ED-ONT:"))
 2787:             {
 2788:                 #region ED-ONT
 2789:                 Ia.Ftn.Cl.Models.Ont ont, dataOnt;
 2790:  
 2791:                 /*
 2792:     SUR-5-2 14-11-23 05:22:08
 2793:     M  0 COMPLD
 2794:     / * ED-ONT:SUR-5-2:ONT-1-1-1-2-6::::DESC1=ZAH.2.6: * /
 2795:  
 2796:     M  0 COMPLD
 2797:     / * ED-ONT:QRW-SLB-LAG2:ONT-1-1-3-2-10:98499:::DESC1=QRW.33.10: * /
 2798:     ;
 2799:                 */
 2800:  
 2801:                 // below: read OntPosition
 2802:                 match = Regex.Match(rowData, @"ED-ONT:([\w\d\-]+)", RegexOptions.Singleline);
 2803:  
 2804:                 amsName = match.Groups[1].Value;
 2805:  
 2806:                 match = Regex.Match(rowData, @"ONT-1-1-(\d{1,2}-\d{1,2}-\d{1,2}):\d{0,6}:::(.+?):", RegexOptions.Singleline);
 2807:  
 2808:                 if (match.Success)
 2809:                 {
 2810:                     cardPortOnt = match.Groups[1].Value;
 2811:  
 2812:                     line = match.Groups[2].Value;
 2813:  
 2814:                     ontId = Ia.Ftn.Cl.Models.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 2815:  
 2816:                     if (!string.IsNullOrEmpty(ontId))
 2817:                     {
 2818:                         dataOnt = new Ia.Ftn.Cl.Models.Ont();
 2819:  
 2820:                         dataOnt.Id = ontId;
 2821:                         dataOnt.Description1 = Ia.Cl.Models.Default.Match(line, @"DESC1=(.{1,64})");
 2822:                         dataOnt.Description2 = Ia.Cl.Models.Default.Match(line, @"DESC2=(.{1,64})");
 2823:  
 2824:                         using (var db = new Ia.Ftn.Cl.Db())
 2825:                         {
 2826:                             ont = (from o in db.Onts where o.Id == dataOnt.Id select o).SingleOrDefault();
 2827:  
 2828:                             if (ont == null)
 2829:                             {
 2830:                                 // below: Don't create a new ONT in this ED-ONT function
 2831:                                 //dataOnt.Created = dataOnt.Updated = DateTime.UtcNow.AddHours(3);
 2832:  
 2833:                                 //db.Onts.Add(dataOnt);
 2834:  
 2835:                                 insertedItemCount++;
 2836:                             }
 2837:                             else
 2838:                             {
 2839:                                 existingItemCount++;
 2840:  
 2841:                                 if (ont.Update(dataOnt))
 2842:                                 {
 2843:                                     db.Onts.Attach(ont);
 2844:                                     db.Entry(ont).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 2845:  
 2846:                                     updatedItemCount++;
 2847:                                 }
 2848:                             }
 2849:  
 2850:                             db.SaveChanges();
 2851:                         }
 2852:                     }
 2853:                     else
 2854:                     {
 2855:                         result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
 2856:                     }
 2857:                 }
 2858:                 else
 2859:                 {
 2860:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 2861:                 }
 2862:                 #endregion
 2863:             }
 2864:             else if (rowData.Contains("RTRV-SERVICE-VOIP:"))
 2865:             {
 2866:                 #region RTRV-SERVICE-VOIP
 2867:  
 2868:                 string ontServiceVoipId;
 2869:                 int card;
 2870:                 Ia.Ftn.Cl.Models.OntServiceVoip ontServiceVoip, dataOntServiceVoip;
 2871:  
 2872:                 // below: information from the definition of "RTRV-SERVICE-VOIP" in "AMS TL1 Commands Reference"
 2873:  
 2874:                 /*
 2875:  
 2876:     SUR-1-1 08-07-09 09:43:13
 2877:     M  0 COMPLD
 2878:     / * RTRV-SERVICE-VOIP:SUR-1-1:VOIP-1-1-1-1-1-1&VOIP-1-1-1-1-10-1&VOIP-1-1 * /
 2879:     / * -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- * /
 2880:     / * 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 * /
 2881:     "VOIP-1-1-1-1-1-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
 2882:     BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
 2883:     IPADDRLOC=10.3.144.1,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
 2884:     IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
 2885:     VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
 2886:     CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
 2887:     SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
 2888:     SRCVLANID=0:IS-NR"
 2889:     "VOIP-1-1-1-1-10-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
 2890:     BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
 2891:     IPADDRLOC=10.3.144.10,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
 2892:     IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
 2893:     VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
 2894:     CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
 2895:     SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
 2896:     SRCVLANID=0:IS-NR"
 2897:     "VOIP-1-1-1-1-2-1::BWPROFUPID=1,BWPROFUPNM=VOIP,BWPROFDNID=1,
 2898:     BWPROFDNNM=VOIP,PQPROFID=1,PQPROFNM=VOIPPQ,AESENABLE=DISABLE,SVLAN=10,
 2899:     IPADDRLOC=10.3.144.2,NETMASKLOC=255.255.248.0,DEFROUTER=10.3.151.254,
 2900:     IPADDRMGC=10.255.251.5,IPADDRFTP=0.0.0.0,DHCP=DISABLE,PORTMGC=2944,
 2901:     VOIPDSCP=24,VOIPMODE=SSH248,CONFIGFILE=kuwait.xml,CLIENTID="",
 2902:     CUSTOMERID="",SECRETID=,SECRETK=,IPSECENABLE=DISABLED,CONFMETH=FTPSERVER,
 2903:     SPGPROFID=0,SPGPROFNM="",SPGUNAME="",SPGPWD="",SPGREALM="",
 2904:     SRCVLANID=0:IS-NR"
 2905:  
 2906:     / * More Output Follows * /
 2907:     >
 2908:                 */
 2909:  
 2910:                 // below: read OntPosition
 2911:                 match = Regex.Match(rowData, @"RTRV-SERVICE-VOIP:([\w\d\-]+)", RegexOptions.Singleline);
 2912:  
 2913:                 amsName = match.Groups[1].Value;
 2914:  
 2915:                 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);
 2916:  
 2917:                 if (match.Success)
 2918:                 {
 2919:                     cardPortOnt = match.Groups[1].Value;
 2920:                     card = int.Parse(match.Groups[2].Value);
 2921:  
 2922:                     line = match.Groups[3].Value;
 2923:  
 2924:                     ontId = Ia.Ftn.Cl.Models.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 2925:  
 2926:                     if (!string.IsNullOrEmpty(ontId))
 2927:                     {
 2928:                         ontServiceVoipId = Ia.Ftn.Cl.Models.Business.Nokia.OntServiceVoip.OntServiceVoipId(ontId, card);
 2929:  
 2930:                         dataOntServiceVoip = new Ia.Ftn.Cl.Models.OntServiceVoip();
 2931:  
 2932:                         dataOntServiceVoip.Id = ontServiceVoipId;
 2933:  
 2934:                         dataOntServiceVoip.ConfiguratinFile = Ia.Cl.Models.Default.Match(line, @"CONFIGFILE=(\w{1,}\.xml)");
 2935:                         dataOntServiceVoip.Customer = Ia.Cl.Models.Default.Match(line, @"CUSTOMERID=""([^""]{1,62})""");
 2936:                         dataOntServiceVoip.FtpIp = Ia.Cl.Models.Default.Match(line, @"IPADDRFTP=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 2937:                         dataOntServiceVoip.Ip = Ia.Cl.Models.Default.Match(line, @"IPADDRLOC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 2938:                         dataOntServiceVoip.Label = Ia.Cl.Models.Default.Match(line, @"LABEL=""([^""]{1,80})""");
 2939:                         dataOntServiceVoip.MgcIp = Ia.Cl.Models.Default.Match(line, @"IPADDRMGC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 2940:                         dataOntServiceVoip.MgcSecondaryIp = Ia.Cl.Models.Default.Match(line, @"IPADDRMGCSEC=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 2941:  
 2942:                         switch (match.Groups[4].Value)
 2943:                         {
 2944:                             case "IS-NR": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.IsNr; break;
 2945:                             case "OOS-AU": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAu; break;
 2946:                             case "OOS-MA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosMa; break;
 2947:                             case "OOS-AUMA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAuma; break;
 2948:                             default: state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.Undefined; break;
 2949:                         }
 2950:  
 2951:                         dataOntServiceVoip.StateId = (int)state;
 2952:  
 2953:                         dataOntServiceVoip.Svlan = int.Parse(Ia.Cl.Models.Default.Match(line, @"SVLAN=(\d{1,3})"));
 2954:  
 2955:                         using (var db = new Ia.Ftn.Cl.Db())
 2956:                         {
 2957:                             dataOntServiceVoip.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 2958:  
 2959:                             ontServiceVoip = (from osv in db.OntServiceVoips where osv.Id == dataOntServiceVoip.Id select osv).SingleOrDefault();
 2960:  
 2961:                             if (ontServiceVoip == null)
 2962:                             {
 2963:                                 dataOntServiceVoip.Created = dataOntServiceVoip.Updated = DateTime.UtcNow.AddHours(3);
 2964:  
 2965:                                 db.OntServiceVoips.Add(dataOntServiceVoip);
 2966:  
 2967:                                 insertedItemCount++;
 2968:                             }
 2969:                             else
 2970:                             {
 2971:                                 existingItemCount++;
 2972:  
 2973:                                 if (ontServiceVoip.Update(dataOntServiceVoip))
 2974:                                 {
 2975:                                     db.OntServiceVoips.Attach(ontServiceVoip);
 2976:                                     db.Entry(ontServiceVoip).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 2977:  
 2978:                                     updatedItemCount++;
 2979:                                 }
 2980:                             }
 2981:  
 2982:                             db.SaveChanges();
 2983:                         }
 2984:                     }
 2985:                     else
 2986:                     {
 2987:                         result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
 2988:                     }
 2989:                 }
 2990:                 else
 2991:                 {
 2992:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 2993:                 }
 2994:                 #endregion
 2995:             }
 2996:             else if (rowData.Contains("RTRV-ONTPOTS:"))
 2997:             {
 2998:                 #region RTRV-ONTPOTS
 2999:  
 3000:                 string ontOntPotsId;
 3001:                 int card, port, svlan;
 3002:                 Ia.Ftn.Cl.Models.OntOntPots ontOntPots, dataOntOntPots;
 3003:  
 3004:                 // below: information from the definition of "RTRV-ONTPOTS" in "AMS TL1 Commands Reference"
 3005:  
 3006:                 /*
 3007:                  * ;RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1;
 3008:  
 3009:     SUR-1-1 14-03-13 08:15:46
 3010:     M  0 COMPLD
 3011:     /* RTRV-ONTPOTS:SUR-1-1:ONTPOTS-1-1-1-1-1-2-1 * /
 3012:     "ONTPOTS-1-1-1-1-1-2-1::VOIPSERV=1,TERMID=td1,POTSDSCP=46,POTSPWR=0,
 3013:     CALLHIST=DISABLED,PWROVERRIDE=FALSE,SIPMSGTOTH=0,BRRPKTLOSSTH=0,XJTTRTH=0,
 3014:     RXGAIN=0,TXGAIN=0:IS-NR"
 3015:     ;
 3016:     */
 3017:  
 3018:                 // below: read OntPosition
 3019:                 match = Regex.Match(rowData, @"RTRV-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
 3020:  
 3021:                 amsName = match.Groups[1].Value;
 3022:  
 3023:                 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);
 3024:  
 3025:                 if (match.Success)
 3026:                 {
 3027:                     cardPortOnt = match.Groups[1].Value;
 3028:                     card = int.Parse(match.Groups[2].Value);
 3029:                     port = int.Parse(match.Groups[3].Value);
 3030:  
 3031:                     line = match.Groups[4].Value;
 3032:  
 3033:                     ontId = Ia.Ftn.Cl.Models.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 3034:  
 3035:                     if (!string.IsNullOrEmpty(ontId))
 3036:                     {
 3037:                         if (card >= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MaximumPortValue)
 3038:                         {
 3039:                             ontOntPotsId = Ia.Ftn.Cl.Models.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
 3040:  
 3041:                             dataOntOntPots = new Ia.Ftn.Cl.Models.OntOntPots();
 3042:  
 3043:                             dataOntOntPots.Id = ontOntPotsId;
 3044:  
 3045:                             dataOntOntPots.Card = card;
 3046:                             dataOntOntPots.Customer = Ia.Cl.Models.Default.Match(line, @"CUSTINFO=(\w{1,80})");
 3047:                             dataOntOntPots.Port = port;
 3048:  
 3049:                             switch (match.Groups[5].Value)
 3050:                             {
 3051:                                 case "IS-NR": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.IsNr; break;
 3052:                                 case "OOS-AU": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAu; break;
 3053:                                 case "OOS-MA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosMa; break;
 3054:                                 case "OOS-AUMA": state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.OosAuma; break;
 3055:                                 default: state = Ia.Ftn.Cl.Models.Business.Nokia.Ams.BellcoreState.Undefined; break;
 3056:                             }
 3057:  
 3058:                             dataOntOntPots.StateId = (int)state;
 3059:  
 3060:                             if (int.TryParse(Ia.Cl.Models.Default.Match(line, @"SVLAN=(\d{1,3})"), out svlan)) dataOntOntPots.Svlan = svlan;
 3061:  
 3062:                             dataOntOntPots.Termination = Ia.Cl.Models.Default.Match(line, @"TERMID=(\w{1,20})");
 3063:                             dataOntOntPots.Tn = Ia.Cl.Models.Default.Match(line, @"TN=(\w{1,16})");
 3064:                             dataOntOntPots.VoipClientIp = Ia.Cl.Models.Default.Match(line, @"VOIPCLIENTADDR=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})");
 3065:  
 3066:                             using (var db = new Ia.Ftn.Cl.Db())
 3067:                             {
 3068:                                 dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 3069:  
 3070:                                 ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
 3071:  
 3072:                                 if (ontOntPots == null)
 3073:                                 {
 3074:                                     dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
 3075:  
 3076:                                     db.OntOntPots.Add(dataOntOntPots);
 3077:  
 3078:                                     insertedItemCount++;
 3079:                                 }
 3080:                                 else
 3081:                                 {
 3082:                                     existingItemCount++;
 3083:  
 3084:                                     if (ontOntPots.Update(dataOntOntPots))
 3085:                                     {
 3086:                                         db.OntOntPots.Attach(ontOntPots);
 3087:                                         db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 3088:  
 3089:                                         updatedItemCount++;
 3090:                                     }
 3091:                                 }
 3092:  
 3093:                                 db.SaveChanges();
 3094:                             }
 3095:                         }
 3096:                         else
 3097:                         {
 3098:                             result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
 3099:                         }
 3100:                     }
 3101:                     else
 3102:                     {
 3103:                         result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
 3104:                     }
 3105:                 }
 3106:                 else
 3107:                 {
 3108:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 3109:                 }
 3110:  
 3111:                 #endregion
 3112:             }
 3113:             else if (rowData.Contains("ED-ONTPOTS:"))
 3114:             {
 3115:                 #region ED-ONTPOTS
 3116:  
 3117:                 string ontOntPotsId;
 3118:                 int card, port;
 3119:                 Ia.Ftn.Cl.Models.OntOntPots ontOntPots, dataOntOntPots;
 3120:  
 3121:                 /* ED-ONTPOTS:SUL-1-1:ONTPOTS-1-1-9-1-1-2-1:14614:::CUSTINFO=24977777: */
 3122:                 /* ED-ONTPOTS:SJA-JHR-LAG14:ONTPOTS-1-1-1-6-4-0-0:2425:::CUSTINFO=24531914: */
 3123:  
 3124:                 // below: read OntPosition
 3125:                 match = Regex.Match(rowData, @"ED-ONTPOTS:([\w\d\-]+)", RegexOptions.Singleline);
 3126:  
 3127:                 amsName = match.Groups[1].Value;
 3128:  
 3129:                 match = Regex.Match(rowData, @"ONTPOTS-1-1-(\d{1,2}-\d{1,2}-\d{1,2})-(\d{1,2})-(\d{1,2}):(.+?):", RegexOptions.Singleline);
 3130:  
 3131:                 if (match.Success)
 3132:                 {
 3133:                     cardPortOnt = match.Groups[1].Value;
 3134:                     card = int.Parse(match.Groups[2].Value);
 3135:                     port = int.Parse(match.Groups[3].Value);
 3136:  
 3137:                     line = match.Groups[4].Value;
 3138:  
 3139:                     ontId = Ia.Ftn.Cl.Models.Business.Nokia.Ont.OntId(amsName, cardPortOnt);
 3140:  
 3141:                     if (!string.IsNullOrEmpty(ontId))
 3142:                     {
 3143:                         if (card >= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MinimumCardValue && card <= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MaximumCardValue && port >= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MinimumPortValue && port <= Ia.Ftn.Cl.Models.Business.Nokia.Ont.MaximumPortValue)
 3144:                         {
 3145:                             ontOntPotsId = Ia.Ftn.Cl.Models.Business.Nokia.OntOntPots.OntOntPotsId(ontId, card, port);
 3146:  
 3147:                             dataOntOntPots = new Ia.Ftn.Cl.Models.OntOntPots();
 3148:  
 3149:                             dataOntOntPots.Id = ontOntPotsId;
 3150:  
 3151:                             dataOntOntPots.Card = card;
 3152:                             dataOntOntPots.Customer = Ia.Cl.Models.Default.Match(line, @"CUSTINFO=(\w{1,80})");
 3153:                             dataOntOntPots.Port = port;
 3154:  
 3155:                             using (var db = new Ia.Ftn.Cl.Db())
 3156:                             {
 3157:                                 dataOntOntPots.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 3158:  
 3159:                                 ontOntPots = (from oop in db.OntOntPots where oop.Id == dataOntOntPots.Id select oop).SingleOrDefault();
 3160:  
 3161:                                 if (ontOntPots == null)
 3162:                                 {
 3163:                                     dataOntOntPots.Created = dataOntOntPots.Updated = DateTime.UtcNow.AddHours(3);
 3164:  
 3165:                                     db.OntOntPots.Add(dataOntOntPots);
 3166:  
 3167:                                     insertedItemCount++;
 3168:                                 }
 3169:                                 else
 3170:                                 {
 3171:                                     existingItemCount++;
 3172:  
 3173:                                     if (ontOntPots.Update(dataOntOntPots))
 3174:                                     {
 3175:                                         db.OntOntPots.Attach(ontOntPots);
 3176:                                         db.Entry(ontOntPots).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
 3177:  
 3178:                                         updatedItemCount++;
 3179:                                     }
 3180:                                 }
 3181:  
 3182:                                 db.SaveChanges();
 3183:                             }
 3184:                         }
 3185:                         else
 3186:                         {
 3187:                             result.AddError(@"Card and/or port value is invalid: card:" + card + ", port:" + port);
 3188:                         }
 3189:                     }
 3190:                     else
 3191:                     {
 3192:                         result.AddError("Error in UpdateDatabaseWithAmsCommandOutput(): ontId was null or empty for amsName: [" + amsName + "] and pon: [" + cardPortOnt + "].");
 3193:                     }
 3194:                 }
 3195:                 else
 3196:                 {
 3197:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 3198:                 }
 3199:  
 3200:                 #endregion
 3201:             }
 3202:             else if (rowData.Contains("RTRV-ALM-PON:"))
 3203:             {
 3204:                 // 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
 3205:                 #region RTRV-ALM-PON
 3206:  
 3207:                 Ia.Ftn.Cl.Models.Event @event;
 3208:  
 3209:                 // below: important, remove all ''' char from string
 3210:                 rowData = rowData.Replace(@"'", "");
 3211:  
 3212:                 // below: read eventTime and amsName
 3213:                 // QRW-1-1 14-03-31 06:15:20
 3214:                 match = Regex.Match(rowData, @"([\w\d\-]+) ((\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}))", RegexOptions.Singleline);
 3215:  
 3216:                 amsName = match.Groups[1].Value;
 3217:                 eventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
 3218:  
 3219:                 // old "PON-1-1-9-2,PON:MN,NEWONT,NSA,,,,: \"SERNUM =ALCLA0A2D17A, SLID =DEFAULT,\""
 3220:                 // 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);
 3221:  
 3222:                 /*
 3223:     "PON-1-1-10-3:CL,NEWONT,NSA,5-26,23-8-36,,:,
 3224:     "SERNUM =ALCLA0A22564, SLID =DEFAULT                 ,
 3225:     LOID =                        , USRATE =1.25g""
 3226:                 */
 3227:  
 3228:                 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);
 3229:  
 3230:                 if (matchCollection.Count > 0)
 3231:                 {
 3232:                     using (var db = new Ia.Ftn.Cl.Db())
 3233:                     {
 3234:                         foreach (Match m in matchCollection)
 3235:                         {
 3236:                             if (m.Success)
 3237:                             {
 3238:                                 @event = new Ia.Ftn.Cl.Models.Event();
 3239:  
 3240:                                 @event.Aid = m.Groups[1].Value;
 3241:                                 @event.Cause = "NEWONT";
 3242:                                 @event.Class = "ONT";
 3243:                                 @event.Detail = m.Groups[3].Value;
 3244:                                 @event.EventTime = eventTime;
 3245:                                 @event.NodeTime = null;
 3246:                                 @event.Number = 0;
 3247:                                 @event.SeverityEffect = "NSA";
 3248:                                 @event.Severity = m.Groups[2].Value;
 3249:                                 @event.System = amsName;
 3250:                                 @event.TypeId = 0;
 3251:  
 3252:                                 @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
 3253:                                 db.Events.Add(@event);
 3254:  
 3255:                                 insertedItemCount++;
 3256:                             }
 3257:                         }
 3258:  
 3259:                         db.SaveChanges();
 3260:                     }
 3261:                 }
 3262:                 else
 3263:                 {
 3264:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: [" + rowData + "] was not matched.");
 3265:                 }
 3266:  
 3267:                 #endregion
 3268:             }
 3269:             else if (rowData.Contains("REPT ALM"))
 3270:             {
 3271:                 #region REPT ALM
 3272:  
 3273:                 string _class, aid;
 3274:                 Ia.Ftn.Cl.Models.Event @event;
 3275:  
 3276:                 // below: important, remove all ''' char from string
 3277:                 rowData = rowData.Replace(@"'", "");
 3278:  
 3279:                 // 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\"" ;
 3280:  
 3281:                 /*
 3282:     SLA-SUR-LAG16 18-06-24 18:21:01
 3283:     A  37211 REPT ALM ONT
 3284:     "ONT-1-1-5-9-20:CL,DG,SA,6-24,18-21-1:
 3285:     "Received Dying Gasp indication from ONT","
 3286:     ;                 */
 3287:                 // 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);
 3288:                 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);
 3289:  
 3290:                 if (match.Success)
 3291:                 {
 3292:                     amsName = match.Groups[1].Value;
 3293:  
 3294:                     _class = match.Groups[12].Captures[0].Value;
 3295:                     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;
 3296:  
 3297:                     ontPosition = CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(amsName, _class, aid);
 3298:                     ontId = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntIdByPosition(ontPosition);
 3299:  
 3300:                     @event = new Ia.Ftn.Cl.Models.Event();
 3301:  
 3302:                     @event.Aid = aid;
 3303:                     @event.Cause = match.Groups[18].Captures[0].Value;
 3304:                     @event.Class = _class;
 3305:                     @event.Detail = match.Groups[27].Captures[0].Value.Replace(@"""", "");
 3306:                     @event.EventTime = DateTime.ParseExact(match.Groups[2].Captures[0].Value, "yy-MM-dd HH:mm:ss", null);
 3307:                     @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);
 3308:                     @event.Number = int.Parse(match.Groups[10].Captures[0].Value);
 3309:                     @event.SeverityEffect = match.Groups[19].Captures[0].Value;
 3310:                     @event.Severity = match.Groups[17].Captures[0].Value;
 3311:                     @event.System = amsName;
 3312:                     @event.TypeId = 0;
 3313:  
 3314:                     using (var db = new Ia.Ftn.Cl.Db())
 3315:                     {
 3316:                         if (ontId != null) @event.Ont = (from o in db.Onts where o.Id == ontId select o).SingleOrDefault();
 3317:  
 3318:                         @event.Created = @event.Updated = DateTime.UtcNow.AddHours(3);
 3319:                         db.Events.Add(@event);
 3320:  
 3321:                         insertedItemCount++;
 3322:  
 3323:                         db.SaveChanges();
 3324:                     }
 3325:                 }
 3326:                 else
 3327:                 {
 3328:                     result.AddWarning("Warning in UpdateDatabaseWithAmsCommandOutput(): Row data: REPT ALM [" + rowData + "] was not matched.");
 3329:                 }
 3330:  
 3331:                 #endregion
 3332:             }
 3333:  
 3334:             if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
 3335:             else isUpdated = false;
 3336:  
 3337:             result.AddSuccess("(" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
 3338:  
 3339:             return isUpdated;
 3340:         }
 3341:  
 3342:         ////////////////////////////////////////////////////////////////////////////
 3343:  
 3344:         /// <summary>
 3345:         /// 
 3346:         /// </summary>
 3347:         private static string CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(string amsName, string _class, string aid)
 3348:         {
 3349:             /*
 3350:     --BRGPORT    BRGPORT-1-1-11-2-6-1-1
 3351:     --PON    PON-1-1-13-1
 3352:     --EQPT    LT-1-1-14
 3353:     --ONTPOTS    ONTPOTS-1-1-8-1-17-2-2
 3354:     --ONTVOIP    VOIP-1-1-13-2-22-1
 3355:     --ONT    ONT-1-1-13-1-10
 3356:     --ONTENET    ONTENET-1-1-2-1-20-1-1
 3357:     --ONTCARD    ONTCARD-1-1-9-2-8-1
 3358:     --ONTHSI    HSI-1-1-2-1-8-1-2-2
 3359:             */
 3360:  
 3361:             string ontPosition;
 3362:             Match match;
 3363:  
 3364:             ontPosition = string.Empty;
 3365:  
 3366:             if (!string.IsNullOrEmpty(aid) && !string.IsNullOrEmpty(_class))
 3367:             {
 3368:                 if (_class == "BRGPORT")
 3369:                 {
 3370:                     // BRGPORT    BRGPORT-1-1-11-2-6-1-1
 3371:                     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);
 3372:  
 3373:                     if (match.Success)
 3374:                     {
 3375:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3376:                     }
 3377:                     else
 3378:                     {
 3379:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3380:                     }
 3381:                 }
 3382:                 else if (_class == "PON")
 3383:                 {
 3384:                     // PON    PON-1-1-13-1
 3385:                     match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 3386:  
 3387:                     if (match.Success)
 3388:                     {
 3389:                         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
 3390:                     }
 3391:                     else
 3392:                     {
 3393:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3394:                     }
 3395:                 }
 3396:                 else if (_class == "EQPT")
 3397:                 {
 3398:                     // EQPT    LT-1-1-14
 3399:                     match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 3400:  
 3401:                     if (match.Success)
 3402:                     {
 3403:                         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
 3404:                     }
 3405:                     else
 3406:                     {
 3407:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3408:                     }
 3409:                 }
 3410:                 else if (_class == "ONTPOTS")
 3411:                 {
 3412:                     // ONTPOTS    ONTPOTS-1-1-8-1-17-2-2
 3413:                     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);
 3414:  
 3415:                     if (match.Success)
 3416:                     {
 3417:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3418:                     }
 3419:                     else
 3420:                     {
 3421:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3422:                     }
 3423:                 }
 3424:                 else if (_class == "ONTVOIP")
 3425:                 {
 3426:                     // ONTVOIP    VOIP-1-1-13-2-22-1
 3427:                     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);
 3428:  
 3429:                     if (match.Success)
 3430:                     {
 3431:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3432:                     }
 3433:                     else
 3434:                     {
 3435:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3436:                     }
 3437:                 }
 3438:                 else if (_class == "ONT")
 3439:                 {
 3440:                     // ONT    ONT-1-1-13-1-10
 3441:                     match = Regex.Match(aid, @"^(\w+)-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})-(\d{1,2})$", RegexOptions.Singleline);
 3442:  
 3443:                     if (match.Success)
 3444:                     {
 3445:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3446:                     }
 3447:                     else
 3448:                     {
 3449:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3450:                     }
 3451:                 }
 3452:                 else if (_class == "ONTENET")
 3453:                 {
 3454:                     // ONTENET    ONTENET-1-1-2-1-20-1-1
 3455:                     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);
 3456:  
 3457:                     if (match.Success)
 3458:                     {
 3459:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3460:                     }
 3461:                     else
 3462:                     {
 3463:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3464:                     }
 3465:                 }
 3466:                 else if (_class == "ONTCARD")
 3467:                 {
 3468:                     // ONTCARD    ONTCARD-1-1-9-2-8-1
 3469:                     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);
 3470:  
 3471:                     if (match.Success)
 3472:                     {
 3473:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3474:                     }
 3475:                     else
 3476:                     {
 3477:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3478:                     }
 3479:                 }
 3480:                 else if (_class == "ONTHSI")
 3481:                 {
 3482:                     // ONTHSI    HSI-1-1-2-1-8-1-2-2
 3483:                     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);
 3484:  
 3485:                     if (match.Success)
 3486:                     {
 3487:                         ontPosition = amsName + "-" + int.Parse(match.Groups[4].Value) + "-" + int.Parse(match.Groups[5].Value) + "-" + int.Parse(match.Groups[6].Value);
 3488:                     }
 3489:                     else
 3490:                     {
 3491:                         throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + " unmatched.") { };
 3492:                     }
 3493:                 }
 3494:                 else
 3495:                 {
 3496:                     throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): class: " + _class + ", aid: " + aid + ". Class is unknown.") { };
 3497:                 }
 3498:             }
 3499:             else
 3500:             {
 3501:                 throw new Exception("CalculateRelaventOntPositionAccordingToAmsNameAndClassAndAid(): aid and/or class are null.") { };
 3502:             }
 3503:  
 3504:             return ontPosition;
 3505:         }
 3506:  
 3507:         ////////////////////////////////////////////////////////////////////////////
 3508:  
 3509:         /// <summary>
 3510:         ///
 3511:         /// </summary>
 3512:         public bool AddPot(string td)
 3513:         {
 3514:             bool b;
 3515:  
 3516:             b = true;
 3517:  
 3518:  
 3519:             return b;
 3520:         }
 3521:  
 3522:         ////////////////////////////////////////////////////////////////////////////
 3523:  
 3524:         /// <summary>
 3525:         ///
 3526:         /// </summary>
 3527:         public static string CommandsToDeleteAndCreateServiceVoipUsingNdd(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt, Ia.Ftn.Cl.Models.Ont ont, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
 3528:         {
 3529:             string sa, cardPortOnt, voipServiceState;
 3530:  
 3531:             sa = string.Empty;
 3532:  
 3533:             foreach (Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.PonGroup ponGroup in olt.PonGroupList)
 3534:             {
 3535:                 cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 3536:  
 3537:                 if (edServiceVoipIsOos) voipServiceState = "OOS";
 3538:                 else voipServiceState = "IS";
 3539:  
 3540:                 sa = @"
 3541: # Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
 3542:  
 3543:                 if (ont != null)
 3544:                 {
 3545:                     if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Gfu || ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Undefined)
 3546:                     {
 3547:                         sa += @"
 3548:  
 3549: # Delete ONTPOTS
 3550: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
 3551: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
 3552:  
 3553: # Delete VOIP
 3554: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
 3555: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 3556:  
 3557: # Create VOIP
 3558: 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;
 3559:  
 3560: # Create ONTPOTS
 3561: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
 3562: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
 3563: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
 3564: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 3565:  
 3566: # VOIP service state
 3567: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3568:  
 3569:  
 3570: ";
 3571:                     }
 3572:                     else if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Soho)
 3573:                     {
 3574:                         sa += @"
 3575:  
 3576: # Delete ONTPOTS
 3577: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
 3578: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
 3579:  
 3580: # Delete VOIP
 3581: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
 3582: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 3583:  
 3584: # Create VOIP
 3585: 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;
 3586:  
 3587: # Create ONTPOTS
 3588: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
 3589: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
 3590: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
 3591: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 3592: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
 3593: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
 3594: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
 3595: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
 3596:  
 3597: # VOIP service state
 3598: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3599:  
 3600:  
 3601: ";
 3602:                     }
 3603:                     else if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Gmdu)
 3604:                     {
 3605:                         sa += @"
 3606:  
 3607: # Delete ONTPOTS
 3608: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8:::::OOS;
 3609: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8:::::OOS;
 3610: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8:::::OOS;
 3611: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1&&-8::;
 3612: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-8::;
 3613: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1&&-8::;
 3614:  
 3615: # Delete VOIP
 3616: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
 3617: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 3618:  
 3619: # Create VOIP
 3620: 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;
 3621:  
 3622: # Create ONTPOTS
 3623: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
 3624: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
 3625: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
 3626: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
 3627: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
 3628: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
 3629: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
 3630: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
 3631:  
 3632: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
 3633: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
 3634: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
 3635: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
 3636: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
 3637: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
 3638: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
 3639: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
 3640:  
 3641: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
 3642: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
 3643: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
 3644: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
 3645: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
 3646: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
 3647: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
 3648: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
 3649:  
 3650: # VOIP service state
 3651: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3652:  
 3653:  
 3654: ";
 3655:                     }
 3656:                     else
 3657:                     {
 3658:                         throw new Exception("Unknown familyType") { };
 3659:                     }
 3660:                 }
 3661:                 else
 3662:                 {
 3663:  
 3664:                     sa = @"
 3665: # Delete then create VOIP and associated ONTPOTS: " + nddOnt.Access.Name + @" " + nddOnt.Position;
 3666:  
 3667:                     sa += @"
 3668: # ONT does not have an associated Access to it.";
 3669:  
 3670:                     sa += @"
 3671:  
 3672: # Delete ONTPOTS
 3673: ED-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4:::::OOS;
 3674: DLT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1&&-4::;
 3675:  
 3676: # Delete VOIP
 3677: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::OOS;
 3678: DLT-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1;
 3679:  
 3680: # Create VOIP
 3681: 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;
 3682:  
 3683: # Create ONTPOTS
 3684: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
 3685: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
 3686: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
 3687: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 3688:  
 3689: # VOIP service state
 3690: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3691:  
 3692:  
 3693: ";
 3694:                 }
 3695:             }
 3696:  
 3697:             return sa;
 3698:         }
 3699:  
 3700:         ////////////////////////////////////////////////////////////////////////////
 3701:  
 3702:         /// <summary>
 3703:         ///
 3704:         /// </summary>
 3705:         public static string CommandsToCreateOntPots(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt, Ia.Ftn.Cl.Models.Ont ont, Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
 3706:         {
 3707:             string sa, cardPortOnt, voipServiceState;
 3708:  
 3709:             cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 3710:  
 3711:             if (edServiceVoipIsOos) voipServiceState = "OOS";
 3712:             else voipServiceState = "IS";
 3713:  
 3714:             sa = @"
 3715: # Create ONTPOTS: " + ont.Access.Name + @" " + ont.Access.Position;
 3716:  
 3717:             if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Sfu || ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Gfu)
 3718:             {
 3719:                 sa += @"
 3720:  
 3721: # Create ONTPOTS
 3722: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
 3723: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
 3724: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
 3725: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 3726:  
 3727: # VOIP service state
 3728: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3729:  
 3730:  
 3731: ";
 3732:             }
 3733:             else if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Soho)
 3734:             {
 3735:                 sa += @"
 3736:  
 3737: # Create ONTPOTS
 3738: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;
 3739: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;
 3740: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;
 3741: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;
 3742: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td5:IS;
 3743: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td6:IS;
 3744: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td7:IS;
 3745: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td8:IS;
 3746:  
 3747: # VOIP service state
 3748: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3749:  
 3750:  
 3751: ";
 3752:             }
 3753:             else if (ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Mdu || ont.FamilyTypeId == (int)Ia.Ftn.Cl.Models.Business.Nokia.Ont.FamilyType.Gmdu)
 3754:             {
 3755:                 sa += @"
 3756:  
 3757: # Create ONTPOTS
 3758: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-1::::VOIPSERV=1,TERMID=td1:IS;
 3759: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-2::::VOIPSERV=1,TERMID=td2:IS;
 3760: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-3::::VOIPSERV=1,TERMID=td3:IS;
 3761: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-4::::VOIPSERV=1,TERMID=td4:IS;
 3762: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-5::::VOIPSERV=1,TERMID=td13:IS;
 3763: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-6::::VOIPSERV=1,TERMID=td14:IS;
 3764: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-7::::VOIPSERV=1,TERMID=td15:IS;
 3765: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-1-8::::VOIPSERV=1,TERMID=td16:IS;
 3766:  
 3767: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td5:IS;
 3768: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td6:IS;
 3769: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td7:IS;
 3770: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td8:IS;
 3771: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-5::::VOIPSERV=1,TERMID=td17:IS;
 3772: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-6::::VOIPSERV=1,TERMID=td18:IS;
 3773: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-7::::VOIPSERV=1,TERMID=td19:IS;
 3774: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-8::::VOIPSERV=1,TERMID=td20:IS;
 3775:  
 3776: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-1::::VOIPSERV=1,TERMID=td9:IS;
 3777: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-2::::VOIPSERV=1,TERMID=td10:IS;
 3778: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-3::::VOIPSERV=1,TERMID=td11:IS;
 3779: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-4::::VOIPSERV=1,TERMID=td12:IS;
 3780: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-5::::VOIPSERV=1,TERMID=td21:IS;
 3781: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-6::::VOIPSERV=1,TERMID=td22:IS;
 3782: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-7::::VOIPSERV=1,TERMID=td23:IS;
 3783: ENT-ONTPOTS:" + olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-3-8::::VOIPSERV=1,TERMID=td24:IS;
 3784:  
 3785: # VOIP service state
 3786: ED-SERVICE-VOIP:" + olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";
 3787:  
 3788:  
 3789: ";
 3790:             }
 3791:             else
 3792:             {
 3793:                 sa += @"
 3794:  
 3795: # Unknown FamilyType
 3796:  
 3797:  
 3798: ";
 3799:             }
 3800:  
 3801:             return sa;
 3802:         }
 3803:  
 3804:         ////////////////////////////////////////////////////////////////////////////
 3805:  
 3806:         /// <summary>
 3807:         ///
 3808:         /// </summary>
 3809:         public static List<string> CommandsToPreprovisionOntWithinOlt(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
 3810:         {
 3811:             string cardPortOnt, voipServiceState;
 3812:             List<string> list;
 3813:  
 3814:             list = new List<string>();
 3815:  
 3816:             if (edServiceVoipIsOos) voipServiceState = "OOS";
 3817:             else voipServiceState = "IS";
 3818:  
 3819:             cardPortOnt = nddOnt.CardSlot + "-" + nddOnt.Port + "-" + nddOnt.InternalNumber;
 3820:  
 3821:             //list.Add("# Preprovision an empty ONT on the network: " + nddOnt.Access.Name + @" " + nddOnt.Position + " (" + nddOnt.Ip + @");");
 3822:             list.Add("ENT-ONT:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONT-1-1-" + cardPortOnt + @"::::SWVERPLND=" + Ia.Ftn.Cl.Models.Data.Nokia.Ams.PlannedSoftware + @",DESC1=" + nddOnt.Access.Name + @",DESC2=""NULL"":OOS;");
 3823:  
 3824:             //list.Add("# Provision the VOIP service;");
 3825:             list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-2:::POTS::IS;");
 3826:             list.Add("ENT-ONTCARD:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTCARD-1-1-" + cardPortOnt + @"-1:::10_100BASET::IS;");
 3827:             list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-1::::SESSPROFID=1,MAXMACNUM=4:IS;");
 3828:             list.Add("ENT-ONTENET:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTENET-1-1-" + cardPortOnt + @"-1-2::::SESSPROFID=1,MAXMACNUM=4:IS;");
 3829:             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;");
 3830:             list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-1::::VOIPSERV=1,TERMID=td1:IS;");
 3831:             list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-2::::VOIPSERV=1,TERMID=td2:IS;");
 3832:             list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-3::::VOIPSERV=1,TERMID=td3:IS;");
 3833:             list.Add("ENT-ONTPOTS:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":ONTPOTS-1-1-" + cardPortOnt + @"-2-4::::VOIPSERV=1,TERMID=td4:IS;");
 3834:  
 3835:             //list.Add("# VOIP service state");
 3836:             list.Add("ED-SERVICE-VOIP:" + nddOnt.Pon.PonGroup.Olt.AmsName + @":VOIP-1-1-" + cardPortOnt + @"-1:::::" + voipServiceState + @";");
 3837:  
 3838:             return list;
 3839:         }
 3840:  
 3841:         ////////////////////////////////////////////////////////////////////////////
 3842:  
 3843:         /// <summary>
 3844:         ///
 3845:         /// </summary>
 3846:         public static string CommandsToPreprovisionOntWithinOltUsingConfigureCommand(Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt, bool edServiceVoipIsOos)
 3847:         {
 3848:             string sa, rackSubCardPortOnt;//, voipServiceState;
 3849:  
 3850:             //if (edServiceVoipIsOos) voipServiceState = "OOS";
 3851:             //else voipServiceState = "IS";
 3852:  
 3853:             rackSubCardPortOnt = nddOnt.Rack + "/" + nddOnt.Sub + "/" + nddOnt.CardSlot + "/" + nddOnt.Port + "/" + nddOnt.InternalNumber;
 3854:  
 3855:             sa = @"
 3856: configure equipment ont slot " + rackSubCardPortOnt + @"/1 planned-card-type 10_100base plndnumdataports 2 plndnumvoiceports 0
 3857: configure equipment ont slot " + rackSubCardPortOnt + @"/2 planned-card-type pots plndnumdataports 0 plndnumvoiceports 4
 3858: configure qos interface ont:" + rackSubCardPortOnt + @" us-num-queue 8
 3859: configure qos interface " + rackSubCardPortOnt + @"/voip upstream-queue 5 bandwidth-profile name:VOICE bandwidth-sharing ont-sharing 
 3860: configure bridge port " + rackSubCardPortOnt + @"/voip max-unicast-mac 8    
 3861: configure bridge port " + rackSubCardPortOnt + @"/voip vlan-id " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
 3862: configure bridge port " + rackSubCardPortOnt + @"/voip pvid " /*+ nddOnt.Pon.PonGroup.Olt.Vlan*/ + @"
 3863: 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*/ + @"
 3864:  
 3865: ";
 3866:  
 3867:             return sa;
 3868:         }
 3869:  
 3870:         ////////////////////////////////////////////////////////////////////////////    
 3871:         ////////////////////////////////////////////////////////////////////////////    
 3872:     }
 3873:  
 3874:     ////////////////////////////////////////////////////////////////////////////
 3875:     ////////////////////////////////////////////////////////////////////////////   
 3876: }