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

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

Service Request support class of Fixed Telecommunications Network (FTN) business model.

    1: using System;
    2: using System.Collections.Generic;
    3: using System.Data;
    4: using System.Globalization;
    5: using System.Linq;
    6: using System.Text.RegularExpressions;
    7: using System.Threading.Tasks;
    8: using System.Xml;
    9:  
   10: namespace Ia.Ftn.Cl.Models.Business
   11: {
   12:     ////////////////////////////////////////////////////////////////////////////
   13:  
   14:     /// <summary publish="true">
   15:     /// Service Request support class of Fixed Telecommunications Network (FTN) business model.
   16:     /// </summary>
   17:     /// 
   18:     /// <remarks> 
   19:     /// Copyright © 2006-2025 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   20:     /// </remarks> 
   21:     public class ServiceRequest
   22:     {
   23:         /// <summary/>
   24:         public ServiceRequest() { }
   25:  
   26:         private static int sequentialProvisioningWorkflowQueueOriginalCount;
   27:         private static Dictionary<string, DateTime> provisioningWorkflowServiceIdDateTimeDictionary = new Dictionary<string, DateTime>();
   28:         private static Queue<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>> sequentialProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>>();
   29:  
   30:         /// <summary/>
   31:         public static int ServiceRequestIdStartEndRangeBufferedListIndex, ServiceRequestHistoryServiceListIndex, ServiceListIndex;
   32:  
   33:         /// <summary/>
   34:         public enum Procedure { Create, Read, Update, Delete, None };
   35:  
   36:         /// <summary/>
   37:         public struct ProvisioningWorkflow<T>
   38:         {
   39:             /// <summary/>
   40:             public T Item { get; set; }
   41:  
   42:             /// <summary/>
   43:             public Procedure Procedure { get; set; }
   44:  
   45:             /// <summary/>
   46:             public DateTime DateTime { get; set; }
   47:         }
   48:  
   49:         ////////////////////////////////////////////////////////////////////////////    
   50:  
   51:         /// <summary>
   52:         ///
   53:         /// </summary>
   54:         public struct NumberSerial
   55:         {
   56:             /// <summary/>
   57:             public long Id
   58:             {
   59:                 get { return (long)Number * 100 + Serial; }
   60:             }
   61:             /// <summary/>
   62:             public int Number { get; set; }
   63:             /// <summary/>
   64:             public int Serial { get; set; }
   65:         }
   66:  
   67:         ////////////////////////////////////////////////////////////////////////////    
   68:         ////////////////////////////////////////////////////////////////////////////    
   69:  
   70:         /// <summary>
   71:         ///
   72:         /// </summary>
   73:         public static string OracleSqlCommandForServiceRequestIdRange(Tuple<int, int> startEndRange)
   74:         {
   75:             return OracleSqlCommandForServiceRequestIdRange(startEndRange.Item1, startEndRange.Item2);
   76:         }
   77:  
   78:         ////////////////////////////////////////////////////////////////////////////    
   79:  
   80:         /// <summary>
   81:         ///
   82:         /// </summary>
   83:         public static string OracleSqlCommandForServiceRequestIdRange(int start, int end)
   84:         {
   85:             string sql;
   86:  
   87:             // select * from SRV_REQ_FIPER where SRV_REQ_ID >= 110000 and SRV_REQ_ID <= 110200 order by SRV_REQ_ID asc
   88:             sql = @"select * from SRV_REQ_FIPER where SRV_REQ_ID >= " + start + " and SRV_REQ_ID <= " + end + " order by SRV_REQ_ID asc";
   89:  
   90:             return sql;
   91:         }
   92:  
   93:         ////////////////////////////////////////////////////////////////////////////    
   94:  
   95:         /// <summary>
   96:         ///
   97:         /// </summary>
   98:         public static string OracleSqlCommandForServiceRequest(string service)
   99:         {
  100:             string sql;
  101:  
  102:             if (!string.IsNullOrEmpty(service))
  103:             {
  104:                 // select * from SRV_REQ_FIPER where SRV_NO = 23632222 order by SRV_REQ_ID asc
  105:                 sql = @"select * from SRV_REQ_FIPER where SRV_NO = " + service + " order by SRV_REQ_ID asc";
  106:             }
  107:             else sql = string.Empty;
  108:  
  109:             return sql;
  110:         }
  111:  
  112:         ////////////////////////////////////////////////////////////////////////////    
  113:  
  114:         /// <summary>
  115:         ///
  116:         /// </summary>
  117:         private static string OracleSqlCommandForGivenDateTime(DateTime dateTime)
  118:         {
  119:             string sql;
  120:  
  121:             //sql = @"select * from SRV_REQ_FIPER LEFT OUTER JOIN SRV_REQ_FIPER_TECH ON SRV_REQ_FIPER_TECH.SRV_REQ_ID = SRV_REQ_FIPER.SRV_REQ_ID where REQ_DATE >= '" + dateTime.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) + "' and REQ_DATE < '" + dateTime.AddDays(1).ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) + "' order by REQ_DATE asc, SRV_REQ_ID asc";
  122:             sql = @"select * from SRV_REQ_FIPER where REQ_DATE >= '" + dateTime.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) + "' and REQ_DATE < '" + dateTime.AddDays(1).ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) + "' order by SRV_REQ_ID asc";
  123:  
  124:             return sql;
  125:         }
  126:  
  127:         ////////////////////////////////////////////////////////////////////////////    
  128:  
  129:         /// <summary>
  130:         ///
  131:         /// </summary>
  132:         private static string OracleSqlCommandForSingleRandomDateTimeWithinTheLastNDays(int rangeOfPastDays, out DateTime selectedDate)
  133:         {
  134:             // below:
  135:             int i;
  136:             string sql;
  137:  
  138:             i = Ia.Cl.Models.Default.Random(rangeOfPastDays);
  139:  
  140:             selectedDate = DateTime.UtcNow.AddDays(-i);
  141:  
  142:             sql = OracleSqlCommandForGivenDateTime(selectedDate);
  143:  
  144:             return sql;
  145:         }
  146:  
  147:         ////////////////////////////////////////////////////////////////////////////    
  148:  
  149:         /// <summary>
  150:         ///
  151:         /// </summary>
  152:         private static string OracleSqlCommandForSingleDateTimeUsingDayIndexBetweenNowAndEarliestDate(ref int index, out DateTime selectedDate)
  153:         {
  154:             // below: select a date between now and the earliest date using an variable index value
  155:             string sql;
  156:             DateTime now;
  157:  
  158:             now = DateTime.UtcNow.AddHours(3);
  159:  
  160:             // below: check that inIndex is an index of a day between earliest day and now, and reset it to 0 if it is bigger than now
  161:             if (DateTime.Compare(Ia.Ftn.Cl.Models.Business.Administration.EarliestServiceRequestDate.AddDays(index), now) < 0)
  162:             {
  163:                 // below: within range
  164:             }
  165:             else index = 0;
  166:  
  167:             selectedDate = Ia.Ftn.Cl.Models.Business.Administration.EarliestServiceRequestDate.AddDays(index++);
  168:  
  169:             sql = OracleSqlCommandForGivenDateTime(selectedDate);
  170:  
  171:             return sql;
  172:         }
  173:  
  174:         ////////////////////////////////////////////////////////////////////////////
  175:  
  176:         /// <summary>
  177:         ///
  178:         /// </summary>
  179:         public static bool TemporaryProcedureToDetectADisconnectWithOracleDatabase(string result)
  180:         {
  181:             bool b;
  182:  
  183:             b = result.Contains("dataTable == null/?/?");
  184:  
  185:             return b;
  186:         }
  187:  
  188:         ////////////////////////////////////////////////////////////////////////////
  189:         ////////////////////////////////////////////////////////////////////////////
  190:  
  191:         /// <summary>
  192:         ///
  193:         /// </summary>
  194:         public static async Task<Ia.Cl.Models.Result> ManageMessageQueue(Ia.Cl.Models.Db.Oracle oracle)
  195:         {
  196:             var result = new Ia.Cl.Models.Result();
  197:  
  198:             var count = await Ia.Ftn.Cl.Models.Data.MessageQueue.ServiceRequestApplication.CountAsync;
  199:  
  200:             if (count > 0)
  201:             {
  202:                 var message = await Ia.Ftn.Cl.Models.Data.MessageQueue.ServiceRequestApplication.DequeueAsync;
  203:  
  204:                 if (message != null)
  205:                 {
  206:                     if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadService)
  207:                     {
  208:                         result = ReadAndUpdateServiceRequestAndServiceRequestTypeAndServiceRequestHistoryAndUpdateServiceRequestServiceForService(ref oracle, message.Service);
  209:                     }
  210:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.AccessCreated)
  211:                     {
  212:                         result = SequentialOutboundSynchronizationOfServiceRequestOnt_Create(ref oracle);
  213:                     }
  214:                     else if (message.Process == Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ActiveApplicationRunningPermissionState)
  215:                     {
  216:                         Ia.Ftn.Cl.Models.Business.Default.PermitActiveApplicationsToRun = message.State;
  217:  
  218:                         result.AddSuccess("PermitActiveApplicationsToRun: " + message.State);
  219:                     }
  220:                     else
  221:                     {
  222:                         throw new ArgumentOutOfRangeException("Process " + message.Process.ToString() + " is undefined");
  223:                     }
  224:                 }
  225:                 else
  226:                 {
  227:                 }
  228:             }
  229:             else
  230:             {
  231:             }
  232:  
  233:             return result;
  234:         }
  235:  
  236:         ////////////////////////////////////////////////////////////////////////////
  237:  
  238:         /// <summary>
  239:         ///
  240:         /// </summary>
  241:         private static Ia.Cl.Models.Result ReadAndUpdateServiceRequestAndServiceRequestTypeAndServiceRequestHistoryAndUpdateServiceRequestServiceForService(ref Ia.Cl.Models.Db.Oracle oracle, string service)
  242:         {
  243:             string s;
  244:             DataTable serviceRequestDataTable, serviceRequestTypeDataTable, serviceRequestHistoryDataTable;
  245:  
  246:             var result = new Ia.Cl.Models.Result();
  247:  
  248:             if (!string.IsNullOrEmpty(service))
  249:             {
  250:                 // service-request
  251:                 serviceRequestDataTable = ReadServiceRequest(ref oracle, service);
  252:                 UpdateServiceRequest(serviceRequestDataTable, service, out Ia.Cl.Models.Result r2);
  253:  
  254:                 // service-request-type
  255:                 serviceRequestTypeDataTable = ReadServiceRequestType(ref oracle, service);
  256:                 UpdateServiceRequestType(serviceRequestTypeDataTable, service, out Ia.Cl.Models.Result r3);
  257:  
  258:                 // service-request-history:
  259:                 serviceRequestHistoryDataTable = ReadServiceRequestHistory(ref oracle, service);
  260:                 UpdateServiceRequestHistory(serviceRequestHistoryDataTable, service, out string r4);
  261:  
  262:                 // service-request-service
  263:                 s = UpdateServiceRequestService(service);
  264:  
  265:                 result.AddSuccess(service + ",SR:" + r2.MessageWithoutCaption + ",SRT:" + r3.MessageWithoutCaption + ",SRH:" + r4 + ",SRS:" + s);
  266:             }
  267:             else
  268:             {
  269:                 result.AddWarning("Service is null or empty");
  270:             }
  271:  
  272:             return result;
  273:         }
  274:  
  275:         ////////////////////////////////////////////////////////////////////////////
  276:  
  277:         /// <summary>
  278:         ///
  279:         /// </summary>
  280:         public static Ia.Cl.Models.Result SequentialOutboundSynchronizationOfServiceRequestOnt_Create(ref Ia.Cl.Models.Db.Oracle oracle)
  281:         {
  282:             DataTable serviceRequestOntDataTable;
  283:             Ia.Ftn.Cl.Models.ServiceRequestOnt serviceRequestOnt;
  284:  
  285:             var result = new Ia.Cl.Models.Result();
  286:  
  287:             serviceRequestOnt = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.ServiceRequestOntNotInCustomerDepartmentDatabase(out Ia.Cl.Models.Result r1);
  288:  
  289:             result.AddResult(r1);
  290:  
  291:             if (serviceRequestOnt != null)
  292:             {
  293:                 OutboundInsertServiceRequestOnt(ref oracle, serviceRequestOnt);
  294:  
  295:                 serviceRequestOntDataTable = InboundReadServiceRequestOnt(ref oracle, serviceRequestOnt.Id);
  296:                 var r3 = UpdateServiceRequestOnt(serviceRequestOntDataTable, serviceRequestOnt.Id);
  297:  
  298:                 result.AddResult(r3);
  299:             }
  300:             else
  301:             {
  302:  
  303:             }
  304:  
  305:             return result;
  306:         }
  307:  
  308:         ////////////////////////////////////////////////////////////////////////////
  309:  
  310:         /// <summary>
  311:         ///
  312:         /// </summary>
  313:         public static Ia.Cl.Models.Result SequentialOutboundSynchronizationOfServiceRequestOntCreateUpdate(ref Ia.Cl.Models.Db.Oracle oracle)
  314:         {
  315:             Ia.Cl.Models.Result result;
  316:  
  317:             if (Ia.Ftn.Cl.Models.Business.Administration.NowIsOfficialWorkingTime)
  318:             {
  319:                 result = Ia.Ftn.Cl.Models.Business.ServiceRequest.SequentialOutboundSynchronizationOfServiceRequestOnt_Create(ref oracle);
  320:             }
  321:             else
  322:             {
  323:                 result = SequentialOutboundSynchronizationOfServiceRequestOnt_Update(ref oracle);
  324:             }
  325:  
  326:             //result.AddResult("Sequential Outbound Synchronization of Service Request ONT", r);
  327:  
  328:             return result;
  329:         }
  330:  
  331:         ////////////////////////////////////////////////////////////////////////////
  332:  
  333:         /// <summary>
  334:         ///
  335:         /// </summary>
  336:         public static Ia.Cl.Models.Result SequentialOutboundSynchronizationOfServiceRequestOntDetail(ref Ia.Cl.Models.Db.Oracle oracle)
  337:         {
  338:             var result = new Ia.Cl.Models.Result();
  339:  
  340:             result = _SequentialOutboundSynchronizationOfServiceRequestOntDetail(ref oracle);
  341:  
  342:             return result;
  343:         }
  344:  
  345:         ////////////////////////////////////////////////////////////////////////////
  346:  
  347:         /// <summary>
  348:         ///
  349:         /// </summary>
  350:         private static Ia.Cl.Models.Result _SequentialOutboundSynchronizationOfServiceRequestOntDetail(ref Ia.Cl.Models.Db.Oracle oracle)
  351:         {
  352:             DataTable serviceRequestOntDetailDataTable;
  353:             Ia.Cl.Models.Result result;
  354:             Ia.Ftn.Cl.Models.Business.ServiceRequest.ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> pw;
  355:  
  356:             result = new Ia.Cl.Models.Result();
  357:  
  358:             pw = Ia.Ftn.Cl.Models.Business.ServiceRequest.SequentialProvisioningWorkflowOfOfServiceRequestOntDetailSyncWithCustomerDepartmentDatabaseListItem(out int sequentialProvisioningProcedureQueueCount, out string progressCounterString);
  359:  
  360:             if (pw.Procedure != Ia.Ftn.Cl.Models.Business.ServiceRequest.Procedure.None)
  361:             {
  362:                 if (pw.Procedure == Ia.Ftn.Cl.Models.Business.ServiceRequest.Procedure.Create)
  363:                 {
  364:                     var r = OutboundCreateServiceRequestOntDetail(ref oracle, pw.Item);
  365:  
  366:                     if (r.HasError) result = r;
  367:                     else result.AddSuccess("create: " + pw.Item.Service + " " + progressCounterString);
  368:                 }
  369:                 else if (pw.Procedure == Ia.Ftn.Cl.Models.Business.ServiceRequest.Procedure.Read)
  370:                 {
  371:                     serviceRequestOntDetailDataTable = Ia.Ftn.Cl.Models.Business.ServiceRequest.InboundReadServiceRequestOntDetailWithinServiceRequestOntId(ref oracle, pw.Item.ServiceRequestOnt.Id);
  372:  
  373:                     var r = Ia.Ftn.Cl.Models.Business.ServiceRequest.UpdateServiceRequestOntDetailWithinServiceRequestOntId(serviceRequestOntDetailDataTable, pw.Item.ServiceRequestOnt.Id);
  374:  
  375:                     result.AddSuccess("read: " + pw.Item.Service + " " + progressCounterString + " " + r.Success);
  376:                 }
  377:                 else if (pw.Procedure == Ia.Ftn.Cl.Models.Business.ServiceRequest.Procedure.Delete)
  378:                 {
  379:                     var r = OutboundDeleteServiceRequestOntDetail(ref oracle, pw.Item);
  380:  
  381:                     if (r.HasError) result = r;
  382:                     else result.AddSuccess("delete: " + pw.Item.Service + " " + progressCounterString);
  383:                 }
  384:                 else
  385:                 {
  386:                     result.AddSuccess("sync: undefined procedure. ");
  387:                 }
  388:             }
  389:             else
  390:             {
  391:                 result.AddSuccess("sync: nothing to create or delete");
  392:             }
  393:  
  394:             return result;
  395:         }
  396:  
  397:         ////////////////////////////////////////////////////////////////////////////
  398:  
  399:         /// <summary>
  400:         ///
  401:         /// </summary>
  402:         private static Ia.Cl.Models.Result OutboundCreateServiceRequestOntDetail(ref Ia.Cl.Models.Db.Oracle oracle, Ia.Ftn.Cl.Models.ServiceRequestOntDetail serviceRequestOntDetail)
  403:         {
  404:             string sql;
  405:             var result = new Ia.Cl.Models.Result();
  406:  
  407:             if (serviceRequestOntDetail != null)
  408:             {
  409:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.OracleSqlCommandInsertServiceRequestOntDetailRecord(serviceRequestOntDetail);
  410:  
  411:                 try
  412:                 {
  413:                     oracle.Sql(sql);
  414:                 }
  415:                 catch (Exception ex)
  416:                 {
  417:                     result.AddError("OutboundCreateServiceRequestOntDetail(): " + ex.ToString() + "::::" + sql);
  418:                 }
  419:             }
  420:             else
  421:             {
  422:             }
  423:  
  424:             return result;
  425:         }
  426:  
  427:         ////////////////////////////////////////////////////////////////////////////
  428:  
  429:         /// <summary>
  430:         ///
  431:         /// </summary>
  432:         private static Ia.Cl.Models.Result OutboundDeleteServiceRequestOntDetail(ref Ia.Cl.Models.Db.Oracle oracle, Ia.Ftn.Cl.Models.ServiceRequestOntDetail serviceRequestOntDetail)
  433:         {
  434:             string sql;
  435:             var result = new Ia.Cl.Models.Result();
  436:  
  437:             if (serviceRequestOntDetail != null)
  438:             {
  439:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.OracleSqlCommandDeleteServiceRequestOntDetailRecord(serviceRequestOntDetail);
  440:  
  441:                 try
  442:                 {
  443:                     oracle.Sql(sql);
  444:                 }
  445:                 catch (Exception ex)
  446:                 {
  447:                     result.AddError("OutboundDeleteServiceRequestOntDetail(): " + ex.ToString() + "::::" + sql);
  448:                 }
  449:             }
  450:             else
  451:             {
  452:             }
  453:  
  454:             return result;
  455:         }
  456:  
  457:         ////////////////////////////////////////////////////////////////////////////
  458:  
  459:         /// <summary>
  460:         ///
  461:         /// </summary>
  462:         private static Ia.Cl.Models.Result OutboundDeleteServiceRequestOntDetailByService(ref Ia.Cl.Models.Db.Oracle oracle, string service)
  463:         {
  464:             string sql;
  465:             var result = new Ia.Cl.Models.Result();
  466:  
  467:             if (!string.IsNullOrEmpty(service))
  468:             {
  469:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.OracleSqlCommandDeleteServiceRequestOntDetailRecordByService(service);
  470:  
  471:                 try
  472:                 {
  473:                     oracle.Sql(sql);
  474:                 }
  475:                 catch (Exception ex)
  476:                 {
  477:                     result.AddError("OutboundDeleteServiceRequestOntDetailByService(): " + ex.ToString() + "::::" + sql);
  478:                 }
  479:             }
  480:             else
  481:             {
  482:             }
  483:  
  484:             return result;
  485:         }
  486:  
  487:         ////////////////////////////////////////////////////////////////////////////
  488:         ////////////////////////////////////////////////////////////////////////////
  489:  
  490:         /// <summary>
  491:         ///
  492:         /// </summary>
  493:         public static Ia.Cl.Models.Result SequentialOutboundSynchronizationOfServiceRequestOnt_Update(ref Ia.Cl.Models.Db.Oracle oracle)
  494:         {
  495:             DataTable serviceRequestOntDataTable;
  496:             Ia.Cl.Models.Result result;
  497:             Ia.Ftn.Cl.Models.ServiceRequestOnt serviceRequestOnt;
  498:  
  499:             result = new Ia.Cl.Models.Result();
  500:  
  501:             serviceRequestOnt = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.ServiceRequestOntNotUpdatedInCustomerDepartmentDatabase(out Ia.Cl.Models.Result r2);
  502:             result.AddResult(r2);
  503:  
  504:             if (serviceRequestOnt != null)
  505:             {
  506:                 OutboundUpdateServiceRequestOnt(ref oracle, serviceRequestOnt);
  507:  
  508:                 serviceRequestOntDataTable = InboundReadServiceRequestOnt(ref oracle, serviceRequestOnt.Id);
  509:                 var r3 = Ia.Ftn.Cl.Models.Business.ServiceRequest.UpdateServiceRequestOnt(serviceRequestOntDataTable, serviceRequestOnt.Id);
  510:  
  511:                 result.AddResult(r3);
  512:             }
  513:             else
  514:             {
  515:  
  516:             }
  517:  
  518:             return result;
  519:         }
  520:  
  521:  
  522:         ////////////////////////////////////////////////////////////////////////////
  523:  
  524:         /// <summary>
  525:         ///
  526:         /// </summary>
  527:         public static Ia.Cl.Models.Result SequentialInboundSynchronizationOfServiceRequestOntAndOntDetail(ref Ia.Cl.Models.Db.Oracle oracle)
  528:         {
  529:             DataTable serviceRequestOntDataTable, serviceRequestOntDetailDataTable;
  530:             Tuple<string, string> ontStartEndRange;
  531:  
  532:             var result = new Ia.Cl.Models.Result();
  533:  
  534:             ontStartEndRange = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.ServiceRequestOntIdStartEndRangeManager(out Ia.Cl.Models.Result r1);
  535:             //ontStartEndRange = new Tuple<int, int>(244125, 244125 + 1000);
  536:  
  537:             serviceRequestOntDataTable = InboundReadServiceRequestOnt(ref oracle, ontStartEndRange);
  538:             Ia.Ftn.Cl.Models.Business.ServiceRequest.UpdateServiceRequestOnt(serviceRequestOntDataTable, ontStartEndRange);
  539:  
  540:             serviceRequestOntDetailDataTable = InboundReadServiceRequestOntDetail(ref oracle, ontStartEndRange);
  541:             var r2 = UpdateServiceRequestOntDetail(serviceRequestOntDetailDataTable, ontStartEndRange);
  542:  
  543:             result.AddResult(r1);
  544:             result.AddResult(r2);
  545:  
  546:             return result;
  547:         }
  548:  
  549:         ////////////////////////////////////////////////////////////////////////////
  550:         ////////////////////////////////////////////////////////////////////////////
  551:  
  552:         /// <summary>
  553:         ///
  554:         /// </summary>
  555:         private static DataTable InboundReadServiceRequestOnt(ref Ia.Cl.Models.Db.Oracle oracle, string serviceRequestOntId)
  556:         {
  557:             return InboundReadServiceRequestOnt(ref oracle, new Tuple<string, string>(serviceRequestOntId, serviceRequestOntId));
  558:         }
  559:  
  560:         ////////////////////////////////////////////////////////////////////////////
  561:  
  562:         /// <summary>
  563:         ///
  564:         /// </summary>
  565:         private static DataTable InboundReadServiceRequestOnt(ref Ia.Cl.Models.Db.Oracle oracle, Tuple<string, string> startEndRangeTuple)
  566:         {
  567:             string sql;
  568:             DataTable dataTable;
  569:  
  570:             var result = new Ia.Cl.Models.Result();
  571:  
  572:             sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.OracleSqlCommandSelectProperServiceRequestOntRecordList(startEndRangeTuple);
  573:  
  574:             if (!string.IsNullOrEmpty(sql) && oracle != null)
  575:             {
  576:                 try
  577:                 {
  578:                     dataTable = oracle.Select(sql);
  579:  
  580:                     if (dataTable != null) dataTable.TableName = sql;
  581:                 }
  582:                 catch (Exception ex)
  583:                 {
  584:                     result.AddError("ReadServiceRequestOnt(): " + ex.ToString() + "::::" + sql);
  585:  
  586:                     dataTable = null;
  587:                 }
  588:             }
  589:             else dataTable = null;
  590:  
  591:             return dataTable;
  592:         }
  593:  
  594:         ////////////////////////////////////////////////////////////////////////////
  595:  
  596:         /// <summary>
  597:         ///
  598:         /// </summary>
  599:         public static DataTable InboundReadServiceRequestOntDetailWithinServiceRequestOntId(ref Ia.Cl.Models.Db.Oracle oracle, string serviceRequestOntId)
  600:         {
  601:             return InboundReadServiceRequestOntDetail(ref oracle, new Tuple<string, string>(serviceRequestOntId, serviceRequestOntId));
  602:         }
  603:  
  604:         ////////////////////////////////////////////////////////////////////////////
  605:  
  606:         /// <summary>
  607:         ///
  608:         /// </summary>
  609:         public static DataTable InboundReadServiceRequestOntDetail(ref Ia.Cl.Models.Db.Oracle oracle, Tuple<string, string> startEndRangeTuple)
  610:         {
  611:             string sql;
  612:             DataTable dataTable;
  613:  
  614:             sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.OracleSqlCommandSelectProperServiceRequestOntDetailRecordList(startEndRangeTuple);
  615:  
  616:             if (!string.IsNullOrEmpty(sql) && oracle != null)
  617:             {
  618:                 try
  619:                 {
  620:                     dataTable = oracle.Select(sql);
  621:  
  622:                     if (dataTable != null) dataTable.TableName = sql;
  623:                 }
  624:                 catch (Exception ex)
  625:                 {
  626:                     //Message("ReadServiceRequestOntDetail()", ex.ToString() + "::::" + sql, MessageType.Error);
  627:  
  628:                     dataTable = null;
  629:                 }
  630:             }
  631:             else dataTable = null;
  632:  
  633:             return dataTable;
  634:         }
  635:  
  636:         ////////////////////////////////////////////////////////////////////////////
  637:  
  638:         /// <summary>
  639:         ///
  640:         /// </summary>
  641:         public static Ia.Cl.Models.Result UpdateServiceRequestOntDetailWithinServiceRequestOntId(DataTable dataTable, string serviceRequestOntId)
  642:         {
  643:             return UpdateServiceRequestOntDetail(dataTable, new Tuple<string, string>(serviceRequestOntId, serviceRequestOntId));
  644:         }
  645:  
  646:         ////////////////////////////////////////////////////////////////////////////
  647:  
  648:         /// <summary>
  649:         ///
  650:         /// </summary>
  651:         private static Ia.Cl.Models.Result UpdateServiceRequestOntDetail(DataTable dataTable, Tuple<string, string> startEndRangeTuple)
  652:         {
  653:             return Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.UpdateForServiceRequestOntIdRangeWithOutputDataTable(dataTable, startEndRangeTuple);
  654:         }
  655:  
  656:         ////////////////////////////////////////////////////////////////////////////
  657:         ////////////////////////////////////////////////////////////////////////////
  658:  
  659:         /// <summary>
  660:         ///
  661:         /// </summary>
  662:         public static void OutboundInsertServiceRequestOnt(ref Ia.Cl.Models.Db.Oracle oracle, Ia.Ftn.Cl.Models.ServiceRequestOnt serviceRequestOnt)
  663:         {
  664:             string sql;
  665:  
  666:             if (serviceRequestOnt != null)
  667:             {
  668:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.OracleSqlCommandInsertServiceRequestOntRecord(serviceRequestOnt);
  669:  
  670:                 try
  671:                 {
  672:                     oracle.Sql(sql);
  673:                 }
  674:                 catch (Exception ex)
  675:                 {
  676:                     //Message("OutboundInsertServiceRequestOnt()", ex.ToString() + "::::" + sql, MessageType.Error);
  677:                 }
  678:             }
  679:             else
  680:             {
  681:             }
  682:         }
  683:  
  684:         ////////////////////////////////////////////////////////////////////////////
  685:  
  686:         /// <summary>
  687:         ///
  688:         /// </summary>
  689:         public static void OutboundUpdateServiceRequestOnt(ref Ia.Cl.Models.Db.Oracle oracle, Ia.Ftn.Cl.Models.ServiceRequestOnt serviceRequestOnt)
  690:         {
  691:             string sql;
  692:  
  693:             if (serviceRequestOnt != null)
  694:             {
  695:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.OracleSqlCommandUpdateServiceRequestOntRecord(serviceRequestOnt);
  696:  
  697:                 try
  698:                 {
  699:                     oracle.Sql(sql);
  700:                 }
  701:                 catch (Exception ex)
  702:                 {
  703:                     //Message("OutboundUpdateServiceRequestOnt()", ex.ToString() + "::::" + sql, MessageType.Error);
  704:                 }
  705:             }
  706:             else
  707:             {
  708:             }
  709:         }
  710:  
  711:         ////////////////////////////////////////////////////////////////////////////
  712:  
  713:         /// <summary>
  714:         ///
  715:         /// </summary>
  716:         public static void OutboundDeleteServiceRequestOnt(ref Ia.Cl.Models.Db.Oracle oracle, Ia.Ftn.Cl.Models.ServiceRequestOnt serviceRequestOnt)
  717:         {
  718:             string sql;
  719:  
  720:             if (serviceRequestOnt != null)
  721:             {
  722:                 sql = Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.OracleSqlCommandDeleteServiceRequestOntRecord(serviceRequestOnt);
  723:  
  724:                 try
  725:                 {
  726:                     oracle.Sql(sql);
  727:                 }
  728:                 catch (Exception ex)
  729:                 {
  730:                     //Message("OutboundDeleteServiceRequestOnt()", ex.ToString() + "::::" + sql, MessageType.Error);
  731:                 }
  732:             }
  733:             else
  734:             {
  735:             }
  736:         }
  737:  
  738:         ////////////////////////////////////////////////////////////////////////////
  739:  
  740:         /// <summary>
  741:         ///
  742:         /// </summary>
  743:         public static string SequentialInboundSynchronizationOfServiceRequestAndServiceRequestType(ref Ia.Cl.Models.Db.Oracle oracle)
  744:         {
  745:             string r5;
  746:             DataTable serviceRequestDataTable, serviceRequestTypeDataTable;
  747:             Tuple<int, int> startEndRange;
  748:  
  749:             List<string> insertedOrUpdatedOrDeletedServiceList;
  750:  
  751:             startEndRange = Ia.Ftn.Cl.Models.Data.ServiceRequest.ServiceRequestIdStartEndRangeManager(ref ServiceRequestIdStartEndRangeBufferedListIndex, out string r1);
  752:             //startEndRange = new Tuple<int, int>(3370, 3406); this range will cause "The instance of entity type 'ServiceRequestService' cannot be tracked" error in UpdateServiceRequest(), if Ia.Ftn.Cl.Model.Data.ServiceRequest.ListWithinIdRange(start, end) has AsNoTracking()
  753:  
  754:             serviceRequestDataTable = ReadServiceRequest(ref oracle, startEndRange);
  755:             insertedOrUpdatedOrDeletedServiceList = UpdateServiceRequest(serviceRequestDataTable, out string r3);
  756:  
  757:             serviceRequestTypeDataTable = ReadServiceRequestType(ref oracle, startEndRange);
  758:             var insertedOrUpdatedOrDeletedService2List = UpdateServiceRequestType(serviceRequestTypeDataTable, out string r4);
  759:  
  760:             var mismatchedProvisionStateBetweenDefaultSrsAndHistoricalSrsServiceList = UpdateServiceRequestService(startEndRange, out r5);
  761:  
  762:             var list = insertedOrUpdatedOrDeletedServiceList.Union(insertedOrUpdatedOrDeletedService2List).Union(mismatchedProvisionStateBetweenDefaultSrsAndHistoricalSrsServiceList).ToList();
  763:  
  764:             // below is important to prepare and update all related information about work order service
  765:             foreach (string service in list)
  766:             {
  767:                 Ia.Ftn.Cl.Models.Ui.Maintenance.Find.SearchToEnqueueAndUpdateRelatedInformation(service);
  768:  
  769:                 Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.ServiceRequestApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ServiceRequestAndOrServiceRequestTypeUpdated, service);
  770:             }
  771:  
  772:             return "Range:" + r1 + ",SR:" + r3 + ",SRT:" + r4 + ",SRS:" + r5;
  773:         }
  774:  
  775:         ////////////////////////////////////////////////////////////////////////////
  776:  
  777:         /// <summary>
  778:         ///
  779:         /// </summary>
  780:         public static DataTable ReadServiceRequest(ref Ia.Cl.Models.Db.Oracle oracle, Tuple<int, int> startEndRange)
  781:         {
  782:             DataTable dataTable = null;
  783:  
  784:             if (startEndRange != null)
  785:             {
  786:                 var sql = Ia.Ftn.Cl.Models.Business.ServiceRequest.OracleSqlCommandForServiceRequestIdRange(startEndRange);
  787:  
  788:                 try
  789:                 {
  790:                     dataTable = oracle.Select(sql);
  791:                 }
  792:                 catch (Exception)
  793:                 {
  794:                     //InitializeOracleConnection();
  795:  
  796:                     dataTable = null; // = oracle.Select(sql);
  797:                 }
  798:  
  799:                 if (dataTable != null) dataTable.TableName = sql;
  800:             }
  801:  
  802:             return dataTable;
  803:         }
  804:  
  805:         ////////////////////////////////////////////////////////////////////////////
  806:  
  807:         /// <summary>
  808:         ///
  809:         /// </summary>
  810:         private static DataTable ReadServiceRequest(ref Ia.Cl.Models.Db.Oracle oracle, string service)
  811:         {
  812:             string sql;
  813:             DataTable dataTable;
  814:  
  815:             sql = Ia.Ftn.Cl.Models.Business.ServiceRequest.OracleSqlCommandForServiceRequest(service);
  816:  
  817:             try
  818:             {
  819:                 dataTable = oracle.Select(sql);
  820:             }
  821:             catch (Exception)
  822:             {
  823:                 //InitializeOracleConnection();
  824:  
  825:                 dataTable = null; // = oracle.Select(sql);
  826:             }
  827:  
  828:             if (dataTable != null) dataTable.TableName = sql;
  829:  
  830:             return dataTable;
  831:         }
  832:  
  833:         ////////////////////////////////////////////////////////////////////////////
  834:  
  835:         /// <summary>
  836:         ///
  837:         /// </summary>
  838:         public static List<string> UpdateServiceRequest(DataTable dataTable, out string result)
  839:         {
  840:             result = Ia.Ftn.Cl.Models.Data.ServiceRequest.UpdateForServiceRequestWithOutputDataTableAndIdRange(dataTable, out List<string> insertedOrUpdatedOrDeletedServiceList);
  841:  
  842:             return insertedOrUpdatedOrDeletedServiceList;
  843:         }
  844:  
  845:         ////////////////////////////////////////////////////////////////////////////
  846:  
  847:         /// <summary>
  848:         ///
  849:         /// </summary>
  850:         private static bool UpdateServiceRequest(DataTable dataTable, string service, out Ia.Cl.Models.Result result)
  851:         {
  852:             Ia.Ftn.Cl.Models.Data.ServiceRequest.UpdateForServiceRequestWithOutputDataTableAndService(dataTable, service, out bool isUpdated, out result);
  853:  
  854:             return isUpdated;
  855:         }
  856:  
  857:         ////////////////////////////////////////////////////////////////////////////
  858:  
  859:         /// <summary>
  860:         ///
  861:         /// </summary>
  862:         private static DataTable ReadServiceRequestType(ref Ia.Cl.Models.Db.Oracle oracle, Tuple<int, int> startEndRange)
  863:         {
  864:             string sql;
  865:             DataTable dataTable = null;
  866:  
  867:             if (startEndRange != null)
  868:             {
  869:                 sql = Ia.Ftn.Cl.Models.Business.ServiceRequestType.OracleSqlCommandForServiceRequestIdRange(startEndRange);
  870:  
  871:                 dataTable = oracle.Select(sql);
  872:  
  873:                 if (dataTable != null) dataTable.TableName = sql;
  874:             }
  875:  
  876:             return dataTable;
  877:         }
  878:  
  879:         ////////////////////////////////////////////////////////////////////////////
  880:  
  881:         /// <summary>
  882:         ///
  883:         /// </summary>
  884:         private static DataTable ReadServiceRequestType(ref Ia.Cl.Models.Db.Oracle oracle, string service)
  885:         {
  886:             string sql;
  887:             DataTable dataTable;
  888:  
  889:             sql = Ia.Ftn.Cl.Models.Business.ServiceRequestType.OracleSqlCommandForServiceRequestByService(service);
  890:  
  891:             try
  892:             {
  893:                 dataTable = oracle.Select(sql);
  894:             }
  895:             catch (Exception)
  896:             {
  897:                 //InitializeOracleConnection();
  898:  
  899:                 dataTable = null; // = oracle.Select(sql);
  900:             }
  901:  
  902:             if (dataTable != null) dataTable.TableName = sql;
  903:  
  904:             return dataTable;
  905:         }
  906:  
  907:         ////////////////////////////////////////////////////////////////////////////
  908:  
  909:         /// <summary>
  910:         ///
  911:         /// </summary>
  912:         private static List<string> UpdateServiceRequestType(DataTable dataTable, out string result)
  913:         {
  914:             result = Ia.Ftn.Cl.Models.Data.ServiceRequestType.UpdateForServiceRequestIdRangeWithOutputDataTable(dataTable, out List<string> insertedOrUpdatedOrDeletedServiceList);
  915:  
  916:             return insertedOrUpdatedOrDeletedServiceList;
  917:         }
  918:  
  919:         ////////////////////////////////////////////////////////////////////////////
  920:  
  921:         /// <summary>
  922:         ///
  923:         /// </summary>
  924:         private static bool UpdateServiceRequestType(DataTable dataTable, string service, out Ia.Cl.Models.Result result)
  925:         {
  926:             Ia.Ftn.Cl.Models.Data.ServiceRequestType.UpdateForServiceRequestTypeWithOutputDataTableService(dataTable, service, out bool updated, out result);
  927:  
  928:             return updated;
  929:         }
  930:  
  931:         ////////////////////////////////////////////////////////////////////////////
  932:         ////////////////////////////////////////////////////////////////////////////
  933:  
  934:         /// <summary>
  935:         ///
  936:         /// </summary>
  937:         public static DataTable ReadServiceRequestHistory(ref Ia.Cl.Models.Db.Oracle oracle, string service)
  938:         {
  939:             string sql;
  940:             DataTable dataTable;
  941:  
  942:             sql = Ia.Ftn.Cl.Models.Data.ServiceRequestHistory.OracleSqlCommandSelectByService(service);
  943:  
  944:             try
  945:             {
  946:                 dataTable = oracle.Select(sql);
  947:             }
  948:             catch (Exception)
  949:             {
  950:                 //InitializeOracleConnection();
  951:  
  952:                 dataTable = null; // = oracle.Select(sql);
  953:             }
  954:  
  955:             if (dataTable != null) dataTable.TableName = sql;
  956:  
  957:             return dataTable;
  958:         }
  959:  
  960:         ////////////////////////////////////////////////////////////////////////////
  961:  
  962:         /// <summary>
  963:         ///
  964:         /// </summary>
  965:         public static bool UpdateServiceRequestHistory(DataTable dataTable, string service, out string result)
  966:         {
  967:             Ia.Ftn.Cl.Models.Data.ServiceRequestHistory.UpdateWithServiceAndOutputDataTable(service, dataTable, out bool isUpdated, out result);
  968:  
  969:             return isUpdated;
  970:         }
  971:  
  972:         ////////////////////////////////////////////////////////////////////////////
  973:  
  974:         /// <summary>
  975:         ///
  976:         /// </summary>
  977:         public static string UpdateServiceRequestService(string service)
  978:         {
  979:             Ia.Ftn.Cl.Models.Business.ServiceRequestService.UpdateForService(service, out string result);
  980:  
  981:             return result;
  982:         }
  983:  
  984:         ////////////////////////////////////////////////////////////////////////////
  985:         ////////////////////////////////////////////////////////////////////////////
  986:  
  987:         /// <summary>
  988:         ///
  989:         /// </summary>
  990:         public static Ia.Cl.Models.Result UpdateServiceRequestOnt(DataTable dataTable, string serviceRequestOntId)
  991:         {
  992:             return UpdateServiceRequestOnt(dataTable, new Tuple<string, string>(serviceRequestOntId, serviceRequestOntId));
  993:         }
  994:  
  995:         ////////////////////////////////////////////////////////////////////////////
  996:  
  997:         /// <summary>
  998:         ///
  999:         /// </summary>
 1000:         public static Ia.Cl.Models.Result UpdateServiceRequestOnt(DataTable dataTable, Tuple<string, string> startEndRangeTuple)
 1001:         {
 1002:             return Ia.Ftn.Cl.Models.Data.ServiceRequestOnt.UpdateForServiceRequestOntIdRangeWithOutputDataTable(dataTable, startEndRangeTuple);
 1003:         }
 1004:  
 1005:         ////////////////////////////////////////////////////////////////////////////
 1006:  
 1007:         /// <summary>
 1008:         ///
 1009:         /// </summary>
 1010:         public static List<string> UpdateServiceRequestService(Tuple<int, int> startEndRange, out string result)
 1011:         {
 1012:             var mismatchedProvisionStateBetweenDefaultSrsAndHistoricalSrsServiceList = Ia.Ftn.Cl.Models.Business.ServiceRequestService.UpdateForServiceRequestIdRange(startEndRange, out result);
 1013:  
 1014:             return mismatchedProvisionStateBetweenDefaultSrsAndHistoricalSrsServiceList;
 1015:         }
 1016:  
 1017:         ////////////////////////////////////////////////////////////////////////////
 1018:         ////////////////////////////////////////////////////////////////////////////
 1019:  
 1020:         /// <summary>
 1021:         ///
 1022:         /// </summary>
 1023:         public static ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> SequentialProvisioningWorkflowOfOfServiceRequestOntDetailSyncWithCustomerDepartmentDatabaseListItem(out int sequentialProvisioningWorkflowQueueCount, out string progressCounterString)
 1024:         {
 1025:             ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> pw;
 1026:             List<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>> list;
 1027:  
 1028:             if (sequentialProvisioningWorkflowQueue.Count == 0)
 1029:             {
 1030:                 list = Ia.Ftn.Cl.Models.Business.ServiceRequest.ProvisioningWorkflowOfServiceRequestOntDetailSyncWithCustomerDepartmentDatabaseList;
 1031:  
 1032:                 sequentialProvisioningWorkflowQueue = new Queue<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>>(list);
 1033:  
 1034:                 sequentialProvisioningWorkflowQueueOriginalCount = sequentialProvisioningWorkflowQueue.Count;
 1035:             }
 1036:  
 1037:             if (sequentialProvisioningWorkflowQueue.Count > 0) pw = sequentialProvisioningWorkflowQueue.Dequeue();
 1038:             else pw = new ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> { Item = null, Procedure = Procedure.None };
 1039:  
 1040:             progressCounterString = "(" + sequentialProvisioningWorkflowQueue.Count + "/" + sequentialProvisioningWorkflowQueueOriginalCount + ")";
 1041:  
 1042:             sequentialProvisioningWorkflowQueueCount = sequentialProvisioningWorkflowQueue.Count;
 1043:  
 1044:             return pw;
 1045:         }
 1046:  
 1047:         ////////////////////////////////////////////////////////////////////////////
 1048:  
 1049:         /// <summary>
 1050:         ///
 1051:         /// </summary>
 1052:         public static List<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>> ProvisioningWorkflowOfServiceRequestOntDetailSyncWithCustomerDepartmentDatabaseList
 1053:         {
 1054:             get
 1055:             {
 1056:                 DateTime dateTime;
 1057:                 ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> provisioningWorkflow;
 1058:                 List<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>> provisioningWorkflowList;
 1059:  
 1060:                 dateTime = DateTime.UtcNow.AddHours(3);
 1061:  
 1062:                 provisioningWorkflowList = new List<ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail>>();
 1063:  
 1064:                 Ia.Ftn.Cl.Models.Data.ServiceRequestOntDetail.ServiceRequestOntDetailCreateAndDeleteList(out List<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> serviceRequestOntDetailCreateList, out List<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> serviceRequestOntDetailDeleteList);
 1065:  
 1066:                 foreach (Ia.Ftn.Cl.Models.ServiceRequestOntDetail srod in serviceRequestOntDetailCreateList)
 1067:                 {
 1068:                     provisioningWorkflow = new ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> { Item = srod, Procedure = Procedure.Create, DateTime = dateTime };
 1069:                     provisioningWorkflowList.Add(provisioningWorkflow);
 1070:  
 1071:                     provisioningWorkflow = new ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> { Item = srod, Procedure = Procedure.Read, DateTime = dateTime };
 1072:                     provisioningWorkflowList.Add(provisioningWorkflow);
 1073:                 }
 1074:  
 1075:                 foreach (Ia.Ftn.Cl.Models.ServiceRequestOntDetail srod in serviceRequestOntDetailDeleteList)
 1076:                 {
 1077:                     provisioningWorkflow = new ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> { Item = srod, Procedure = Procedure.Delete, DateTime = dateTime };
 1078:                     provisioningWorkflowList.Add(provisioningWorkflow);
 1079:  
 1080:                     provisioningWorkflow = new ProvisioningWorkflow<Ia.Ftn.Cl.Models.ServiceRequestOntDetail> { Item = srod, Procedure = Procedure.Read, DateTime = dateTime };
 1081:                     provisioningWorkflowList.Add(provisioningWorkflow);
 1082:                 }
 1083:  
 1084:                 return provisioningWorkflowList;
 1085:             }
 1086:         }
 1087:  
 1088:         ////////////////////////////////////////////////////////////////////////////
 1089:         ////////////////////////////////////////////////////////////////////////////
 1090:  
 1091:         /// <summary>
 1092:         ///
 1093:         /// </summary>
 1094:         public static Ia.Ftn.Cl.Models.Business.ServiceAddress ServiceAddress(string service, string customerAddress, out string level)
 1095:         {
 1096:             int areaId;
 1097:             string provinceArea;
 1098:             Match match;
 1099:             Ia.Ftn.Cl.Models.Business.ServiceAddress serviceAddress;
 1100:  
 1101:             serviceAddress = new ServiceAddress { Service = service };
 1102:  
 1103:             if (!string.IsNullOrEmpty(customerAddress))
 1104:             {
 1105:                 customerAddress = Ia.Ftn.Cl.Models.Business.Default.CorrectCustomerAddress(customerAddress);
 1106:  
 1107:                 // below: special handeling needed here
 1108:                 customerAddress = Ia.Ftn.Cl.Models.Business.Default.CorrectCustomerAddressMissingProvinceArea(service, customerAddress);
 1109:  
 1110:                 // ',قطعة 4 قسيمة 538,'
 1111:                 // get areaId only
 1112:                 match = Regex.Match(customerAddress, @"^(.+?),", RegexOptions.Singleline);
 1113:  
 1114:                 if (match.Success)
 1115:                 {
 1116:                     level = "1";
 1117:  
 1118:                     provinceArea = match.Groups[1].Value;
 1119:                     areaId = (from a in Ia.Ftn.Cl.Models.Data.Service.KuwaitFtnAreaList
 1120:                               where provinceArea == a.ServiceRequestAddressProvinceAreaName
 1121:                               select a.Id).SingleOrDefault();
 1122:  
 1123:                     if (areaId != 0)
 1124:                     {
 1125:                         serviceAddress.AreaId = areaId;
 1126:  
 1127:                         // الجهراء الجهراء المدينة,قطعة 79 شارع 5 جادة 5 قسيمة 17, منزل 17
 1128:                         match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+) جادة (.+) قسيمة (.+), منزل (.+)$", RegexOptions.Singleline);
 1129:  
 1130:                         if (match.Success)
 1131:                         {
 1132:                             level = "1-";
 1133:  
 1134:                             serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1135:                             serviceAddress.Street = match.Groups[3].Value;
 1136:                             serviceAddress.Boulevard = match.Groups[4].Value;
 1137:                             serviceAddress.PremisesOld = match.Groups[5].Value;
 1138:                             serviceAddress.PremisesNew = match.Groups[6].Value;
 1139:                         }
 1140:                         else
 1141:                         {
 1142:                             // حولى بيان,قطعة 12 شارع 1 جادة 9, منزل 38
 1143:                             match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+) جادة (.+), منزل (.+)$", RegexOptions.Singleline);
 1144:  
 1145:                             if (match.Success)
 1146:                             {
 1147:                                 level = "2-";
 1148:  
 1149:                                 serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1150:                                 serviceAddress.Street = match.Groups[3].Value;
 1151:                                 serviceAddress.Boulevard = match.Groups[4].Value;
 1152:                                 serviceAddress.PremisesOld = match.Groups[5].Value;
 1153:                                 serviceAddress.PremisesNew = match.Groups[6].Value;
 1154:                             }
 1155:                             else
 1156:                             {
 1157:                                 // الجهراء الجهراء المدينة,قطعة 79 شارع 5 قسيمة 17, منزل 17
 1158:                                 match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+) قسيمة (.+), منزل (.+)$", RegexOptions.Singleline);
 1159:  
 1160:                                 if (match.Success)
 1161:                                 {
 1162:                                     level = "3-";
 1163:  
 1164:                                     serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1165:                                     serviceAddress.Street = match.Groups[3].Value;
 1166:                                     serviceAddress.Boulevard = string.Empty;
 1167:                                     serviceAddress.PremisesOld = match.Groups[4].Value;
 1168:                                     serviceAddress.PremisesNew = match.Groups[5].Value;
 1169:                                 }
 1170:                                 else
 1171:                                 {
 1172:                                     // الجهراء الجهراء المدينة,قطعة 79 شارع 5, منزل 17
 1173:                                     match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+), منزل (.+)$", RegexOptions.Singleline);
 1174:  
 1175:                                     if (match.Success)
 1176:                                     {
 1177:                                         level = "4-";
 1178:  
 1179:                                         serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1180:                                         serviceAddress.Street = match.Groups[3].Value;
 1181:                                         serviceAddress.Boulevard = string.Empty;
 1182:                                         serviceAddress.PremisesOld = string.Empty;
 1183:                                         serviceAddress.PremisesNew = match.Groups[4].Value;
 1184:                                     }
 1185:                                     else
 1186:                                     {
 1187:                                         // الجهراء الجهراء المدينة,قطعة 79 شارع 5 قسيمة 17
 1188:                                         match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+) قسيمة (.+),$", RegexOptions.Singleline);
 1189:  
 1190:                                         if (match.Success)
 1191:                                         {
 1192:                                             level = "5-";
 1193:  
 1194:                                             serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1195:                                             serviceAddress.Street = match.Groups[3].Value;
 1196:                                             serviceAddress.Boulevard = string.Empty;
 1197:                                             serviceAddress.PremisesOld = match.Groups[4].Value;
 1198:                                             serviceAddress.PremisesNew = string.Empty;
 1199:                                         }
 1200:                                         else
 1201:                                         {
 1202:                                             // الجهراء الجهراء المدينة,قطعة 79 شارع 5 جادة 5
 1203:                                             match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+) جادة (.+),$", RegexOptions.Singleline);
 1204:  
 1205:                                             if (match.Success)
 1206:                                             {
 1207:                                                 level = "6-";
 1208:  
 1209:                                                 serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1210:                                                 serviceAddress.Street = match.Groups[3].Value;
 1211:                                                 serviceAddress.Boulevard = match.Groups[4].Value;
 1212:                                                 serviceAddress.PremisesOld = string.Empty;
 1213:                                                 serviceAddress.PremisesNew = string.Empty;
 1214:                                             }
 1215:                                             else
 1216:                                             {
 1217:                                                 // الجهراء الجهراء المدينة,قطعة 79 قسيمة 17, منزل 17
 1218:                                                 match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) قسيمة (.+), منزل (.+)$", RegexOptions.Singleline);
 1219:  
 1220:                                                 if (match.Success)
 1221:                                                 {
 1222:                                                     level = "7-";
 1223:  
 1224:                                                     serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1225:                                                     serviceAddress.Street = string.Empty;
 1226:                                                     serviceAddress.Boulevard = string.Empty;
 1227:                                                     serviceAddress.PremisesOld = match.Groups[3].Value;
 1228:                                                     serviceAddress.PremisesNew = match.Groups[4].Value;
 1229:                                                 }
 1230:                                                 else
 1231:                                                 {
 1232:                                                     // الجهراء الجهراء المدينة,قطعة 79 قسيمة 17
 1233:                                                     match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) قسيمة (.+),$", RegexOptions.Singleline);
 1234:  
 1235:                                                     if (match.Success)
 1236:                                                     {
 1237:                                                         level = "8-";
 1238:  
 1239:                                                         serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1240:                                                         serviceAddress.Street = string.Empty;
 1241:                                                         serviceAddress.Boulevard = string.Empty;
 1242:                                                         serviceAddress.PremisesOld = match.Groups[3].Value;
 1243:                                                         serviceAddress.PremisesNew = string.Empty;
 1244:                                                     }
 1245:                                                     else
 1246:                                                     {
 1247:                                                         // الجهراء الجهراء المدينة,قطعة 79, منزل 17
 1248:                                                         match = Regex.Match(customerAddress, @"^(.+),قطعة (.+), منزل (.+)$", RegexOptions.Singleline);
 1249:  
 1250:                                                         if (match.Success)
 1251:                                                         {
 1252:                                                             level = "9-";
 1253:  
 1254:                                                             serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1255:                                                             serviceAddress.Street = string.Empty;
 1256:                                                             serviceAddress.Boulevard = string.Empty;
 1257:                                                             serviceAddress.PremisesOld = string.Empty;
 1258:                                                             serviceAddress.PremisesNew = match.Groups[3].Value;
 1259:                                                         }
 1260:                                                         else
 1261:                                                         {
 1262:                                                             // الجهراء الجهراء المدينة,قطعة 79 شارع 5
 1263:                                                             match = Regex.Match(customerAddress, @"^(.+),قطعة (.+) شارع (.+)$", RegexOptions.Singleline);
 1264:  
 1265:                                                             if (match.Success)
 1266:                                                             {
 1267:                                                                 level = "10-";
 1268:  
 1269:                                                                 serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1270:                                                                 serviceAddress.Street = match.Groups[3].Value;
 1271:                                                                 serviceAddress.Boulevard = string.Empty;
 1272:                                                                 serviceAddress.PremisesOld = string.Empty;
 1273:                                                                 serviceAddress.PremisesNew = string.Empty;
 1274:                                                             }
 1275:                                                             else
 1276:                                                             {
 1277:                                                                 // الجهراء الجهراء المدينة,قطعة 79
 1278:                                                                 match = Regex.Match(customerAddress, @"^(.+),قطعة (.+),$", RegexOptions.Singleline);
 1279:  
 1280:                                                                 if (match.Success)
 1281:                                                                 {
 1282:                                                                     level = "11-";
 1283:  
 1284:                                                                     serviceAddress.Block = Ia.Ftn.Cl.Models.Business.Access.NormalizeBlockEntry(match.Groups[2].Value);
 1285:                                                                     serviceAddress.Street = string.Empty;
 1286:                                                                     serviceAddress.Boulevard = string.Empty;
 1287:                                                                     serviceAddress.PremisesOld = string.Empty;
 1288:                                                                     serviceAddress.PremisesNew = string.Empty;
 1289:                                                                 }
 1290:                                                                 else
 1291:                                                                 {
 1292:                                                                     // حولي السلام,,
 1293:                                                                     match = Regex.Match(customerAddress, @"^(.+),,$", RegexOptions.Singleline);
 1294:  
 1295:                                                                     if (match.Success)
 1296:                                                                     {
 1297:                                                                         level = "12-";
 1298:  
 1299:                                                                         serviceAddress.Block = string.Empty;
 1300:                                                                         serviceAddress.Street = string.Empty;
 1301:                                                                         serviceAddress.Boulevard = string.Empty;
 1302:                                                                         serviceAddress.PremisesOld = string.Empty;
 1303:                                                                         serviceAddress.PremisesNew = string.Empty;
 1304:                                                                     }
 1305:                                                                     else
 1306:                                                                     {
 1307:                                                                         level = "13";
 1308:                                                                     }
 1309:                                                                 }
 1310:                                                             }
 1311:                                                         }
 1312:                                                     }
 1313:                                                 }
 1314:                                             }
 1315:                                         }
 1316:                                     }
 1317:                                 }
 1318:                             }
 1319:                         }
 1320:  
 1321:                         // below: we will try to store integers in integer format
 1322:  
 1323:                         //serviceAddress.Block this is already in int format
 1324:                         serviceAddress.Street = int.TryParse(serviceAddress.Street, out int i) ? i.ToString() : serviceAddress.Street;
 1325:                         serviceAddress.Boulevard = int.TryParse(serviceAddress.Boulevard, out i) ? i.ToString() : serviceAddress.Boulevard;
 1326:                         serviceAddress.PremisesOld = int.TryParse(serviceAddress.PremisesOld, out i) ? i.ToString() : serviceAddress.PremisesOld;
 1327:                         serviceAddress.PremisesNew = int.TryParse(serviceAddress.PremisesNew, out i) ? i.ToString() : serviceAddress.PremisesNew;
 1328:  
 1329:                         // I will change all 0 entries to string.Empty
 1330:  
 1331:                         if (serviceAddress.Block == "0") serviceAddress.Block = string.Empty;
 1332:                         if (serviceAddress.Street == "0") serviceAddress.Street = string.Empty;
 1333:                         if (serviceAddress.Boulevard == "0") serviceAddress.Boulevard = string.Empty;
 1334:                         if (serviceAddress.PremisesOld == "0") serviceAddress.PremisesOld = string.Empty;
 1335:                         if (serviceAddress.PremisesNew == "0") serviceAddress.PremisesNew = string.Empty;
 1336:                     }
 1337:                     else
 1338:                     {
 1339:                         level = "0";
 1340:  
 1341:                         serviceAddress.AreaId = 0;
 1342:                         serviceAddress.Block = string.Empty;
 1343:                         serviceAddress.Street = string.Empty;
 1344:                         serviceAddress.Boulevard = string.Empty;
 1345:                         serviceAddress.PremisesOld = string.Empty;
 1346:                         serviceAddress.PremisesNew = string.Empty;
 1347:                     }
 1348:                 }
 1349:                 else
 1350:                 {
 1351:                     level = "0";
 1352:  
 1353:                     serviceAddress.AreaId = 0;
 1354:                     serviceAddress.Block = string.Empty;
 1355:                     serviceAddress.Street = string.Empty;
 1356:                     serviceAddress.Boulevard = string.Empty;
 1357:                     serviceAddress.PremisesOld = string.Empty;
 1358:                     serviceAddress.PremisesNew = string.Empty;
 1359:                 }
 1360:             }
 1361:             else
 1362:             {
 1363:                 level = "0";
 1364:  
 1365:                 serviceAddress.AreaId = 0;
 1366:                 serviceAddress.Block = string.Empty;
 1367:                 serviceAddress.Street = string.Empty;
 1368:                 serviceAddress.Boulevard = string.Empty;
 1369:                 serviceAddress.PremisesOld = string.Empty;
 1370:                 serviceAddress.PremisesNew = string.Empty;
 1371:             }
 1372:  
 1373:             return serviceAddress;
 1374:         }
 1375:  
 1376:         ////////////////////////////////////////////////////////////////////////////    
 1377:  
 1378:         /// <summary>
 1379:         ///
 1380:         /// </summary>
 1381:         public static bool ServiceRequestIdIsAllowedForProcessing(int serviceRequestId)
 1382:         {
 1383:             bool b;
 1384:  
 1385:             // see ServiceRequestIsAllowedProcessing in authority.cs
 1386:  
 1387:             if (serviceRequestId == 2390979) b = false; // Violation of PRIMARY KEY constraint 'PK_dbo.ServiceRequests'. Cannot insert duplicate key in object 'dbo.ServiceRequests'. The duplicate key value is (2390979).
 1388:             else if (serviceRequestId == 2391097) b = false; // Violation of PRIMARY KEY constraint 'PK_dbo.ServiceRequests'. Cannot insert duplicate key in object 'dbo.ServiceRequests'. The duplicate key value is (2391097).
 1389:             //else if (serviceRequestId == 2316113) b = false; // 2316113 problamatic causes duplicate primary key error
 1390:             else b = true;
 1391:  
 1392:             return b;
 1393:         }
 1394:  
 1395:         ////////////////////////////////////////////////////////////////////////////
 1396:  
 1397:         /// <summary>
 1398:         /// Generate a OptimizedStartEndRangeList() but with a range buffer before start and after end.
 1399:         /// </summary>
 1400:         public static List<Tuple<int, int>> OptimizedStartEndRangeBufferedList(List<int> list, int count, int bufferRange)
 1401:         {
 1402:             int start, end;
 1403:             List<Tuple<int, int>> tupleList;
 1404:  
 1405:             tupleList = OptimizedStartEndRangeTupleList(list, count);
 1406:  
 1407:             if (tupleList != null && tupleList.Count > 0)
 1408:             {
 1409:                 start = tupleList[0].Item1;
 1410:                 end = tupleList[tupleList.Count - 1].Item2;
 1411:  
 1412:                 tupleList.Insert(tupleList.Count, new Tuple<int, int>(end + 1, end + bufferRange + 1));
 1413:                 tupleList.Insert(0, new Tuple<int, int>((start - bufferRange) > 0 ? (start - bufferRange) : 0, start - 1)); // keep order
 1414:             }
 1415:  
 1416:             tupleList.Sort();
 1417:  
 1418:             return tupleList;
 1419:         }
 1420:  
 1421:         ////////////////////////////////////////////////////////////////////////////
 1422:  
 1423:         /// <summary>
 1424:         /// Generate a list of start-end count optimized to read around count number of values from passed list. 
 1425:         /// </summary>
 1426:         public static List<Tuple<int, int>> OptimizedStartEndRangeTupleList(List<int> list, int count)
 1427:         {
 1428:             bool started, done;
 1429:             int c, start, end;
 1430:             Tuple<int, int> tuple;
 1431:             List<Tuple<int, int>> tupleList;
 1432:  
 1433:             tupleList = new List<Tuple<int, int>>();
 1434:  
 1435:             started = true;
 1436:             done = false;
 1437:             c = start = 0;
 1438:  
 1439:             if (list.Count > 0 && count > 0)
 1440:             {
 1441:                 foreach (int item in list)
 1442:                 {
 1443:                     if (started)
 1444:                     {
 1445:                         start = item;
 1446:                         started = false;
 1447:                     }
 1448:  
 1449:                     if (c == 0)
 1450:                     {
 1451:                         done = false;
 1452:                     }
 1453:  
 1454:                     if (c == count - 1)
 1455:                     {
 1456:                         end = item;
 1457:  
 1458:                         tuple = new Tuple<int, int>(start, end);
 1459:  
 1460:                         tupleList.Add(tuple);
 1461:  
 1462:                         start = item + 1;
 1463:                         done = true;
 1464:                         c = 0;
 1465:                     }
 1466:                     else c++;
 1467:                 }
 1468:  
 1469:                 if (!done)
 1470:                 {
 1471:                     end = list[list.Count - 1];
 1472:  
 1473:                     tuple = new Tuple<int, int>(start, end);
 1474:  
 1475:                     tupleList.Add(tuple);
 1476:                 }
 1477:             }
 1478:             //else throw new System.ArgumentException("List empty or range too short. ");
 1479:  
 1480:             tupleList.Sort();
 1481:  
 1482:             return tupleList;
 1483:         }
 1484:  
 1485:         ////////////////////////////////////////////////////////////////////////////    
 1486:         ////////////////////////////////////////////////////////////////////////////    
 1487:     }
 1488:  
 1489:     ////////////////////////////////////////////////////////////////////////////    
 1490:     ////////////////////////////////////////////////////////////////////////////
 1491:  
 1492:     /// <summary>
 1493:     ///
 1494:     /// </summary>
 1495:     public static class ServiceRequestExtension
 1496:     {
 1497:         ////////////////////////////////////////////////////////////////////////////
 1498:  
 1499:         /// <summary>
 1500:         /// Extension method: Collect number list
 1501:         /// </summary>
 1502:         public static List<int> NumberList(this List<Ia.Ftn.Cl.Models.ServiceRequest> serviceRequestList)
 1503:         {
 1504:             List<int> numberList;
 1505:  
 1506:             if (serviceRequestList.Count > 0)
 1507:             {
 1508:                 numberList = (from n in serviceRequestList select n.Number).Distinct().ToList<int>();
 1509:             }
 1510:             else numberList = new List<int>();
 1511:  
 1512:             return numberList;
 1513:         }
 1514:  
 1515:         ////////////////////////////////////////////////////////////////////////////
 1516:  
 1517:         /// <summary>
 1518:         /// Extension method: Collect distinct number-serials into NumberSerial list
 1519:         /// </summary>
 1520:         public static List<Ia.Ftn.Cl.Models.Business.ServiceRequest.NumberSerial> DistinctNumberSerialList(this List<Ia.Ftn.Cl.Models.ServiceRequest> sourceList)
 1521:         {
 1522:             List<Ia.Ftn.Cl.Models.Business.ServiceRequest.NumberSerial> numberSerialList;
 1523:  
 1524:             if (sourceList.Count > 0)
 1525:             {
 1526:                 numberSerialList = (from n in sourceList
 1527:                                     select new Ia.Ftn.Cl.Models.Business.ServiceRequest.NumberSerial { Number = n.Number, Serial = n.Serial }).Distinct().ToList();
 1528:             }
 1529:             else numberSerialList = new List<Ia.Ftn.Cl.Models.Business.ServiceRequest.NumberSerial>();
 1530:  
 1531:             return numberSerialList;
 1532:         }
 1533:  
 1534:         ////////////////////////////////////////////////////////////////////////////
 1535:         ////////////////////////////////////////////////////////////////////////////
 1536:     }
 1537:  
 1538:     ////////////////////////////////////////////////////////////////////////////
 1539:     ////////////////////////////////////////////////////////////////////////////
 1540: }