Esempio n. 1
0
        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;
                    }
                }
            }
        }
Esempio n. 2
0
 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();
 }
Esempio n. 3
0
 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";
 }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
 public bool IsBHDunconfirmed(BHDmini b)
 {
     return(!BookingStageCodes[bookingStage.confirmed].Concat(BookingStageCodes[bookingStage.cancelled])
            .Contains(b.STATUS.Trim()));
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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));
        }