public void SetDeadline(BHDmini b, CompanySpecifics CompSpec) { string tpCode = b.SALE4.Trim(); if (CompSpec.dictDeadlines.ContainsKey(tpCode)) { maxNbDaysQuoting = CompSpec.dictDeadlines[tpCode].MaxDaysQuoting; maxNbDayContracting = CompSpec.dictDeadlines[tpCode].MaxDaysContracting; } else if (tpCode == "I") { // Several dates placed offer if (b.UDTEXT4.Trim() != "") { DateTime deadlineDate = DateTime.Parse(b.UDTEXT4.Trim(), new System.Globalization.CultureInfo("fr-FR", true)); DateTime dtSent = DateSent; if (dtSent <= deadlineDate) { maxNbDaysQuoting = 9999; maxNbDayContracting = 9999; } else { maxNbDaysQuoting = -1; maxNbDayContracting = -1; } } } }
public TooltipConversion(BHDmini b) { Full_Reference = b.FULL_REFERENCE.Trim(); Booking_Name = b.NAME.Trim(); Date_Entered = b.DATE_ENTERED.ToString("dd/MM/yyyy"); Travel_Date = b.TRAVELDATE.ToString("dd/MM/yyyy"); Current_Status = b.STATUS.Trim(); }
public TooltipMissingData(BHDmini b, BHDmissingData bmd) { Full_Reference = b.FULL_REFERENCE.Trim(); Booking_Name = b.NAME.Trim(); Estimated_Turnover = !bmd.MissingEstimatedTurnover ? b.UDTEXT3.Trim() : "MISSING ESTIMATED TURNOVER"; Sales_Update = !bmd.MissingSalesUpdate ? b.UDTEXT5.Trim() : "MISSING SALES UPDATE"; Series_Reference = !bmd.MissingSeriesReference ? b.UDTEXT1.Trim() : "MISSING SERIES REFERENCE"; Series_Reference = !bmd.IncorrectSeriesReference ? Series_Reference : "INVALID SERIES REFERENCE"; }
public TooltipQuotedEnquiry(SentEnquiry se, BHDmini b) { Full_Reference = se.FullReference; Bkg_Name = b.NAME; Date_Entered = b.DATE_ENTERED.ToString("dd/MM/yyyy"); Date_Sent = se.DateSent.ToString("dd/MM/yyyy"); Deadline = se.maxNbDaysQuoting.ToString(); if (se.maxNbDaysQuoting == 9999 || se.maxNbDaysQuoting == -1) { Deadline = b.UDTEXT4.Trim(); } Work_Days_Quoting = se.nbDaysQuoting.ToString(); }
public SentEnquiry SwitchToContractEvaluation(BHDmini b) { // create a clone of se SentEnquiry seCloned = this.MemberwiseClone() as SentEnquiry; seCloned.IsDepartment = (cs, dpt) => true; seCloned.IsSuccess = cs => nbDaysContracting <= maxNbDayContracting; seCloned.IsCsl = csl => dictContracting.ContainsKey(csl); seCloned.GetAllCslFromListOfItems = _listItems => _listItems.SelectMany(t => t.dictContracting.Keys).Distinct().ToList(); seCloned._tooltipColChart = new TooltipContractEnquiry(this, b); return(seCloned); }
public bool IsBHDunconfirmed(BHDmini b) { return(!BookingStageCodes[bookingStage.confirmed].Concat(BookingStageCodes[bookingStage.cancelled]) .Contains(b.STATUS.Trim())); }
public PendingEnquiryTableRow GenerateTableRow(BHDmini b) { PendingEnquiryTableRow tr = new PendingEnquiryTableRow(); tr.Full_Reference = b.FULL_REFERENCE.Trim(); tr.Booking_Name = b.NAME.Trim(); tr.Last_Stage = CompSpec.GetCurrentStage(b.STATUS.Trim()); // to get the number of days of the current process: // foreach BStage going backward in time // if same as current stage -> add days // if beyond sent stage or not pending -> exit for // take into account that the last BStage will be recorded until yesterday max int nbDaysCurrentStage = 0; var listBS = compDbRepo.listBStage.Where(bs => MinimiseRef(bs.FullReference.Trim()) == MinimiseRef(b.FULL_REFERENCE.Trim())); foreach (BStage bs in listBS.OrderByDescending(_bs => _bs.FromDate)) { string stage = CompSpec.GetCurrentStage(bs.Status.Trim()); if (stage == tr.Last_Stage) { // add days nbDaysCurrentStage += DatesUtilities.GetNbWorkingDays(bs.FromDate, bs.ToDate); } // if not pending at all -> break for if (!CompSpec.BookingStageCodes[bookingStage.pending].Contains(bs.Status.Trim())) { break; } } nbDaysCurrentStage++; // to include today's working day // establish the number of days before deadline // if response code other than "I" -> difference between deadline and nbDaysCurrentStage // if response code is "I" -> difference between today and the target date string responseCode = b.SALE4.Trim(); if (responseCode == "I") { DateTime deadlineDate; if (b.UDTEXT4.Trim() == "") { deadlineDate = new DateTime(2017, 2, 1); } else { deadlineDate = DateTime.Parse(b.UDTEXT4.Trim(), new System.Globalization.CultureInfo("fr-FR", true)); } tr.Days_Before_Deadline = (int)deadlineDate.Subtract(DateTime.Today).TotalDays; } else { int nbMaxDays = 0; if (CompSpec.dictDeadlines.ContainsKey(responseCode)) { nbMaxDays = tr.Last_Stage == "Quoting" ? CompSpec.dictDeadlines[responseCode].MaxDaysQuoting : CompSpec.dictDeadlines[responseCode].MaxDaysContracting; } tr.Days_Before_Deadline = (nbMaxDays - nbDaysCurrentStage); } //if (tpRepo.DictCsls == null) tpRepo.GetAllConsultants(); tr.Last_Consultant = tpRepo.DictCsls[b.CONSULTANT.Trim()]; tr.BD_Consultant = tpRepo.DictCsls[b.SALE1.Trim()]; return(tr); }
public async Task GeneratePerformanceSplitsAsync() { await tpRepo.GetAllConsultantsAsync(); var listSentEnquiriesTask = CalculateSentEnquiriesAsync(); string jsFromDate = "2017-05-01"; string jsToDate = DateTime.Today.AddDays(-1).ToString("yyyy-MM-dd"); DateTime FromDate = DateTime.ParseExact(jsFromDate, "yyyy-MM-dd", CultureInfo.InvariantCulture); DateTime ToDate = DateTime.ParseExact(jsToDate, "yyyy-MM-dd", CultureInfo.InvariantCulture); dictAllPerformance = new Dictionary <string, object>(); // 07/06/2017: remove the dupplicated offer for the conversion rate and the sent enquiries // definition of a dupplicatedOffer : a booking is part of a series defined by its first booking entered // the initial booking should remain for the evaluation , not the dupplicatedOffer // the dupplicatedOffer are kept for the missing data // 16/06/2017: booking references are compared by number and the branch List <string> validStatus = CompSpec.BookingStageCodes[bookingStage.sent] .Concat(CompSpec.BookingStageCodes[bookingStage.confirmed]) .Concat(CompSpec.BookingStageCodes[bookingStage.cancelled]) .Concat(CompSpec.BookingStageCodes[bookingStage.pending]) .ToList(); // read all bookings entered in FY16 IEnumerable <string> AllBookingsReferencesFY16 = ExtractBookingRefFY16(validStatus); // concerns : // I want to avoid having bedbanks if (tpRepo.AllBHDminiFromFY17 == null) { await tpRepo.ExtractAllBHDminiFromFY17Async(); } IEnumerable <BHDmini> AllBHDminiFY17 = tpRepo.AllBHDminiFromFY17 .Where(b => validStatus.Contains(b.STATUS.Trim())); IEnumerable <string> AllReferencesFromFY17 = AllBHDminiFY17 .Select(b => MinimiseRef(b.FULL_REFERENCE.Trim())); // start missing data task var ExtractMissingDataFromFY17Task = ExtractMissingDataFromFY17Async(MinimiseRef, AllBookingsReferencesFY16, AllBHDminiFY17, AllReferencesFromFY17); // grouped offers var GroupedOffers = AllBHDminiFY17 .GroupBy(b => b.UDTEXT1.Trim()) .Where(g => !AllBookingsReferencesFY16.Contains(MinimiseRef(g.Key))) // remove the group if it belongs to FY16 .SelectMany(g => { string groupKey = MinimiseRef(g.Key); if (groupKey == "") { return(g); // if no offer reference , each element is treated as a group } else if (AllReferencesFromFY17.Contains(groupKey)) // common enquiry from FY17 { // if the group contains the reference return that reference // if not return null because the booking is either as "" or invalid reference return(g.Where(b => MinimiseRef(b.FULL_REFERENCE.Trim()) == groupKey)); } else // invalid series reference -> returns the first booking entered, the rest is ignored { return(g.OrderBy(b => b.DATE_ENTERED).Take(1)); } }) .ToList(); // conversion rate List <BHDmini> EvaluatedForConversion = GroupedOffers .Select(b => { b._tooltipColChart = new TooltipConversion(b); return(b); }) .ToList(); dictAllPerformance.Add("Conversion", EvalAllDepartments(EvaluatedForConversion)); // missing data List <BHDmissingData> AllBHDmissingDataFY17 = (await ExtractMissingDataFromFY17Task).ToList(); dictAllPerformance.Add("MissingData", EvalAllDepartments(AllBHDmissingDataFY17)); // turnaround rate : Quoted enquiries and Contract enquiries IList <SentEnquiry> listSentEnquiries = await listSentEnquiriesTask; //listSentEnquiries = listSentEnquiries // .Where(se => FromDate <= se.DateSent && se.DateSent <= ToDate) // .Select(se => // { // BHDmini b = tpRepo.AllBHDminiFromFY17.FirstOrDefault(_b => _b.BHD_ID == se.BHD_ID); // se.SetDeadline(b, CompSpec); // return se; // }) // .ToList(); // listSentEnquiries might contains enquiries which have been entered prior to 01/05/2017 and they should be removed DateTime beginDt = new DateTime(2017, 5, 1); listSentEnquiries = listSentEnquiries .Where(se => FromDate <= se.DateSent && se.DateSent <= ToDate) .Where(se => se.Date_Entered >= beginDt) .Join(tpRepo.AllBHDminiFromFY17, se => se.BHD_ID, bhd => bhd.BHD_ID, (se, bhd) => { se.SetDeadline(bhd, CompSpec); return(se); }) .ToList(); // Quoted enquiries var listGroupedOffers = GroupedOffers.Select(b => b.FULL_REFERENCE.Trim()); List <SentEnquiry> AllQuotedEnquiriesFiltered = listSentEnquiries .Where(se => listGroupedOffers.Contains(se.FullReference)) // only accept the sent enquiries from groupedOffers (non dupplicates) .Select(se => { BHDmini b = tpRepo.AllBHDminiFromFY17.FirstOrDefault(_b => _b.BHD_ID == se.BHD_ID); se._tooltipColChart = new TooltipQuotedEnquiry(se, b); return(se); }) .ToList(); // 16/06/2017: remove potential dupplicates which slipped through the first net // potential dupplicate: // quoting took 1 day or less and there is an invalid or missing series reference List <string> WrongSeriesReferenceBookings = AllBHDmissingDataFY17 .Where(bmd => bmd.IncorrectSeriesReference || bmd.MissingSeriesReference) .Select(bmd => bmd.bhdMini.FULL_REFERENCE.Trim()) .ToList(); AllQuotedEnquiriesFiltered = AllQuotedEnquiriesFiltered .Where(se => !(se.nbDaysQuoting <= 1 && WrongSeriesReferenceBookings.Contains(se.FullReference.Trim()))) .ToList(); dictAllPerformance.Add("Turnaround", EvalAllDepartments(AllQuotedEnquiriesFiltered)); // Contract enquiries List <SentEnquiry> AllContractEnquiries = listSentEnquiries .Select(se => { BHDmini b = tpRepo.AllBHDminiFromFY17.FirstOrDefault(_b => _b.BHD_ID == se.BHD_ID); return(se.SwitchToContractEvaluation(b)); }) .ToList(); dictAllPerformance.Add("ContractEnquiries", EvalAllDepartments(AllContractEnquiries)); }