)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Skip Navigation LinksHome » Code Library » Ams

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

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

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