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

Integrated Applications Programming Company

Skip Navigation Links

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

Migration support class of Next Generation Network'a (NGN's) business model.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text.RegularExpressions;
   5:  using System.Web;
   6:   
   7:  namespace Ia.Ngn.Cl.Model.Business
   8:  {
   9:      ////////////////////////////////////////////////////////////////////////////
  10:   
  11:      /// <summary publish="true">
  12:      /// Migration support class of Next Generation Network'a (NGN's) business model.
  13:      /// </summary>
  14:      /// 
  15:      /// <remarks> 
  16:      /// Copyright © 2018-2020 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
  17:      ///
  18:      /// 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
  19:      /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
  20:      ///
  21:      /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
  22:      /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
  23:      /// 
  24:      /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
  25:      /// 
  26:      /// Copyright notice: This notice may not be removed or altered from any source distribution.
  27:      /// </remarks> 
  28:      public partial class Migration
  29:      {
  30:          ////////////////////////////////////////////////////////////////////////////
  31:   
  32:          /// <summary>
  33:          ///
  34:          /// </summary>
  35:          public Migration()
  36:          {
  37:   
  38:          }
  39:   
  40:          ////////////////////////////////////////////////////////////////////////////
  41:   
  42:          /// <summary>
  43:          ///
  44:          /// </summary>
  45:          public static bool ReviewEligibility(Ia.Ngn.Cl.Model.Staff staff, string accessNameTextBoxText, string serviceListTextBoxText, out string accessName, out List<string> migrationService5List, out bool doDisplayReview, out List<string> reviewServiceList, out Ia.Cl.Model.Result result)
  46:          {
  47:              bool isEligibleForMigration;
  48:              string accessNameString;
  49:              List<string> serviceList;
  50:   
  51:              isEligibleForMigration = false;
  52:              doDisplayReview = true;
  53:              serviceList = new List<string>();
  54:              reviewServiceList = new List<string>();
  55:   
  56:              accessName = string.Empty;
  57:              migrationService5List = new List<string>();
  58:   
  59:              result = new Ia.Cl.Model.Result();
  60:   
  61:              if (Ia.Ngn.Cl.Model.Business.Authority.StaffCanMigratePremisesFromPstnToGpon(staff))
  62:              {
  63:                  if (!string.IsNullOrEmpty(accessNameTextBoxText) && !string.IsNullOrEmpty(HttpContext.Current.Server.HtmlDecode(accessNameTextBoxText)))
  64:                  {
  65:                      accessNameString = HttpContext.Current.Server.HtmlDecode(accessNameTextBoxText);
  66:   
  67:                      accessNameString = accessNameString.Trim();
  68:   
  69:                      if (accessNameString.Length > 0)
  70:                      {
  71:                          if (Ia.Ngn.Cl.Model.Business.Access.AccessNameIsInValidFormat(accessNameString))
  72:                          {
  73:                              if (Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(accessNameString, out accessName))
  74:                              {
  75:                                  var access = Ia.Ngn.Cl.Model.Data.Access.ReadByAccessName(accessName);
  76:   
  77:                                  if (access != null)
  78:                                  {
  79:                                      if (Ia.Ngn.Cl.Model.Business.Service.OltIdIsWithinAllowedToBeMigratedOltList(access.Olt))
  80:                                      {
  81:                                          var nddOnt = Ia.Ngn.Cl.Model.Data.NetworkDesignDocument.OntByAccessName(accessName);
  82:   
  83:                                          if (nddOnt != null)
  84:                                          {
  85:                                              var serviceRequestOnt = Ia.Ngn.Cl.Model.Data.ServiceRequestOnt.Read(nddOnt.Access.Id);
  86:   
  87:                                              if (serviceRequestOnt != null)
  88:                                              {
  89:                                                  if (Ia.Ngn.Cl.Model.Business.Authority.StaffCanMigratePremisesFromPstnToGponForNddOnt(staff, nddOnt))
  90:                                                  {
  91:                                                      var huaweiAccessToPstnServiceListDictionary = Ia.Ngn.Cl.Model.Data.Huawei.GponPhaseIiHomeConnectionAndMigration.AccessToPstnServiceListDictionary;
  92:   
  93:                                                      if (huaweiAccessToPstnServiceListDictionary != null && huaweiAccessToPstnServiceListDictionary.Count > 0)
  94:                                                      {
  95:                                                          if (!string.IsNullOrEmpty(serviceListTextBoxText) && !string.IsNullOrEmpty(HttpContext.Current.Server.HtmlDecode(serviceListTextBoxText)))
  96:                                                          {
  97:                                                              var u = HttpContext.Current.Server.HtmlDecode(serviceListTextBoxText.Trim());
  98:   
  99:                                                              if (u.Length > 0)
 100:                                                              {
 101:                                                                  var matchCollection = Regex.Matches(u, @"\b\d{8}\b");
 102:   
 103:                                                                  if (matchCollection.Count > 0)
 104:                                                                  {
 105:                                                                      var list = matchCollection.Cast<Match>().Select(m => m.Value).ToList();
 106:   
 107:                                                                      if (list.Count > 0)
 108:                                                                      {
 109:                                                                          foreach (var service in list)
 110:                                                                          {
 111:                                                                              if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedDomainList(service))
 112:                                                                              {
 113:                                                                                  if (Ia.Ngn.Cl.Model.Business.Authority.NumberIsWithinFrameworkSiteDomainList(staff.Framework, service))
 114:                                                                                  {
 115:                                                                                      if (Ia.Ngn.Cl.Model.Business.Service.NumberIsWithinAllowedRouterDomainList(nddOnt, service))
 116:                                                                                      {
 117:                                                                                          serviceList.Add(service);
 118:                                                                                      }
 119:                                                                                      else
 120:                                                                                      {
 121:                                                                                          result.AddWarning("The service number " + service + " is not within allowed router domain list for access " + nddOnt.Access.Name + " (الرقم لا ينتمي لنطاقات المقسم المسموح بها للجهاز). ");
 122:                                                                                      }
 123:                                                                                  }
 124:                                                                                  else
 125:                                                                                  {
 126:                                                                                      result.AddWarning("The service number " + service + " is not in staff site domain (الرقم لا ينتمي لنطاقات المستخدم). ");
 127:                                                                                  }
 128:                                                                              }
 129:                                                                              else
 130:                                                                              {
 131:                                                                                  result.AddError("The service number " + service + " does not belong to the network (الرقم لا ينتمي للشبكة). ");
 132:                                                                              }
 133:                                                                          }
 134:                                                                      }
 135:                                                                      else
 136:                                                                      {
 137:                                                                          result.AddWarning("Could not retrieve any service number from the string " + serviceListTextBoxText + " (لم يتم استخراج أي رقم خدمة من النص المعطى). ");
 138:                                                                      }
 139:                                                                  }
 140:                                                                  else
 141:                                                                  {
 142:                                                                      result.AddWarning("Could not retrieve any service number from the string " + serviceListTextBoxText + " (لم يتم استخراج أي رقم خدمة من النص المعطى). ");
 143:                                                                  }
 144:                                                              }
 145:                                                              else
 146:                                                              {
 147:                                                                  // result.AddWarning("");
 148:                                                              }
 149:                                                          }
 150:                                                          else
 151:                                                          {
 152:                                                              // result.AddWarning("");
 153:                                                          }
 154:   
 155:                                                          var accessNameToServiceListWithinAllowedToBeMigratedOltDictionary = Ia.Ngn.Cl.Model.Data.ServiceRequest.AccessNameToServiceListWithinAllowedToBeMigratedOltDictionary;
 156:   
 157:                                                          if (huaweiAccessToPstnServiceListDictionary.ContainsKey(accessName) || accessNameToServiceListWithinAllowedToBeMigratedOltDictionary.ContainsKey(accessName) || serviceList.Count > 0)
 158:                                                          {
 159:                                                              serviceList = serviceList.Distinct().ToList();
 160:   
 161:                                                              var migrationService1List = new List<string>();
 162:   
 163:                                                              if (huaweiAccessToPstnServiceListDictionary.ContainsKey(accessName) && accessNameToServiceListWithinAllowedToBeMigratedOltDictionary.ContainsKey(accessName))
 164:                                                              {
 165:                                                                  migrationService1List.AddRange(huaweiAccessToPstnServiceListDictionary[accessName]);
 166:                                                                  migrationService1List.AddRange(accessNameToServiceListWithinAllowedToBeMigratedOltDictionary[accessName]);
 167:   
 168:                                                                  migrationService1List.AddRange(serviceList);
 169:                                                              }
 170:                                                              else if (huaweiAccessToPstnServiceListDictionary.ContainsKey(accessName))
 171:                                                              {
 172:                                                                  migrationService1List.AddRange(huaweiAccessToPstnServiceListDictionary[accessName]);
 173:   
 174:                                                                  migrationService1List.AddRange(serviceList);
 175:                                                              }
 176:                                                              else if (accessNameToServiceListWithinAllowedToBeMigratedOltDictionary.ContainsKey(accessName))
 177:                                                              {
 178:                                                                  migrationService1List.AddRange(accessNameToServiceListWithinAllowedToBeMigratedOltDictionary[accessName]);
 179:   
 180:                                                                  migrationService1List.AddRange(serviceList);
 181:                                                              }
 182:                                                              else // only optional number serviceList.Count > 0 left
 183:                                                              {
 184:                                                                  migrationService1List.AddRange(serviceList);
 185:                                                              }
 186:   
 187:                                                              if (migrationService1List.Count > 0)
 188:                                                              {
 189:                                                                  migrationService1List = migrationService1List.Distinct().ToList();
 190:   
 191:                                                                  reviewServiceList.AddRange(migrationService1List);
 192:   
 193:                                                                  // get a list of all numbers within DB box as the ones in contactor data
 194:                                                                  var dbNamePeerServiceList = Ia.Ngn.Cl.Model.Data.ServiceRequest.DbPeerServiceList(migrationService1List);
 195:   
 196:                                                                  var migrationService2List = new List<string>();
 197:   
 198:                                                                  migrationService2List.AddRange(migrationService1List);
 199:                                                                  migrationService2List.AddRange(dbNamePeerServiceList);
 200:   
 201:                                                                  migrationService2List = migrationService2List.Distinct().ToList();
 202:   
 203:                                                                  reviewServiceList.AddRange(migrationService2List);
 204:   
 205:                                                                  // check for GPON and PSTN numbers in Service2
 206:                                                                  var gponService2List = Ia.Ngn.Cl.Model.Data.Service2.ReadList(migrationService2List);
 207:                                                                  var pstnService2List = Ia.Ngn.Cl.Model.Data.Service2.ReadPstnList(migrationService2List);
 208:   
 209:                                                                  reviewServiceList.AddRange(gponService2List.Select(u => u.Service).ToList());
 210:                                                                  reviewServiceList.AddRange(pstnService2List.Select(u => u.Service).ToList());
 211:   
 212:                                                                  // check the migration state of every service in pstnMigrationServiceList
 213:   
 214:                                                                  var migrationService3List = new List<string>();
 215:   
 216:                                                                  foreach (var migrationService in migrationService2List)
 217:                                                                  {
 218:                                                                      if (gponService2List.Any(u => u.Service == migrationService))
 219:                                                                      {
 220:                                                                          result.AddWarning("The service number " + migrationService + " already exists in the GPON network (الرقم يعمل في مقسم الشبكة الرقمية الحديثة). ");
 221:                                                                      }
 222:                                                                      else
 223:                                                                      {
 224:                                                                          if (pstnService2List.Any(u => u.Service == migrationService))
 225:                                                                          {
 226:                                                                              migrationService3List.Add(migrationService);
 227:                                                                          }
 228:                                                                          else
 229:                                                                          {
 230:                                                                              result.AddWarning("The service number " + migrationService + " does not exist in the PSTN exchange (الرقم غير موجود في مقسم النحاس القديم). ");
 231:                                                                          }
 232:                                                                      }
 233:                                                                  }
 234:   
 235:                                                                  if (migrationService3List.Count > 0)
 236:                                                                  {
 237:                                                                      var axeSubsriberServiceList = Ia.Ngn.Cl.Model.Data.Ericsson.Subscriber.List(migrationService3List);
 238:                                                                      //var seruattrServiceList = Ia.Ngn.Cl.Model.Data.Huawei.Seruattr.List(migrationService3List);
 239:   
 240:                                                                      // check if AXE numbers are PBXs [AxeSubscribers] where SUT = 'PB'. SUT = PB is key, MIS is PNB=25376912 is branch of key
 241:   
 242:                                                                      var migrationService4List = new List<string>();
 243:   
 244:                                                                      foreach (var migrationService in migrationService3List)
 245:                                                                      {
 246:                                                                          if (axeSubsriberServiceList.Any(u => u.SNB.ToString() == migrationService && (u.SUT == "PB" || u.MIS.Contains("PNB"))))
 247:                                                                          {
 248:                                                                              result.AddError("The number " + migrationService + " is a PBX key or branch. PBX numbers must be handled manually (الرقم عبارة عن مفتاح أو فرع بدالة ويجب تركيبه يدويا بواسطة قسم الدعم الفني). ");
 249:                                                                          }
 250:                                                                          else migrationService4List.Add(migrationService);
 251:                                                                      }
 252:   
 253:                                                                      if (migrationService4List.Count > 0)
 254:                                                                      {
 255:                                                                          reviewServiceList.AddRange(migrationService4List);
 256:   
 257:                                                                          var serviceRequestServiceIdList = Ia.Ngn.Cl.Model.Data.Maintenance.Find.ServiceRequestServiceIdListFromServiceList(migrationService4List);
 258:                                                                          var serviceRequestServiceList = Ia.Ngn.Cl.Model.Data.Maintenance.Find.ServiceRequestServiceList(serviceRequestServiceIdList);
 259:   
 260:                                                                          if (serviceRequestServiceList.Count > 0)
 261:                                                                          {
 262:                                                                              foreach (var serviceRequestService in serviceRequestServiceList)
 263:                                                                              {
 264:                                                                                  if (serviceRequestService.Provisioned)
 265:                                                                                  {
 266:                                                                                      migrationService5List.Add(serviceRequestService.Service);
 267:                                                                                  }
 268:                                                                                  else
 269:                                                                                  {
 270:                                                                                      result.AddWarning("The service number " + serviceRequestService.Service + " is not provisioned in the customer service database and can not be migrated from PSTN to GPON (الرقم مرفوع عن الخدمة بحسب بيانات خدمات المشتركين ولا يمكن ترحيله من مقسم النحاس (القديم) إلى مقسم الشبكة الرقمية). ");
 271:                                                                                  }
 272:                                                                              }
 273:   
 274:                                                                              if (migrationService5List.Count > 0)
 275:                                                                              {
 276:                                                                                  isEligibleForMigration = true;
 277:   
 278:                                                                                  migrationService5List = migrationService5List.Distinct().ToList();
 279:   
 280:                                                                                  result.AddSuccess("The service number(s) " + string.Join(", ", migrationService5List) + " might be good migration candidates and are ready for migration to access " + accessName + " (رقم أو أرقام الخدمة التالية قد تكون صحيحة وجاهزة للترحيل إلى الجهاز الرقمي الجديد). ");
 281:   
 282:                                                                                  reviewServiceList.AddRange(migrationService5List);
 283:                                                                              }
 284:                                                                              else result.AddError("Comparing GPON and PSTN information with contractor data and statistical approximation of access using service requests does not warrant a migration (مقارنة معلومات قائمة المقاول مع معلومات مقسم النحاس (القديم) مع معلومات الشبكة الرقمية مع حالة الأرقام عند خدمات المشتركين مع إحصاءات تقريب عناوين المشتركين من أوامر العمل، لم تنتج عن أي أرقام يمكن ترحيلها). ");
 285:                                                                          }
 286:                                                                          else result.AddError("Comparing GPON and PSTN information with contractor data and statistical approximation of access using service requests does not warrant a migration (مقارنة معلومات قائمة المقاول مع معلومات مقسم النحاس (القديم) مع معلومات الشبكة الرقمية مع حالة الأرقام عند خدمات المشتركين مع إحصاءات تقريب عناوين المشتركين من أوامر العمل، لم تنتج عن أي أرقام يمكن ترحيلها). ");
 287:                                                                      }
 288:                                                                      else result.AddError("Comparing GPON and PSTN information with contractor data and statistical approximation of access using service requests does not warrant a migration (مقارنة معلومات قائمة المقاول مع معلومات مقسم النحاس (القديم) مع معلومات الشبكة الرقمية مع حالة الأرقام عند خدمات المشتركين مع إحصاءات تقريب عناوين المشتركين من أوامر العمل، لم تنتج عن أي أرقام يمكن ترحيلها). ");
 289:                                                                  }
 290:                                                                  else result.AddError("Comparing GPON and PSTN information with contractor data and statistical approximation of access using service requests does not warrant a migration (مقارنة معلومات قائمة المقاول مع معلومات مقسم النحاس (القديم) مع معلومات الشبكة الرقمية مع حالة الأرقام عند خدمات المشتركين مع إحصاءات تقريب عناوين المشتركين من أوامر العمل، لم تنتج عن أي أرقام يمكن ترحيلها). ");
 291:                                                              }
 292:                                                              else result.AddError("Could not find any services related to " + accessName + ". Neither contractor data nor statistical approximation of access using service requests could produce related services (لم نتوصل إلى أرقام متعلقة بالجهاز. لا يوجد أثر لأرقام في قائمة المقاول ولا في إحصاءات تقريب عناوين المشتركين من أوامر العمل). ");
 293:                                                          }
 294:                                                          else result.AddError("Contractor data and/or statistical approximation of access from service requests do not have key entries for access " + accessName + " and there was not optional supporting service number to conceder (لا يوجد أثر للجهاز لا في قائمة المقاول ولا في إحصاءات تقريب عناوين المشتركين من أوامر العمل ولا يوجد رقما اختياريا للمساعدة). ");
 295:                                                      }
 296:                                                      else result.AddError("Could not read or process contractor data (لم أستطع الوصول إلى قائمة المقاول). ");
 297:   
 298:                                                      reviewServiceList = reviewServiceList.Distinct().ToList();
 299:                                                      doDisplayReview = true;
 300:                                                  }
 301:                                                  else result.AddError("You are not authorized to conduct migrations for " + nddOnt.Pon.PonGroup.Olt.Symbol + " (لست مخولاً بتنفيذ عمليات ترحيل للمنطقة). ");
 302:                                              }
 303:                                              else result.AddError("Access " + accessName + " is not ready for service. Contact the TNMD department (الجهاز غير معرف وليس جاهزا للخدمة. إتصل بإدارة المشاريع عن طريق تقديم طلب في قسم الخدمات). ");
 304:                                          }
 305:                                          else throw new Exception("NDD ONT is null. ");
 306:   
 307:                                          Ia.Ngn.Cl.Model.Data.Msmq.AccessNameQueue.Enqueue(accessName);
 308:                                      }
 309:                                      else result.AddError(accessName + @" does not belong to an OLT that is cleared for migration (device must be within " + AllowedToBeMigratedOltListString() + ") (الجهاز لا ينتمي لقائمة النهايات البصرية المعدة للترحيل). ");
 310:                                  }
 311:                                  else result.AddError(accessName + @" does not exist (الجهاز غير معرف). ");
 312:                              }
 313:                              else result.AddError(accessNameString + @" does not belong to the network (الجهاز لا ينتمي للشبكة). ");
 314:                          }
 315:                          else result.AddError(accessNameString + @" format is unknown (قيمة غير مفهومة). ");
 316:                      }
 317:                      else result.AddError("Input format is unknown (قيمة غير مفهومة). ");
 318:                  }
 319:                  else result.AddError("Input format is unknown (قيمة غير مفهومة). ");
 320:              }
 321:              else result.AddError("You are not authorized to conduct migrations (لست مخولاً بتنفيذ عمليات ترحيل). ");
 322:   
 323:              return isEligibleForMigration;
 324:          }
 325:   
 326:          ////////////////////////////////////////////////////////////////////////////
 327:   
 328:          /// <summary>
 329:          ///
 330:          /// </summary>
 331:          public static string AllowedToBeMigratedOltListString()
 332:          {
 333:              var list = Ia.Ngn.Cl.Model.Business.Service.AllowedToBeMigratedOltSymbolList;
 334:   
 335:              list.RemoveAll(u => u == "SSR");
 336:              list = list.Distinct().ToList();
 337:   
 338:              return string.Join(", ", list.ToArray());
 339:          }
 340:   
 341:          ////////////////////////////////////////////////////////////////////////////    
 342:          ////////////////////////////////////////////////////////////////////////////    
 343:      }
 344:   
 345:      ////////////////////////////////////////////////////////////////////////////
 346:      ////////////////////////////////////////////////////////////////////////////   
 347:  }