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

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

Administration support class for Fixed Telecommunications Network (FTN) data model.

    1: using Microsoft.AspNetCore.Identity;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Configuration;
    5: using System.Data;
    6: using System.Globalization;
    7: using System.IO;
    8: using System.Linq;
    9: using System.Reflection;
   10: using System.Xml.Linq;
   11:  
   12: namespace Ia.Ftn.Cl.Models.Data
   13: {
   14:     ////////////////////////////////////////////////////////////////////////////
   15:  
   16:     /// <summary publish="true">
   17:     /// Administration support class for Fixed Telecommunications Network (FTN) data model.
   18:     /// </summary>
   19:     /// 
   20:     /// <remarks> 
   21:     /// Copyright © 2006-2021 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   22:     /// </remarks> 
   23:     public class Administration
   24:     {
   25:         private static XDocument xDocument;
   26:         private static List<Ia.Ftn.Cl.Models.Business.Administration.Framework> frameworkList;
   27:         private static List<Ia.Ftn.Cl.Models.Business.Administration.Category> categoryList;
   28:         private static List<Ia.Ftn.Cl.Models.Business.Administration.StaffFramework> staffFrameworkList;
   29:         private static List<Ia.Ftn.Cl.Models.Business.Administration.StaffContact> staffContactList;
   30:         private static List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea> statisticList;
   31:  
   32:         private static readonly object objectLock = new object();
   33:  
   34:         /// <summary/>
   35:         public static string ApplicationRoleName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationRoleName"); } }
   36:  
   37:         /// <summary/>
   38:         public static string ApplicationUserName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationUserName"); } }
   39:  
   40:         /// <summary/>
   41:         public static string ApplicationUserPassword { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationUserPassword"); } }
   42:  
   43:         /// <summary/>
   44:         public static string ApplicationUserEmail { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationUserEmail"); } }
   45:  
   46:  
   47:         /// <summary/>
   48:         public static string ApplicationArabicFirstName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationArabicFirstName"); } }
   49:  
   50:         /// <summary/>
   51:         public static string ApplicationArabicMiddleName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationArabicMiddleName"); } }
   52:  
   53:         /// <summary/>
   54:         public static string ApplicationArabicLastName { get { return Ia.Cl.Models.ApplicationConfiguration.GetSetting("AppSettings:ApplicationArabicLastName"); } }
   55:  
   56:  
   57:         ////////////////////////////////////////////////////////////////////////////
   58:  
   59:         /// <summary>
   60:         ///
   61:         /// </summary>
   62:         public Administration() { }
   63:  
   64:         ////////////////////////////////////////////////////////////////////////////
   65:  
   66:         /// <summary>
   67:         ///
   68:         /// </summary>
   69:         public static List<Ia.Ftn.Cl.Models.Business.Administration.Framework> FrameworkList
   70:         {
   71:             get
   72:             {
   73:                 if (frameworkList == null || frameworkList.Count == 0)
   74:                 {
   75:                     lock (objectLock)
   76:                     {
   77:                         frameworkList = Ia.Ftn.Cl.Models.Data.Administration._FrameworkList();
   78:                     }
   79:                 }
   80:  
   81:                 return frameworkList;
   82:             }
   83:         }
   84:  
   85:         ////////////////////////////////////////////////////////////////////////////
   86:  
   87:         /// <summary>
   88:         ///
   89:         /// </summary>
   90:         private static List<Ia.Ftn.Cl.Models.Business.Administration.Framework> _FrameworkList()
   91:         {
   92:             int i;
   93:             string id, parentId;
   94:             string arabicName, coloredArabicName, siteNameList;
   95:             Ia.Ftn.Cl.Models.Business.Administration.Framework framework;
   96:  
   97:             var frameworkList = new List<Ia.Ftn.Cl.Models.Business.Administration.Framework>(Ia.Ftn.Cl.Models.Business.Administration.InitialFrameworkListLength); // needed to prevent errors
   98:  
   99:             var lightBackgroundColorList = Ia.Ftn.Cl.Models.Ui.Default.LightBackgroundColorList;
  100:  
  101:             foreach (XElement xe in XDocument.Element("administration").Element("frameworkList").Descendants("framework"))
  102:             {
  103:                 id = XmlBasedTwoDigitPerId(xe);
  104:                 parentId = Ia.Ftn.Cl.Models.Business.Administration.Framework.ParentId(id);
  105:                 arabicName = xe.Attribute("arabicName").Value;
  106:  
  107:                 i = int.Parse(id);
  108:  
  109:                 coloredArabicName = @"<span style=""color:" + lightBackgroundColorList[i % lightBackgroundColorList.Count] + @""">" + arabicName + "</span>";
  110:  
  111:                 framework = new Ia.Ftn.Cl.Models.Business.Administration.Framework();
  112:  
  113:                 framework.Id = id;
  114:                 framework.Level = xe.Ancestors().Count();
  115:                 framework.Type = xe.Attribute("type").Value;
  116:                 framework.Name = xe.Attribute("name").Value;
  117:                 framework.ArabicName = arabicName;
  118:  
  119:                 if (xe.Attribute("phone") != null && !string.IsNullOrEmpty(xe.Attribute("phone").Value)) framework.Phone = xe.Attribute("phone").Value;
  120:                 else framework.Phone = string.Empty;
  121:  
  122:                 framework.ColoredArabicName = coloredArabicName;
  123:  
  124:                 if (xe.Attribute("siteNameList") != null && !string.IsNullOrEmpty(xe.Attribute("siteNameList").Value))
  125:                 {
  126:                     siteNameList = xe.Attribute("siteNameList").Value;
  127:                     framework.Sites = (from s in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.SiteList where siteNameList.Contains(s.Name) select s).ToList();
  128:                 }
  129:                 else if (xe.Parent.Attribute("siteNameList") != null && !string.IsNullOrEmpty(xe.Parent.Attribute("siteNameList").Value))
  130:                 {
  131:                     siteNameList = xe.Parent.Attribute("siteNameList").Value;
  132:                     framework.Sites = (from s in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.SiteList where siteNameList.Contains(s.Name) select s).ToList();
  133:                 }
  134:                 else framework.Sites = new List<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Site>();
  135:  
  136:                 frameworkList.Add(framework);
  137:             }
  138:  
  139:             // Parents, authorities and children
  140:             foreach (Ia.Ftn.Cl.Models.Business.Administration.Framework f in frameworkList)
  141:             {
  142:                 parentId = Ia.Ftn.Cl.Models.Business.Administration.Framework.ParentId(f.Id);
  143:  
  144:                 f.Parent = (from _f in frameworkList where _f.Id == parentId select _f).SingleOrDefault();
  145:  
  146:                 f.Children = new List<Ia.Ftn.Cl.Models.Business.Administration.Framework>();
  147:  
  148:                 if (f.Parent != null) f.Parent.Children.Add(f);
  149:             }
  150:  
  151:             // Children or self
  152:             foreach (var f in frameworkList)
  153:             {
  154:                 f.ChildrenOrSelf = (from _f in frameworkList where _f.Id == f.Id select _f).Union(f.Children).ToList();
  155:             }
  156:  
  157:             // Siblings
  158:             foreach (var f in frameworkList.ToList())
  159:             {
  160:                 //f.Siblings = new List<Ia.Ftn.Cl.Model.Business.Administration.Framework>();
  161:  
  162:                 f.Siblings = (from _f in frameworkList where _f.Parent == f.Parent && _f.Id != f.Id select _f).ToList();
  163:  
  164:                 f.SiblingsOrSelf = (from _f in frameworkList where _f.Id == f.Id select _f).Union(f.Siblings).ToList();
  165:             }
  166:  
  167:             // Descendants
  168:             foreach (var f in frameworkList.ToList())
  169:             {
  170:                 //f.Descendants = new List<Ia.Ftn.Cl.Model.Business.Administration.Framework>();
  171:  
  172:                 f.Descendants = (from _f in frameworkList
  173:                                  where _f.Id != f.Id && //_f.Id > f.Id &&
  174:                                      (_f.Parent != null && (_f.Parent == f
  175:                                      || _f.Parent.Parent != null && (_f.Parent.Parent == f
  176:                                      || _f.Parent.Parent.Parent != null && (_f.Parent.Parent.Parent == f
  177:                                      || _f.Parent.Parent.Parent.Parent != null && _f.Parent.Parent.Parent.Parent == f)))
  178:                                      )
  179:                                  select _f).ToList();
  180:  
  181:                 f.DescendantsOrSelf = (from _f in frameworkList where _f.Id == f.Id select _f).Union(f.Descendants).ToList();
  182:             }
  183:  
  184:             // Ancestors
  185:             foreach (var f in frameworkList.ToList())
  186:             {
  187:                 //f.Ancestors = new List<Ia.Ftn.Cl.Model.Business.Administration.Framework>();
  188:  
  189:                 f.Ancestors = (from _f in frameworkList
  190:                                where _f.Id != f.Id && //_f.Id < f.Id &&
  191:                                    (f.Parent != null && (f.Parent == _f
  192:                                    || f.Parent.Parent != null && (f.Parent.Parent == _f
  193:                                    || f.Parent.Parent.Parent != null && (f.Parent.Parent.Parent == _f
  194:                                    || f.Parent.Parent.Parent.Parent != null && f.Parent.Parent.Parent.Parent == _f)))
  195:                                    )
  196:                                select _f).ToList();
  197:  
  198:                 f.AncestorsOrSelf = (from _f in frameworkList where _f.Id == f.Id select _f).Union(f.Ancestors).ToList();
  199:             }
  200:  
  201:             return frameworkList.ToList();
  202:         }
  203:  
  204:         ////////////////////////////////////////////////////////////////////////////
  205:  
  206:         /// <summary>
  207:         ///
  208:         /// </summary>
  209:         private static string XmlBasedOneDigitPerId(XElement xeIn)
  210:         {
  211:             return XmlBasedId(xeIn, 1);
  212:         }
  213:  
  214:         ////////////////////////////////////////////////////////////////////////////
  215:  
  216:         /// <summary>
  217:         ///
  218:         /// </summary>
  219:         private static string XmlBasedTwoDigitPerId(XElement xeIn)
  220:         {
  221:             return XmlBasedId(xeIn, 2);
  222:         }
  223:  
  224:         ////////////////////////////////////////////////////////////////////////////
  225:  
  226:         /// <summary>
  227:         ///
  228:         /// </summary>
  229:         private static string XmlBasedId(XElement xe, int digit)
  230:         {
  231:             string id;
  232:  
  233:             id = string.Empty;
  234:  
  235:             while (xe.HasAttributes && xe.Attribute("id") != null)
  236:             {
  237:                 id = xe.Attribute("id").Value.PadLeft(digit, '0') + id;
  238:                 xe = xe.Parent;
  239:             }
  240:  
  241:             return id;
  242:         }
  243:  
  244:         ////////////////////////////////////////////////////////////////////////////
  245:  
  246:         /// <summary>
  247:         ///
  248:         /// </summary>
  249:         public static List<Ia.Ftn.Cl.Models.Business.Administration.Category> CategoryList
  250:         {
  251:             get
  252:             {
  253:                 if (categoryList == null || categoryList.Count == 0)
  254:                 {
  255:                     lock (objectLock)
  256:                     {
  257:                         categoryList = Ia.Ftn.Cl.Models.Data.Administration._CategoryList;
  258:                     }
  259:                 }
  260:  
  261:                 return categoryList;
  262:             }
  263:         }
  264:  
  265:         ////////////////////////////////////////////////////////////////////////////
  266:  
  267:         /// <summary>
  268:         ///
  269:         /// </summary>
  270:         private static List<Ia.Ftn.Cl.Models.Business.Administration.Category> _CategoryList
  271:         {
  272:             get
  273:             {
  274:                 Ia.Ftn.Cl.Models.Business.Administration.Category category;
  275:  
  276:                 var categoryList = new List<Ia.Ftn.Cl.Models.Business.Administration.Category>();
  277:  
  278:                 foreach (XElement xe in XDocument.Element("administration").Elements("category"))
  279:                 {
  280:                     category = new Ia.Ftn.Cl.Models.Business.Administration.Category()
  281:                     {
  282:                         Name = xe.Attribute("name").Value,
  283:                         Regex = xe.Attribute("regex").Value,
  284:                         Description = (xe.Attribute("description") != null) ? xe.Attribute("description").Value : string.Empty,
  285:                         Color = (xe.Attribute("color") != null) ? xe.Attribute("color").Value : string.Empty
  286:                     };
  287:  
  288:                     categoryList.Add(category);
  289:                 }
  290:  
  291:                 return categoryList.ToList();
  292:             }
  293:         }
  294:  
  295:         ////////////////////////////////////////////////////////////////////////////
  296:  
  297:         /// <summary>
  298:         ///
  299:         /// </summary>
  300:         public static List<Ia.Ftn.Cl.Models.Business.Administration.StaffContact> StaffContactList()
  301:         {
  302:             if (staffContactList == null || staffContactList.Count == 0)
  303:             {
  304:                 lock (objectLock)
  305:                 {
  306:                     staffContactList = Ia.Ftn.Cl.Models.Data.Administration._StaffContactList();
  307:                 }
  308:             }
  309:  
  310:             return staffContactList;
  311:         }
  312:  
  313:         ////////////////////////////////////////////////////////////////////////////
  314:  
  315:         /// <summary>
  316:         ///
  317:         /// </summary>
  318:         private static List<Ia.Ftn.Cl.Models.Business.Administration.StaffContact> _StaffContactList()
  319:         {
  320:             var staffContactList = new List<Ia.Ftn.Cl.Models.Business.Administration.StaffContact>();
  321:  
  322:             foreach (var staff in Ia.Ftn.Cl.Models.Data.StaffIdentityUser.List())
  323:             {
  324:                 if (staff.Email != null)
  325:                 {
  326:                     var staffContact = new Ia.Ftn.Cl.Models.Business.Administration.StaffContact() { StaffIdentityUser = staff };
  327:  
  328:                     staffContactList.Add(staffContact);
  329:                 }
  330:             }
  331:  
  332:             foreach (var contact in Ia.Ftn.Cl.Models.Data.Contact.List)
  333:             {
  334:                 if (contact.Email != null)
  335:                 {
  336:                     var staffContact = new Ia.Ftn.Cl.Models.Business.Administration.StaffContact() { Contact = contact };
  337:  
  338:                     staffContactList.Add(staffContact);
  339:                 }
  340:             }
  341:  
  342:             return staffContactList.ToList();
  343:         }
  344:  
  345:         ////////////////////////////////////////////////////////////////////////////
  346:  
  347:         /// <summary>
  348:         ///
  349:         /// </summary>
  350:         public static List<Ia.Ftn.Cl.Models.Business.Administration.StaffFramework> StaffFrameworkList()
  351:         {
  352:             if (staffFrameworkList == null || staffFrameworkList.Count == 0)
  353:             {
  354:                 lock (objectLock)
  355:                 {
  356:                     staffFrameworkList = Ia.Ftn.Cl.Models.Data.Administration._StaffFrameworkList();
  357:                 }
  358:             }
  359:  
  360:             return staffFrameworkList;
  361:         }
  362:  
  363:         ////////////////////////////////////////////////////////////////////////////
  364:  
  365:         /// <summary>
  366:         ///
  367:         /// </summary>
  368:         private static List<Ia.Ftn.Cl.Models.Business.Administration.StaffFramework> _StaffFrameworkList()
  369:         {
  370:             var staffList = (from s in Ia.Ftn.Cl.Models.Data.StaffIdentityUser.List()
  371:                              select new Ia.Ftn.Cl.Models.Business.Administration.StaffFramework
  372:                              {
  373:                                  Id = s.Id,
  374:                                  FrameworkId = s.Framework.Id,
  375:                                  IsStaff = true,
  376:                                  Name = s.FirstAndMiddleName
  377:                              }
  378:             ).ToList();
  379:  
  380:             var frameworkList = (from f in Ia.Ftn.Cl.Models.Data.Administration.FrameworkList
  381:                                  select new Ia.Ftn.Cl.Models.Business.Administration.StaffFramework
  382:                                  {
  383:                                      Id = f.Id,
  384:                                      FrameworkId = f.Id,
  385:                                      IsFramework = true,
  386:                                      Name = f.FullyQualifiedArabicName //.ArabicName
  387:                                  }
  388:             ).ToList();
  389:  
  390:             staffFrameworkList = staffList.Union(frameworkList).ToList();
  391:  
  392:             return staffFrameworkList.ToList();
  393:         }
  394:  
  395:         ////////////////////////////////////////////////////////////////////////////
  396:  
  397:         /// <summary>
  398:         ///
  399:         /// </summary>
  400:         public static string FullyQualifiedFrameworkArabicNameFromFrameworkId(string frameworkId)
  401:         {
  402:             var fullyQualifiedArabicName = (from f in Ia.Ftn.Cl.Models.Data.Administration.FrameworkList
  403:                                             where f.Id == frameworkId
  404:                                             select f.FullyQualifiedArabicName).SingleOrDefault();
  405:  
  406:             return fullyQualifiedArabicName;
  407:  
  408:         }
  409:  
  410:         ////////////////////////////////////////////////////////////////////////////
  411:         ////////////////////////////////////////////////////////////////////////////
  412:  
  413:         /// <summary>
  414:         ///
  415:         /// </summary>
  416:         public static int ServiceRequestServicesWithNullAccessCount()
  417:         {
  418:             using (var db = new Ia.Ftn.Cl.Db())
  419:             {
  420:                 return (from srs in db.ServiceRequestServices
  421:                         where srs.Access == null
  422:                         select srs.Id).Count();
  423:             }
  424:         }
  425:  
  426:         ////////////////////////////////////////////////////////////////////////////
  427:  
  428:         /// <summary>
  429:         ///
  430:         /// </summary>
  431:         public static int ServicesWithNullAccessCount()
  432:         {
  433:             using (var db = new Ia.Ftn.Cl.Db())
  434:             {
  435:                 return (from s in db.Service2
  436:                         where s.ServiceType == Ia.Ftn.Cl.Models.Business.Service.ServiceType.ImsService && s.Access == null
  437:                         select s.Id).Count();
  438:             }
  439:         }
  440:  
  441:         ////////////////////////////////////////////////////////////////////////////
  442:  
  443:         /// <summary>
  444:         ///
  445:         /// </summary>
  446:         public static List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea> ServiceAccessStatisticWithinKuwaitFtnAreaCachedDaily
  447:         {
  448:             get
  449:             {
  450:                 if (statisticList == null || statisticList.Count == 0)
  451:                 {
  452:                     if (Ia.Cl.Models.Cache.Instance.TryGetValue("statisticList" + DateTime.Now.Day, out statisticList))
  453:                     {
  454:                     }
  455:                     else
  456:                     {
  457:                         lock (objectLock)
  458:                         {
  459:                             statisticList = Ia.Ftn.Cl.Models.Data.Administration.ServiceAccessStatisticWithinKuwaitFtnArea();
  460:  
  461:                             Ia.Cl.Models.Cache.Instance.Set("statisticList" + DateTime.Now.Day, statisticList);
  462:                         }
  463:                     }
  464:                 }
  465:  
  466:                 return statisticList;
  467:             }
  468:         }
  469:  
  470:         ////////////////////////////////////////////////////////////////////////////
  471:  
  472:         /// <summary>
  473:         ///
  474:         /// </summary>
  475:         public static List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea> ServiceAccessStatisticWithinKuwaitFtnArea()
  476:         {
  477:             if (statisticList == null || statisticList.Count == 0)
  478:             {
  479:                 int fourDigitDomain, fiveDigitDomain;
  480:                 int totalService, totalNokiaService, totalHuaweiService, totalServiceRequestService, totalAccessCapacity, totalNokiaOnt, totalHuaweiOnt, totalNokiaAccess, totalHuaweiAccess, totalAccessReady, totalAccessUsed;
  481:                 string accessId;
  482:                 Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor vendor;
  483:                 Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea kuwaitAreaStatistic;
  484:                 Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Olt olt;
  485:  
  486:                 statisticList = new List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea>();
  487:                 statisticList.Clear();
  488:  
  489:                 totalService = totalNokiaService = totalHuaweiService = totalServiceRequestService = totalAccessCapacity = totalNokiaOnt = totalHuaweiOnt = totalNokiaAccess = totalHuaweiAccess = totalAccessReady = totalAccessUsed = totalService = totalServiceRequestService = 0;
  490:  
  491:                 //kuwaitFtnAreaList = new List<Ia.Ftn.Cl.Model.Business.Service.KuwaitFtnArea>(); // I need to clear it because I add an item in it below
  492:                 var kuwaitFtnAreaList = Ia.Ftn.Cl.Models.Data.Service.KuwaitFtnAreaList;
  493:  
  494:                 var ontAccessIdToSeviceListDictionary = Ia.Ftn.Cl.Models.Data.Service2.OntAccessIdToSeviceListDictionary();
  495:  
  496:                 var ontList = Ia.Ftn.Cl.Models.Data.Nokia.Ont.ListIncludeAccess();
  497:                 var emsOntList = Ia.Ftn.Cl.Models.Data.Huawei.Ont.ListIncludeAccess();
  498:                 var accessList = Ia.Ftn.Cl.Models.Data.Access.List();
  499:                 var accessIdToOltIdDictionary = Ia.Ftn.Cl.Models.Data.Access.IdToOltIdDictionary;
  500:  
  501:                 var accessIdToKuwaitFtnAreaIdDictionary = Ia.Ftn.Cl.Models.Data.Access.IdToKuwaitFtnAreaIdDictionary;
  502:  
  503:                 var serviceRequestServiceProvisionedServiceIdToAccessIdDictionary = Ia.Ftn.Cl.Models.Data.ServiceRequestService.ProvisionedServiceIdToAccessIdDictionary;
  504:                 var serviceIdToAccessIdDictionary = Ia.Ftn.Cl.Models.Data.Service2.ServiceIdToAccessIdDictionary;
  505:  
  506:                 var accessesWithProvisionedAndReadyOntsIdToKuwaitFtnAreaIdDictionary = Ia.Ftn.Cl.Models.Data.Access.AccessWithProvisionedAndReadyOntIdToKuwaitFtnAreaIdDictionary;
  507:  
  508:                 var domainToRouterVendorDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.DomainToRouterVendorDictionary;
  509:  
  510:                 var unknown = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea("Unknown", "غير معرف");
  511:  
  512:                 //ontIdToOltIdDictionary = Ia.Ftn.Cl.Model.Data.NetworkDesignDocument.OntIdToOltIdDictionary;
  513:  
  514:                 // - ONT capacity, usage, # of services in an ONT, type of ONT
  515:                 // - Graphics
  516:                 /*
  517:                 update statistics
  518:     Vendor,
  519:     number perfix,
  520:     4 in ONT,
  521:     0 in ONT,
  522:     Acces: ONT used by subscribers
  523:     */
  524:  
  525:                 foreach (var kna in kuwaitFtnAreaList)
  526:                 {
  527:                     kuwaitAreaStatistic = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea();
  528:  
  529:                     kuwaitAreaStatistic.Name = kna.NameArabicName;
  530:  
  531:                     kuwaitAreaStatistic.Symbol = kna.Symbol;
  532:  
  533:                     kuwaitAreaStatistic.ServiceRequestService = 0;
  534:  
  535:                     kuwaitAreaStatistic.NokiaService = 0;
  536:                     kuwaitAreaStatistic.HuaweiService = 0;
  537:                     kuwaitAreaStatistic.Service = 0;
  538:  
  539:                     foreach (KeyValuePair<string, string> kvp in serviceIdToAccessIdDictionary)
  540:                     {
  541:                         accessId = kvp.Value;
  542:  
  543:                         if (accessIdToKuwaitFtnAreaIdDictionary.ContainsKey(accessId))
  544:                         {
  545:                             if (accessIdToKuwaitFtnAreaIdDictionary[accessId] == kna.Id)
  546:                             {
  547:                                 kuwaitAreaStatistic.Service++;
  548:  
  549:                                 fiveDigitDomain = int.Parse(kvp.Key.Substring(0, 5));
  550:  
  551:                                 if (domainToRouterVendorDictionary.ContainsKey(fiveDigitDomain)) vendor = domainToRouterVendorDictionary[fiveDigitDomain];
  552:                                 else
  553:                                 {
  554:                                     fourDigitDomain = int.Parse(kvp.Key.Substring(0, 4));
  555:  
  556:                                     if (domainToRouterVendorDictionary.ContainsKey(fourDigitDomain))
  557:                                     {
  558:                                         vendor = domainToRouterVendorDictionary[fourDigitDomain];
  559:                                     }
  560:                                     else vendor = null;
  561:                                 }
  562:  
  563:                                 if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia) kuwaitAreaStatistic.NokiaService++;
  564:                                 else if (vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei) kuwaitAreaStatistic.HuaweiService++;
  565:                                 else
  566:                                 {
  567:                                     unknown.Service++;
  568:  
  569:                                     //throw new Exception("Vendor is unknown");
  570:                                 }
  571:  
  572:                             }
  573:                         }
  574:                     }
  575:  
  576:                     kuwaitAreaStatistic.NokiaHuaweiService = (kuwaitAreaStatistic.NokiaService + kuwaitAreaStatistic.HuaweiService) + " (" + kuwaitAreaStatistic.NokiaService + "/" + kuwaitAreaStatistic.HuaweiService + ")";
  577:  
  578:  
  579:                     foreach (KeyValuePair<string, string> kvp in serviceRequestServiceProvisionedServiceIdToAccessIdDictionary)
  580:                     {
  581:                         if (accessIdToKuwaitFtnAreaIdDictionary.ContainsKey(kvp.Value))
  582:                         {
  583:                             if (accessIdToKuwaitFtnAreaIdDictionary[kvp.Value] == kna.Id)
  584:                             {
  585:                                 kuwaitAreaStatistic.ServiceRequestService++;
  586:                             }
  587:                         }
  588:                     }
  589:  
  590:                     //statistic.SiteAccessCapacity = kna.Site.Routers.SelectMany(u => u.Odfs.SelectMany(y => y.Olts)).Count() * 1024;
  591:                     //statistic.SiteAccessCapacity = f.Sum(u => kna.Site.Routers.Any(u => u.Odfs.Any(y => y.Olts.Any(z => z.Id == u.Value)))) * 1024;
  592:                     //kuwaitAreaStatistic.AccessProvisioned = accessIdToKuwaitFtnAreaIdDictionary.Count(u => u.Value == kna.Id);
  593:                     //kuwaitAreaStatistic.AccessUtilized = 0;
  594:  
  595:                     // below: this does not include SSR accesses for area
  596:                     kuwaitAreaStatistic.AccessCapacity = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList
  597:                                                           where o.Symbol == kna.Symbol
  598:                                                           select o).Sum(o => o.NumberOfPons * o.NumberOfOntsInPon);
  599:  
  600:                     kuwaitAreaStatistic.NokiaOnt = 0;
  601:                     kuwaitAreaStatistic.HuaweiOnt = 0;
  602:  
  603:                     foreach (var o in ontList)
  604:                     {
  605:                         if (o.Access != null)
  606:                         {
  607:                             if (accessIdToKuwaitFtnAreaIdDictionary.ContainsKey(o.Access.Id))
  608:                             {
  609:                                 if (accessIdToKuwaitFtnAreaIdDictionary[o.Access.Id] == kna.Id)
  610:                                 {
  611:                                     kuwaitAreaStatistic.NokiaOnt++;
  612:                                 }
  613:                             }
  614:                         }
  615:                         else
  616:                         {
  617:                         }
  618:                     }
  619:  
  620:                     foreach (var o in emsOntList)
  621:                     {
  622:                         if (o.Access != null)
  623:                         {
  624:                             if (accessIdToKuwaitFtnAreaIdDictionary.ContainsKey(o.Access.Id))
  625:                             {
  626:                                 if (accessIdToKuwaitFtnAreaIdDictionary[o.Access.Id] == kna.Id)
  627:                                 {
  628:                                     kuwaitAreaStatistic.HuaweiOnt++;
  629:                                 }
  630:                             }
  631:                         }
  632:                         else
  633:                         {
  634:                         }
  635:                     }
  636:  
  637:                     kuwaitAreaStatistic.NokiaHuaweiOnt = (kuwaitAreaStatistic.NokiaOnt + kuwaitAreaStatistic.HuaweiOnt) + " (" + kuwaitAreaStatistic.NokiaOnt + "/" + kuwaitAreaStatistic.HuaweiOnt + ")";
  638:  
  639:                     kuwaitAreaStatistic.NokiaAccess = 0;
  640:                     kuwaitAreaStatistic.HuaweiAccess = 0;
  641:  
  642:                     foreach (var a in accessList)
  643:                     {
  644:                         if (accessIdToKuwaitFtnAreaIdDictionary[a.Id] == kna.Id)
  645:                         {
  646:                             olt = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList
  647:                                    where o.Id == accessIdToOltIdDictionary[a.Id]
  648:                                    select o).SingleOrDefault();
  649:  
  650:                             if (olt != null)
  651:                             {
  652:                                 // <vendor id="1" name="Nokia" shortName="No" ... />
  653:                                 if (olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia) kuwaitAreaStatistic.NokiaAccess++;
  654:  
  655:                                 // <vendor id="2" name="Huawei" shortName="Hu" ... />
  656:                                 else if (olt.Odf.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei) kuwaitAreaStatistic.HuaweiAccess++;
  657:                             }
  658:                             else
  659:                             {
  660:  
  661:                             }
  662:                         }
  663:                     }
  664:  
  665:                     kuwaitAreaStatistic.NokiaHuaweiAccess = (kuwaitAreaStatistic.NokiaAccess + kuwaitAreaStatistic.HuaweiAccess) + " (" + kuwaitAreaStatistic.NokiaAccess + "/" + kuwaitAreaStatistic.HuaweiAccess + ")";
  666:  
  667:  
  668:                     kuwaitAreaStatistic.AccessReady = 0;
  669:                     kuwaitAreaStatistic.AccessUsed = 0;
  670:  
  671:                     foreach (var a in accessList)
  672:                     {
  673:                         if (accessesWithProvisionedAndReadyOntsIdToKuwaitFtnAreaIdDictionary.ContainsKey(a.Id))
  674:                         {
  675:                             if (accessesWithProvisionedAndReadyOntsIdToKuwaitFtnAreaIdDictionary[a.Id] == kna.Id)
  676:                             {
  677:                                 kuwaitAreaStatistic.AccessReady++;
  678:  
  679:                                 if (ontAccessIdToSeviceListDictionary[a.Id].Count > 0) kuwaitAreaStatistic.AccessUsed++;
  680:                             }
  681:                         }
  682:                     }
  683:  
  684:                     kuwaitAreaStatistic.AccessReadyUsed = kuwaitAreaStatistic.AccessReady + "/" + kuwaitAreaStatistic.AccessUsed;
  685:  
  686:  
  687:                     // totals:
  688:                     totalService += kuwaitAreaStatistic.Service;
  689:  
  690:                     totalNokiaService += kuwaitAreaStatistic.NokiaService;
  691:                     totalHuaweiService += kuwaitAreaStatistic.HuaweiService;
  692:  
  693:                     totalServiceRequestService += kuwaitAreaStatistic.ServiceRequestService;
  694:  
  695:                     totalAccessCapacity += kuwaitAreaStatistic.AccessCapacity;
  696:  
  697:                     totalNokiaOnt += kuwaitAreaStatistic.NokiaOnt;
  698:                     totalHuaweiOnt += kuwaitAreaStatistic.HuaweiOnt;
  699:  
  700:                     totalNokiaAccess += kuwaitAreaStatistic.NokiaAccess;
  701:                     totalHuaweiAccess += kuwaitAreaStatistic.HuaweiAccess;
  702:  
  703:                     totalAccessReady += kuwaitAreaStatistic.AccessReady;
  704:                     totalAccessUsed += kuwaitAreaStatistic.AccessUsed;
  705:  
  706:                     statisticList.Add(kuwaitAreaStatistic);
  707:                 }
  708:  
  709:                 statisticList = statisticList.OrderBy(u => u.Name).ToList();
  710:  
  711:                 statisticList.Add(unknown);
  712:  
  713:                 // totals:
  714:                 kuwaitAreaStatistic = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.KuwaitArea();
  715:  
  716:                 kuwaitAreaStatistic.Name = "Total";
  717:  
  718:                 kuwaitAreaStatistic.Service = totalService;
  719:                 kuwaitAreaStatistic.NokiaService = totalNokiaService;
  720:                 kuwaitAreaStatistic.HuaweiService = totalHuaweiService;
  721:                 kuwaitAreaStatistic.NokiaHuaweiService = (kuwaitAreaStatistic.NokiaService + kuwaitAreaStatistic.HuaweiService) + " (" + kuwaitAreaStatistic.NokiaService + "/" + kuwaitAreaStatistic.HuaweiService + ")";
  722:  
  723:  
  724:                 kuwaitAreaStatistic.ServiceRequestService = totalServiceRequestService;
  725:  
  726:                 kuwaitAreaStatistic.AccessCapacity = totalAccessCapacity;
  727:  
  728:                 kuwaitAreaStatistic.NokiaOnt = totalNokiaOnt;
  729:                 kuwaitAreaStatistic.HuaweiOnt = totalHuaweiOnt;
  730:                 kuwaitAreaStatistic.NokiaHuaweiOnt = (totalNokiaOnt + totalHuaweiOnt) + " (" + totalNokiaOnt + "/" + totalHuaweiOnt + ")";
  731:  
  732:                 kuwaitAreaStatistic.NokiaAccess = totalNokiaAccess;
  733:                 kuwaitAreaStatistic.HuaweiAccess = totalHuaweiAccess;
  734:                 kuwaitAreaStatistic.NokiaHuaweiAccess = (totalNokiaAccess + totalHuaweiAccess) + " (" + totalNokiaAccess + "/" + totalHuaweiAccess + ")";
  735:  
  736:                 kuwaitAreaStatistic.AccessReady = totalAccessReady;
  737:                 kuwaitAreaStatistic.AccessUsed = totalAccessUsed;
  738:                 kuwaitAreaStatistic.AccessReadyUsed = totalAccessReady + "/" + totalAccessUsed;
  739:  
  740:                 statisticList.Add(kuwaitAreaStatistic);
  741:             }
  742:  
  743:             return statisticList;
  744:         }
  745:  
  746:         ////////////////////////////////////////////////////////////////////////////
  747:  
  748:         /// <summary>
  749:         ///
  750:         /// </summary>
  751:         public static List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site> SiteStatistics()
  752:         {
  753:             int siteId;
  754:             int totalFiberAccessCapacity, totalFiberServiceCapacity, totalMsanServiceCapacity, totalFiberService, totalNokiaService, totalHuaweiService, totalService;
  755:             int totalMsanService, totalPstnService, totalEricssonService, totalSiemensService;
  756:             Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site siteStatistic;
  757:             List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site> siteStatisticList;
  758:  
  759:             siteStatisticList = new List<Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site>();
  760:  
  761:             totalFiberService = totalNokiaService = totalHuaweiService = totalFiberAccessCapacity = totalFiberServiceCapacity = totalMsanServiceCapacity = 0;
  762:             totalMsanService = totalPstnService = totalEricssonService = totalSiemensService = 0;
  763:             totalService = 0;
  764:  
  765:             using (var db = new Ia.Ftn.Cl.Db())
  766:             {
  767:                 var oltIdToCountOfServiceDictionary = Ia.Ftn.Cl.Models.Data.Default.OltIdToCountOfServiceDictionary();
  768:                 var oltList = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList;
  769:  
  770:                 var msanSiteIdToDidListDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.MsanSiteIdToDidListDictionary();
  771:                 var msanSiteIdToCapacityDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.MsanSiteIdToCapacityDictionary();
  772:                 var msanDidToServiceCountDictionary = Ia.Ftn.Cl.Models.Data.Default.MsanDidToMsanServiceCountDictionary();
  773:  
  774:                 var pstnFiveDigitDomainToCountOfServicesDictionary = Ia.Ftn.Cl.Models.Data.Service2.PstnFiveDigitDomainToCountOfServicesDictionary();
  775:                 var pstnToFiveDigitDomainListDictionary = Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.PstnToFiveDigitDomainListDictionary();
  776:  
  777:                 var unknown = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site(); // ("Unknown", );
  778:                 unknown.NameArabicName = "Unknown (غير معرف)";
  779:                 unknown.Name = "Unknown";
  780:  
  781:                 foreach (var site in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.SiteList)
  782:                 {
  783:                     siteStatistic = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site();
  784:  
  785:                     siteId = site.Id;
  786:                     siteStatistic.Id = site.Id.ToString();
  787:                     siteStatistic.NameArabicName = site.NameArabicName;
  788:                     siteStatistic.Name = site.Name;
  789:  
  790:                     siteStatistic.KuwaitAreaNameListString = string.Join(", ", site.KuwaitFtnAreas.Select(u => u.ArabicName));
  791:  
  792:                     siteStatistic.PstnDomainListString = string.Join(", ", site.Pstns.SelectMany(u => u.DomainList).ToList());
  793:  
  794:                     siteStatistic.MsanDomainListString = string.Join(", ", site.Msans.SelectMany(u => u.DomainList).ToList());
  795:  
  796:                     siteStatistic.DomainListString = string.Join(", ", site.Routers.SelectMany(u => u.DomainList).ToList());
  797:  
  798:                     siteStatistic.SymbolListString = string.Join(", ", site.AreaSymbolList.ToList());
  799:  
  800:                     siteStatistic.FiberAccessCapacity = (from o in Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.OltList
  801:                                                          where o.Odf.Router.Site.Id == siteId
  802:                                                          select o).Sum(o => o.NumberOfPons * o.NumberOfOntsInPon);
  803:  
  804:                     siteStatistic.FiberServiceCapacity = site.NumberOfPossibleServicesWithinDomainList;
  805:  
  806:  
  807:                     // Fiber
  808:                     foreach (var olt in site.Routers.SelectMany(u => u.Odfs.SelectMany(v => v.Olts)))
  809:                     {
  810:                         if (oltIdToCountOfServiceDictionary.ContainsKey(olt.Id))
  811:                         {
  812:                             if (olt.Odf.Router.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Nokia) siteStatistic.NokiaService += oltIdToCountOfServiceDictionary[olt.Id];
  813:                             else if (olt.Odf.Router.Vendor == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor.Huawei) siteStatistic.HuaweiService += oltIdToCountOfServiceDictionary[olt.Id];
  814:                             else
  815:                             {
  816:                                 unknown.FiberService++;
  817:                             }
  818:                         }
  819:                     }
  820:  
  821:                     siteStatistic.FiberService = siteStatistic.NokiaService + siteStatistic.HuaweiService;
  822:                     siteStatistic.FiberServiceText = siteStatistic.FiberService + " (" + siteStatistic.NokiaService + "/" + siteStatistic.HuaweiService + ")";
  823:  
  824:  
  825:                     // MSAN
  826:                     if (!string.IsNullOrEmpty(siteStatistic.MsanDomainListString))
  827:                     {
  828:                         if (msanSiteIdToDidListDictionary.ContainsKey(siteId))
  829:                         {
  830:                             siteStatistic.MsanServiceCapacity = msanSiteIdToCapacityDictionary[siteId];
  831:  
  832:                             foreach (var msanDid in msanSiteIdToDidListDictionary[siteId])
  833:                             {
  834:                                 if (msanDidToServiceCountDictionary.ContainsKey(msanDid))
  835:                                 {
  836:                                     siteStatistic.MsanService += msanDidToServiceCountDictionary[msanDid];
  837:                                 }
  838:                                 else
  839:                                 {
  840:                                     unknown.MsanService++;
  841:                                 }
  842:                             }
  843:                         }
  844:  
  845:                         siteStatistic.MsanServiceText = siteStatistic.MsanService.ToString();
  846:                     }
  847:  
  848:                     siteStatistic.Service = siteStatistic.FiberService + siteStatistic.MsanService;
  849:                     siteStatistic.ServiceText = siteStatistic.Service.ToString();
  850:  
  851:                     // PSTN
  852:                     if (!string.IsNullOrEmpty(siteStatistic.PstnDomainListString))
  853:                     {
  854:                         foreach (var pstn in site.Pstns)
  855:                         {
  856:                             var list = pstnToFiveDigitDomainListDictionary[pstn];
  857:  
  858:                             foreach (var l in list)
  859:                             {
  860:                                 if (pstnFiveDigitDomainToCountOfServicesDictionary.ContainsKey(l.ToString()))
  861:                                 {
  862:                                     if (pstn.PstnExchangeType == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.PstnExchangeType.EricssonAxe) siteStatistic.EricssonPstnService += pstnFiveDigitDomainToCountOfServicesDictionary[l.ToString()];
  863:                                     else if (pstn.PstnExchangeType == Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.PstnExchangeType.SiemensEwsd) siteStatistic.SiemensPstnService += pstnFiveDigitDomainToCountOfServicesDictionary[l.ToString()];
  864:                                     else
  865:                                     {
  866:                                         unknown.PstnService++;
  867:                                     }
  868:                                 }
  869:                                 else
  870:                                 {
  871:  
  872:                                 }
  873:                             }
  874:                         }
  875:  
  876:                         siteStatistic.PstnService = siteStatistic.EricssonPstnService + siteStatistic.SiemensPstnService;
  877:                         siteStatistic.EricssonSiemensPstnServiceText = siteStatistic.PstnService + " (" + siteStatistic.EricssonPstnService + "/" + siteStatistic.SiemensPstnService + ")";
  878:                     }
  879:  
  880:  
  881:                     // totals:
  882:                     totalFiberService += siteStatistic.FiberService;
  883:                     totalService += siteStatistic.Service;
  884:  
  885:                     totalNokiaService += siteStatistic.NokiaService;
  886:                     totalHuaweiService += siteStatistic.HuaweiService;
  887:  
  888:                     totalFiberAccessCapacity += siteStatistic.FiberAccessCapacity;
  889:                     totalFiberServiceCapacity += siteStatistic.FiberServiceCapacity;
  890:  
  891:                     totalMsanServiceCapacity += siteStatistic.MsanServiceCapacity;
  892:                     totalMsanService += siteStatistic.MsanService;
  893:  
  894:                     totalPstnService += siteStatistic.PstnService;
  895:  
  896:                     totalEricssonService += siteStatistic.EricssonPstnService;
  897:                     totalSiemensService += siteStatistic.SiemensPstnService;
  898:  
  899:                     siteStatisticList.Add(siteStatistic);
  900:                 }
  901:  
  902:                 // MSAN: collect count of numbers in DIDs *not* within site DIDs
  903:                 var didList = msanSiteIdToDidListDictionary.Values.SelectMany(x => x).ToList();
  904:  
  905:                 foreach (var d in msanDidToServiceCountDictionary)
  906:                 {
  907:                     if (!didList.Contains(d.Key)) unknown.MsanService += d.Value;
  908:                 }
  909:  
  910:                 siteStatisticList = siteStatisticList.OrderBy(u => u.Name).ToList();
  911:  
  912:                 siteStatisticList.Add(unknown);
  913:  
  914:                 // below: last totals row
  915:                 siteStatistic = new Ia.Ftn.Cl.Models.Business.Administration.Statistic.Site();
  916:  
  917:                 siteStatistic.NameArabicName = "Total (مجموع)";
  918:                 siteStatistic.Name = "Total";
  919:  
  920:                 siteStatistic.FiberService = totalFiberService;
  921:                 siteStatistic.NokiaService = totalNokiaService;
  922:                 siteStatistic.HuaweiService = totalHuaweiService;
  923:                 siteStatistic.FiberServiceText = (siteStatistic.NokiaService + siteStatistic.HuaweiService) + " (" + siteStatistic.NokiaService + "/" + siteStatistic.HuaweiService + ")";
  924:  
  925:                 siteStatistic.FiberAccessCapacity = totalFiberAccessCapacity;
  926:                 siteStatistic.FiberServiceCapacity = totalFiberServiceCapacity;
  927:  
  928:                 siteStatistic.MsanService = totalMsanService;
  929:                 siteStatistic.MsanServiceCapacity = totalMsanServiceCapacity;
  930:                 siteStatistic.MsanServiceText = totalMsanService.ToString();
  931:  
  932:                 siteStatistic.PstnService = totalPstnService;
  933:                 siteStatistic.EricssonPstnService = totalEricssonService;
  934:                 siteStatistic.SiemensPstnService = totalSiemensService;
  935:                 siteStatistic.EricssonSiemensPstnServiceText = (siteStatistic.EricssonPstnService + siteStatistic.SiemensPstnService) + " (" + siteStatistic.EricssonPstnService + "/" + siteStatistic.SiemensPstnService + ")";
  936:  
  937:                 siteStatistic.Service = totalService;
  938:                 siteStatistic.ServiceText = siteStatistic.Service.ToString();
  939:  
  940:                 siteStatisticList.Add(siteStatistic);
  941:             }
  942:  
  943:             return siteStatisticList;
  944:         }
  945:  
  946:         ////////////////////////////////////////////////////////////////////////////
  947:  
  948:         /// <summary>
  949:         ///
  950:         /// </summary>
  951:         public class YearMonthProvisionedDeprovisionServiceProvisioningStatistic
  952:         {
  953:             public int Year { get; set; }
  954:  
  955:             public int Month { get; set; }
  956:  
  957:             public string MonthName
  958:             {
  959:                 get
  960:                 {
  961:                     return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(this.Month);
  962:                 }
  963:             }
  964:  
  965:             public string YearMonth { get { return Year + "-" + Month.ToString().PadLeft(2, '0'); } }
  966:  
  967:             public int Provisioned { get; set; }
  968:  
  969:             public int Deprovisioned { get; set; }
  970:  
  971:             public int Total { get; set; }
  972:         }
  973:  
  974:         ////////////////////////////////////////////////////////////////////////////
  975:  
  976:         /// <summary>
  977:         ///
  978:         /// </summary>
  979:         public static List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic> ServiceProvisioningInImsSwitchAndAccessNetworkStatistic()
  980:         {
  981:             List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic> list;
  982:  
  983:             using (var db = new Ia.Ftn.Cl.Db())
  984:             {
  985:                 var sqlServer = new Ia.Cl.Models.Db.SqlServer();
  986:  
  987:                 var dbtable = sqlServer.Select(@"
  988: select
  989: YEAR(sr.RequestDateTime) Year, MONTH(sr.RequestDateTime) Month,
  990: SUM(case WHEN sr.ServiceId = 1 or sr.ServiceId = 129 or sr.ServiceId = 54 then 1 else 0 end) Provisioned,
  991: SUM(case WHEN sr.ServiceId = 40 then 1 else 0 end) Deprovisioned 
  992: --count(srs.Provisioned)
  993: from ServiceRequestServices srs
  994: left outer join ServiceRequests sr on srs.Id = sr.ServiceRequestService_Id
  995: where (sr.ServiceId = 1 or sr.ServiceId = 129 or sr.ServiceId = 54 or sr.ServiceId = 40) 
  996: group by YEAR(sr.RequestDateTime), MONTH(sr.RequestDateTime)
  997: order by YEAR(sr.RequestDateTime), MONTH(sr.RequestDateTime)
  998: ");
  999:  
 1000:                 /*
 1001: -- <service id="1" arabicName="خط هاتف" />
 1002: -- <service id="129" arabicName="خط هاتف مع نداء آلي"/>
 1003: -- <service id="54" arabicName="اعادة تركيب" />
 1004: -- <service id="40" arabicName="رفع خط" />
 1005:                 *
 1006:                  */
 1007:  
 1008:                 // I tried every possible way to use LINQ but failed. As a last resort I used SqlServer directly
 1009:  
 1010:                 var total = 0;
 1011:                 list = new List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic>();
 1012:  
 1013:                 foreach (DataRow row in dbtable.Rows)
 1014:                 {
 1015:                     var item = new YearMonthProvisionedDeprovisionServiceProvisioningStatistic();
 1016:  
 1017:                     item.Year = int.Parse(row["Year"].ToString());
 1018:                     item.Month = int.Parse(row["Month"].ToString());
 1019:                     item.Provisioned = int.Parse(row["Provisioned"].ToString());
 1020:                     item.Deprovisioned = int.Parse(row["Deprovisioned"].ToString());
 1021:  
 1022:                     total += item.Provisioned - item.Deprovisioned;
 1023:                     item.Total = total;
 1024:  
 1025:                     list.Add(item);
 1026:                 }
 1027:             }
 1028:  
 1029:             return list;
 1030:         }
 1031:  
 1032:         ////////////////////////////////////////////////////////////////////////////
 1033:  
 1034:         /// <summary>
 1035:         ///
 1036:         /// </summary>
 1037:         public static List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic> ServiceProvisioningInFtnSwitchNetworkStatistic()
 1038:         {
 1039:             List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic> list;
 1040:  
 1041:             using (var db = new Ia.Ftn.Cl.Db())
 1042:             {
 1043:                 var sqlServer = new Ia.Cl.Models.Db.SqlServer();
 1044:  
 1045:                 var dbtable = sqlServer.Select(@"
 1046: select
 1047: YEAR(sr.RequestDateTime) Year, MONTH(sr.RequestDateTime) Month,
 1048: SUM(case WHEN sr.ServiceId = 1 or sr.ServiceId = 129 or sr.ServiceId = 54 then 1 else 0 end) Provisioned,
 1049: SUM(case WHEN sr.ServiceId = 40 then 1 else 0 end) Deprovisioned 
 1050: --count(srs.Provisioned)
 1051: from ServiceRequests sr
 1052: where (sr.ServiceId = 1 or sr.ServiceId = 129 or sr.ServiceId = 54 or sr.ServiceId = 40) 
 1053: group by YEAR(sr.RequestDateTime), MONTH(sr.RequestDateTime)
 1054: order by YEAR(sr.RequestDateTime), MONTH(sr.RequestDateTime)
 1055: ");
 1056:  
 1057:                 /*
 1058: -- <service id="1" arabicName="خط هاتف" />
 1059: -- <service id="129" arabicName="خط هاتف مع نداء آلي"/>
 1060: -- <service id="54" arabicName="اعادة تركيب" />
 1061: -- <service id="40" arabicName="رفع خط" />
 1062:                 *
 1063:                  */
 1064:  
 1065:                 // I tried every possible way to use LINQ but failed. As a last resort I used SqlServer directly
 1066:  
 1067:                 var total = 0;
 1068:                 list = new List<YearMonthProvisionedDeprovisionServiceProvisioningStatistic>();
 1069:  
 1070:                 foreach (DataRow row in dbtable.Rows)
 1071:                 {
 1072:                     var item = new YearMonthProvisionedDeprovisionServiceProvisioningStatistic();
 1073:  
 1074:                     item.Year = int.Parse(row["Year"].ToString());
 1075:                     item.Month = int.Parse(row["Month"].ToString());
 1076:                     item.Provisioned = int.Parse(row["Provisioned"].ToString());
 1077:                     item.Deprovisioned = int.Parse(row["Deprovisioned"].ToString());
 1078:  
 1079:                     total += item.Provisioned - item.Deprovisioned;
 1080:                     item.Total = total;
 1081:  
 1082:                     list.Add(item);
 1083:                 }
 1084:             }
 1085:  
 1086:             return list;
 1087:         }
 1088:  
 1089:         /*
 1090:         ////////////////////////////////////////////////////////////////////////////
 1091: 
 1092:         /// <summary>
 1093:         ///
 1094:         /// </summary>
 1095:         public static List<Ia.Ftn.Cl.Model.Business.Administration.Statistic> PhoneStatistic(string timePeriod)
 1096:         {
 1097:             List<Ia.Ftn.Cl.Model.Business.Administration.Statistic> phoneStatisticList;
 1098: 
 1099:             /*
 1100:             string s, where;
 1101:             DateTime from, to;
 1102:             DataTable dt;
 1103: 
 1104:             if (timePeriod != null)
 1105:             {
 1106:                 from = DateTime.Parse(timePeriod);
 1107:                 to = DateTime.Parse(timePeriod);
 1108:                 to = to.AddMonths(1);
 1109: 
 1110:                 where = " AND (sr.request_time >= '" + sqlserver.SmallDateTime(from) + "' AND sr.request_time < '" + sqlserver.SmallDateTime(to) + "') ";
 1111:             }
 1112:             else where = string.Empty;
 1113:              * /
 1114: 
 1115:             using (var db = new Ia.Ftn.Cl.Model.Ftn())
 1116:             {
 1117:                 phoneStatisticList = (from a in Ia.Ftn.Cl.Model.Data.Service.KuwaitFtnAreaList
 1118:                      group a by a.Id into grp
 1119:                      orderby grp.Key
 1120:                      select new Ia.Ftn.Cl.Model.Business.Administration.Statistic()
 1121:                      {
 1122:                          Id = grp.Key.ToString(),
 1123:                          Name = grp.SingleOrDefault().NameArabicName,
 1124:                          //ServiceRequests = (from sr in db.ServiceRequests where sr.AreaId == grp.Key && sr.ServiceRequestService != null select sr.Id).Count().ToString(),
 1125:                          ServiceRequestServices = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key select srs.Id).Count(),
 1126:                          Services = (from s in db.Service2s where s.ServiceType == Ia.Ftn.Cl.Model.Business.Service.ServiceType.ImsService && s.Access != null && s.Access.AreaId == grp.Key select s.Id).Count(),
 1127:                          InternationalCalling = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.InternationalCalling == true select srs.Id).Count(),
 1128:                          InternationalCallingUserControlled = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.InternationalCallingUserControlled == true select srs.Id).Count(),
 1129:                          CallWaiting = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.CallWaiting == true select srs.Id).Count(),
 1130: 
 1131:                          AlarmCall = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.AlarmCall == true select srs.Id).Count(),
 1132: 
 1133:                          CallBarring = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.CallBarring == true select srs.Id).Count(),
 1134:                          CallerId = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.CallerId == true select srs.Id).Count(),
 1135:                          CallForwarding = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.CallForwarding == true select srs.Id).Count(),
 1136:                          ConferenceCall = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.ConferenceCall == true select srs.Id).Count(),
 1137:                          ServiceSuspension = (from srs in db.ServiceRequestServices where srs.Access != null && srs.Access.AreaId == grp.Key && srs.ServiceSuspension == true select srs.Id).Count()
 1138:                      }).ToList();
 1139: 
 1140:                 /*
 1141:                 if (dt != null)
 1142:                 {
 1143:                     // below: the totals rows
 1144:                     dr = dt.NewRow();
 1145: 
 1146:                     dr["SRS_AccessIdNotNull"] = dt.Compute("SUM (SRS_AccessIdNotNull)", "").ToString();
 1147:                     dr["IMS_AccessIdNotNull"] = dt.Compute("SUM (IMS_AccessIdNotNull)", "").ToString();
 1148:                     dr["SRS_AccordingToAreaIdFromDomain"] = dt.Compute("SUM (SRS_AccordingToAreaIdFromDomain)", "").ToString();
 1149: 
 1150:                     dr["InternationalCalling"] = dt.Compute("SUM (InternationalCalling)", "").ToString();
 1151:                     dr["InternationalCallingUserControlled"] = dt.Compute("SUM (InternationalCallingUserControlled)", "").ToString();
 1152:                     dr["CallWaiting"] = dt.Compute("SUM (CallWaiting)", "").ToString();
 1153:                     dr["AlarmCall"] = dt.Compute("SUM (AlarmCall)", "").ToString();
 1154:                     dr["CallBarring"] = dt.Compute("SUM (CallBarring)", "").ToString();
 1155:                     dr["CallerId"] = dt.Compute("SUM (CallerId)", "").ToString();
 1156:                     dr["CallForwarding"] = dt.Compute("SUM (CallForwarding)", "").ToString();
 1157:                     dr["ConferenceCall"] = dt.Compute("SUM (ConferenceCall)", "").ToString();
 1158:                     dr["ServiceSuspension"] = dt.Compute("SUM (ServiceSuspension)", "").ToString();
 1159: 
 1160:                     dt.Rows.Add(dr);
 1161:                 }
 1162:                  * /
 1163:             }
 1164: 
 1165:             return phoneStatisticList;
 1166:         }
 1167:         */
 1168:  
 1169:         ////////////////////////////////////////////////////////////////////////////
 1170:  
 1171:         /// <summary>
 1172:         ///
 1173:         /// </summary>
 1174:         public static List<Ia.Ftn.Cl.Models.Ui.Performance> StaffAndFrameworkPerformanceReport(int daysAgo)
 1175:         {
 1176:             DateTime startDateTime;
 1177:             List<Ia.Ftn.Cl.Models.Ui.Performance> performanceList;
 1178:  
 1179:             // after 2015-06-01 user report closer inserts a last historic report
 1180:             // I should designate last report as CLOSED and add it to resolution list to be accessed by HEAD only.
 1181:  
 1182:             // if daysAgo is 0 will make it 9999 days to cover all times
 1183:             startDateTime = DateTime.UtcNow.AddDays(daysAgo == 0 ? -9999 : -daysAgo);
 1184:  
 1185:             using (var db = new Ia.Ftn.Cl.Db())
 1186:             {
 1187:                 var staffList = (from s in db.StaffIdentityUsers select s).ToList();
 1188:  
 1189:                 var resolvedList = (from r in db.ReportHistories
 1190:                                     where r.Resolution == 1020 && r.Created > startDateTime
 1191:                                     group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g
 1192:                                     select new { StaffIdentityUserId = g.Key, Count = g.Count() }).ToDictionary(u => u.StaffIdentityUserId, u => u.Count);
 1193:  
 1194:                 var attemptedList = (from r in db.ReportHistories where r.Resolution != 1020 && r.Created > startDateTime group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() }).ToDictionary(u => u.StaffIdentityUserId, u => u.Count);
 1195:  
 1196:                 var insertedList = (from r in db.Reports where r.Created > startDateTime group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() }).ToDictionary(u => u.StaffIdentityUserId, u => u.Count);
 1197:  
 1198:                 var openList = (from r in db.Reports where r.Created > startDateTime group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() }).ToDictionary(u => u.StaffIdentityUserId, u => u.Count);
 1199:  
 1200:  
 1201:                 var allowedToBeMigratedDomainList = Ia.Ftn.Cl.Models.Business.Service.AllowedToBeMigratedDomainList;
 1202:  
 1203:                 var serviceRequestServiceList = (from srs in db.ServiceRequestServices
 1204:                                                  where srs.Updated > startDateTime
 1205:                                                  select new { srs.Service, StaffIdentityUserId = srs.StaffIdentityUser.Id }).ToList();
 1206:  
 1207:                 var migratedList = (from srs in serviceRequestServiceList
 1208:                                     where allowedToBeMigratedDomainList.Any(u => srs.Service.StartsWith(u.ToString()))
 1209:                                     group srs.StaffIdentityUserId by srs.StaffIdentityUserId into g
 1210:                                     select new { StaffIdentityUserId = g.Key, Count = g.Count() }).ToDictionary(u => u.StaffIdentityUserId, u => u.Count);
 1211:  
 1212:  
 1213:                 performanceList = new List<Ia.Ftn.Cl.Models.Ui.Performance>();
 1214:  
 1215:                 foreach (var staff in staffList)
 1216:                 {
 1217:                     var p = new Ia.Ftn.Cl.Models.Ui.Performance
 1218:                     {
 1219:                         StaffIdentityUserId = staff.Id,
 1220:                         FirstAndMiddleName = staff.FirstAndMiddleName,
 1221:                         Resolved = (resolvedList.ContainsKey(staff.Id) ? resolvedList[staff.Id] : 0),
 1222:                         Attempted = (attemptedList.ContainsKey(staff.Id) ? attemptedList[staff.Id] : 0),
 1223:                         Inserted = (insertedList.ContainsKey(staff.Id) ? insertedList[staff.Id] : 0),
 1224:                         Open = (openList.ContainsKey(staff.Id) ? openList[staff.Id] : 0),
 1225:                         AverageReportsPerDay = 0,
 1226:                         Migrated = (migratedList.ContainsKey(staff.Id) ? migratedList[staff.Id] : 0),
 1227:                     };
 1228:  
 1229:                     performanceList.Add(p);
 1230:                 }
 1231:             }
 1232:  
 1233:             // below: exclude staff who did absolutly nothing: Resolved = Attempted = Inserted = 0
 1234:  
 1235:             performanceList = (from p in performanceList where (p.Inserted != 0 || p.Attempted != 0 || p.Resolved != 0) select p).ToList();
 1236:  
 1237:             foreach (var p in performanceList)
 1238:             {
 1239:                 if (string.IsNullOrEmpty(p.StaffIdentityUserId)) p.FirstAndMiddleName = "غير معرف";
 1240:                 else { }
 1241:             }
 1242:  
 1243:             return performanceList;
 1244:         }
 1245:  
 1246:         ////////////////////////////////////////////////////////////////////////////
 1247:  
 1248:         /// <summary>
 1249:         ///
 1250:         /// </summary>
 1251:         public static List<Ia.Ftn.Cl.Models.Ui.Performance> StatisticsOfResolvedAndAttemptedAndInsertedStaffReport2(string userId)
 1252:         {
 1253:             List<Ia.Ftn.Cl.Models.Ui.Performance> performanceList;
 1254:  
 1255:             // after 2015-06-01 user report closer inserts a last historic report
 1256:             // I should designate last report as CLOSED and add it to resolution list to be accessed by HEAD only.
 1257:  
 1258:             using (var db = new Ia.Ftn.Cl.Db())
 1259:             {
 1260:                 performanceList =
 1261:                     (
 1262:                     from staff in
 1263:                         (from s in db.StaffIdentityUsers group s.Id by s.Id into g select new { Id = g.Key, Count = g.Count() })
 1264:                     join resolved in
 1265:                         (from r in db.ReportHistories where r.Resolution == 1020 group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() })
 1266:                     on staff.Id equals resolved.StaffIdentityUserId into resolved_gj
 1267:                     from re in resolved_gj.DefaultIfEmpty()
 1268:  
 1269:                     join attempted in
 1270:                         (from r in db.ReportHistories where r.Resolution != 1020 group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() })
 1271:                     on staff.Id equals attempted.StaffIdentityUserId into attempted_gj
 1272:                     from at in attempted_gj.DefaultIfEmpty()
 1273:  
 1274:                     join inserted in
 1275:                         (from r in db.Reports group r.StaffIdentityUser.Id by r.StaffIdentityUser.Id into g select new { StaffIdentityUserId = g.Key, Count = g.Count() })
 1276:                     on staff.Id equals inserted.StaffIdentityUserId into inserted_gj
 1277:                     from ins in inserted_gj.DefaultIfEmpty()
 1278:                         // below: the 20, 10, 1 give weight to the field
 1279:                     orderby re.Count descending, at.Count descending, ins.Count descending
 1280:                     select new Ia.Ftn.Cl.Models.Ui.Performance
 1281:                     {
 1282:                         StaffIdentityUserId = staff.Id,
 1283:                         FirstAndMiddleName = (from s in Ia.Ftn.Cl.Models.Data.StaffIdentityUser.List()
 1284:                                               where s.Id == staff.Id
 1285:                                               select s.FirstAndMiddleName).SingleOrDefault(),
 1286:                         Resolved = (re == null ? 0 : re.Count),
 1287:                         Attempted = (at == null ? 0 : at.Count),
 1288:                         Inserted = (ins == null ? 0 : ins.Count),
 1289:                         AverageReportsPerDay = 0
 1290:                     }).ToList();
 1291:  
 1292:                 /*
 1293:         select users.StaffIdentityUser.Id, resolved.count,attempted.count,inserted.count from
 1294:         (
 1295:         (select count(*) as count, UserId from Users group by UserId) as users
 1296:         left outer join
 1297:         (select count(*) as count, rh.StaffIdentityUser.Id from ReportHistories as rh where rh.Resolution = 1020 group by rh.StaffIdentityUser.Id) as resolved
 1298:         on users.StaffIdentityUser.Id = resolved.StaffIdentityUser.Id
 1299:         left outer join
 1300:         (select count(*) as count, rh.StaffIdentityUser.Id from ReportHistories as rh where rh.Resolution <> 1020 group by rh.StaffIdentityUser.Id) as attempted
 1301:         on users.StaffIdentityUser.Id = attempted.StaffIdentityUser.Id
 1302:         left outer join
 1303:         (select count(*) as count, UserId from Reports group by UserId) as inserted
 1304:         on users.StaffIdentityUser.Id = inserted.StaffIdentityUser.Id
 1305:         )
 1306:         order by resolved.count*20+attempted.count*10+inserted.count desc
 1307:             */
 1308:             }
 1309:  
 1310:             return performanceList.ToList();
 1311:         }
 1312:  
 1313:         ////////////////////////////////////////////////////////////////////////////    
 1314:  
 1315:         /// <summary>
 1316:         ///
 1317:         /// </summary>
 1318:         public static Dictionary<string, int> DateTimesWithAvailableData()
 1319:         {
 1320:             Dictionary<string, int> dic;
 1321:  
 1322:  
 1323:             dic = new Dictionary<string, int>(100);
 1324:  
 1325:  
 1326:             using (var db = new Ia.Ftn.Cl.Db())
 1327:             {
 1328:                 //dic = (from q in db.ServiceRequests orderby q.RequestDateTime select q.RequestDateTime).Distinct().ToDictionary(r => r.CustomerName, r => r.Id);
 1329:  
 1330:                 // dictionary = (from q in ReportXDocument.Elements("report").Elements("category") select new { Id = int.Parse(q.Attribute("id").Value), Name = q.Attribute("name").Value }).ToDictionary(r => r.Id, r => r.Name);
 1331:  
 1332:             }
 1333:  
 1334:             /*
 1335:         SELECT DISTINCT CONVERT(varchar(7), RequestDateTime, 102) AS date, COUNT(1) AS count
 1336:         FROM [Ia_Ftn].[dbo].[ServiceRequests]
 1337:         GROUP BY CONVERT(varchar(7), RequestDateTime, 102)
 1338:         ORDER BY date
 1339:              */
 1340:  
 1341:             return dic;
 1342:         }
 1343:  
 1344:         ////////////////////////////////////////////////////////////////////////////    
 1345:  
 1346:         /// <summary>
 1347:         ///
 1348:         /// </summary>
 1349:         public static void CreateFrameworkIdentityRolesIfTheyDoNotExist(RoleManager<IdentityRole> roleManager)
 1350:         {
 1351:             IdentityResult identityResult;
 1352:  
 1353:             foreach (var framework in Ia.Ftn.Cl.Models.Data.Administration.FrameworkList)
 1354:             {
 1355:                 if (!roleManager.RoleExistsAsync(framework.FullyQualifiedArabicName).Result)
 1356:                 {
 1357:                     identityResult = roleManager.CreateAsync(new IdentityRole(framework.FullyQualifiedArabicName)).Result;
 1358:                 }
 1359:  
 1360:                 // create IsHead and IsSecretary role if they did not exists
 1361:                 if (!Ia.Ftn.Cl.Models.Identity.RoleExists(roleManager, "IsHead")) Ia.Ftn.Cl.Models.Identity.CreateRole(roleManager, "IsHead");
 1362:                 if (!Ia.Ftn.Cl.Models.Identity.RoleExists(roleManager, "IsSecretary")) Ia.Ftn.Cl.Models.Identity.CreateRole(roleManager, "IsSecretary");
 1363:             }
 1364:         }
 1365:  
 1366:         ////////////////////////////////////////////////////////////////////////////    
 1367:  
 1368:         /// <summary>
 1369:         ///
 1370:         /// </summary>
 1371:         public static void CreateApplicationUserAndStaffIfDoesNotExist(RoleManager<IdentityRole> roleManager, UserManager<Ia.Ftn.Cl.Models.StaffIdentityUser> userManager)
 1372:         {
 1373:             var staffIdentityUser = Ia.Ftn.Cl.Models.Data.StaffIdentityUser.CreateApplicationStaff(userManager, roleManager,
 1374:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationArabicFirstName,
 1375:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationArabicMiddleName,
 1376:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationArabicLastName,
 1377:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationUserEmail,
 1378:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationUserName,
 1379:                 string.Empty,
 1380:                 Ia.Ftn.Cl.Models.Data.Administration.ApplicationUserPassword,
 1381:                 out IdentityResult identityResult);
 1382:  
 1383:             if (identityResult.Succeeded)
 1384:             {
 1385:                 Ia.Ftn.Cl.Models.Business.Authority.UpdateFrameworkRolesOfStaffIdentityUser(userManager, roleManager, staffIdentityUser);
 1386:             }
 1387:             else
 1388:             {
 1389:             }
 1390:         }
 1391:  
 1392:         ////////////////////////////////////////////////////////////////////////////
 1393:         ////////////////////////////////////////////////////////////////////////////
 1394:  
 1395:         /// <summary>
 1396:         /// 
 1397:         /// How to embed and access resources by using Visual C# http://support.microsoft.com/kb/319292/en-us
 1398:         /// 
 1399:         /// 1. Change the "Build Action" property of your XML file from "Content" to "Embedded Resource".
 1400:         /// 2. Add "using System.Reflection".
 1401:         /// 3. Manifest resource stream will start with the project namespace, the location of XML file.
 1402:         /// 
 1403:         /// </summary>
 1404:  
 1405:         private static XDocument XDocument
 1406:         {
 1407:             get
 1408:             {
 1409:                 if (xDocument == null)
 1410:                 {
 1411:                     lock (objectLock)
 1412:                     {
 1413:                         Assembly assembly;
 1414:                         StreamReader streamReader;
 1415:  
 1416:                         assembly = Assembly.GetExecutingAssembly();
 1417:                         streamReader = new StreamReader(assembly.GetManifestResourceStream("Ia.Ftn.Cl.Models.Data.administration.xml"));
 1418:  
 1419:                         try
 1420:                         {
 1421:                             if (streamReader.Peek() != -1) xDocument = System.Xml.Linq.XDocument.Load(streamReader);
 1422:                         }
 1423:                         catch (Exception)
 1424:                         {
 1425:                         }
 1426:                         finally
 1427:                         {
 1428:                         }
 1429:                     }
 1430:                 }
 1431:  
 1432:                 return xDocument;
 1433:             }
 1434:         }
 1435:  
 1436:         ////////////////////////////////////////////////////////////////////////////
 1437:         ////////////////////////////////////////////////////////////////////////////    
 1438:     }
 1439:  
 1440:     ////////////////////////////////////////////////////////////////////////////
 1441:     ////////////////////////////////////////////////////////////////////////////   
 1442: }