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

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

Huawei's Dev support class of Fixed Telecommunications Network (FTN) data model.

    1: using Microsoft.EntityFrameworkCore;
    2: using System;
    3: using System.Collections.Generic;
    4: using System.Data;
    5: using System.Linq;
    6: using System.Text;
    7:  
    8: namespace Ia.Ftn.Cl.Models.Data.Huawei
    9: {
   10:     ////////////////////////////////////////////////////////////////////////////
   11:  
   12:     /// <summary publish="true">
   13:     /// Huawei's Dev support class of Fixed Telecommunications Network (FTN) data model.
   14:     /// </summary>
   15:     /// 
   16:     /// <remarks> 
   17:     /// Copyright © 2016-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   18:     /// </remarks> 
   19:     public class Dev
   20:     {
   21:         private static Dictionary<int, long> didToResultCodeDictionary;
   22:         private static Dictionary<string, int> devTypeToDevTypeIdDictionary;
   23:         private static Dictionary<int, string> devTypeIdToDevTypeDictionary;
   24:  
   25:         private static Dictionary<string, int> devToDidDictionary;
   26:         private static Dictionary<int, string> didToDevDictionary;
   27:  
   28:         private static Dictionary<string, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type> devToTypeDictionary;
   29:  
   30:         private static Dictionary<int, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type> didToTypeDictionary;
   31:  
   32:         private static DateTime didToResultCodeDictionaryFutureRefreshDateTime;
   33:  
   34:         private static readonly object objectLock = new object();
   35:  
   36:         public static Dictionary<string, int> DevTypeToDevTypeIdDictionary
   37:         {
   38:             get
   39:             {
   40:                 if (devTypeToDevTypeIdDictionary == null || devTypeToDevTypeIdDictionary.Count == 0)
   41:                 {
   42:                     devTypeToDevTypeIdDictionary = new Dictionary<string, int>();
   43:  
   44:                     devTypeToDevTypeIdDictionary["UA5000(PVMV1)"] = 219;
   45:                     devTypeToDevTypeIdDictionary["MA5662"] = 37;
   46:                     devTypeToDevTypeIdDictionary["MA5600V3"] = 44;
   47:                     devTypeToDevTypeIdDictionary["MA5105(BSL)"] = 71;
   48:                     devTypeToDevTypeIdDictionary["MA5100V2"] = 72;
   49:                     devTypeToDevTypeIdDictionary["MA5300V1"] = 74;
   50:                     devTypeToDevTypeIdDictionary["MD5500V1"] = 75;
   51:                     devTypeToDevTypeIdDictionary["UA5000"] = 82;
   52:                     devTypeToDevTypeIdDictionary["MA5100V1"] = 86;
   53:                     devTypeToDevTypeIdDictionary["UA5000(IPMB)"] = 253;
   54:                     devTypeToDevTypeIdDictionary["MA5605"] = 30;
   55:                     devTypeToDevTypeIdDictionary["MA5680T"] = 34;
   56:                     devTypeToDevTypeIdDictionary["MA5606T"] = 57;
   57:                     devTypeToDevTypeIdDictionary["UA5000(PVU)"] = 232;
   58:                     devTypeToDevTypeIdDictionary["MA5600T"] = 249;
   59:                     devTypeToDevTypeIdDictionary["MA5615"] = 60;
   60:                     devTypeToDevTypeIdDictionary["MA5626E"] = 61;
   61:                     devTypeToDevTypeIdDictionary["MA5620E"] = 62;
   62:                     devTypeToDevTypeIdDictionary["MA5651"] = 64;
   63:                     devTypeToDevTypeIdDictionary["MA5620G"] = 65;
   64:                     devTypeToDevTypeIdDictionary["MA5626G"] = 66;
   65:                     devTypeToDevTypeIdDictionary["MA5651G"] = 67;
   66:                     devTypeToDevTypeIdDictionary["MA5610"] = 70;
   67:                     devTypeToDevTypeIdDictionary["MA5652G"] = 92;
   68:                     devTypeToDevTypeIdDictionary["MA5603U"] = 94;
   69:                     devTypeToDevTypeIdDictionary["MA5603T"] = 95;
   70:                     devTypeToDevTypeIdDictionary["MA5620"] = 96;
   71:                     devTypeToDevTypeIdDictionary["MA5626"] = 97;
   72:                     devTypeToDevTypeIdDictionary["MA5616"] = 100;
   73:                     devTypeToDevTypeIdDictionary["MA5635"] = 103;
   74:                     devTypeToDevTypeIdDictionary["MA5612"] = 104;
   75:                     devTypeToDevTypeIdDictionary["MA5621"] = 2319;
   76:                     devTypeToDevTypeIdDictionary["MA5628"] = 2312;
   77:                     devTypeToDevTypeIdDictionary["MA5652"] = 2313;
   78:                     devTypeToDevTypeIdDictionary["MA5631"] = 2317;
   79:                     devTypeToDevTypeIdDictionary["MA5612A"] = 2320;
   80:                     devTypeToDevTypeIdDictionary["MA5669"] = 2321;
   81:                     devTypeToDevTypeIdDictionary["MA5621A"] = 2322;
   82:                     devTypeToDevTypeIdDictionary["MA5622A"] = 2323;
   83:                     devTypeToDevTypeIdDictionary["MA5623"] = 2324;
   84:                     devTypeToDevTypeIdDictionary["MA5623A"] = 2326;
   85:                     devTypeToDevTypeIdDictionary["MA5632"] = 2318;
   86:                     devTypeToDevTypeIdDictionary["MA5608T"] = 2331;
   87:                     devTypeToDevTypeIdDictionary["MA5698"] = 2333;
   88:                     devTypeToDevTypeIdDictionary["MA5694"] = 2335;
   89:                     devTypeToDevTypeIdDictionary["MA5821"] = 2336;
   90:                     devTypeToDevTypeIdDictionary["MA5822"] = 2337;
   91:                     devTypeToDevTypeIdDictionary["MA5898"] = 2338;
   92:                     devTypeToDevTypeIdDictionary["MA5818"] = 2339;
   93:                     devTypeToDevTypeIdDictionary["MA5611S"] = 2340;
   94:                     devTypeToDevTypeIdDictionary["MA5694S"] = 2343;
   95:                     devTypeToDevTypeIdDictionary["RPS"] = 2344;
   96:                 }
   97:  
   98:                 return devTypeToDevTypeIdDictionary;
   99:             }
  100:         }
  101:  
  102:         /// <summary/>
  103:         public Dev() { }
  104:  
  105:         ////////////////////////////////////////////////////////////////////////////
  106:  
  107:         /// <summary>
  108:         ///
  109:         /// </summary>
  110:         public static Dictionary<int, string> DevTypeIdToDevTypeDictionary
  111:         {
  112:             get
  113:             {
  114:                 if (devTypeIdToDevTypeDictionary == null || devTypeIdToDevTypeDictionary.Count == 0)
  115:                 {
  116:                     devTypeIdToDevTypeDictionary = new Dictionary<int, string>();
  117:  
  118:                     foreach (KeyValuePair<string, int> kvp in DevTypeToDevTypeIdDictionary) devTypeIdToDevTypeDictionary[kvp.Value] = kvp.Key;
  119:                 }
  120:  
  121:                 return devTypeIdToDevTypeDictionary;
  122:             }
  123:         }
  124:  
  125:         ////////////////////////////////////////////////////////////////////////////
  126:  
  127:         /// <summary>
  128:         ///
  129:         /// </summary>
  130:         public static Dictionary<string, int> DevToDidDictionary
  131:         {
  132:             get
  133:             {
  134:                 if (devToDidDictionary == null || devToDidDictionary.Count == 0)
  135:                 {
  136:                     devToDidDictionary = new Dictionary<string, int>();
  137:  
  138:                     List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  139:  
  140:                     using (var db = new Ia.Ftn.Cl.Db())
  141:                     {
  142:                         // this will list the Disconnecting devs first so that if there is an override it will allow the Connecting to be in dictionary
  143:                         list = (from ed in db.EmsDevs select ed).OrderBy(u => u.DSTAT == "Connecting").ToList();
  144:                     }
  145:  
  146:                     foreach (var d in list) devToDidDictionary[d.DEV] = d.DID;
  147:                 }
  148:  
  149:                 return devToDidDictionary;
  150:             }
  151:         }
  152:  
  153:         ////////////////////////////////////////////////////////////////////////////
  154:  
  155:         /// <summary>
  156:         ///
  157:         /// </summary>
  158:         public static Dictionary<int, long> DidToResultCodeDictionary
  159:         {
  160:             get
  161:             {
  162:                 var now = DateTime.UtcNow.AddHours(3);
  163:  
  164:                 if (didToResultCodeDictionary == null || didToResultCodeDictionary.Count == 0 || now > didToResultCodeDictionaryFutureRefreshDateTime)
  165:                 {
  166:                     lock (objectLock)
  167:                     {
  168:                         didToResultCodeDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev._DidToResultCodeDictionary(60); // one hour
  169:                     }
  170:                 }
  171:  
  172:                 return didToResultCodeDictionary;
  173:             }
  174:         }
  175:  
  176:         ////////////////////////////////////////////////////////////////////////////
  177:  
  178:         /// <summary>
  179:         ///
  180:         /// </summary>
  181:         private static Dictionary<int, long> _DidToResultCodeDictionary(int minutesToKeepDataValid)
  182:         {
  183:             var now = DateTime.UtcNow.AddHours(3);
  184:  
  185:             didToResultCodeDictionaryFutureRefreshDateTime = now.AddMinutes(minutesToKeepDataValid);
  186:  
  187:             using (var db = new Ia.Ftn.Cl.Db())
  188:             {
  189:                 didToResultCodeDictionary = (from ed in db.EmsDevs
  190:                                              select new { ed.DID, ed.ResultCode }).AsNoTracking().ToDictionary(u => u.DID, u => u.ResultCode);
  191:             }
  192:  
  193:             return didToResultCodeDictionary;
  194:         }
  195:  
  196:         ////////////////////////////////////////////////////////////////////////////
  197:  
  198:         /// <summary>
  199:         ///
  200:         /// </summary>
  201:         public static Dictionary<string, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type> DevToTypeDictionary
  202:         {
  203:             get
  204:             {
  205:                 if (devToTypeDictionary == null || devToTypeDictionary.Count == 0)
  206:                 {
  207:                     devToTypeDictionary = new Dictionary<string, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type>();
  208:  
  209:                     foreach (var dev in Ia.Ftn.Cl.Models.Data.Huawei.Dev.List()) devToTypeDictionary[dev.DEV] = dev.Type;
  210:                 }
  211:  
  212:                 return devToTypeDictionary;
  213:             }
  214:         }
  215:  
  216:         ////////////////////////////////////////////////////////////////////////////
  217:  
  218:         /// <summary>
  219:         ///
  220:         /// </summary>
  221:         public static Dictionary<int, string> DidToDevDictionary
  222:         {
  223:             get
  224:             {
  225:                 if (didToDevDictionary == null || didToDevDictionary.Count == 0)
  226:                 {
  227:                     didToDevDictionary = new Dictionary<int, string>();
  228:  
  229:                     foreach (KeyValuePair<string, int> kvp in DevToDidDictionary) didToDevDictionary[kvp.Value] = kvp.Key;
  230:                 }
  231:  
  232:                 return didToDevDictionary;
  233:             }
  234:         }
  235:  
  236:         ////////////////////////////////////////////////////////////////////////////
  237:  
  238:         /// <summary>
  239:         ///
  240:         /// </summary>
  241:         public static Dictionary<int, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type> DidToTypeDictionary
  242:         {
  243:             get
  244:             {
  245:                 if (didToTypeDictionary == null || didToTypeDictionary.Count == 0)
  246:                 {
  247:                     didToTypeDictionary = new Dictionary<int, Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type>();
  248:  
  249:                     foreach (KeyValuePair<int, string> kvp in DidToDevDictionary)
  250:                     {
  251:                         didToTypeDictionary[kvp.Key] = DevToTypeDictionary.ContainsKey(kvp.Value) ? DevToTypeDictionary[kvp.Value] : Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Unknown;
  252:                     }
  253:                 }
  254:  
  255:                 return didToTypeDictionary;
  256:             }
  257:         }
  258:  
  259:         ////////////////////////////////////////////////////////////////////////////
  260:  
  261:         /// <summary>
  262:         ///
  263:         /// </summary>
  264:         public static bool Update(Ia.Ftn.Cl.Models.Business.Huawei.Ems.Response response, out Ia.Cl.Models.Result result)
  265:         {
  266:             bool isUpdated;
  267:             int id, queryDtTypeId, did, readItemCount, existingItemCount, insertedItemCount, updatedItemCount, deletedItemCount;
  268:             string queryCommand, queryDev, devDev, dtType;
  269:             DataColumnCollection columns;
  270:             DataRow columnDataRow;
  271:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Ont nddOnt;
  272:             Ia.Ftn.Cl.Models.Huawei.EmsDev dev, devByDev, newDev;
  273:             List<int> itemIdList;
  274:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> devList;
  275:  
  276:             isUpdated = false;
  277:             readItemCount = existingItemCount = insertedItemCount = updatedItemCount = deletedItemCount = 0;
  278:             result = new Ia.Cl.Models.Result();
  279:  
  280:             if (response.CompletionCode == "COMPLD")
  281:             {
  282:                 if (response.QueryDataTable != null)
  283:                 {
  284:                     queryCommand = response.CommandFromCorrelationTagDictionaryByCtag;
  285:  
  286:                     columns = response.QueryDataTable.Columns;
  287:                     readItemCount = response.QueryDataTable.Rows.Count;
  288:  
  289:                     itemIdList = new List<int>(response.QueryDataTable.Rows.Count + 1);
  290:  
  291:                     using (var db = new Ia.Ftn.Cl.Db())
  292:                     {
  293:                         if (queryCommand.Contains("LST-DEV::DT") || queryCommand.Contains("LST-DEV::DEV"))
  294:                         {
  295:                             if (queryCommand.Contains("LST-DEV::DT"))
  296:                             {
  297:                                 // LST-DEV::DT=100:{ctag}::;
  298:                                 queryDtTypeId = int.Parse(Ia.Cl.Models.Default.Match(queryCommand, @"DT=(\d+)"));
  299:  
  300:                                 //if (Ia.Ftn.Cl.Model.Data.Huawei.Dev.DevTypeIdToDevTypeDictionary.ContainsKey(queryDtTypeId))
  301:                                 //{
  302:                                 dtType = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DevTypeIdToDevTypeDictionary[queryDtTypeId];
  303:  
  304:                                 devList = (from ed in db.EmsDevs where ed.DT == dtType select ed).ToList();
  305:                                 //}
  306:                                 //else
  307:                                 //{
  308:                                 //    result.AddWarning("Ia.Ftn.Cl.Model.Data.Huawei.Dev.DevTypeIdToDevTypeDictionary does not contain key queryDtTypeId: " + queryDtTypeId);
  309:                                 //}
  310:                             }
  311:                             else //if (queryCommand.Contains("LST-DEV::DEV"))
  312:                             {
  313:                                 // LST-DEV::DEV=MDU-SAB-1443-001:{ctag}::;
  314:  
  315:                                 queryDev = Ia.Cl.Models.Default.Match(queryCommand, @"DEV=(.+?):");
  316:  
  317:                                 devList = (from ed in db.EmsDevs where ed.DEV == queryDev select ed).ToList();
  318:                             }
  319:  
  320:                             existingItemCount = devList.Count;
  321:  
  322:                             if (response.QueryDataTable.Rows.Count >= 1)
  323:                             {
  324:                                 columnDataRow = response.QueryDataTable.Rows[0];
  325:  
  326:                                 foreach (DataRow dataRow in response.QueryDataTable.Rows)
  327:                                 {
  328:                                     did = int.Parse(dataRow[columns.IndexOf("DID")].ToString());
  329:  
  330:                                     id = Ia.Ftn.Cl.Models.Business.Huawei.Dev.DevId(did);
  331:  
  332:                                     dev = (from d in devList where d.Id == id select d).SingleOrDefault();
  333:  
  334:                                     devDev = columns.Contains("DEV") ? dataRow[columns.IndexOf("DEV")].ToString() : string.Empty;
  335:  
  336:                                     newDev = new Ia.Ftn.Cl.Models.Huawei.EmsDev()
  337:                                     {
  338:                                         Id = id,
  339:                                         DID = did,
  340:                                         ResultCode = (long)response.ResultCode,
  341:                                         DEV = devDev,
  342:                                         DEVIP = columns.Contains("DEVIP") ? dataRow[columns.IndexOf("DEVIP")].ToString() : string.Empty,
  343:                                         DT = columns.Contains("DT") ? dataRow[columns.IndexOf("DT")].ToString() : string.Empty,
  344:                                         DVER = columns.Contains("DVER") ? dataRow[columns.IndexOf("DVER")].ToString() : string.Empty,
  345:                                         DSTAT = columns.Contains("DSTAT") ? dataRow[columns.IndexOf("DSTAT")].ToString() : string.Empty,
  346:                                         DLOC = columns.Contains("DLOC") ? dataRow[columns.IndexOf("DLOC")].ToString() : string.Empty,
  347:                                         AdminStat = columns.Contains("AdminStat") ? dataRow[columns.IndexOf("AdminStat")].ToString() : string.Empty,
  348:                                         WorkMode = columns.Contains("WorkMode") ? dataRow[columns.IndexOf("WorkMode")].ToString() : string.Empty,
  349:                                         ADDITIONALINFO = columns.Contains("ADDITIONALINFO") ? dataRow[columns.IndexOf("ADDITIONALINFO")].ToString() : string.Empty,
  350:                                         CRTID = columns.Contains("CRTID") ? dataRow[columns.IndexOf("CRTID")].ToString() : string.Empty,
  351:                                         CRTADDR = columns.Contains("CRTADDR") ? dataRow[columns.IndexOf("CRTADDR")].ToString() : string.Empty,
  352:                                         CRTTEL = columns.Contains("CRTTEL") ? dataRow[columns.IndexOf("CRTTEL")].ToString() : string.Empty,
  353:                                         CRTDATE = columns.Contains("CRTDATE") ? dataRow[columns.IndexOf("CRTDATE")].ToString() : string.Empty,
  354:                                         REMARK = columns.Contains("REMARK") ? dataRow[columns.IndexOf("REMARK")].ToString() : string.Empty,
  355:                                         TYPE = columns.Contains("TYPE") ? dataRow[columns.IndexOf("TYPE")].ToString() : string.Empty,
  356:                                         NERATELIST = columns.Contains("NERATELIST") ? dataRow[columns.IndexOf("NERATELIST")].ToString() : string.Empty,
  357:                                         NEPROV = columns.Contains("NEPROV") ? dataRow[columns.IndexOf("NEPROV")].ToString() : string.Empty,
  358:                                         TOPXY = columns.Contains("TOPXY") ? dataRow[columns.IndexOf("TOPXY")].ToString() : string.Empty,
  359:                                         EMSID = columns.Contains("EMSID") ? dataRow[columns.IndexOf("EMSID")].ToString() : string.Empty,
  360:                                         ALIAS = columns.Contains("ALIAS") ? dataRow[columns.IndexOf("ALIAS")].ToString() : string.Empty,
  361:                                         PCBVER = columns.Contains("PCBVER") ? dataRow[columns.IndexOf("PCBVER")].ToString() : string.Empty,
  362:                                         MAINTAINID = columns.Contains("MAINTAINID") ? dataRow[columns.IndexOf("MAINTAINID")].ToString() : string.Empty,
  363:                                         MAINTAINADDR = columns.Contains("MAINTAINADDR") ? dataRow[columns.IndexOf("MAINTAINADDR")].ToString() : string.Empty,
  364:                                         MAINTAINTEL = columns.Contains("MAINTAINTEL") ? dataRow[columns.IndexOf("MAINTAINTEL")].ToString() : string.Empty,
  365:                                         REGISTERSTAT = columns.Contains("REGISTERSTAT") ? dataRow[columns.IndexOf("REGISTERSTAT")].ToString() : string.Empty,
  366:                                     };
  367:  
  368:                                     nddOnt = Ia.Ftn.Cl.Models.Business.Default.NddOntFromHuaweiEmsAccessNameFormat(devDev);
  369:                                     if (nddOnt != null) newDev.Access = (from a in db.Accesses where a.Id == nddOnt.Access.Id select a).SingleOrDefault();
  370:  
  371:                                     if (dev == null)
  372:                                     {
  373:                                         devByDev = (from d in devList where d.DEV == devDev select d).SingleOrDefault();
  374:  
  375:                                         if (devByDev == null)
  376:                                         {
  377:                                             newDev.Created = newDev.Updated = DateTime.UtcNow.AddHours(3);
  378:  
  379:                                             db.EmsDevs.Add(newDev);
  380:  
  381:                                             insertedItemCount++;
  382:                                         }
  383:                                         else
  384:                                         {
  385:                                             throw new Exception("Ia.Ftn.Cl.Model.Data.Huawei.Dev.Update(): There is alreay a Dev with the same name: " + devDev + " but different Id. You should check the database and maybe delete the current, old dev entry. ");
  386:                                         }
  387:                                     }
  388:                                     else // update
  389:                                     {
  390:                                         // below: copy values from newDev to dev
  391:  
  392:                                         if (dev.Update(newDev))
  393:                                         {
  394:                                             db.EmsDevs.Attach(dev);
  395:                                             db.Entry(dev).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
  396:  
  397:                                             updatedItemCount++;
  398:                                         }
  399:                                     }
  400:  
  401:                                     itemIdList.Add(id); // keep at the end
  402:                                 }
  403:  
  404:                                 // below: this function will remove values that were not present in the reading
  405:                                 if (devList.Count > 0)
  406:                                 {
  407:                                     foreach (Ia.Ftn.Cl.Models.Huawei.EmsDev de in devList)
  408:                                     {
  409:                                         if (!itemIdList.Contains(de.Id))
  410:                                         {
  411:                                             dev = (from ed in db.EmsDevs where ed.Id == de.Id select ed).SingleOrDefault();
  412:  
  413:                                             db.EmsDevs.Remove(dev);
  414:  
  415:                                             deletedItemCount++;
  416:                                         }
  417:                                     }
  418:                                 }
  419:                             }
  420:                             else
  421:                             {
  422:                                 // below: remove all values since reading was empty
  423:  
  424:                                 if (devList.Count > 0)
  425:                                 {
  426:                                     foreach (Ia.Ftn.Cl.Models.Huawei.EmsDev de in devList)
  427:                                     {
  428:                                         dev = (from ed in db.EmsDevs where ed.Id == de.Id select ed).SingleOrDefault();
  429:  
  430:                                         db.EmsDevs.Remove(dev);
  431:  
  432:                                         deletedItemCount++;
  433:                                     }
  434:                                 }
  435:                             }
  436:                         }
  437:                         else
  438:                         {
  439:                             result.AddWarning("LST-DEV (" + response.Ctag + "): Ia.Ftn.Cl.Model.Data.Huawei.Dev.Update() Unknown parameters in command: " + queryCommand);
  440:                         }
  441:  
  442:                         try
  443:                         {
  444:                             db.SaveChanges();
  445:                         }
  446:                         catch (Exception ex)
  447:                         {
  448:  
  449:                         }
  450:                     }
  451:  
  452:                     if (insertedItemCount != 0 || updatedItemCount != 0 || deletedItemCount != 0) isUpdated = true;
  453:                     else isUpdated = false;
  454:  
  455:                     result.AddSuccess("LST-DEV (" + response.Ctag + "): (" + readItemCount + "/" + existingItemCount + "/" + insertedItemCount + "," + updatedItemCount + "," + deletedItemCount + ")");
  456:                 }
  457:                 else
  458:                 {
  459:                     result.AddWarning("LST-DEV (" + response.Ctag + "): QueryDataTable is null, (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  460:                 }
  461:             }
  462:             else
  463:             {
  464:                 result.AddWarning("LST-DEV (" + response.Ctag + "): (" + response.CompletionCode + ", " + response.ResultCode.ToString() + ")");
  465:             }
  466:  
  467:             return isUpdated;
  468:         }
  469:  
  470:         ////////////////////////////////////////////////////////////////////////////
  471:  
  472:         /// <summary>
  473:         ///
  474:         /// </summary>
  475:         public static bool UpdateResultCode(int emsDevDid, Ia.Ftn.Cl.Models.Client.Huawei.Ems.ResultCode resultCode)
  476:         {
  477:             // similar to Ia.Ftn.Cl.Model.Data.Huawei.Ont.UpdateResultCode();
  478:             bool isUpdated;
  479:  
  480:             using (var db = new Ia.Ftn.Cl.Db())
  481:             {
  482:                 if (emsDevDid > 0)
  483:                 {
  484:                     var updatedDev = (from o in db.EmsDevs where o.DID == emsDevDid select o).SingleOrDefault();
  485:  
  486:                     if (updatedDev != null)
  487:                     {
  488:                         if (updatedDev.ResultCode != (long)resultCode)
  489:                         {
  490:                             updatedDev.ResultCode = (long)resultCode;
  491:                             updatedDev.Updated = DateTime.UtcNow.AddHours(3);
  492:  
  493:                             db.EmsDevs.Attach(updatedDev);
  494:                             db.Entry(updatedDev).Property(u => u.ResultCode).IsModified = true;
  495:                             db.Entry(updatedDev).Property(u => u.Updated).IsModified = true;
  496:  
  497:                             db.SaveChanges();
  498:  
  499:                             isUpdated = true;
  500:                             //result.AddSuccess("EmsDevs.ResultCode updated. ");
  501:                         }
  502:                         else
  503:                         {
  504:                             isUpdated = false;
  505:                             // result.AddWarning("Warning: EmsDevs.ResultCode value was not updated because its the same. ");
  506:                         }
  507:                     }
  508:                     else
  509:                     {
  510:                         isUpdated = false;
  511:                         // result.AddError("Error: updatedDev is null. ");
  512:                     }
  513:                 }
  514:                 else
  515:                 {
  516:                     isUpdated = false;
  517:                 }
  518:             }
  519:  
  520:             return isUpdated;
  521:         }
  522:  
  523:         ////////////////////////////////////////////////////////////////////////////
  524:  
  525:         /// <summary>
  526:         ///
  527:         /// </summary>
  528:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> List()
  529:         {
  530:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  531:  
  532:             using (var db = new Ia.Ftn.Cl.Db())
  533:             {
  534:                 list = (from ed in db.EmsDevs select ed).AsNoTracking().ToList();
  535:             }
  536:  
  537:             return list;
  538:         }
  539:  
  540:         ////////////////////////////////////////////////////////////////////////////
  541:  
  542:         /// <summary>
  543:         ///
  544:         /// </summary>
  545:         public static List<string> DevList()
  546:         {
  547:             List<string> list;
  548:  
  549:             using (var db = new Ia.Ftn.Cl.Db())
  550:             {
  551:                 list = (from ed in db.EmsDevs select ed.DEV).ToList();
  552:             }
  553:  
  554:             return list;
  555:         }
  556:  
  557:         ////////////////////////////////////////////////////////////////////////////
  558:  
  559:         /// <summary>
  560:         ///
  561:         /// </summary>
  562:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> ListByMA5616DevType()
  563:         {
  564:             return ListByDevType("MA5616");
  565:         }
  566:  
  567:         ////////////////////////////////////////////////////////////////////////////
  568:  
  569:         /// <summary>
  570:         ///
  571:         /// </summary>
  572:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> ListByDevType(string devType)
  573:         {
  574:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  575:  
  576:             using (var db = new Ia.Ftn.Cl.Db())
  577:             {
  578:                 list = (from ed in db.EmsDevs where ed.DT == devType select ed).ToList();
  579:             }
  580:  
  581:             return list;
  582:         }
  583:  
  584:         ////////////////////////////////////////////////////////////////////////////
  585:  
  586:         /// <summary>
  587:         ///
  588:         /// </summary>
  589:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev Read(int id)
  590:         {
  591:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  592:  
  593:             using (var db = new Ia.Ftn.Cl.Db())
  594:             {
  595:                 item = (from ed in db.EmsDevs where ed.Id == id select ed).SingleOrDefault();
  596:             }
  597:  
  598:             return item;
  599:         }
  600:  
  601:         ////////////////////////////////////////////////////////////////////////////
  602:  
  603:         /// <summary>
  604:         ///
  605:         /// </summary>
  606:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev ReadByEmsName(string emsName)
  607:         {
  608:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  609:  
  610:             using (var db = new Ia.Ftn.Cl.Db())
  611:             {
  612:                 item = (from ed in db.EmsDevs where ed.DEV == emsName select ed).SingleOrDefault();
  613:             }
  614:  
  615:             return item;
  616:         }
  617:  
  618:         ////////////////////////////////////////////////////////////////////////////
  619:  
  620:         /// <summary>
  621:         ///
  622:         /// </summary>
  623:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev ReadByDev(string dev)
  624:         {
  625:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  626:  
  627:             using (var db = new Ia.Ftn.Cl.Db())
  628:             {
  629:                 item = (from ed in db.EmsDevs where ed.DEV == dev select ed).SingleOrDefault();
  630:             }
  631:  
  632:             return item;
  633:         }
  634:  
  635:         ////////////////////////////////////////////////////////////////////////////
  636:  
  637:         /// <summary>
  638:         ///
  639:         /// </summary>
  640:         public static Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type ReadTypeByDev(string dev)
  641:         {
  642:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type type;
  643:  
  644:             if (Ia.Ftn.Cl.Models.Data.Huawei.Dev.DevToTypeDictionary.ContainsKey(dev))
  645:             {
  646:                 type = devToTypeDictionary[dev];
  647:             }
  648:             else type = Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Unknown;
  649:  
  650:             return type;
  651:         }
  652:  
  653:         ////////////////////////////////////////////////////////////////////////////
  654:  
  655:         /// <summary>
  656:         ///
  657:         /// </summary>
  658:         public static Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type ReadTypeByDid(int did)
  659:         {
  660:             Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type type;
  661:  
  662:             var d = DidToTypeDictionary;
  663:  
  664:             type = (d.ContainsKey(did)) ? d[did] : Ia.Ftn.Cl.Models.Business.Huawei.Dev.Type.Unknown;
  665:  
  666:             return type;
  667:         }
  668:  
  669:         ////////////////////////////////////////////////////////////////////////////
  670:  
  671:         /// <summary>
  672:         ///
  673:         /// </summary>
  674:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev ReadByDid(int did)
  675:         {
  676:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  677:  
  678:             using (var db = new Ia.Ftn.Cl.Db())
  679:             {
  680:                 item = (from ed in db.EmsDevs where ed.DID == did select ed).SingleOrDefault();
  681:             }
  682:  
  683:             return item;
  684:         }
  685:  
  686:         ////////////////////////////////////////////////////////////////////////////
  687:  
  688:         /// <summary>
  689:         ///
  690:         /// </summary>
  691:         public static Ia.Ftn.Cl.Models.Huawei.EmsDev ReadByAccessId(string accessId)
  692:         {
  693:             Ia.Ftn.Cl.Models.Huawei.EmsDev item;
  694:  
  695:             using (var db = new Ia.Ftn.Cl.Db())
  696:             {
  697:                 item = (from ed in db.EmsDevs where ed.Access != null && ed.Access.Id == accessId select ed).SingleOrDefault();
  698:             }
  699:  
  700:             return item;
  701:         }
  702:  
  703:         ////////////////////////////////////////////////////////////////////////////
  704:  
  705:         /// <summary>
  706:         /// Return Devs with similar names
  707:         /// </summary>
  708:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> RedundantDevList()
  709:         {
  710:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> devs;
  711:  
  712:             using (var db = new Ia.Ftn.Cl.Db())
  713:             {
  714:                 // select * from EmsDevs ed1 left outer join EmsDevs ed2 on ed1.DEV = ed2.DEV where ed1.Id <> ed2.Id
  715:  
  716:                 devs = (from ed1 in db.EmsDevs
  717:                         join ed2 in db.EmsDevs on ed1.DEV equals ed2.DEV
  718:                         where ed2.DID != ed2.DID
  719:                         select ed1).AsNoTracking().ToList();
  720:             }
  721:  
  722:             return devs;
  723:         }
  724:  
  725:         ////////////////////////////////////////////////////////////////////////////
  726:  
  727:         /// <summary>
  728:         ///
  729:         /// </summary>
  730:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> OltDevList()
  731:         {
  732:             var oltDtType = new List<string>() { "MA5600T", "MA5603T" };
  733:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  734:  
  735:             list = new List<Ia.Ftn.Cl.Models.Huawei.EmsDev>();
  736:  
  737:             using (var db = new Ia.Ftn.Cl.Db())
  738:             {
  739:                 list = (from ed in db.EmsDevs
  740:                         where oltDtType.Contains(ed.DT) && ed.DEV.Contains("OLT")
  741:                         select ed).ToList();
  742:             }
  743:  
  744:             return list;
  745:         }
  746:  
  747:         ////////////////////////////////////////////////////////////////////////////
  748:  
  749:         /// <summary>
  750:         ///
  751:         /// </summary>
  752:         public static List<string> OltDevDevList()
  753:         {
  754:             var list = new List<string>();
  755:  
  756:             var oltDevList = Ia.Ftn.Cl.Models.Data.Huawei.Dev.OltDevList();
  757:  
  758:             foreach (var dev in oltDevList)
  759:             {
  760:                 list.Add(dev.DEV);
  761:             }
  762:  
  763:             return list;
  764:         }
  765:  
  766:         ////////////////////////////////////////////////////////////////////////////
  767:  
  768:         /// <summary>
  769:         ///
  770:         /// </summary>
  771:         public static List<Ia.Ftn.Cl.Models.Huawei.EmsDev> MsanDevList()
  772:         {
  773:             List<Ia.Ftn.Cl.Models.Huawei.EmsDev> list;
  774:  
  775:             using (var db = new Ia.Ftn.Cl.Db())
  776:             {
  777:                 list = (from ed in db.EmsDevs where ed.DEV.Contains("_MSAN_") select ed).AsNoTracking().ToList();
  778:             }
  779:  
  780:             return list;
  781:         }
  782:  
  783:         ////////////////////////////////////////////////////////////////////////////
  784:  
  785:         /// <summary>
  786:         ///
  787:         /// </summary>
  788:         public static List<string> MsanDevDevList()
  789:         {
  790:             List<string> list;
  791:  
  792:             using (var db = new Ia.Ftn.Cl.Db())
  793:             {
  794:                 list = (from ed in db.EmsDevs where ed.DEV.Contains("_MSAN_") select ed.DEV).AsNoTracking().ToList();
  795:             }
  796:  
  797:             return list;
  798:         }
  799:  
  800:         ////////////////////////////////////////////////////////////////////////////
  801:  
  802:         /// <summary>
  803:         ///
  804:         /// </summary>
  805:         public static List<int> MsanDevDidList()
  806:         {
  807:             List<int> list;
  808:  
  809:             using (var db = new Ia.Ftn.Cl.Db())
  810:             {
  811:                 list = (from ed in db.EmsDevs where ed.DEV.Contains("_MSAN_") select ed.DID).ToList();
  812:             }
  813:  
  814:             return list;
  815:         }
  816:  
  817:         ////////////////////////////////////////////////////////////////////////////
  818:  
  819:         /// <summary>
  820:         ///
  821:         /// </summary>
  822:         public static Dictionary<int, int> MsanDidToSiteIdDictionary()
  823:         {
  824:             Dictionary<int, int> dictionary;
  825:  
  826:             var msanDevList = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList;
  827:  
  828:             dictionary = new Dictionary<int, int>();
  829:  
  830:             foreach (var msanDev in msanDevList)
  831:             {
  832:                 dictionary[msanDev.Did] = msanDev.Msan.Site.Id;
  833:             }
  834:  
  835:             return dictionary;
  836:         }
  837:  
  838:         ////////////////////////////////////////////////////////////////////////////
  839:  
  840:         /// <summary>
  841:         ///
  842:         /// </summary>
  843:         public static Dictionary<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Site, List<int>> MsanSiteToDidListDictionary()
  844:         {
  845:             var msanDevList = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList;
  846:  
  847:             var dictionary = new Dictionary<Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Site, List<int>>();
  848:  
  849:             foreach (var msanDev in msanDevList)
  850:             {
  851:                 var site = msanDev.Msan.Site;
  852:  
  853:                 if (!dictionary.ContainsKey(site)) dictionary[site] = new List<int>();
  854:  
  855:                 dictionary[site].Add(msanDev.Did);
  856:             }
  857:  
  858:             return dictionary;
  859:         }
  860:  
  861:         ////////////////////////////////////////////////////////////////////////////
  862:  
  863:         /// <summary>
  864:         ///
  865:         /// </summary>
  866:         public static Dictionary<int, List<int>> MsanSiteIdToDidListDictionary()
  867:         {
  868:             Dictionary<int, List<int>> dictionary;
  869:  
  870:             var msanDevList = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList;
  871:  
  872:             dictionary = new Dictionary<int, List<int>>();
  873:  
  874:             foreach (var msanDev in msanDevList)
  875:             {
  876:                 var id = msanDev.Msan.Site.Id;
  877:  
  878:                 if (!dictionary.ContainsKey(id)) dictionary[id] = new List<int>();
  879:  
  880:                 dictionary[id].Add(msanDev.Did);
  881:             }
  882:  
  883:             return dictionary;
  884:         }
  885:  
  886:         ////////////////////////////////////////////////////////////////////////////
  887:  
  888:         /// <summary>
  889:         ///
  890:         /// </summary>
  891:         public static Dictionary<int, int> MsanSiteIdToCapacityDictionary()
  892:         {
  893:             Dictionary<int, int> dictionary;
  894:  
  895:             var msanDevList = Ia.Ftn.Cl.Models.Data.Huawei.Default.MsanDevList;
  896:  
  897:             dictionary = new Dictionary<int, int>();
  898:  
  899:             foreach (var msanDev in msanDevList)
  900:             {
  901:                 var id = msanDev.Msan.Site.Id;
  902:  
  903:                 if (!dictionary.ContainsKey(id)) dictionary[id] = 0;
  904:  
  905:                 dictionary[id] += msanDev.Capacity;
  906:             }
  907:  
  908:             return dictionary;
  909:         }
  910:  
  911:         ////////////////////////////////////////////////////////////////////////////
  912:  
  913:         /// <summary>
  914:         ///
  915:         /// </summary>
  916:         public static bool NullifyAccessIdByAccessId(string accessId, out string result)
  917:         {
  918:             bool b;
  919:             int numberOfRecordsWhereAccessIsNullified;
  920:             Ia.Ftn.Cl.Models.Huawei.EmsDev dev;
  921:  
  922:             b = false;
  923:             numberOfRecordsWhereAccessIsNullified = 0;
  924:  
  925:             using (var db = new Ia.Ftn.Cl.Db())
  926:             {
  927:                 // --update EmsOnts set Access_Id = null where Access_Id = '1040101010040004'
  928:                 //var query = (from eo in db.EmsOnts where eo.Access.Id == accessId select eo).ToList();
  929:  
  930:                 //foreach (var v in query)
  931:                 //{
  932:                 dev = (from o in db.EmsDevs where o.Access.Id == accessId select o).Include(u => u.Access).FirstOrDefault(); //.SingleOrDefault();
  933:  
  934:                 if (dev != null)
  935:                 {
  936:                     dev.Access = null;
  937:                     dev.Updated = DateTime.UtcNow.AddHours(3);
  938:  
  939:                     db.EmsDevs.Attach(dev);
  940:                     db.Entry(dev).Property(u => u.Updated).IsModified = true;
  941:  
  942:                     db.SaveChanges();
  943:  
  944:                     numberOfRecordsWhereAccessIsNullified++;
  945:                 }
  946:                 //}
  947:  
  948:                 b = true;
  949:             }
  950:  
  951:             result = "Number of records where access is nullified: " + numberOfRecordsWhereAccessIsNullified;
  952:  
  953:             return b;
  954:         }
  955:  
  956:         ////////////////////////////////////////////////////////////////////////////
  957:  
  958:         /// <summary>
  959:         ///
  960:         /// </summary>
  961:         public static string EmsDevDevByEmsDevDid(int did)
  962:         {
  963:             string s;
  964:             var didToDevDictionary = Ia.Ftn.Cl.Models.Data.Huawei.Dev.DidToDevDictionary;
  965:  
  966:             if (didToDevDictionary.ContainsKey(did)) s = didToDevDictionary[did];
  967:             else s = string.Empty;
  968:  
  969:             return s;
  970:         }
  971:  
  972:         ////////////////////////////////////////////////////////////////////////////
  973:         ////////////////////////////////////////////////////////////////////////////
  974:  
  975:         /// <summary>
  976:         ///
  977:         /// </summary>
  978:         public static string ToSimpleTextString(Ia.Ftn.Cl.Models.Huawei.EmsDev emsDev)
  979:         {
  980:             StringBuilder sb;
  981:  
  982:             sb = new StringBuilder();
  983:  
  984:             sb.AppendLine("DID: " + emsDev.DID);
  985:             sb.AppendLine("DEV: " + emsDev.DEV);
  986:             sb.AppendLine("DEVIP: " + emsDev.DEVIP);
  987:             sb.AppendLine("DT: " + emsDev.DT);
  988:             sb.AppendLine("DVER: " + emsDev.DVER);
  989:             sb.AppendLine("DSTAT: " + emsDev.DSTAT);
  990:  
  991:             return sb.ToString();
  992:         }
  993:  
  994:         ////////////////////////////////////////////////////////////////////////////
  995:         ////////////////////////////////////////////////////////////////////////////
  996:     }
  997:  
  998:     ////////////////////////////////////////////////////////////////////////////
  999:     ////////////////////////////////////////////////////////////////////////////
 1000: }