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

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

Default mdaa network information support class for the Fixed Telecommunications Network business model

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Data;
    4: using System.IO;
    5: using System.Linq;
    6: using System.Text;
    7: using System.Text.Json;
    8: using System.Text.RegularExpressions;
    9: using System.Threading;
   10: using System.Threading.Tasks;
   11:  
   12: namespace Ia.Ftn.Cl.Models.Business.Mdaa
   13: {
   14:     ////////////////////////////////////////////////////////////////////////////
   15:  
   16:     /// <summary publish="true">
   17:     /// Default mdaa network information support class for the Fixed Telecommunications Network business model
   18:     /// </summary>
   19:     /// 
   20:     /// <remarks> 
   21:     /// Copyright © 2021-2022 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   22:     /// </remarks> 
   23:     public class Default
   24:     {
   25:         private static readonly string archive = @"\\Jabriya\Users\Public\Documents\Archive\Mdaa\";
   26:  
   27:         private static Ia.Ftn.Mdaa.Cl.Models.Business.DatabaseInformation databaseInformation = new Ia.Ftn.Mdaa.Cl.Models.Business.DatabaseInformation();
   28:  
   29:         private static Ia.Cl.Models.Db.Oracle oracle;
   30:  
   31:         private static readonly object objectLock = new object();
   32:  
   33:         public const bool ApplicationIsDisconnectedFromMinistryNetworkForDebugging = true;
   34:  
   35:         ////////////////////////////////////////////////////////////////////////////
   36:  
   37:         /// <summary>
   38:         ///
   39:         /// </summary>
   40:         public Default() { }
   41:  
   42:         ////////////////////////////////////////////////////////////////////////////
   43:  
   44:         /// <summary>
   45:         ///
   46:         /// </summary>
   47:         public static Ia.Cl.Models.Result InitializeOracleConnection()
   48:         {
   49:             var result = new Ia.Cl.Models.Result();
   50:  
   51:             if (!ApplicationIsDisconnectedFromMinistryNetworkForDebugging)
   52:             {
   53:                 //var oracleConnectionString = ConfigurationManager.ConnectionStrings["OracleConnection"].ToString();
   54:                 var oracleConnectionString = "DATA SOURCE = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.139)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = MOCDB))) IBM1 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.139)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = MOCDB) (INSTANCE_NAME=MOCDB1))) IBM2 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = MOCDB) (INSTANCE_NAME=MOCDB2)));PERSIST SECURITY INFO=True;USER ID=NGNUSER;PASSWORD=NGN;ENLIST=True";
   55:  
   56:                 try
   57:                 {
   58:                     oracle = new Ia.Cl.Models.Db.Oracle(oracleConnectionString);
   59:  
   60:                     oracle.Sql(Ia.Ftn.Cl.Models.Business.Mdaa.MinistryDatabase.AlterSessionOfCustomerDepartmentOracleDatabase);
   61:  
   62:                     result.AddSuccess("Initialize Oracle Connection: Success");
   63:                 }
   64:                 catch (Exception ex)
   65:                 {
   66:                     result.AddError("Initialize Oracle Connection: Error: Exception: " + ex.Message);
   67:                 }
   68:             }
   69:  
   70:             return result;
   71:         }
   72:  
   73:         ////////////////////////////////////////////////////////////////////////////
   74:  
   75:         /// <summary>
   76:         ///
   77:         /// </summary>
   78:         public static Ia.Cl.Models.Result Collect()
   79:         {
   80:             var result = new Ia.Cl.Models.Result();
   81:  
   82:             databaseInformation.Read();
   83:  
   84:             var tableList = databaseInformation.TableInformationList;
   85:  
   86:             var i = 0;
   87:             foreach (var table in tableList)
   88:             {
   89:                 var tableInformation = CollectTableInformationFromMocdbOracleDatabase(table.Name, table.Schema);
   90:  
   91:                 databaseInformation.Update(tableInformation);
   92:  
   93:                 result.AddSuccess("Collect: table name: " + table.Name + ", number: " + i++);
   94:  
   95:                 Thread.Sleep(2000);
   96:  
   97:                 //if (i == 4) break;
   98:             }
   99:  
  100:             return result;
  101:         }
  102:  
  103:         ////////////////////////////////////////////////////////////////////////////
  104:  
  105:         /// <summary>
  106:         ///
  107:         /// </summary>
  108:         public static Ia.Cl.Models.Result Analisys()
  109:         {
  110:             var result = new Ia.Cl.Models.Result();
  111:  
  112:             var stringBuilder = new StringBuilder();
  113:  
  114:             string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\analysis.html";
  115:  
  116:             databaseInformation.Read();
  117:  
  118:             stringBuilder.AppendLine(@"<html><head><style>
  119:   span {color:red;}
  120: </style></head><body><pre>");
  121:  
  122:             stringBuilder.AppendLine("Number of tables: " + databaseInformation.TableInformationList.Count);
  123:  
  124:             var i = 1000;
  125:             var c = (from ti in databaseInformation.TableInformationList where ti.Count > i select ti).Count();
  126:  
  127:             stringBuilder.AppendLine("Number of tables with over " + i + " records: " + c);
  128:  
  129:             stringBuilder.AppendLine("<hr/>");
  130:  
  131:             var distinctSchemaList = (from ti in databaseInformation.TableInformationList
  132:                                       where ti.Count > 0
  133:                                       select ti.Schema).Distinct();
  134:  
  135:             stringBuilder.AppendLine("Distinct Schema: " + string.Join(", ", distinctSchemaList));
  136:  
  137:             stringBuilder.AppendLine("<hr/>");
  138:  
  139:             stringBuilder.AppendLine("<dl>");
  140:  
  141:             foreach (var schema in distinctSchemaList)
  142:             {
  143:                 var tableList = (from ti in databaseInformation.TableInformationList
  144:                                  where ti.Schema == schema && ti.Count > 0
  145:                                  select ti).ToList();
  146:  
  147:                 //stringBuilder.AppendLine("Schema: " + schema); // tables: " + string.Join(", ", tableList.));
  148:                 //stringBuilder.AppendLine();
  149:  
  150:                 foreach (var table in tableList)
  151:                 {
  152:                     stringBuilder.AppendLine("<dt>Table: " + table.Name + ", Schema: " + table.Schema + ", Record count: <span>" + table.Count + "</span></dt>");
  153:  
  154:                     // "Desc": "COLUMN_NAME\tDATATYPE_LENGTH\t\r\nFEEDER_ID\tNUMBER(22)\t\r\nFEEDER_NAME\tVARCHAR2(300)\t\r\nMDF_PAIR\tNUMBER(22)\t\r\nREMARKS\tVARCHAR2(500)\t\r\nFEEDER_BOX_ID\tNUMBER(22)\t\r\nE_DATE\tDATE(7)\t\r\nE_USER\tVARCHAR2(30)\t\r\nL_DATE\tDATE(7)\t\r\nL_USER\tVARCHAR2(30)\t\r\n",
  155:                     //      "TopRecordText": "\r\n"
  156:  
  157:                     stringBuilder.AppendLine("<dd>");
  158:                     var desc = table.Desc;
  159:  
  160:                     stringBuilder.AppendLine("Database fields: ");
  161:                     stringBuilder.AppendLine(table.Desc);
  162:                     stringBuilder.AppendLine();
  163:                     stringBuilder.AppendLine("TopRecordText: ");
  164:                     stringBuilder.AppendLine(table.TopRecordText);
  165:                     stringBuilder.AppendLine("</dd>");
  166:  
  167:                     stringBuilder.AppendLine("<hr/>");
  168:                 }
  169:  
  170:                 stringBuilder.AppendLine("<hr/>");
  171:             }
  172:  
  173:             stringBuilder.AppendLine("</dl>");
  174:  
  175:             stringBuilder.AppendLine("</pre></body></html>");
  176:  
  177:             File.WriteAllText(filePath, stringBuilder.ToString());
  178:  
  179:             return result;
  180:         }
  181:  
  182:         ////////////////////////////////////////////////////////////////////////////
  183:  
  184:         /// <summary>
  185:         ///
  186:         /// </summary>
  187:         private static Ia.Ftn.Mdaa.Cl.Models.Business.TableInformation CollectTableInformationFromMocdbOracleDatabase(string tableName, string tableSchema)
  188:         {
  189:             int count;
  190:  
  191:             var countSql = "select count(*) from " + tableName;
  192:             var sql = "select * from " + tableName + " where rownum <= 10";
  193:  
  194:             var tableInformation = new Ia.Ftn.Mdaa.Cl.Models.Business.TableInformation();
  195:  
  196:             try
  197:             {
  198:                 var countString = oracle.Scalar(countSql);
  199:                 var descDt = oracle.Desc(tableName, tableSchema);
  200:                 var dt = oracle.Select(sql);
  201:  
  202:                 if (int.TryParse(countString, out count)) { }
  203:                 else count = 0;
  204:  
  205:                 tableInformation.Schema = tableSchema;
  206:                 tableInformation.Name = tableName;
  207:                 tableInformation.Count = count;
  208:                 tableInformation.Desc = Ia.Cl.Models.Default.GenerateTabSeparatedTextFromDataTable(descDt);
  209:                 tableInformation.TopRecordText = Ia.Cl.Models.Default.GenerateTabSeparatedTextFromDataTable(dt);
  210:             }
  211:             catch (Exception ex)
  212:             {
  213:  
  214:             }
  215:  
  216:             return tableInformation;
  217:         }
  218:  
  219:         ////////////////////////////////////////////////////////////////////////////
  220:  
  221:         /// <summary>
  222:         ///
  223:         /// </summary>
  224:         public static Ia.Cl.Models.Result ManageProperly(ref int properlySelectedHundredsSubdomainListIndex)
  225:         {
  226:             List<string> addedServiceList, removedServiceList;
  227:  
  228:             var result = new Ia.Cl.Models.Result();
  229:  
  230:             var hundredsSubdomain = Ia.Ftn.Cl.Models.Business.Mdaa.MinistryDatabase.ProperlySelectedHundredsSubdomainListItem(ref properlySelectedHundredsSubdomainListIndex, out int itemIndex, out int listCount);
  231:  
  232:             var dataTable = ReadHundredsSubdomainBalanceListItemDataTable(hundredsSubdomain);
  233:  
  234:             var serviceStateThatCrossedThresholdList = UpdateServiceStateThatCrossedThresholdList(hundredsSubdomain, dataTable, out addedServiceList, out removedServiceList);
  235:  
  236:             var s = string.Empty;
  237:  
  238:             if (hundredsSubdomain.PstnId != 0) s += "Legacy: " + hundredsSubdomain.Pstn.Name + ": ";
  239:             if (hundredsSubdomain.RouterId != 0) s += "Ims: " + hundredsSubdomain.Router.Name + ": ";
  240:  
  241:             var r = s
  242:                 + hundredsSubdomain.FirstServiceNumber + "-" + hundredsSubdomain.LastServiceNumber + " "
  243:                 + "(" + itemIndex + "/" + listCount + "): "
  244:                 + "list (total): " + serviceStateThatCrossedThresholdList.Count + " (" + Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateThatCrossedThresholdList.Count + "), "
  245:                 + "added (total): " + addedServiceList.Count + " (" + Ia.Ftn.Cl.Models.Data.MinistryDatabase.AddedServiceList.Count + "), "
  246:                 + "removed (total): " + removedServiceList.Count + " (" + Ia.Ftn.Cl.Models.Data.MinistryDatabase.RemovedServiceList.Count + ")";
  247:  
  248:             result.AddSuccess(r);
  249:  
  250:             return result;
  251:         }
  252:  
  253:         ////////////////////////////////////////////////////////////////////////////
  254:  
  255:         /// <summary>
  256:         ///
  257:         /// </summary>4
  258:         public static Ia.Cl.Models.Result ManageTransaction()
  259:         {
  260:             var result = new Ia.Cl.Models.Result();
  261:  
  262:             var serviceTransactionList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceTransactionList;
  263:  
  264:             var latestTransactionId = serviceTransactionList.Count > 0 ? serviceTransactionList.Max(u => u.TransactionId) : 0;
  265:  
  266:             var dataTable = ReadPaymentTransactionOfThePreviousNDaysServiceDataTable(latestTransactionId, 2);
  267:  
  268:             serviceTransactionList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceSerialTransactionIdDateTimeListFromTransactionListDataTable(dataTable);
  269:  
  270:             Ia.Ftn.Cl.Models.Data.MinistryDatabase.Update(serviceTransactionList, out List<string> addedServiceTransactionList);
  271:  
  272:             var r =
  273:                 "list (total): " + serviceTransactionList.Count + " (" + Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceTransactionList.Count + "), "
  274:                 + "added: " + addedServiceTransactionList.Count;
  275:  
  276:             result.AddSuccess(r);
  277:  
  278:             return result;
  279:         }
  280:  
  281:         ////////////////////////////////////////////////////////////////////////////
  282:  
  283:         /// <summary>
  284:         ///
  285:         /// </summary>
  286:         public static Ia.Cl.Models.Result ManageAnalyzeTransaction()
  287:         {
  288:             List<string> addedServiceList, removedServiceList;
  289:  
  290:             var result = new Ia.Cl.Models.Result();
  291:  
  292:             var examinedServiceTransactionIdList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ExaminedServiceTransactionIdList;
  293:  
  294:             var serviceTransactionList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceTransactionList; // note that ServiceTransactionList is not sorted here, it will be sorted just below
  295:  
  296:             var serviceTransaction = (from st in serviceTransactionList
  297:                                       where !examinedServiceTransactionIdList.Contains(st.TransactionId)
  298:                                       select st).OrderBy(u => u.TransactionId).LastOrDefault();
  299:  
  300:             var r = string.Empty;
  301:  
  302:             if (!string.IsNullOrEmpty(serviceTransaction.Service))
  303:             {
  304:                 r = "reading: " + serviceTransaction.Service;
  305:  
  306:                 var dataTable = ReadASingleServiceNumberBalanceDataTable(int.Parse(serviceTransaction.Service));
  307:  
  308:                 if (dataTable != null)
  309:                 {
  310:                     var hundredsSubdomain = new Ia.Ftn.Cl.Models.Business.Service.HundredsSubdomain(serviceTransaction.Service);
  311:  
  312:                     if (hundredsSubdomain.Subdomain != 0)
  313:                     {
  314:                         var serviceStateThatCrossedThresholdList = UpdateServiceStateThatCrossedThresholdList(hundredsSubdomain, dataTable, out addedServiceList, out removedServiceList);
  315:  
  316:                         Ia.Ftn.Cl.Models.Data.MinistryDatabase.ExaminedServiceTransactionIdList.Add(serviceTransaction.TransactionId);
  317:                     }
  318:                     else
  319:                     {
  320:                         Ia.Ftn.Cl.Models.Data.MinistryDatabase.ExaminedServiceTransactionIdList.Add(serviceTransaction.TransactionId);
  321:                     }
  322:                 }
  323:                 else
  324:                 {
  325:                 }
  326:             }
  327:             else r = "reading: no pending services to read";
  328:  
  329:             result.AddSuccess(r);
  330:  
  331:             return result;
  332:         }
  333:  
  334:         ////////////////////////////////////////////////////////////////////////////
  335:  
  336:         /// <summary>
  337:         ///
  338:         /// </summary>
  339:         public static async Task<Ia.Cl.Models.Result> ManageMessageQueue()
  340:         {
  341:             var result = new Ia.Cl.Models.Result();
  342:  
  343:             var count = await Ia.Ftn.Cl.Models.Data.MessageQueue.MdaaApplication.CountAsync;
  344:  
  345:             if (count > 0)
  346:             {
  347:                 var message = await Ia.Ftn.Cl.Models.Data.MessageQueue.MdaaApplication.DequeueAsync;
  348:  
  349:                 if (message != null)
  350:                 {
  351:                     if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadService)
  352:                     {
  353:  
  354:                         result.AddSuccess(message.Service);
  355:                     }
  356:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.Synchronize)
  357:                     {
  358:                         //var r = ManageSynchronization();
  359:  
  360:                         //result.AddResult(r);
  361:                     }
  362:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ActiveApplicationRunningPermissionState)
  363:                     {
  364:                         Ia.Ftn.Cl.Models.Business.Default.PermitActiveApplicationsToRun = message.State;
  365:  
  366:                         result.AddSuccess("PermitActiveApplicationsToRun: " + message.State);
  367:                     }
  368:                     else
  369:                     {
  370:                         throw new ArgumentOutOfRangeException("MessageQueue process " + message.Process.ToString() + " is undefined");
  371:                     }
  372:                 }
  373:                 else
  374:                 {
  375:                 }
  376:             }
  377:             else
  378:             {
  379:             }
  380:  
  381:             return result;
  382:         }
  383:  
  384:         ////////////////////////////////////////////////////////////////////////////
  385:  
  386:         /// <summary>
  387:         ///
  388:         /// </summary>
  389:         private static List<Ia.Ftn.Cl.Models.Business.Mdaa.MinistryDatabase.ServiceState> UpdateServiceStateThatCrossedThresholdList(Ia.Ftn.Cl.Models.Business.Service.HundredsSubdomain hundredsSubdomain, DataTable dataTable, out List<string> addedServiceList, out List<string> removedServiceList)
  390:         {
  391:             var serviceStateList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateListFromHundredsSubdomainListDataTable(hundredsSubdomain, dataTable);
  392:  
  393:             var serviceStateWithLatestSerialList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.FilterServiceStateListByServicesWithLatestSerial(serviceStateList);
  394:  
  395:             var serviceStateThatCrossedThresholdList = Ia.Ftn.Cl.Models.Data.MinistryDatabase.FilterServiceStateListByServicesThatCrossedAdministrativeDisconnectionBalanceThresholdList(serviceStateWithLatestSerialList);
  396:  
  397:             Ia.Ftn.Cl.Models.Data.MinistryDatabase.Update(hundredsSubdomain, serviceStateThatCrossedThresholdList, out addedServiceList, out removedServiceList);
  398:  
  399:             return serviceStateThatCrossedThresholdList;
  400:         }
  401:  
  402:         ////////////////////////////////////////////////////////////////////////////
  403:  
  404:         /// <summary>
  405:         ///
  406:         /// </summary>
  407:         public static Ia.Cl.Models.Result ManageSynchronization()
  408:         {
  409:             var result = new Ia.Cl.Models.Result();
  410:  
  411:             var addedList = new List<string>();
  412:             var removedList = new List<string>();
  413:  
  414:             foreach (var service in Ia.Ftn.Cl.Models.Data.MinistryDatabase.AddedServiceList)
  415:             {
  416:                 var task = Ia.Cl.Models.Http.PostAsync("http://ftn", "api/v2/service-request-administrative-issues/" + service);
  417:                 task.Wait();
  418:                 var v = task.Result;
  419:  
  420:                 if (v.Contains(@"""IsSuccessful"":true")) addedList.Add(service);
  421:             }
  422:  
  423:             foreach (var service in Ia.Ftn.Cl.Models.Data.MinistryDatabase.RemovedServiceList)
  424:             {
  425:                 var task = Ia.Cl.Models.Http.DeleteAsync("http://ftn", "api/v2/service-request-administrative-issues/" + service);
  426:                 task.Wait();
  427:                 var v = task.Result;
  428:  
  429:                 if (v.Contains(@"""IsSuccessful"":true")) removedList.Add(service);
  430:             }
  431:  
  432:             foreach (var v in addedList)
  433:             {
  434:                 Ia.Ftn.Cl.Models.Data.MinistryDatabase.AddedServiceList.Remove(v);
  435:             }
  436:  
  437:             foreach (var v in removedList)
  438:             {
  439:                 Ia.Ftn.Cl.Models.Data.MinistryDatabase.RemovedServiceList.Remove(v);
  440:             }
  441:  
  442:             var r = " added service list: [" + string.Join(" ", addedList) + "], removed service list: [" + string.Join(" ", removedList) + "] ";
  443:  
  444:             result.AddSuccess(r);
  445:  
  446:             return result;
  447:         }
  448:  
  449:         ////////////////////////////////////////////////////////////////////////////
  450:  
  451:         /// <summary>
  452:         ///
  453:         /// </summary>
  454:         public static Ia.Cl.Models.Result Information()
  455:         {
  456:             var result = new Ia.Cl.Models.Result();
  457:  
  458:             var r = "ExaminedServiceTransactionIdList count: " + Ia.Ftn.Cl.Models.Data.MinistryDatabase.ExaminedServiceTransactionIdList.Count + "\r\n"
  459:         + "AddedServiceList count: " + Ia.Ftn.Cl.Models.Data.MinistryDatabase.AddedServiceList.Count + "\r\n"
  460:         + "RemovedServiceList count: " + Ia.Ftn.Cl.Models.Data.MinistryDatabase.RemovedServiceList.Count + "\r\n"
  461:         + "ServiceStateThatCrossedThresholdList count: " + Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateThatCrossedThresholdList.Count + "\r\n"
  462:         + "ServiceStateThatCrossedThresholdList: " + string.Join(", ", Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateThatCrossedThresholdList.Select(u => u.Service)) + "\r\n"
  463:         + "ServiceTransactionList count: " + Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceTransactionList.Count + "\r\n";
  464:  
  465:             result.AddSuccess(r);
  466:  
  467:             return result;
  468:         }
  469:  
  470:         ////////////////////////////////////////////////////////////////////////////
  471:  
  472:         /// <summary>
  473:         ///
  474:         /// </summary>
  475:         public static DataTable ReadHundredsSubdomainBalanceListItemDataTable(Ia.Ftn.Cl.Models.Business.Service.HundredsSubdomain hundredsSubdomain)
  476:         {
  477:             DataTable dateTable = null;
  478:  
  479:             var sql = Ia.Ftn.Cl.Models.Data.MinistryDatabase.OracleSqlCommandToReadBalanceForRangeOfAHundredsSubdomain(hundredsSubdomain);
  480:  
  481:             if (oracle != null)
  482:             {
  483:                 try
  484:                 {
  485:                     dateTable = oracle.Select(sql);
  486:                 }
  487:                 catch (Exception)
  488:                 {
  489:                     InitializeOracleConnection();
  490:  
  491:                     dateTable = oracle.Select(sql);
  492:                 }
  493:             }
  494:  
  495:             if (dateTable != null) dateTable.TableName = sql;
  496:  
  497:             return dateTable;
  498:         }
  499:  
  500:         ////////////////////////////////////////////////////////////////////////////
  501:  
  502:         /// <summary>
  503:         ///
  504:         /// </summary>
  505:         public static DataTable ReadASingleServiceNumberBalanceDataTable(int serviceNumber)
  506:         {
  507:             DataTable dateTable = null;
  508:  
  509:             var sql = Ia.Ftn.Cl.Models.Data.MinistryDatabase.OracleSqlCommandToReadBalanceOfASingleServiceNumber(serviceNumber);
  510:  
  511:             if (oracle != null)
  512:             {
  513:                 try
  514:                 {
  515:                     dateTable = oracle.Select(sql);
  516:                 }
  517:                 catch (Exception)
  518:                 {
  519:                     InitializeOracleConnection();
  520:  
  521:                     dateTable = oracle.Select(sql);
  522:                 }
  523:             }
  524:  
  525:             if (dateTable != null) dateTable.TableName = sql;
  526:  
  527:             return dateTable;
  528:         }
  529:  
  530:         ////////////////////////////////////////////////////////////////////////////
  531:  
  532:         /// <summary>
  533:         ///
  534:         /// </summary>
  535:         public static void SaveServiceStateThatCrossedThresholdListToFile()
  536:         {
  537:             var list = Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateThatCrossedThresholdList;
  538:  
  539:             var jsonSerializerOptions = new JsonSerializerOptions
  540:             {
  541:                 WriteIndented = true
  542:             };
  543:  
  544:             var text = JsonSerializer.Serialize(list, jsonSerializerOptions);
  545:  
  546:             SaveContentInADateTimeNamedFileInArchive(text);
  547:         }
  548:  
  549:         ////////////////////////////////////////////////////////////////////////////
  550:  
  551:         /// <summary>
  552:         ///
  553:         /// </summary>
  554:         public static void ReadServiceStateThatCrossedThresholdListFromFile()
  555:         {
  556:             if (!ApplicationIsDisconnectedFromMinistryNetworkForDebugging)
  557:             {
  558:                 var text = ReadContentOfLatestFileInArchive();
  559:  
  560:                 if (!string.IsNullOrEmpty(text))
  561:                 {
  562:                     var list = JsonSerializer.Deserialize<List<Ia.Ftn.Cl.Models.Business.Mdaa.MinistryDatabase.ServiceState>>(text);
  563:  
  564:                     Ia.Ftn.Cl.Models.Data.MinistryDatabase.ServiceStateThatCrossedThresholdList = list.ToList();
  565:                 }
  566:             }
  567:         }
  568:  
  569:         ////////////////////////////////////////////////////////////////////////////
  570:  
  571:         /// <summary>
  572:         ///
  573:         /// </summary>
  574:         private static void SaveContentInADateTimeNamedFileInArchive(string content)
  575:         {
  576:             var now = DateTime.UtcNow.AddHours(3);
  577:  
  578:             var archiveDirectory = archive + now.ToString("yyyy-MM-dd") + @"\";
  579:             var archiveFileName = archiveDirectory + now.ToString("HH-mm-ss-fff") + @".txt";
  580:  
  581:             lock (objectLock)
  582:             {
  583:                 Directory.CreateDirectory(archiveDirectory);
  584:  
  585:                 File.WriteAllText(archiveFileName, content);
  586:             }
  587:         }
  588:  
  589:         ////////////////////////////////////////////////////////////////////////////
  590:  
  591:         /// <summary>
  592:         ///
  593:         /// </summary>
  594:         private static string ReadContentOfLatestFileInArchive()
  595:         {
  596:             string content;
  597:  
  598:             var now = DateTime.UtcNow.AddHours(3);
  599:  
  600:             var archiveDirectory = archive + now.ToString("yyyy-MM-dd") + @"\";
  601:  
  602:             lock (objectLock)
  603:             {
  604:                 var directoryInfo = Directory.CreateDirectory(archiveDirectory);
  605:  
  606:                 var file = (from f in directoryInfo.GetFiles()
  607:                             orderby f.LastWriteTime descending
  608:                             select f).FirstOrDefault();
  609:  
  610:                 if (file != null) content = File.ReadAllText(file.FullName);
  611:                 else content = string.Empty;
  612:             }
  613:  
  614:             return content;
  615:         }
  616:  
  617:         ////////////////////////////////////////////////////////////////////////////
  618:  
  619:         /// <summary>
  620:         ///
  621:         /// </summary>
  622:         private static DataTable ReadPaymentTransactionOfThePreviousNDaysServiceDataTable(long latestTransactionId, int previousNDays)
  623:         {
  624:             DataTable dateTable = null;
  625:  
  626:             var sql = Ia.Ftn.Cl.Models.Data.MinistryDatabase.OracleSqlCommandToReturnPaymentTransactionOfThePreviousNDays(latestTransactionId, previousNDays);
  627:  
  628:             if (oracle != null)
  629:             {
  630:                 try
  631:                 {
  632:                     dateTable = oracle.Select(sql);
  633:                 }
  634:                 catch (Exception)
  635:                 {
  636:                     InitializeOracleConnection();
  637:  
  638:                     dateTable = oracle.Select(sql);
  639:                 }
  640:             }
  641:  
  642:             if (dateTable != null) dateTable.TableName = sql;
  643:  
  644:             return dateTable;
  645:         }
  646:  
  647:         ////////////////////////////////////////////////////////////////////////////
  648:         ////////////////////////////////////////////////////////////////////////////   
  649:     }
  650:  
  651:     ////////////////////////////////////////////////////////////////////////////
  652:     ////////////////////////////////////////////////////////////////////////////   
  653: }