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

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

    1: using Microsoft.AspNetCore.Mvc.Rendering;
    2: using Microsoft.Identity.Client;
    3: using System.Data;
    4: using System.Net;
    5: using System.Text.RegularExpressions;
    6:  
    7: namespace Ia.Ftn.Wa.Models.Maintenance
    8: {
    9:     ////////////////////////////////////////////////////////////////////////////
   10:  
   11:     /// <summary publish="true">
   12:     ///
   13:     /// </summary>
   14:     /// 
   15:     /// <remarks> 
   16:     /// Copyright © 2006-2025 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
   17:     /// </remarks> 
   18:     public static class Report
   19:     {
   20:         ////////////////////////////////////////////////////////////////////////////
   21:  
   22:         /// <summary>
   23:         ///
   24:         /// </summary>
   25:         public static void ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
   26:         {
   27:             if (!string.IsNullOrEmpty(reportViewModel.FrameworkSelectedValue))
   28:             {
   29:                 ReportListAndFrameworkSelectList_ViewModel(ref reportViewModel, reportViewModel.FrameworkSelectedValue);
   30:             }
   31:             else if (reportViewModel.CurrentStaffIdentityUser.Framework != null) ReportListAndFrameworkSelectList_ViewModel(ref reportViewModel, reportViewModel.CurrentStaffIdentityUser.Framework.Id);
   32:             else
   33:             {
   34:             }
   35:  
   36:             //Telegram_ViewModel();
   37:  
   38:             reportViewModel.TelegramChatPanelVisible = false;
   39:         }
   40:  
   41:         ////////////////////////////////////////////////////////////////////////////
   42:  
   43:         /// <summary>
   44:         ///
   45:         /// </summary>
   46:         public static void Post(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string commandName, string _reportId)
   47:         {
   48:             if (!string.IsNullOrEmpty(commandName) && !string.IsNullOrEmpty(_reportId))
   49:             {
   50:                 if (commandName == "delete")
   51:                 {
   52:                     Ia.Ftn.Wa.Models.Maintenance.Report.DeleteReport(ref reportViewModel, _reportId);
   53:                 }
   54:             }
   55:         }
   56:  
   57:         ////////////////////////////////////////////////////////////////////////////
   58:  
   59:         /// <summary>
   60:         ///
   61:         /// </summary>
   62:         public static void DeleteReport(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string _reportId)
   63:         {
   64:             reportViewModel.UpdateResult = new Ia.Cl.Models.Result();
   65:  
   66:             var reportId = int.Parse(_reportId);
   67:  
   68:             var report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId); // refresh report
   69:  
   70:             if (report != null)
   71:             {
   72:                 if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCreateReadUpdateDeleteReport(Ia.Ftn.Cl.Models.Business.Authority.PersistentStorageFunction.Delete, report, reportViewModel.CurrentStaffIdentityUser))
   73:                 {
   74:                     var b = Ia.Ftn.Cl.Models.Data.Report.Delete(reportId);
   75:  
   76:                     if (b)
   77:                     {
   78:                         reportViewModel.UpdateResult.AddSuccess("Report successfully deleted (مسح التقرير بنجاح)");
   79:                     }
   80:                     else throw new Exception("") { };
   81:                 }
   82:                 else
   83:                 {
   84:                     reportViewModel.UpdateResult.AddError("You are not authorized to modify this report (لست مخولاً بتعديل هذا التقرير)");
   85:                 }
   86:             }
   87:             else
   88:             {
   89:                 reportViewModel.UpdateResult.AddError("Report " + reportId + " does not exist (التقرير غير موجود).");
   90:             }
   91:         }
   92:  
   93:         ////////////////////////////////////////////////////////////////////////////
   94:  
   95:         /// <summary>
   96:         ///
   97:         /// </summary>
   98:         private static void ReportListAndFrameworkSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string frameworkId)
   99:         {
  100:             bool has;
  101:  
  102:             has = Ia.Ftn.Cl.Models.Business.Report.FrameworkHasReadabilityReport(frameworkId);
  103:  
  104:             if (has)
  105:             {
  106:                 var list = Ia.Ftn.Cl.Models.Data.Report.ReportReadabilityByFrameworkIdDictionary();
  107:  
  108:                 var reportIdList = list.ContainsKey(frameworkId) ? list[frameworkId] : new List<int>();
  109:  
  110:                 reportViewModel.ReportList = Ia.Ftn.Cl.Models.Data.Report.OpenStatusOrClosedStatusWithinLast24HourByReportIdReportList(reportIdList);
  111:  
  112:                 reportViewModel.StatisticLabel = reportViewModel.ReportList.Count.ToString();
  113:             }
  114:             else reportViewModel.StatisticLabel = string.Empty;
  115:  
  116:             FrameworkSelectList_ViewModel(ref reportViewModel, frameworkId);
  117:         }
  118:  
  119:         ////////////////////////////////////////////////////////////////////////////
  120:  
  121:         /// <summary>
  122:         ///
  123:         /// </summary>
  124:         private static void FrameworkSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string frameworkId)
  125:         {
  126:             var list = Ia.Ftn.Cl.Models.Data.Report.ReportReadabilityByFrameworkList().OrderBy(f => f.FullyQualifiedArabicName);
  127:  
  128:             var list1 = new List<SelectListItem>();
  129:             //list1.Add(new SelectListItem(" ", "0"));
  130:  
  131:             foreach (var l in list) list1.Add(new SelectListItem(l.FullyQualifiedArabicName, l.Id));
  132:  
  133:             reportViewModel.FrameworkSelectList = new SelectList(list1, "Value", "Text");
  134:  
  135:             if (string.IsNullOrEmpty(frameworkId)) reportViewModel.FrameworkSelectedValue = "0";
  136:             else reportViewModel.FrameworkSelectedValue = frameworkId;
  137:         }
  138:  
  139:         ////////////////////////////////////////////////////////////////////////////
  140:  
  141:         /// <summary>
  142:         ///
  143:         /// </summary>
  144:         private static void Telegram_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  145:         {
  146:             Ia.Cl.Models.QrCode qrCode;
  147:  
  148:             var currentStaffIdentityUser = reportViewModel.CurrentStaffIdentityUser;
  149:  
  150:             //if (Ia.Ftn.Cl.Models.Business.Authority.StaffIsSuperUser(staff))
  151:             //{
  152:             var chat = (from c in Ia.Ftn.Cl.Models.Telegram.Chat.ChatList
  153:                         where c.Framework != null && (c.Framework == currentStaffIdentityUser.Framework || currentStaffIdentityUser.Framework.Parent != null && c.Framework == currentStaffIdentityUser.Framework.Parent)
  154:                         select c).FirstOrDefault();
  155:  
  156:             if (chat != null)
  157:             {
  158:                 reportViewModel.TelegramGroupInviteQrCodeText = chat.Name;
  159:                 reportViewModel.TelegramGroupInviteQrCodeNavigateUrl = chat.TelegramGroupUrl;
  160:                 reportViewModel.TelegramGroupInviteQrCodeImageUrl = chat.LogoImageUrl;
  161:  
  162:                 qrCode = new Ia.Cl.Models.QrCode(chat.InviteLinkUrl, "SlateGray", "White", chat.LogoImageAbsolutePathUrl);
  163:  
  164:                 //telegramGroupInviteQrCodeImage.AlternateText = chat.Name;
  165:                 reportViewModel.TelegramGroupInviteQrCodeImageUrl = qrCode.ImageUrlDataFormat;
  166:  
  167:                 reportViewModel.TelegramChatPanelVisible = true;
  168:             }
  169:             else reportViewModel.TelegramChatPanelVisible = false;
  170:             //}
  171:             //else reportViewModel.TelegramChatPanelVisible = false;
  172:         }
  173:  
  174:         ////////////////////////////////////////////////////////////////////////////
  175:         ////////////////////////////////////////////////////////////////////////////
  176:  
  177:  
  178:  
  179:  
  180:  
  181:  
  182:  
  183:  
  184:  
  185:  
  186:  
  187:         ////////////////////////////////////////////////////////////////////////////
  188:         ////////////////////////////////////////////////////////////////////////////
  189:  
  190:         /// <summary>
  191:         ///
  192:         /// </summary>
  193:         public static void HistoryViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string _reportyId)
  194:         {
  195:             bool otherReportsExist;
  196:             List<Ia.Ftn.Cl.Models.Report> reportList;
  197:  
  198:             reportViewModel.InformationResult = new Ia.Cl.Models.Result();
  199:  
  200:             var reportId = int.Parse(_reportyId);
  201:  
  202:             var report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId);
  203:  
  204:             if (report != null)
  205:             {
  206:                 // below: search for all available reports for this dn and display them as link
  207:                 reportList = Ia.Ftn.Cl.Models.Data.Report.ListByReportId(reportId);
  208:  
  209:                 otherReportsExist = false;
  210:  
  211:                 reportViewModel.ReportLabel = string.Empty;
  212:  
  213:                 foreach (var report0 in reportList)
  214:                 {
  215:                     // below: we will check if there are open reports
  216:  
  217:                     reportViewModel.ReportLabel += "<a href=\"" + "history?reportId=" + report0.Id + "\">" + report0.Created.ToString("yyyy-MM-dd") + "</a> ";
  218:                     otherReportsExist = true;
  219:                 }
  220:  
  221:                 if (!otherReportsExist) reportViewModel.ReportLabel = "None (لا يوجد)";
  222:             }
  223:             else
  224:             {
  225:                 if (reportViewModel.ReportId > -1)
  226:                 {
  227:                     reportId = reportViewModel.ReportId;
  228:  
  229:                     report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId);
  230:                 }
  231:                 else reportViewModel.InformationResult.AddWarning("Report " + reportId + " does not exist (التقرير غير موجود)");
  232:             }
  233:  
  234:             // below: if the report status is closed we will hide the disable panel
  235:             if (report.StatusIsOpen)
  236:             {
  237:                 reportViewModel.ReportStatusIsOpen = true;
  238:                 reportViewModel.InsertButtonEnabled = true;
  239:                 reportViewModel.ReopenClosedReportButtonEnabled = false;
  240:  
  241:                 if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCloseReport(report, reportViewModel.CurrentStaffIdentityUser)) reportViewModel.CloseReportCheckBoxEnabled = true;
  242:                 else reportViewModel.CloseReportCheckBoxEnabled = false;
  243:             }
  244:             else
  245:             {
  246:                 reportViewModel.ReportStatusIsOpen = false;
  247:                 reportViewModel.InsertButtonEnabled = false;
  248:  
  249:                 if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanReopenClosedReport(report, reportViewModel.CurrentStaffIdentityUser)) reportViewModel.ReopenClosedReportButtonEnabled = true;
  250:                 else reportViewModel.ReopenClosedReportButtonEnabled = false;
  251:  
  252:                 reportViewModel.InformationResult.AddWarning("Report is Closed (التقرير مغلق)");
  253:             }
  254:  
  255:             StaffFrameworkAssignmentSelectList_ViewModel(ref reportViewModel, report);
  256:  
  257:             IndicationSelectList_ViewModel(ref reportViewModel, report);
  258:             ActionSelectList_ViewModel(ref reportViewModel, report);
  259:             ResolutionSelectList_ViewModel(ref reportViewModel);
  260:             EstimateSelectList_ViewModel(ref reportViewModel);
  261:  
  262:             ReportSelectList_ViewModel(ref reportViewModel);
  263:             ReportHistorySelectList_ViewModel(ref reportViewModel, report);
  264:         }
  265:  
  266:         ////////////////////////////////////////////////////////////////////////////
  267:  
  268:         /// <summary>
  269:         ///
  270:         /// </summary>
  271:         public static void HistoryPost(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string commandName, string reportHistoryId)
  272:         {
  273:             if (!string.IsNullOrEmpty(commandName))
  274:             {
  275:                 if (commandName == "delete")
  276:                 {
  277:                     if (!string.IsNullOrEmpty(reportHistoryId))
  278:                     {
  279:                         Ia.Ftn.Wa.Models.Maintenance.Report.DeleteHistoryReport(ref reportViewModel, reportHistoryId);
  280:                     }
  281:                     else
  282:                     {
  283:                     }
  284:                 }
  285:                 else if (commandName == "insert")
  286:                 {
  287:                     if (reportViewModel.ReportId > -1)
  288:                     {
  289:                         InsertReportHistory(ref reportViewModel);
  290:                     }
  291:                     else
  292:                     {
  293:                     }
  294:                 }
  295:                 else if (commandName == "reopenClosedReport")
  296:                 {
  297:                     if (reportViewModel.ReportId > -1)
  298:                     {
  299:                         ReopenClosedReport(ref reportViewModel);
  300:                     }
  301:                     else
  302:                     {
  303:                     }
  304:                 }
  305:                 else
  306:                 {
  307:                 }
  308:             }
  309:         }
  310:  
  311:         ////////////////////////////////////////////////////////////////////////////
  312:  
  313:         /// <summary>
  314:         ///
  315:         /// </summary>
  316:         public static void DeleteHistoryReport(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string _reportHistoryId)
  317:         {
  318:             reportViewModel.UpdateResult = new Ia.Cl.Models.Result();
  319:  
  320:             var reportHistoryId = int.Parse(_reportHistoryId);
  321:  
  322:             var report = Ia.Ftn.Cl.Models.Data.Report.Read(reportViewModel.ReportId);
  323:             var reportHistory = Ia.Ftn.Cl.Models.Data.ReportHistory.Read(reportHistoryId);
  324:  
  325:             if (reportHistory != null)
  326:             {
  327:                 if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCreateReadUpdateDeleteReportHistory(Ia.Ftn.Cl.Models.Business.Authority.PersistentStorageFunction.Delete, report, reportHistory, reportViewModel.CurrentStaffIdentityUser))
  328:                 {
  329:                     var b = Ia.Ftn.Cl.Models.Data.ReportHistory.Delete(reportHistoryId);
  330:  
  331:                     if (b)
  332:                     {
  333:                         reportViewModel.UpdateResult.AddSuccess("Report history successfully deleted (مسح التقرير بنجاح)");
  334:                     }
  335:                     else throw new Exception("") { };
  336:                 }
  337:                 else
  338:                 {
  339:                     reportViewModel.InsertButtonEnabled = false;
  340:  
  341:                     reportViewModel.UpdateResult.AddError("You are not authorized to modify this report history (لست مخولاً بتعديل هذا التقرير)");
  342:                 }
  343:             }
  344:             else
  345:             {
  346:                 reportViewModel.UpdateResult.AddError("Report history " + reportHistoryId + " does not exist (التقرير غير موجود).");
  347:             }
  348:         }
  349:  
  350:         ////////////////////////////////////////////////////////////////////////////
  351:  
  352:         /// <summary>
  353:         ///
  354:         /// </summary>
  355:         private static void InsertReportHistory(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  356:         {
  357:             bool reportInserted, reportClosed, complainantNotified;
  358:             int area;
  359:             string result;
  360:             DateTime now;
  361:  
  362:             reportViewModel.InsertResult = new Ia.Cl.Models.Result();
  363:  
  364:             var reportId = reportViewModel.ReportId;
  365:  
  366:             var report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId); // refresh report
  367:             Ia.Ftn.Cl.Models.ReportHistory reportHistory = null;
  368:  
  369:             if (!string.IsNullOrEmpty(reportViewModel.ResolutionSelectedValue))
  370:             {
  371:                 if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCreateReadUpdateDeleteReportHistory(Ia.Ftn.Cl.Models.Business.Authority.PersistentStorageFunction.Create, report, null, reportViewModel.CurrentStaffIdentityUser))
  372:                 {
  373:                     now = DateTime.UtcNow.AddHours(3);
  374:  
  375:                     area = 11; // <area id="11" name="Service"
  376:  
  377:                     var indication = int.Parse(reportViewModel.IndicationSelectedValue);
  378:                     var resolution = int.Parse(reportViewModel.ResolutionSelectedValue);
  379:                     var action = int.Parse(reportViewModel.ActionSelectedValue);
  380:                     var estimate = int.Parse(reportViewModel.EstimateSelectedValue);
  381:  
  382:                     var detail = WebUtility.HtmlDecode(reportViewModel.DetailTextArea);
  383:                     var note = WebUtility.HtmlDecode(reportViewModel.NoteTextArea);
  384:  
  385:                     // below: first check if the last resolution is an assignement and weather the users is rejecting it
  386:                     if (resolution == 1005)
  387:                     {
  388:                         if (report.LastReportHistory != null && report.LastReportHistory.Resolution == 1003)
  389:                         {
  390:                             /*
  391:                              * <resolution id="1002" name="Assign" arabicName="تعيين" insertForm="false"/>
  392:                              * <resolution id="1003" name="Assigned" arabicName="تم تعيين" insertForm="false"/>
  393:                              * <resolution id="1004" name="Accepted" arabicName="قُبِل التعيين" insertForm="false"/>
  394:                              * <resolution id="1005" name="Not Accepted" arabicName="رفض التعيين" insertForm="true"/>
  395:                              */
  396:  
  397:                             // below: the user refuses an assignement, code will look for assingment before last, which should be resolution=1002 and reverse it back to the assigner
  398:  
  399:                             var assigneeStaffIdentityUser = report.SecondToLastReportHistory.StaffIdentityUser;
  400:  
  401:                             // below: first say that this person rejects an assignment
  402:                             // below: <resolution id="1005" name="Not Accepted"
  403:                             resolution = 1005;
  404:                             reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  405:                             {
  406:                                 Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  407:                                 Area = area,
  408:                                 Indication = indication,
  409:                                 Resolution = resolution,
  410:                                 Action = action,
  411:                                 Estimate = estimate,
  412:                                 Detail = detail,
  413:                                 StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
  414:                                 Note = note,
  415:                                 Created = now,
  416:                                 Updated = now
  417:                             };
  418:  
  419:                             reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  420:  
  421:                             if (reportInserted)
  422:                             {
  423:                                 // below: this user assigns to other user
  424:                                 // below: <resolution id="1002" name="Assign"
  425:                                 resolution = 1002;
  426:                                 reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  427:                                 {
  428:                                     Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  429:                                     Area = area,
  430:                                     Indication = indication,
  431:                                     Resolution = resolution,
  432:                                     Action = action,
  433:                                     Estimate = estimate,
  434:                                     Detail = detail,
  435:                                     StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
  436:                                     Note = note,
  437:                                     Created = now,
  438:                                     Updated = now
  439:                                 };
  440:  
  441:                                 reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  442:  
  443:                                 if (reportInserted)
  444:                                 {
  445:                                     // below: <resolution id="1003" name="Assigned"
  446:                                     resolution = 1003;
  447:                                     reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  448:                                     {
  449:                                         Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  450:                                         Area = area,
  451:                                         Indication = indication,
  452:                                         Resolution = resolution,
  453:                                         Action = action,
  454:                                         Estimate = estimate,
  455:                                         Detail = detail,
  456:                                         StaffIdentityUser = assigneeStaffIdentityUser,
  457:                                         Note = note,
  458:                                         Created = now,
  459:                                         Updated = now
  460:                                     };
  461:  
  462:                                     reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  463:  
  464:                                     if (reportInserted)
  465:                                     {
  466:                                         if (bool.TryParse(reportViewModel.ComplainantNotifiedSelectedValue, out bool complainantNotifiedSelected))
  467:                                         {
  468:                                             complainantNotified = complainantNotifiedSelected && Ia.Ftn.Cl.Models.Data.ReportHistory.ComplainantNotified(reportHistory);
  469:                                         }
  470:                                         else
  471:                                         {
  472:                                         }
  473:  
  474:                                         reportClosed = reportViewModel.CloseReportCheckBoxEnabled && Ia.Ftn.Cl.Models.Data.Report.CloseStatus(report);
  475:  
  476:                                         if (reportClosed)
  477:                                         {
  478:                                             reportViewModel.InsertResult.AddSuccess("Report history successfully inserted and report closed (أدخلت حالة تقرير بنجاح وأغلق التقرير)");
  479:                                         }
  480:                                         else
  481:                                         {
  482:                                             reportViewModel.InsertResult.AddSuccess("Report history successfully inserted (أدخلت حالة تقرير بنجاح)");
  483:                                         }
  484:                                     }
  485:                                     else
  486:                                     {
  487:                                         reportViewModel.InsertResult.AddWarning("Two report histories successfully created, but the assignment acknowledgment (third) report was not successful (أدخل التقرير الأول والثاني بنجاح، لكن لم يدخل الثالث).");
  488:                                     }
  489:                                 }
  490:                                 else
  491:                                 {
  492:                                     reportViewModel.InsertResult.AddWarning("One report history successfully created, but the assignment (second) report was not successful (أدخل التقرير الأول بنجاح، لكن لم يدخل الثاني).");
  493:                                 }
  494:                             }
  495:                             else
  496:                             {
  497:                                 reportViewModel.InsertResult.AddWarning("One report history successfully created, but you can't assign to yourself (أدخل التقرير الأول بنجاح، لكن لا تستطيع التعيين لنفسك).");
  498:                             }
  499:                         }
  500:                         else
  501:                         {
  502:                             reportViewModel.InsertResult.AddError("No one assigned this report history to you (لم يتم التعيين لك)");
  503:                         }
  504:                     }
  505:                     else
  506:                     {
  507:                         reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  508:                         {
  509:                             Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  510:                             Area = area,
  511:                             Indication = indication,
  512:                             Resolution = resolution,
  513:                             Action = action,
  514:                             Estimate = estimate,
  515:                             Detail = detail,
  516:                             StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
  517:                             Note = note,
  518:                             Created = now,
  519:                             Updated = now
  520:                         };
  521:  
  522:                         reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  523:  
  524:                         if (reportInserted)
  525:                         {
  526:                             if (!string.IsNullOrEmpty(reportViewModel.StaffFrameworkAssignmentSelectedValue))
  527:                             {
  528:                                 // below: when an assignment is issued two more records will be inserted
  529:                                 /*
  530:                                  * <resolution id="1002" name="Assign" arabicName="تعيين" insertForm="false"/>
  531:                                  * <resolution id="1003" name="Assigned" arabicName="تم تعيين" insertForm="false"/>
  532:                                  * <resolution id="1004" name="Accepted" arabicName="قُبِل التعيين" insertForm="false"/>
  533:                                  * <resolution id="1005" name="Not Accepted" arabicName="رفض التعيين" insertForm="true"/>
  534:                                  */
  535:  
  536:                                 bool isFrameworkId;
  537:                                 Ia.Ftn.Cl.Models.StaffIdentityUser assigneeStaffIdentityUser;
  538:  
  539:                                 var staffFrameworkId = reportViewModel.StaffFrameworkAssignmentSelectedValue;
  540:  
  541:                                 if (Ia.Ftn.Cl.Models.Business.Administration.IsFrameworkId(staffFrameworkId))
  542:                                 {
  543:                                     isFrameworkId = true;
  544:  
  545:                                     assigneeStaffIdentityUser = reportViewModel.CurrentStaffIdentityUser;
  546:                                 }
  547:                                 else
  548:                                 {
  549:                                     isFrameworkId = false;
  550:  
  551:                                     assigneeStaffIdentityUser = (from s in Ia.Ftn.Cl.Models.Data.StaffIdentityUser.List()
  552:                                                                  where s.Id == staffFrameworkId
  553:                                                                  select s).SingleOrDefault();
  554:                                 }
  555:  
  556:                                 // below: check if the assigner and assignee are the same
  557:                                 //if (!isFrameworkId && reportViewModel.CurrentStaffIdentityUser.Id != assigneeStaffIdentityUser.Id)
  558:                                 //{
  559:                                 resolution = 1002; // <resolution id="1002" name="Assign" arabicName="تعيين" insertForm="false"/>
  560:  
  561:                                 // below: then indicate the assigner
  562:                                 reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  563:                                 {
  564:                                     Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  565:                                     Area = area,
  566:                                     Indication = indication,
  567:                                     Resolution = resolution,
  568:                                     Action = action,
  569:                                     Estimate = estimate,
  570:                                     Detail = detail,
  571:                                     StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
  572:                                     Note = note,
  573:                                     Created = now,
  574:                                     Updated = now
  575:                                 };
  576:  
  577:                                 reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  578:  
  579:                                 if (reportInserted)
  580:                                 {
  581:                                     // below: check if assignee is staff or framework
  582:  
  583:                                     if (isFrameworkId) resolution = 1016; // <resolution id="1016" name="Domain Assignment" arabicName="تعيين نطاق"
  584:                                     else resolution = 1003; // <resolution id="1003" name="Assigned" arabicName="تم تعيين"/>
  585:  
  586:                                     // below: then indicate the person, or the framework, that was assigned to
  587:                                     reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  588:                                     {
  589:                                         Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  590:                                         Area = area,
  591:                                         Indication = indication,
  592:                                         Resolution = resolution,
  593:                                         Action = action,
  594:                                         Estimate = estimate,
  595:                                         Detail = detail,
  596:                                         StaffIdentityUser = assigneeStaffIdentityUser,
  597:                                         FrameworkId = staffFrameworkId,
  598:                                         Note = note,
  599:                                         Created = now,
  600:                                         Updated = now
  601:                                     };
  602:  
  603:                                     reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out result);
  604:  
  605:                                     if (reportInserted)
  606:                                     {
  607:                                         if (bool.TryParse(reportViewModel.ComplainantNotifiedSelectedValue, out bool complainantNotifiedSelected))
  608:                                         {
  609:                                             complainantNotified = complainantNotifiedSelected && Ia.Ftn.Cl.Models.Data.ReportHistory.ComplainantNotified(reportHistory);
  610:                                         }
  611:                                         else
  612:                                         {
  613:                                         }
  614:  
  615:                                         reportClosed = reportViewModel.CloseReportCheckBoxEnabled && Ia.Ftn.Cl.Models.Data.Report.CloseStatus(report);
  616:  
  617:                                         if (reportClosed)
  618:                                         {
  619:                                             reportViewModel.InsertResult.AddSuccess("Report history successfully inserted and report closed (أدخلت حالة تقرير بنجاح وأغلق التقرير)");
  620:                                         }
  621:                                         else
  622:                                         {
  623:                                             reportViewModel.InsertResult.AddSuccess("Report history successfully inserted (أدخلت حالة تقرير بنجاح)");
  624:                                         }
  625:                                     }
  626:                                     else
  627:                                     {
  628:                                         reportViewModel.InsertResult.AddWarning("Two report histories successfully created, but the assignment acknowledgment (third) report was not successful (أدخل التقرير الأول والثاني بنجاح، لكن لم يدخل الثالث)");
  629:                                     }
  630:                                 }
  631:                                 else
  632:                                 {
  633:                                     reportViewModel.InsertResult.AddWarning("One report history successfully created, but the assignment (second) report was not successful (أدخل التقرير الأول بنجاح، لكن لم يدخل الثاني)");
  634:                                 }
  635:                                 //}
  636:                                 //else
  637:                                 //{
  638:                                 //    reportViewModel.InsertResult.AddWarning("One report history successfully created, but you can't assign to yourself (أدخل التقرير الأول بنجاح، لكن لا تستطيع التعيين لنفسك)");
  639:                                 //}
  640:  
  641:                                 // below: reset the assignment to nothing
  642:                                 reportViewModel.StaffFrameworkAssignmentSelectedValue = string.Empty;
  643:                             }
  644:                             else
  645:                             {
  646:                                 if (bool.TryParse(reportViewModel.ComplainantNotifiedSelectedValue, out bool complainantNotifiedSelected))
  647:                                 {
  648:                                     complainantNotified = complainantNotifiedSelected && Ia.Ftn.Cl.Models.Data.ReportHistory.ComplainantNotified(reportHistory);
  649:                                 }
  650:                                 else
  651:                                 {
  652:                                 }
  653:  
  654:                                 if (bool.TryParse(reportViewModel.CloseReportSelectedValue, out bool closeReportSelected))
  655:                                 {
  656:                                     reportClosed = closeReportSelected && Ia.Ftn.Cl.Models.Data.Report.CloseStatus(report);
  657:  
  658:                                     if (reportClosed)
  659:                                     {
  660:                                         reportViewModel.InsertResult.AddSuccess("Report history successfully inserted and report closed (أدخلت حالة تقرير بنجاح وأغلق التقرير)");
  661:                                     }
  662:                                     else
  663:                                     {
  664:                                         reportViewModel.InsertResult.AddSuccess("Report history successfully inserted (أدخلت حالة تقرير بنجاح)");
  665:                                     }
  666:                                 }
  667:                                 else
  668:                                 {
  669:                                 }
  670:                             }
  671:                         }
  672:                         else
  673:                         {
  674:                             reportViewModel.InsertResult.AddError("Report history not created (لم يدخل التقرير)");
  675:                         }
  676:                     }
  677:                 }
  678:                 else
  679:                 {
  680:                     reportViewModel.InsertButtonEnabled = false;
  681:  
  682:                     reportViewModel.InsertResult.AddError("You are not authorized to modify this report (لست مخولاً بتعديل هذا التقرير)");
  683:                 }
  684:             }
  685:             else
  686:             {
  687:                 reportViewModel.InsertResult.AddError("Missing resolution (لا نتيجة)");
  688:             }
  689:  
  690:             report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId); // refresh report
  691:         }
  692:  
  693:         ////////////////////////////////////////////////////////////////////////////
  694:  
  695:         /// <summary>
  696:         ///
  697:         /// </summary>
  698:         private static void ReopenClosedReport(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  699:         {
  700:             bool reportInserted, reportReopened;
  701:             int area, indication, resolution, action, estimate;
  702:             string detail, note;
  703:             DateTime now;
  704:  
  705:             reportViewModel.Result = new Ia.Cl.Models.Result();
  706:  
  707:             var reportId = reportViewModel.ReportId;
  708:  
  709:             var report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId);
  710:             Ia.Ftn.Cl.Models.ReportHistory reportHistory = null;
  711:  
  712:             if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCreateReadUpdateDeleteReportHistory(Ia.Ftn.Cl.Models.Business.Authority.PersistentStorageFunction.Create, report, null, reportViewModel.CurrentStaffIdentityUser)
  713:             && Ia.Ftn.Cl.Models.Business.Authority.StaffCanReopenClosedReport(report, reportViewModel.CurrentStaffIdentityUser))
  714:             {
  715:                 now = DateTime.UtcNow.AddHours(3);
  716:  
  717:                 area = 11; // <area id="11" name="Service"
  718:  
  719:                 indication = 0;
  720:                 resolution = 1022; // <resolution id = "1022" name = "Reopened" arabicName = "إعادة فتح" 
  721:                 action = 0;
  722:                 estimate = 0;
  723:                 detail = string.Empty;
  724:                 note = string.Empty;
  725:  
  726:                 reportHistory = new Ia.Ftn.Cl.Models.ReportHistory
  727:                 {
  728:                     Report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId),
  729:                     Area = area,
  730:                     Indication = indication,
  731:                     Resolution = resolution,
  732:                     Action = action,
  733:                     Estimate = estimate,
  734:                     Detail = detail,
  735:                     StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
  736:                     Note = note,
  737:                     Created = now,
  738:                     Updated = now
  739:                 };
  740:  
  741:                 reportInserted = Ia.Ftn.Cl.Models.Data.ReportHistory.Create(reportHistory, out string result);
  742:  
  743:                 if (reportInserted)
  744:                 {
  745:                     reportReopened = Ia.Ftn.Cl.Models.Data.Report.OpenStatus(report);//, staff);
  746:  
  747:                     if (reportReopened)
  748:                     {
  749:                         reportViewModel.Result.AddSuccess("Report history successfully reopened (تم فتح التقرير بنجاح)");
  750:                     }
  751:                     else
  752:                     {
  753:                         reportViewModel.Result.AddError("Report history not reopened (لم يفتح التقرير)");
  754:                     }
  755:                 }
  756:                 else
  757:                 {
  758:                     reportViewModel.Result.AddError("Report history not created (لم يدخل التقرير)");
  759:                 }
  760:             }
  761:             else
  762:             {
  763:                 reportViewModel.InsertButtonEnabled = false;
  764:  
  765:                 reportViewModel.Result.AddError("You are not authorized to modify this report (لست مخولاً بتعديل هذا التقرير)");
  766:             }
  767:  
  768:             report = Ia.Ftn.Cl.Models.Data.Report.Read(reportId);
  769:         }
  770:  
  771:         ////////////////////////////////////////////////////////////////////////////
  772:  
  773:         /// <summary>
  774:         ///
  775:         /// </summary>
  776:         private static void ReportSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  777:         {
  778:             reportViewModel.ReportList = Ia.Ftn.Cl.Models.Data.Report.ReadSingleAsList(reportViewModel.ReportId);
  779:         }
  780:  
  781:         ////////////////////////////////////////////////////////////////////////////
  782:  
  783:         /// <summary>
  784:         ///
  785:         /// </summary>
  786:         private static void StaffFrameworkAssignmentSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, Ia.Ftn.Cl.Models.Report report)
  787:         {
  788:             var list = Ia.Ftn.Cl.Models.Business.Authority.StaffFrameworkListOfAllowedReportAssignsByStaff(report, reportViewModel.CurrentStaffIdentityUser);
  789:  
  790:             var list1 = new List<SelectListItem>();
  791:             list1.Add(new SelectListItem("", ""));
  792:  
  793:             foreach (var l in list) list1.Add(new SelectListItem(l.Name, l.Id));
  794:  
  795:             reportViewModel.StaffFrameworkAssignmentSelectList = new SelectList(list1, "Value", "Text");
  796:             reportViewModel.StaffFrameworkAssignmentSelectedValue = ""; // always default to none
  797:         }
  798:  
  799:         ////////////////////////////////////////////////////////////////////////////
  800:  
  801:         /// <summary>
  802:         ///
  803:         /// </summary>
  804:         private static void IndicationSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, Ia.Ftn.Cl.Models.Report report)
  805:         {
  806:             var currentStaffIdentityUser = reportViewModel.CurrentStaffIdentityUser;
  807:  
  808:             var list = (from i in Ia.Ftn.Cl.Models.Data.Report.IndicationList
  809:                         where (i.Area != null && i.Area.Frameworks != null && (i.Area.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.ArabicName)).Any() || i.Area.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.FullyQualifiedArabicName)).Any())
  810:                         && i.Frameworks != null && (i.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.ArabicName)).Any() || i.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.FullyQualifiedArabicName)).Any())
  811:                         && !i.Obsolete && i.CanInsert) || i.Area == null
  812:                         select new
  813:                         {
  814:                             i.ColoredEnglishAndArabicName,
  815:                             i.XmlId
  816:                         }).Distinct().ToList();
  817:  
  818:             reportViewModel.IndicationSelectList = new SelectList(list, "XmlId", "ColoredEnglishAndArabicName");
  819:             reportViewModel.IndicationSelectedValue ??= "1000"; // <indication id="1000" name="Unspecified" arabicName="غير محدد"/>
  820:         }
  821:  
  822:         ////////////////////////////////////////////////////////////////////////////
  823:  
  824:         /// <summary>
  825:         ///
  826:         /// </summary>
  827:         private static void ActionSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, Ia.Ftn.Cl.Models.Report report)
  828:         {
  829:             var currentStaffIdentityUser = reportViewModel.CurrentStaffIdentityUser;
  830:  
  831:             var list = (from a in Ia.Ftn.Cl.Models.Data.Report.ActionList
  832:                         where (a.Area != null && a.Area.Frameworks != null && (a.Area.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.ArabicName)).Any() || a.Area.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.FullyQualifiedArabicName)).Any())
  833:                         && a.Frameworks != null && (a.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.ArabicName)).Any() || a.Frameworks.Intersect(currentStaffIdentityUser.Framework.AncestorsOrSelf.Select(u => u.FullyQualifiedArabicName)).Any())
  834:                         && !a.Obsolete && a.CanInsert) || a.Area == null
  835:                         select new
  836:                         {
  837:                             a.ColoredEnglishAndArabicName,
  838:                             a.XmlId
  839:                         }).Distinct().ToList();
  840:  
  841:             reportViewModel.ActionSelectList = new SelectList(list, "XmlId", "ColoredEnglishAndArabicName");
  842:             reportViewModel.ActionSelectedValue ??= "1000"; // <resolution id="1000" name="Unspecified" arabicName="غير محدد"/>
  843:         }
  844:  
  845:         ////////////////////////////////////////////////////////////////////////////
  846:  
  847:         /// <summary>
  848:         ///
  849:         /// </summary>
  850:         private static void ResolutionSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  851:         {
  852:             var list = (from r in Ia.Ftn.Cl.Models.Data.Report.ResolutionList
  853:                         where !r.Obsolete && r.CanInsert
  854:                         select new
  855:                         {
  856:                             r.ColoredEnglishAndArabicName,
  857:                             r.XmlId
  858:                         }).Distinct().ToList();
  859:  
  860:             reportViewModel.ResolutionSelectList = new SelectList(list, "XmlId", "ColoredEnglishAndArabicName");
  861:             reportViewModel.ResolutionSelectedValue ??= "1000"; // <indication id="1000" name="Unspecified" arabicName="غير محدد"/>
  862:         }
  863:  
  864:         ////////////////////////////////////////////////////////////////////////////
  865:  
  866:         /// <summary>
  867:         ///
  868:         /// </summary>
  869:         private static void EstimateSelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  870:         {
  871:             var list = Ia.Ftn.Cl.Models.Data.Report.EstimateEnglishAndArabicDictionary;
  872:  
  873:             reportViewModel.EstimateSelectList = new SelectList(list, "Key", "Value", "0");
  874:         }
  875:  
  876:         ////////////////////////////////////////////////////////////////////////////
  877:  
  878:         /// <summary>
  879:         ///
  880:         /// </summary>
  881:         private static void ReportHistorySelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, Ia.Ftn.Cl.Models.Report report)
  882:         {
  883:             var reportId = reportViewModel.ReportId;
  884:  
  885:             if (Ia.Ftn.Cl.Models.Business.Authority.StaffCanCreateReadUpdateDeleteReportHistory(Ia.Ftn.Cl.Models.Business.Authority.PersistentStorageFunction.Create, report, null, reportViewModel.CurrentStaffIdentityUser))
  886:             {
  887:                 reportViewModel.InsertButtonEnabled = true;
  888:             }
  889:             else
  890:             {
  891:                 // below: not owner
  892:                 reportViewModel.InsertButtonEnabled = false;
  893:  
  894:                 reportViewModel.InformationResult.AddError("You are not authorized to modify this report (لست مخولاً بتعديل هذا التقرير)");
  895:             }
  896:  
  897:             reportViewModel.ReportHistoryList = Ia.Ftn.Cl.Models.Data.ReportHistory.ListForReportId(reportId);
  898:         }
  899:  
  900:         ////////////////////////////////////////////////////////////////////////////
  901:         ////////////////////////////////////////////////////////////////////////////
  902:  
  903:  
  904:  
  905:  
  906:  
  907:  
  908:  
  909:  
  910:  
  911:  
  912:  
  913:  
  914:  
  915:  
  916:  
  917:  
  918:  
  919:  
  920:  
  921:  
  922:  
  923:  
  924:  
  925:         ////////////////////////////////////////////////////////////////////////////
  926:         ////////////////////////////////////////////////////////////////////////////
  927:  
  928:         /// <summary>
  929:         ///
  930:         /// </summary>
  931:         public static void InsertViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  932:         {
  933:             var reportId = -1;
  934:  
  935:             reportViewModel.PreliminaryAnalysisPanelVisible = false; // treeview
  936:             reportViewModel.ServiceAPanelVisible = true;
  937:  
  938:             PrioritySelectList_ViewModel(ref reportViewModel);
  939:             SeverityRadioButton_ViewModel(ref reportViewModel);
  940:             TreeView_DataAssign(ref reportViewModel);
  941:         }
  942:  
  943:         ////////////////////////////////////////////////////////////////////////////
  944:  
  945:         /// <summary>
  946:         ///
  947:         /// </summary>
  948:         private static void SeverityRadioButton_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  949:         {
  950:             var list = Ia.Ftn.Cl.Models.Data.Report.SeverityColoredDictionary;
  951:  
  952:             reportViewModel.SeveritySelectList = new SelectList(list, "Key", "Value");
  953:             reportViewModel.SeveritySelectedValue ??= "0";
  954:         }
  955:  
  956:         ////////////////////////////////////////////////////////////////////////////
  957:  
  958:         /// <summary>
  959:         ///
  960:         /// </summary>
  961:         private static void PrioritySelectList_ViewModel(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  962:         {
  963:             var list = Ia.Ftn.Cl.Models.Data.Report.PriorityEnglishAndArabicDictionary;
  964:  
  965:             reportViewModel.PrioritySelectList = new SelectList(list, "Key", "Value");
  966:         }
  967:  
  968:         ////////////////////////////////////////////////////////////////////////////
  969:  
  970:         /// <summary>
  971:         ///
  972:         /// </summary>
  973:         private static void TreeView_DataAssign(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
  974:         {
  975:             //indicationXmlDataSource.Data = Ia.Ftn.Cl.Models.Data.Report.XDocument.ToString();
  976:             //indicationXmlDataSource.XPath = "report/customerCare/indication/*";
  977:         }
  978:  
  979:         ////////////////////////////////////////////////////////////////////////////
  980:  
  981:         /// <summary>
  982:         ///
  983:         /// </summary>
  984:         public static void InsertPost(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string commandName)
  985:         {
  986:             if (commandName == "findReport")
  987:             {
  988:                 Find(ref reportViewModel);
  989:             }
  990:             else if (commandName == "insertReport")
  991:             {
  992:                 InsertReport(ref reportViewModel);
  993:             }
  994:  
  995:             //insertPanel.Visible = treeView.Visible = serviceAPanel.Visible = preliminaryAnalysisPanel.Visible = true;
  996:         }
  997:  
  998:         ////////////////////////////////////////////////////////////////////////////
  999:  
 1000:         /// <summary>
 1001:         ///
 1002:         /// </summary>
 1003:         private static void Find(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
 1004:         {
 1005:             int reportServiceType;
 1006:             string input;
 1007:  
 1008:             input = WebUtility.HtmlDecode(reportViewModel.ServiceInput);
 1009:  
 1010:             reportViewModel.FindResult = new Ia.Cl.Models.Result();
 1011:  
 1012:             if (!string.IsNullOrEmpty(input))
 1013:             {
 1014:                 // below: space characters from start and end
 1015:  
 1016:                 input = input.Trim();
 1017:  
 1018:                 input = Regex.Replace(input, @"^\s+", "");
 1019:                 input = Regex.Replace(input, @"\s+$", "");
 1020:                 input = input.ToUpper();
 1021:  
 1022:                 // below: the regex checks the format of input:
 1023:  
 1024:                 if (Ia.Ftn.Cl.Models.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(input))
 1025:                 {
 1026:                     reportServiceType = (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.Dn;
 1027:  
 1028:                     FindProcess(ref reportViewModel, input, reportServiceType);
 1029:                 }
 1030:                 else if (Ia.Ftn.Cl.Models.Business.Access.AccessNameIsInAValidFormat(input))
 1031:                 {
 1032:                     reportServiceType = (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.AccessName;
 1033:  
 1034:                     FindProcess(ref reportViewModel, input, reportServiceType);
 1035:                 }
 1036:                 else
 1037:                 {
 1038:                     reportServiceType = (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.Unspecified;
 1039:  
 1040:                     reportViewModel.ServicePreviewText = string.Empty;
 1041:                     reportViewModel.InsertButtonEnabled = false;
 1042:  
 1043:                     reportViewModel.FindResult.AddError("Input format is unknown (قيمة غير مفهومة)");
 1044:                 }
 1045:  
 1046:                 reportViewModel.ReportServiceTypeLabel = reportServiceType.ToString();
 1047:             }
 1048:             else
 1049:             {
 1050:                 reportViewModel.FindResult.AddError("No input was entered (لم يتم إدخال أي شيء)");
 1051:  
 1052:                 reportViewModel.ServicePreviewText = string.Empty;
 1053:                 reportViewModel.InsertButtonEnabled = false;
 1054:             }
 1055:         }
 1056:  
 1057:         ////////////////////////////////////////////////////////////////////////////
 1058:  
 1059:         /// <summary>
 1060:         ///
 1061:         /// </summary>
 1062:         private static void FindProcess(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel, string input, int reportServiceType)
 1063:         {
 1064:             bool openReportExists;
 1065:             string serviceName, accessName;
 1066:             Ia.Ftn.Cl.Models.Access access;
 1067:             Ia.Ftn.Cl.Models.Business.NetworkDesignDocument.Vendor switchVendor, accessVendor;
 1068:             List<Ia.Ftn.Cl.Models.Report> reportList;
 1069:  
 1070:             reportViewModel.FindResult = new Ia.Cl.Models.Result();
 1071:  
 1072:             openReportExists = false;
 1073:             reportViewModel.ServicePreviewLabel = reportViewModel.ReportPreviewLabel = /*findResultLabel.Text =*/ string.Empty;
 1074:  
 1075:             serviceName = Ia.Ftn.Cl.Models.Business.Service.ServiceName(input, reportServiceType);
 1076:  
 1077:             if (reportServiceType == (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.Dn)
 1078:             {
 1079:                 if (Ia.Ftn.Cl.Models.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(input))
 1080:                 {
 1081:                     if (Ia.Ftn.Cl.Models.Business.Authority.NumberIsWithinFrameworkSiteDomainList(reportViewModel.CurrentStaffIdentityUser.Framework, input))
 1082:                     {
 1083:                         switchVendor = Ia.Ftn.Cl.Models.Business.Service.SwitchVendor(input);
 1084:  
 1085:                         reportViewModel.ServicePreviewText = serviceName;
 1086:                         reportViewModel.ServicePreviewLink = Ia.Ftn.Cl.Models.Business.Maintenance.Find.Url(serviceName);
 1087:                         reportViewModel.ServicePreviewPanelVisible = true;
 1088:  
 1089:                         using (var db = new Ia.Ftn.Cl.Db())
 1090:                         {
 1091:                             access = (from a in db.Accesses
 1092:                                       join srs in db.ServiceRequestServices on a equals srs.Access
 1093:                                       where srs.Service == input
 1094:                                       select a).FirstOrDefault();
 1095:  
 1096:                             if (access != null)
 1097:                             {
 1098:                                 reportViewModel.ServicePreviewLabel = "(" + access.Name + ") " + access.Address;
 1099:                             }
 1100:                             else
 1101:                             {
 1102:                                 reportViewModel.ServicePreviewLabel = "Number property data not available (لا توجد معلومات عنوان للرقم)";
 1103:  
 1104:                                 reportViewModel.InsertButtonEnabled = true;
 1105:                                 reportViewModel.ServiceLabel = input;
 1106:                             }
 1107:                         }
 1108:  
 1109:                         // below: search for all available reports for this service and display them as link
 1110:                         reportList = Ia.Ftn.Cl.Models.Data.Report.List(input);
 1111:  
 1112:                         if (reportList.Count >= 1)
 1113:                         {
 1114:                             reportViewModel.ReportPreviewLabel = string.Empty;
 1115:  
 1116:                             foreach (Ia.Ftn.Cl.Models.Report report in reportList)
 1117:                             {
 1118:                                 // below: check if there are open reports
 1119:  
 1120:                                 // <status id="1" name="Open"
 1121:                                 // <status id="2" name="Closed"
 1122:                                 if (report.Status == 1)
 1123:                                 {
 1124:                                     openReportExists = true;
 1125:  
 1126:                                     reportViewModel.ReportPreviewLabel += "<a href=\"" + "history?reportId=" + report.Id + "\">" + report.Created.ToString("yyyy-MM-dd") + "</a> (open) ";
 1127:                                 }
 1128:                                 else
 1129:                                 {
 1130:                                     reportViewModel.ReportPreviewLabel += "<a href=\"" + "history?reportId=" + report.Id + "\">" + report.Created.ToString("yyyy-MM-dd") + "</a> ";
 1131:                                 }
 1132:                             }
 1133:  
 1134:                             reportViewModel.InsertedReportList = reportList;
 1135:  
 1136:                             if (openReportExists)
 1137:                             {
 1138:                                 reportViewModel.FindResult.AddWarning("You can not insert a new report because there is still an open report.<br /> لا يمكن إضافة تقرير جديد لهذا الرقم لأن تقريراً سابقاً لا يزال مفتوحاً");
 1139:  
 1140:                                 reportViewModel.InsertButtonEnabled = false;
 1141:                             }
 1142:                             else
 1143:                             {
 1144:                                 reportViewModel.InsertButtonEnabled = true;
 1145:                                 reportViewModel.ServiceLabel = input;
 1146:                             }
 1147:                         }
 1148:                         else
 1149:                         {
 1150:                             reportViewModel.InsertButtonEnabled = true;
 1151:                             reportViewModel.ServiceLabel = input;
 1152:  
 1153:                             reportViewModel.ReportPreviewLabel = "None (لا توجد)";
 1154:                         }
 1155:  
 1156:                         Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.FtnApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadService, input);
 1157:                     }
 1158:                     else
 1159:                     {
 1160:                         reportViewModel.FindResult.AddError("Number " + serviceName + " is not in staff site domain (الرقم لا ينتمي لنطاقات المستخدم)");
 1161:  
 1162:                         reportViewModel.ServicePreviewPanelVisible = false;
 1163:                         reportViewModel.InsertButtonEnabled = false;
 1164:                     }
 1165:                 }
 1166:                 else
 1167:                 {
 1168:                     reportViewModel.FindResult.AddError("Number " + serviceName + " is not within network (الرقم لا ينتمي للشبكة)");
 1169:  
 1170:                     reportViewModel.ServicePreviewPanelVisible = false;
 1171:                     reportViewModel.InsertButtonEnabled = false;
 1172:                 }
 1173:             }
 1174:             else if (reportServiceType == (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.AccessName)
 1175:             {
 1176:                 if (Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out accessName))
 1177:                 {
 1178:                     if (Ia.Ftn.Cl.Models.Business.Authority.AccessNameIsWithinFrameworkSiteAreaSymbolList(reportViewModel.CurrentStaffIdentityUser.Framework, accessName))
 1179:                     {
 1180:                         accessVendor = Ia.Ftn.Cl.Models.Business.Service.AccessVendor(accessName);
 1181:  
 1182:                         reportViewModel.ServicePreviewText = accessName;
 1183:                         reportViewModel.ServicePreviewLink = Ia.Ftn.Cl.Models.Business.Maintenance.Find.Url(accessName);
 1184:  
 1185:                         access = Ia.Ftn.Cl.Models.Data.Access.ReadByAccessName(accessName);
 1186:  
 1187:                         if (access != null)
 1188:                         {
 1189:                             reportViewModel.ServicePreviewPanelVisible = true;
 1190:                             reportViewModel.ServicePreviewLabel = "(" + access.Name + ") " + access.Address;
 1191:  
 1192:                             // below: search for all available reports for this accessName and display them as link
 1193:                             reportList = Ia.Ftn.Cl.Models.Data.Report.List(access.Name);
 1194:  
 1195:                             if (reportList.Count >= 1)
 1196:                             {
 1197:                                 reportViewModel.ReportPreviewLabel = string.Empty;
 1198:  
 1199:                                 foreach (Ia.Ftn.Cl.Models.Report report in reportList)
 1200:                                 {
 1201:                                     // below: we will check if there are open reports
 1202:  
 1203:                                     // <status id="1" name="Open"
 1204:                                     // <status id="2" name="Closed"
 1205:                                     if (report.Status == 1)
 1206:                                     {
 1207:                                         openReportExists = true;
 1208:  
 1209:                                         reportViewModel.ReportPreviewLabel += "<a href=\"" + "history?reportId=" + report.Id + "\">" + report.Created.ToString("yyyy-MM-dd") + "</a> (open) ";
 1210:                                     }
 1211:                                     else
 1212:                                     {
 1213:                                         reportViewModel.ReportPreviewLabel += "<a href=\"" + "history?reportId=" + report.Id + "\">" + report.Created.ToString("yyyy-MM-dd") + "</a> ";
 1214:                                     }
 1215:                                 }
 1216:  
 1217:                                 reportViewModel.InsertedReportList = reportList;
 1218:  
 1219:                                 if (openReportExists)
 1220:                                 {
 1221:                                     reportViewModel.FindResult.AddWarning("You can not insert a new report because there is still an open report.<br /> لا يمكن إضافة تقرير جديد لهذا الرقم لأن تقريراً سابقاً لا يزال مفتوحاً");
 1222:  
 1223:                                     reportViewModel.InsertButtonEnabled = false;
 1224:                                 }
 1225:                                 else
 1226:                                 {
 1227:                                     reportViewModel.ServiceLabel = accessName;
 1228:                                     reportViewModel.InsertButtonEnabled = true;
 1229:                                 }
 1230:                             }
 1231:                             else
 1232:                             {
 1233:                                 reportViewModel.ReportPreviewLabel = "None (لا توجد)";
 1234:  
 1235:                                 reportViewModel.FindResult.AddWarning("None (لا توجد)");
 1236:                                 //findResultLabel.CssClass = "warn";
 1237:  
 1238:                                 reportViewModel.ServiceLabel = accessName;
 1239:                                 reportViewModel.InsertButtonEnabled = true;
 1240:                             }
 1241:                         }
 1242:                         else
 1243:                         {
 1244:                             reportViewModel.FindResult.AddWarning("Access " + accessName + " data not available (لا توجد معلومات جهاز)");
 1245:  
 1246:                             reportViewModel.ServiceLabel = accessName;
 1247:                             reportViewModel.InsertButtonEnabled = true;
 1248:                         }
 1249:  
 1250:                         Ia.Ftn.Cl.Models.Data.MessageQueue.SecretaryApplication.Enqueue(Ia.Ftn.Cl.Models.Business.MessageQueue.Application.FtnApplication, Ia.Ftn.Cl.Models.Business.MessageQueue.Process.ReadAccess, accessName);
 1251:                     }
 1252:                     else
 1253:                     {
 1254:                         reportViewModel.FindResult.AddError("Access " + accessName + " is not in staff site access list (رقم الجهاز لا ينتمي لمقسم المستخدم)");
 1255:  
 1256:                         reportViewModel.ServicePreviewPanelVisible = false;
 1257:                         reportViewModel.InsertButtonEnabled = false;
 1258:                     }
 1259:                 }
 1260:                 else
 1261:                 {
 1262:                     reportViewModel.ServicePreviewText = string.Empty;
 1263:  
 1264:                     reportViewModel.FindResult.AddError("Access " + accessName + " does not belong to the network (الجهاز لا ينتمي للشبكة)");
 1265:  
 1266:                     reportViewModel.ServicePreviewPanelVisible = false;
 1267:                     reportViewModel.InsertButtonEnabled = false;
 1268:                 }
 1269:             }
 1270:             else
 1271:             {
 1272:                 reportViewModel.InsertAuthorityResult.AddError("Unknown error (خطأ غير معروف)");
 1273:  
 1274:                 reportViewModel.ServicePreviewPanelVisible = false;
 1275:                 reportViewModel.InsertButtonEnabled = false;
 1276:             }
 1277:         }
 1278:  
 1279:         ////////////////////////////////////////////////////////////////////////////
 1280:  
 1281:         /// <summary>
 1282:         ///
 1283:         /// </summary>
 1284:         private static bool OpenReportExistsForService(int reportServiceType, string input)
 1285:         {
 1286:             bool openReportExists;
 1287:             long number;
 1288:             string serviceName, accessName;
 1289:             Ia.Ftn.Cl.Models.Access access;
 1290:             List<Ia.Ftn.Cl.Models.Report> reportList;
 1291:  
 1292:             serviceName = Ia.Ftn.Cl.Models.Business.Service.ServiceName(input, reportServiceType);
 1293:  
 1294:             if (reportServiceType == (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.Dn)
 1295:             {
 1296:                 number = int.Parse(input);
 1297:  
 1298:                 if (Ia.Ftn.Cl.Models.Business.Service.ServiceHasEightDigitsAndIsWithinAllowedDomainList(number))
 1299:                 {
 1300:                     reportList = Ia.Ftn.Cl.Models.Data.Report.List(number.ToString());
 1301:  
 1302:                     if (reportList.Count >= 1)
 1303:                     {
 1304:                         openReportExists = false;
 1305:  
 1306:                         foreach (Ia.Ftn.Cl.Models.Report report in reportList)
 1307:                         {
 1308:                             // below: check if there are open reports
 1309:  
 1310:                             // <status id="1" name="Open"
 1311:                             // <status id="2" name="Closed"
 1312:                             if (report.Status == 1)
 1313:                             {
 1314:                                 openReportExists = true;
 1315:                                 break;
 1316:                             }
 1317:                             else
 1318:                             {
 1319:                                 openReportExists = false;
 1320:                             }
 1321:                         }
 1322:                     }
 1323:                     else
 1324:                     {
 1325:                         openReportExists = false;
 1326:                     }
 1327:                 }
 1328:                 else
 1329:                 {
 1330:                     openReportExists = false;
 1331:                 }
 1332:             }
 1333:             else if (reportServiceType == (int)Ia.Ftn.Cl.Models.Business.Report.ServiceType.AccessName)
 1334:             {
 1335:                 if (Ia.Ftn.Cl.Models.Data.NetworkDesignDocument.AccessNameIsWithinAllowedOntList(input, out accessName))
 1336:                 {
 1337:                     access = Ia.Ftn.Cl.Models.Data.Access.ReadByAccessName(accessName);
 1338:  
 1339:                     if (access != null)
 1340:                     {
 1341:                         reportList = Ia.Ftn.Cl.Models.Data.Report.List(access.Name);
 1342:  
 1343:                         if (reportList.Count >= 1)
 1344:                         {
 1345:                             openReportExists = false;
 1346:  
 1347:                             foreach (Ia.Ftn.Cl.Models.Report report in reportList)
 1348:                             {
 1349:                                 // below: we will check if there are open reports
 1350:  
 1351:                                 // <status id="1" name="Open"
 1352:                                 // <status id="2" name="Closed"
 1353:                                 if (report.Status == 1)
 1354:                                 {
 1355:                                     openReportExists = true;
 1356:                                     break;
 1357:                                 }
 1358:                                 else
 1359:                                 {
 1360:                                     openReportExists = false;
 1361:                                 }
 1362:                             }
 1363:                         }
 1364:                         else
 1365:                         {
 1366:                             openReportExists = false;
 1367:                         }
 1368:                     }
 1369:                     else
 1370:                     {
 1371:                         openReportExists = false;
 1372:                     }
 1373:                 }
 1374:                 else
 1375:                 {
 1376:                     openReportExists = false;
 1377:                 }
 1378:             }
 1379:             else
 1380:             {
 1381:                 openReportExists = false;
 1382:             }
 1383:  
 1384:             return openReportExists;
 1385:         }
 1386:  
 1387:         ////////////////////////////////////////////////////////////////////////////
 1388:  
 1389:         /// <summary>
 1390:         ///
 1391:         /// </summary>
 1392:         private static void InsertReport(ref Ia.Ftn.Wa.Models.Maintenance.ReportViewModel reportViewModel)
 1393:         {
 1394:             int reportServiceType;
 1395:             string service, contact, result;
 1396:             DateTime now;
 1397:             Ia.Ftn.Cl.Models.Report report;
 1398:  
 1399:             reportViewModel.InsertResult = new Ia.Cl.Models.Result();
 1400:  
 1401:             reportViewModel.DetailTextArea ??= string.Empty;
 1402:             reportViewModel.ContactNameInput ??= string.Empty;
 1403:             reportViewModel.ContactPhoneInput ??= string.Empty;
 1404:             reportViewModel.NoteTextArea ??= string.Empty;
 1405:  
 1406:             if (reportViewModel.ServiceInput.Length > 0)
 1407:             {
 1408:                 if (reportViewModel.ServicePreviewLink.Length > 0)
 1409:                 {
 1410:                     if (reportViewModel.DetailTextArea.Length > 0)
 1411:                     {
 1412:                         if (reportViewModel.ContactNameInput.Length > 0)
 1413:                         {
 1414:                             if (reportViewModel.ContactPhoneInput.Length > 0)
 1415:                             {
 1416:                                 if (reportViewModel.ServiceLabel.Length > 0 && reportViewModel.ReportServiceTypeLabel.Length > 0)
 1417:                                 {
 1418:                                     reportServiceType = int.Parse(reportViewModel.ReportServiceTypeLabel);
 1419:                                     service = WebUtility.HtmlDecode(reportViewModel.ServiceLabel);
 1420:  
 1421:                                     if (!OpenReportExistsForService(reportServiceType, service))
 1422:                                     {
 1423:                                         now = DateTime.UtcNow.AddHours(3);
 1424:  
 1425:                                         contact = WebUtility.HtmlDecode(reportViewModel.ContactNameInput) + " " + WebUtility.HtmlDecode(reportViewModel.ContactPhoneInput);
 1426:  
 1427:                                         /*
 1428:                                         below:
 1429:                                         <type id="1" name="Dn"
 1430:                                         <type id="2" name="Ont Name"
 1431:                                         <type id="3" name="No Ont"
 1432:                                         <type id="0" name="Unspecified"
 1433:                                         */
 1434:  
 1435:                                         report = new Ia.Ftn.Cl.Models.Report
 1436:                                         {
 1437:                                             Service = service,
 1438:                                             ServiceType = reportServiceType,
 1439:                                             Area = 11, // <area id="11" name="Service"
 1440:                                             Category = 1,
 1441:                                             Severity = int.Parse(reportViewModel.SeveritySelectedValue),
 1442:                                             Priority = int.Parse(reportViewModel.PrioritySelectedValue),
 1443:                                             Status = 1, // <status id="1" name="Open" ...>
 1444:                                             Detail = WebUtility.HtmlDecode(reportViewModel.DetailTextArea),
 1445:                                             Contact = contact,
 1446:                                             StaffIdentityUser = reportViewModel.CurrentStaffIdentityUser,
 1447:                                             Note = WebUtility.HtmlDecode(reportViewModel.NoteTextArea),
 1448:                                             Created = now,
 1449:                                             Updated = now
 1450:                                         };
 1451:  
 1452:                                         var reportId = Ia.Ftn.Cl.Models.Data.Report.Create(report, out result);
 1453:  
 1454:                                         if (reportId >= 0)
 1455:                                         {
 1456:                                             reportViewModel.ReportId = reportId;
 1457:  
 1458:                                             var s = "Report successfully created (تم إدخال المعلومات)";
 1459:                                             reportViewModel.InsertResult.AddSuccess(s);
 1460:  
 1461:                                             reportViewModel.ServiceInput = reportViewModel.DetailTextArea = reportViewModel.ContactNameInput = reportViewModel.ContactPhoneInput = reportViewModel.NoteTextArea = string.Empty;
 1462:  
 1463:                                             reportViewModel.InsertButtonEnabled = false;
 1464:                                         }
 1465:                                         else
 1466:                                         {
 1467:                                             reportViewModel.ReportId = -1;
 1468:  
 1469:                                             reportViewModel.InsertResult.AddError(result);
 1470:                                         }
 1471:                                     }
 1472:                                     else
 1473:                                     {
 1474:                                         reportViewModel.InsertResult.AddError("You can not insert a new report because there is still an open report.<br /> لا يمكن إضافة تقرير جديد لهذا الرقم لأن تقريراً سابقاً لا يزال مفتوحاً");
 1475:  
 1476:                                         reportViewModel.InsertButtonEnabled = false;
 1477:                                     }
 1478:                                 }
 1479:                                 else
 1480:                                 {
 1481:                                     reportViewModel.InsertResult.AddError("Service and ServiceType hidden labels are missing");
 1482:                                 }
 1483:                             }
 1484:                             else
 1485:                             {
 1486:                                 reportViewModel.InsertResult.AddError("Contact phone is missing (رقم مراجعة المتصل مفقود)");
 1487:                             }
 1488:                         }
 1489:                         else
 1490:                         {
 1491:                             reportViewModel.InsertResult.AddError("Contact name is missing (اسم المتصل مفقود)");
 1492:                         }
 1493:                     }
 1494:                     else
 1495:                     {
 1496:                         reportViewModel.InsertResult.AddError("Detail is missing (وصف العطل مفقود)");
 1497:                     }
 1498:                 }
 1499:                 else
 1500:                 {
 1501:                     reportViewModel.InsertResult.AddError("Number format is incorrect or does not exist.<br /> (تركيب الرقم غير صحيح أو الرقم غير موجود ضمن الخدمة)");
 1502:                 }
 1503:             }
 1504:             else
 1505:             {
 1506:                 reportViewModel.InsertResult.AddError("No input was entered (لم يتم إدخال أي شيء)");
 1507:             }
 1508:  
 1509:             reportViewModel.InsertedReportList = Ia.Ftn.Cl.Models.Data.Report.ReadSingleAsList(reportViewModel.ReportId);
 1510:         }
 1511:  
 1512:         ////////////////////////////////////////////////////////////////////////////
 1513:         ////////////////////////////////////////////////////////////////////////////
 1514:     }
 1515:  
 1516:     ////////////////////////////////////////////////////////////////////////////
 1517:     ////////////////////////////////////////////////////////////////////////////
 1518: }