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

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

    1: using Microsoft.AspNetCore.Mvc.Rendering;
    2: using System.Net;
    3:  
    4: namespace Ia.Ftn.Wa.Models.Provision.Migration
    5: {
    6:     ////////////////////////////////////////////////////////////////////////////
    7:  
    8:     /// <summary publish="true">
    9:     ///
   10:     /// </summary>
   11:     /// 
   12:     /// <remarks> 
   13:     /// Copyright © 2006-2025 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   14:     /// </remarks> 
   15:     public static class Manage
   16:     {
   17:         private static bool migrationIsSuspended = true;
   18:  
   19:         ////////////////////////////////////////////////////////////////////////////
   20:  
   21:         /// <summary>
   22:         ///
   23:         /// </summary>
   24:         public static void ViewModel(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel)
   25:         {
   26:             bool isAllowed;
   27:             //Ia.Cl.Models.Result result;
   28:  
   29:             //result = new Ia.Cl.Models.Result();
   30:             manageViewModel.Result = new Ia.Cl.Models.Result();
   31:             //manageViewModel.ReviewResult = new Ia.Cl.Models.Result();
   32:  
   33:             manageViewModel.AllowedToBeMigratedOltSymbolListLiteral = Ia.Ftn.Cl.Models.Business.Migration.AllowedToBeMigratedOltListString();
   34:  
   35:  
   36:             migrationIsSuspended = MigrationIsSuspendedDueToAxeAndEwsdConnectivityIssues(ref manageViewModel);
   37:  
   38:             var allowedToBeMigratedOltSymbolList = Ia.Ftn.Cl.Models.Business.Service.AllowedToBeMigratedOltSymbolList;
   39:             allowedToBeMigratedOltSymbolList.RemoveAll(u => u == "SSR");
   40:             allowedToBeMigratedOltSymbolList = allowedToBeMigratedOltSymbolList.Distinct().ToList();
   41:  
   42:             var list0 = new List<string>();
   43:             foreach (var kuwaitFtnArea in Ia.Ftn.Cl.Models.Data.Service.KuwaitFtnAreaList)
   44:             {
   45:                 if (allowedToBeMigratedOltSymbolList.Contains(kuwaitFtnArea.Symbol))
   46:                 {
   47:                     list0.Add(kuwaitFtnArea.ArabicName);
   48:                 }
   49:             }
   50:             manageViewModel.KuwaitFtnAreaListLabel = string.Join(", ", list0.ToArray().OrderBy(u => u.ToString()));
   51:  
   52:             if (!Ia.Ftn.Cl.Models.Business.Administration.NowIsOfficialWorkingTime)
   53:             {
   54:                 manageViewModel.ReviewButtonEnabled = false;
   55:                 var officialWorkingTimeString = Ia.Ftn.Cl.Models.Business.Administration.OfficialWorkingTimeString();
   56:  
   57:                 var s = "Migration is enabled during official working hours only, Sunday to Thursday " + officialWorkingTimeString + " (عملية الترحيل متاحة خلال ساعات العمل الرسمية فقط)";
   58:                 //manageViewModel.ReviewResult.AddError(s);
   59:                 manageViewModel.Result.AddError(s);
   60:             }
   61:             else if (migrationIsSuspended)
   62:             {
   63:                 manageViewModel.ReviewButtonEnabled = false;
   64:  
   65:                 var s = "Migration is suspended due to loss of connectivity to Siemens EWSD and/or Ericsson AXE (تم تعليق الترحيل بسبب انقطاع الرابط مع مقاسم سيمنس و/أو أريكسون النحاسية)";
   66:                 //manageViewModel.ReviewResult.AddError(s);
   67:                 manageViewModel.Result.AddError(s);
   68:             }
   69:             else
   70:             {
   71:                 isAllowed = (Ia.Ftn.Cl.Models.Business.Authority.StaffCanMigratePremisesFromPstnToFiber(manageViewModel.CurrentStaffIdentityUser)) ? true : false;
   72:  
   73:                 if (isAllowed)
   74:                 {
   75:                     manageViewModel.ReviewButtonEnabled = true;
   76:  
   77:                     manageViewModel.ReviewStaffNameLabel = manageViewModel.CurrentStaffIdentityUser.FullName;
   78:                 }
   79:                 else
   80:                 {
   81:                     manageViewModel.ReviewButtonEnabled = false;
   82:  
   83:                     manageViewModel.Result.AddError("You are not authorized to conduct migrations (لست مخولاً بتنفيذ عمليات ترحيل)");
   84:                 }
   85:             }
   86:         }
   87:  
   88:         ////////////////////////////////////////////////////////////////////////////
   89:  
   90:         /// <summary>
   91:         ///
   92:         /// </summary>
   93:         public static void Post(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel, string commandName)
   94:         {
   95:             if (commandName == "review") ReviewEligibility(ref manageViewModel);
   96:             else if (commandName == "migrate") Migrate(ref manageViewModel);
   97:             else
   98:             {
   99:             }
  100:         }
  101:  
  102:         /*
  103:         ////////////////////////////////////////////////////////////////////////////
  104: 
  105:         /// <summary>
  106:         ///
  107:         /// </summary>
  108:         private static async Task HearbeatsAsync(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel)
  109:         {
  110:             int withinLastNMinutes = 20;
  111:             var axe = "ia.ftn.axe.ca";
  112:             var ewsd = "ia.ftn.netmanager.ca";
  113: 
  114:             var dateTime = DateTime.UtcNow.AddHours(3).AddMinutes(-withinLastNMinutes);
  115: 
  116:             var heartbeats = await Ia.Ftn.Cl.Models.Business.Heartbeat.HearbeatsAsync();
  117: 
  118:             var axeAndEwsdAreAlive = (from h in heartbeats where h.Created > dateTime && h.Name == axe select h).Count() > 0
  119:                 && (from h in heartbeats where h.Created > dateTime && h.Name == ewsd select h).Count() > 0;
  120: 
  121:             //migrationIsSuspended = !axeAndEwsdAreAlive;
  122: 
  123:             Page_ViewModel(ref manageViewModel);
  124:         }
  125:         */
  126:  
  127:         ////////////////////////////////////////////////////////////////////////////
  128:  
  129:         /// <summary>
  130:         ///
  131:         /// </summary>
  132:         private static void ReviewEligibility(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel)
  133:         {
  134:             bool isEligibleForMigration, doDisplayReview;
  135:             string accessNameInput, serviceListInput, accessName;
  136:             List<string> pstnToFiberMigrationServiceList, reviewServiceList;
  137:             Ia.Cl.Models.Result reviewEligibilityResult;
  138:  
  139:             accessNameInput = manageViewModel.AccessNameInput;
  140:             serviceListInput = manageViewModel.ServiceListInput;
  141:  
  142:             isEligibleForMigration = Ia.Ftn.Cl.Models.Business.Migration.ReviewEligibility(manageViewModel.CurrentStaffIdentityUser, accessNameInput, serviceListInput, out accessName, out pstnToFiberMigrationServiceList, out doDisplayReview, out reviewServiceList, out reviewEligibilityResult);
  143:  
  144:             if (doDisplayReview) DisplayReview(ref manageViewModel, accessName, reviewServiceList);
  145:  
  146:             if (isEligibleForMigration)
  147:             {
  148:                 manageViewModel.AccessNameHidden = accessName;
  149:                 manageViewModel.PstnToFiberMigrationServiceListHidden = string.Join(",", pstnToFiberMigrationServiceList);
  150:  
  151:                 manageViewModel.MigrateLabel = "Select the service number(s) you believe to be correct only, to be migrated to access " + accessName + " (اختر أرقام الخدمة التي ترى أنها صحيحة فقط للترحيل إلى الجهاز الرقمي الجديد)";
  152:  
  153:                 var access = Ia.Ftn.Cl.Models.Data.Access.ReadByAccessName(accessName);
  154:  
  155:                 manageViewModel.AccessNameLabel = accessName + ": " + access.ArabicAddress;
  156:  
  157:                 manageViewModel.MigrateStaffNameLabel = manageViewModel.CurrentStaffIdentityUser.FullName;
  158:  
  159:                 manageViewModel.MigrateButtonEnabled = true;
  160:                 manageViewModel.MigrateCheckBoxEnabled = true;
  161:                 manageViewModel.MigratePanelVisible = true;
  162:  
  163:                 ServiceCheckBoxList_ViewModel(ref manageViewModel, pstnToFiberMigrationServiceList);
  164:             }
  165:             else
  166:             {
  167:                 manageViewModel.AccessNameHidden = string.Empty;
  168:                 manageViewModel.PstnToFiberMigrationServiceListHidden = string.Empty;
  169:  
  170:                 manageViewModel.MigrateButtonEnabled = false;
  171:                 manageViewModel.MigrateCheckBoxEnabled = false;
  172:                 manageViewModel.MigratePanelVisible = false;
  173:             }
  174:  
  175:             manageViewModel.ReviewResult = reviewEligibilityResult;
  176:         }
  177:  
  178:         ////////////////////////////////////////////////////////////////////////////
  179:  
  180:         /// <summary>
  181:         ///
  182:         /// </summary>
  183:         private static void ServiceCheckBoxList_ViewModel(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel, List<string> serviceList)
  184:         {
  185:             var list = ServiceCheckBoxSelectListItemList(ref manageViewModel, serviceList);
  186:  
  187:             manageViewModel.ServiceCheckBoxList = new List<SelectListItem>(list); //, "Value", "Text");
  188:         }
  189:  
  190:         ////////////////////////////////////////////////////////////////////////////
  191:  
  192:         /// <summary>
  193:         ///
  194:         /// </summary>
  195:         private static List<SelectListItem> ServiceCheckBoxSelectListItemList(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel, List<string> serviceList)
  196:         {
  197:             List<SelectListItem> serviceCheckBoxSelectListItemList;
  198:  
  199:             serviceCheckBoxSelectListItemList = new List<SelectListItem>();
  200:  
  201:             foreach (var service in serviceList)
  202:             {
  203:                 var serviceRequestList = Ia.Ftn.Cl.Models.Data.ServiceRequest.List(service);
  204:  
  205:                 if (serviceRequestList.Any(u => u.Number.ToString() == service))
  206:                 {
  207:                     var serviceRequest = (from sr in serviceRequestList where sr.Number.ToString() == service select sr).OrderByDescending(u => u.Id).FirstOrDefault();
  208:  
  209:                     serviceCheckBoxSelectListItemList.Add(new SelectListItem { Text = service + ": " + serviceRequest.CustomerName + " (" + serviceRequest.CustomerAddress + ")", Value = service });
  210:                 }
  211:                 else
  212:                 {
  213:                     var serviceRequestHistoryList = Ia.Ftn.Cl.Models.Data.ServiceRequestHistory.List(service);
  214:  
  215:                     if (serviceRequestHistoryList.Any(u => u.Number.ToString() == service))
  216:                     {
  217:                         var serviceRequestHistory = (from sr in serviceRequestHistoryList where sr.Number.ToString() == service select sr).OrderByDescending(u => u.Id).FirstOrDefault();
  218:  
  219:                         var status = Ia.Ftn.Cl.Models.Data.ServiceRequest.SystemCode[serviceRequestHistory.Status].ToString();
  220:                         var startDateTime = serviceRequestHistory.StartDateTime.ToString("yyyy-MM-dd");
  221:                         var requestDateTime = serviceRequestHistory.ServiceDateTime.ToString("yyyy-MM-dd");
  222:                         var serviceName = Ia.Ftn.Cl.Models.Data.ServiceRequest.ServiceSortedList[serviceRequestHistory.ServiceId].ToString();
  223:  
  224:                         serviceCheckBoxSelectListItemList.Add(new SelectListItem { Text = service + ": status: " + status + ", start: " + startDateTime + ", request: " + requestDateTime + ", service: " + serviceName, Value = service });
  225:                     }
  226:                     else
  227:                     {
  228:                         serviceCheckBoxSelectListItemList.Add(new SelectListItem { Text = service + ": There are no recent nor historic work orders (لا توجد أوامر عمل حديثة أو تاريخية)", Value = service });
  229:                     }
  230:                 }
  231:             }
  232:  
  233:             return serviceCheckBoxSelectListItemList;
  234:         }
  235:  
  236:         ////////////////////////////////////////////////////////////////////////////
  237:  
  238:         /// <summary>
  239:         ///
  240:         /// </summary>
  241:         private static void DisplayReview(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel, string accessName, List<string> serviceList)
  242:         {
  243:             List<Ia.Ftn.Cl.Models.Ui.Service2> service2List;
  244:             List<Ia.Ftn.Cl.Models.Ui.Nokia.Subscriber> subscriberList;
  245:             List<Ia.Ftn.Cl.Models.Ui.Huawei.Sbr> sbrList;
  246:             List<Ia.Ftn.Cl.Models.Ericsson.AxeSubscriber> axeSubscriberList;
  247:             List<Ia.Ftn.Cl.Models.Siemens.EwsdSubscriber> ewsdSubscriberList;
  248:             List<Ia.Ftn.Cl.Models.Access> accessList;
  249:             List<Ia.Ftn.Cl.Models.Ui.ServiceRequestService> serviceRequestServiceList;
  250:             List<Ia.Ftn.Cl.Models.ServiceRequest> serviceRequestList;
  251:             List<Ia.Ftn.Cl.Models.ServiceRequestAdministrativeIssue> serviceRequestAdministrativeIssueList;
  252:             List<Ia.Ftn.Cl.Models.ServiceRequestHistory> serviceRequestHistoryList;
  253:             List<Ia.Ftn.Cl.Models.ServiceRequestOnt> serviceRequestOntList;
  254:  
  255:             Ia.Ftn.Cl.Models.Business.Maintenance.Find.MigrationReview(manageViewModel.CurrentStaffIdentityUser.Framework, accessName, serviceList, out service2List, out subscriberList, out sbrList, out axeSubscriberList, out ewsdSubscriberList, out accessList, out serviceRequestServiceList, out serviceRequestList, out serviceRequestAdministrativeIssueList, out serviceRequestHistoryList, out serviceRequestOntList, out Ia.Cl.Models.Result result);
  256:  
  257:             if (result.IsSuccessful)
  258:             {
  259:                 manageViewModel.ServiceList = service2List;
  260:                 manageViewModel.SubscriberList = subscriberList;
  261:                 manageViewModel.SbrList = sbrList;
  262:                 manageViewModel.AxeSubscriberList = axeSubscriberList;
  263:                 manageViewModel.EwsdSubscriberList = ewsdSubscriberList;
  264:  
  265:                 manageViewModel.AccessList = accessList;
  266:                 manageViewModel.ServiceRequestServiceList = serviceRequestServiceList;
  267:  
  268:                 if (serviceRequestList != null) manageViewModel.ServiceRequestList = serviceRequestList.OrderBy(sr => sr.Id).ToList();
  269:                 else manageViewModel.ServiceRequestList = serviceRequestList;
  270:  
  271:                 if (serviceRequestHistoryList != null) manageViewModel.ServiceRequestHistoryList = serviceRequestHistoryList.OrderBy(sr => sr.ServiceDateTime).ToList();
  272:                 else manageViewModel.ServiceRequestHistoryList = serviceRequestHistoryList;
  273:  
  274:                 manageViewModel.ServiceRequestOntList = serviceRequestOntList;
  275:             }
  276:             else
  277:             {
  278:             }
  279:         }
  280:  
  281:         ////////////////////////////////////////////////////////////////////////////
  282:  
  283:         /// <summary>
  284:         ///
  285:         /// </summary>
  286:         private static void Migrate(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel)
  287:         {
  288:             bool isEligibleForMigration, doDisplayReview;
  289:             string accessNameInput, serviceListInput, accessName, accessNameFromViewState;
  290:             List<string> pstnToFiberMigrationServiceList, reviewServiceList, pstnToFiberMigrationServiceListFromViewState, selectedPstnToFiberMigrationServiceList;
  291:             Ia.Cl.Models.Result result, reviewEligibilityResult, migrateFromPstnToFiberResult;
  292:  
  293:             selectedPstnToFiberMigrationServiceList = new List<string>();
  294:  
  295:             result = new Ia.Cl.Models.Result();
  296:             migrateFromPstnToFiberResult = new Ia.Cl.Models.Result();
  297:  
  298:             accessNameInput = manageViewModel.AccessNameInput;
  299:             serviceListInput = manageViewModel.ServiceListInput;
  300:  
  301:             isEligibleForMigration = Ia.Ftn.Cl.Models.Business.Migration.ReviewEligibility(manageViewModel.CurrentStaffIdentityUser, accessNameInput, serviceListInput, out accessName, out pstnToFiberMigrationServiceList, out doDisplayReview, out reviewServiceList, out reviewEligibilityResult);
  302:  
  303:             if (doDisplayReview) DisplayReview(ref manageViewModel, accessName, reviewServiceList);
  304:  
  305:             if (isEligibleForMigration)
  306:             {
  307:                 // below: check if the values are similar to ViewState
  308:  
  309:                 accessNameFromViewState = (!string.IsNullOrEmpty(manageViewModel.AccessNameHidden)) ? manageViewModel.AccessNameHidden : string.Empty;
  310:                 pstnToFiberMigrationServiceListFromViewState = (!string.IsNullOrEmpty(manageViewModel.PstnToFiberMigrationServiceListHidden)) ? manageViewModel.PstnToFiberMigrationServiceListHidden.Split(',').ToList() : new List<string>();
  311:  
  312:                 if (accessNameFromViewState == accessName && pstnToFiberMigrationServiceList.Count == pstnToFiberMigrationServiceListFromViewState.Count)
  313:                 {
  314:                     // collect checked boxes
  315:                     foreach (SelectListItem item in manageViewModel.ServiceCheckBoxList)
  316:                     {
  317:                         if (item.Selected) selectedPstnToFiberMigrationServiceList.Add(item.Value);
  318:                     }
  319:  
  320:                     if (selectedPstnToFiberMigrationServiceList.Count > 0)
  321:                     {
  322:                         if (manageViewModel.MigrateCheckBoxSelectedValue)
  323:                         {
  324:                             MigrateFromPstnToFiber(ref manageViewModel, accessName, selectedPstnToFiberMigrationServiceList, out migrateFromPstnToFiberResult);
  325:  
  326:                             if (migrateFromPstnToFiberResult.IsSuccessful)
  327:                             {
  328:                                 manageViewModel.MigrateButtonEnabled = false;
  329:                                 manageViewModel.MigrateCheckBoxSelectedValue = false;
  330:                                 manageViewModel.MigrateCheckBoxEnabled = false;
  331:                             }
  332:                             else
  333:                             {
  334:                                 manageViewModel.MigrateButtonEnabled = true;
  335:                                 manageViewModel.MigrateCheckBoxEnabled = true;
  336:                             }
  337:                         }
  338:                         else
  339:                         {
  340:                             migrateFromPstnToFiberResult.AddError("You must read and agree to checkbox comments (تحتاج لقراءة وللموافقة على المذكور في مربع الاختيار)");
  341:                         }
  342:                     }
  343:                     else
  344:                     {
  345:                         migrateFromPstnToFiberResult.AddError("You did not select any services to migrate (لم تختر أي رقم للترحيل)");
  346:                     }
  347:                 }
  348:                 else
  349:                 {
  350:                     migrateFromPstnToFiberResult.AddError("Review data and current migration data are inconsistent. Try to review process again (حصل تغيير في معلومات الترحيل خلال الدقائق الاخيرة. أعد عملية المراجعة من جديد)");
  351:  
  352:                     manageViewModel.AccessNameHidden = string.Empty;
  353:                     manageViewModel.PstnToFiberMigrationServiceListHidden = string.Empty;
  354:  
  355:                     manageViewModel.MigrateButtonEnabled = false;
  356:                     manageViewModel.MigrateCheckBoxEnabled = false;
  357:                     manageViewModel.MigratePanelVisible = false;
  358:                 }
  359:             }
  360:             else
  361:             {
  362:                 migrateFromPstnToFiberResult.AddError("Review is not eligible for migration");
  363:  
  364:                 manageViewModel.AccessNameHidden = string.Empty;
  365:                 manageViewModel.PstnToFiberMigrationServiceListHidden = string.Empty;
  366:  
  367:                 manageViewModel.MigrateButtonEnabled = false;
  368:                 manageViewModel.MigrateCheckBoxEnabled = false;
  369:                 manageViewModel.MigratePanelVisible = false;
  370:             }
  371:  
  372:             //result.AddResult(reviewEligibilityResult); not important to report in migration
  373:             result.AddResult(migrateFromPstnToFiberResult);
  374:  
  375:             manageViewModel.MigrateResult = result;
  376:         }
  377:  
  378:         ////////////////////////////////////////////////////////////////////////////
  379:  
  380:         /// <summary>
  381:         ///
  382:         /// </summary>
  383:         private static void MigrateFromPstnToFiber(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel, string accessName, List<string> serviceList, out Ia.Cl.Models.Result result)
  384:         {
  385:             bool overrideRouterDomainRestriction = false;
  386:             string accessId;
  387:  
  388:             result = new Ia.Cl.Models.Result();
  389:  
  390:             var nddOnt = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OntByAccessName(accessName);
  391:  
  392:             if (nddOnt != null)
  393:             {
  394:                 accessId = nddOnt.Access.Id;
  395:                 var accessVendor = nddOnt.Pon.PonGroup.Olt.Odf.Vendor;
  396:  
  397:                 if (accessVendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia)
  398:                 {
  399:                     var ont = Ia.Ftn.Cl.Models.Data.Nokia.Ont.Read(nddOnt.Id);
  400:  
  401:                     if (ont != null)
  402:                     {
  403:                         foreach (string service in serviceList)
  404:                         {
  405:                             Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.FtnApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.DeleteReadServiceAccess, service, nddOnt.Access.Name, overrideRouterDomainRestriction, manageViewModel.CurrentStaffIdentityUser.Id);
  406:  
  407:                             Ia.Ftn.Cl.Models.Data.ServiceRequestService.UpdateServiceRequestServiceAccess(service, accessId, manageViewModel.CurrentStaffIdentityUser.Id, out Ia.Cl.Models.Result r);
  408:  
  409:                             result.AddResult(r);
  410:                         }
  411:  
  412:                         result.AddSuccess("The service number(s) " + string.Join(", ", serviceList) + " was/were migrated from PSTN/MSAN to Fiber successfully to access " + accessName + " (تم ترحيل رقم أو أرقام الخدمة إلى الجهاز الرقمي الجديد بشكل صحيح)");
  413:                     }
  414:                     else result.AddError(@"Ont is null, does not exist for access: " + accessName);
  415:                 }
  416:                 else if (accessVendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei)
  417:                 {
  418:                     var emsOnt = Ia.Ftn.Cl.Models.Data.Huawei.Ont.Read(nddOnt.Id);
  419:  
  420:                     if (emsOnt != null)
  421:                     {
  422:                         foreach (string service in serviceList)
  423:                         {
  424:                             Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.FtnApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.DeleteReadServiceAccess, service, nddOnt.Access.Name, overrideRouterDomainRestriction, manageViewModel.CurrentStaffIdentityUser.Id);
  425:  
  426:                             Ia.Ftn.Cl.Models.Data.ServiceRequestService.UpdateServiceRequestServiceAccess(service, accessId, manageViewModel.CurrentStaffIdentityUser.Id, out Ia.Cl.Models.Result r);
  427:  
  428:                             result.AddResult(r);
  429:                         }
  430:  
  431:                         result.AddSuccess("The service number(s) " + string.Join(", ", serviceList) + " was/were migrated from PSTN/MSAN to Fiber successfully to access " + accessName + " (تم ترحيل رقم أو أرقام الخدمة إلى الجهاز الرقمي الجديد بشكل صحيح)");
  432:                     }
  433:                     else result.AddError(@"EmsOnt is null, does not exist for access: " + accessName);
  434:                 }
  435:                 else throw new Exception("accessVendor is unknown");
  436:             }
  437:             else throw new Exception("NDD ONT is null");
  438:         }
  439:  
  440:         ////////////////////////////////////////////////////////////////////////////
  441:  
  442:         /// <summary>
  443:         ///
  444:         /// </summary>
  445:         private static bool MigrationIsSuspendedDueToAxeAndEwsdConnectivityIssues(ref Ia.Ftn.Wa.Models.Provision.Migration.ManageViewModel manageViewModel)
  446:         {
  447:             bool isSuspended;
  448:             int withinLastNMinutes = 20;
  449:  
  450:             var dictionary = Ia.Ftn.Wa.Models.Business.Default.HeartbeatAssemblyNameToCreatedDateTimeDictionary;
  451:  
  452:             if (dictionary.Count > 0)
  453:             {
  454:                 isSuspended = !Ia.Ftn.Cl.Models.Business.Heartbeat.AxeAndEwsdAreActive(dictionary, withinLastNMinutes);
  455:             }
  456:             else isSuspended = true;
  457:  
  458:             return isSuspended;
  459:         }
  460:  
  461:         ////////////////////////////////////////////////////////////////////////////
  462:         ////////////////////////////////////////////////////////////////////////////
  463:     }
  464:  
  465:     ////////////////////////////////////////////////////////////////////////////
  466:     ////////////////////////////////////////////////////////////////////////////
  467: }