public ActionResult AppointmentsBooked(AppointmentsBookedListModelFilter filter = null, int pageNumber = 1) { int totalRecords; var model = _eventCustomerReportingService.GetAppointmentsBooked(pageNumber, _pageSize, filter, out totalRecords); if (model == null) { model = new AppointmentsBookedListModel(); } model.Filter = filter; var currentAction = ControllerContext.RouteData.Values["action"].ToString(); var routeValueDictionary = new RouteValueDictionary { { "IsRetailEvent", filter.IsRetailEvent }, { "IsCorporateEvent", filter.IsCorporateEvent }, { "IsHealthPlanEvent", filter.IsHealthPlanEvent }, { "IsPublicEvent", filter.IsPublicEvent }, { "IsPrivateEvent", filter.IsPrivateEvent }, { "EventFrom", filter.EventFrom }, { "EventTo", filter.EventTo }, { "FromDate", filter.FromDate }, { "ToDate", filter.ToDate }, { "EventId", filter.EventId }, { "CancelledCustomer", filter.CancelledCustomer }, { "Tag", filter.Tag }, { "EventStatus", filter.EventStatus }, { "AccountId", filter.AccountId }, { "ProductTypeId", filter.ProductTypeId } }; if (!filter.CustomTags.IsNullOrEmpty()) { var index = 0; foreach (var customtag in filter.CustomTags) { routeValueDictionary.Add(string.Format("CustomTags[{0}]", index), customtag); index++; } } Func <int, string> urlFunc = pn => Url.Action(currentAction, AddRouteValueDictionary(routeValueDictionary, pn)); model.PagingModel = new PagingModel(pageNumber, _pageSize, totalRecords, urlFunc); return(View(model)); }
//private readonly IKynHealthAssessmentHelper _healthAssessmentHelper; // private readonly IRoleRepository _roleRepository; //public AppointmentsBookedModelFactory() //{ // //_healthAssessmentHelper = healthAssessmentHelper; // // _roleRepository = roleRepository; //} public AppointmentsBookedListModel Create(IEnumerable <EventCustomer> eventCustomers, IEnumerable <Appointment> appointments, IEnumerable <Order> orders, EventVolumeListModel eventListModel, IEnumerable <Customer> customers, IEnumerable <OrganizationRoleUser> agents, IEnumerable <Role> roles, IEnumerable <OrderedPair <long, string> > agentIdNamePairs, IEnumerable <SourceCode> sourceCodes, IEnumerable <Call> calls, IEnumerable <ShippingDetail> shippingDetails, ShippingOption cdShippingOption, IEnumerable <ShippingOption> shippingOptions, IEnumerable <EventAppointmentChangeLog> eventAppointmentChangeLogs, IEnumerable <PrimaryCarePhysician> primaryCarePhysicians, IEnumerable <EventPackage> eventPackages, IEnumerable <EventTest> eventTests, IEnumerable <Language> languages, IEnumerable <CorporateCustomerCustomTag> customTags, IEnumerable <CorporateAccount> corporateAccounts, IEnumerable <AccountAdditionalFields> accountAdditionalFields, IEnumerable <PcpAppointment> pcpAppointments, IEnumerable <CustomerPredictedZip> customerPredictedZips, IEnumerable <OrderedPair <long, string> > confirmedByAgentNameIdPairs, IEnumerable <CustomerEligibility> customerEligibilities) { var model = new AppointmentsBookedListModel(); var appointmentsBookedModels = new List <AppointmentsBookedModel>(); eventCustomers.ToList().ForEach(ec => { var eventModel = eventListModel.Collection.FirstOrDefault(e => e.EventCode == ec.EventId); var customerEligibility = customerEligibilities.FirstOrDefault(x => x.CustomerId == ec.CustomerId); var order = orders.FirstOrDefault(o => o.EventId == ec.EventId && o.CustomerId == ec.CustomerId); var productCost = order != null ? order.ProductCost : null; var sourceCodeOrderDetail = order == null ? null : order.OrderDetails.Where( od => od.SourceCodeOrderDetail != null && od.SourceCodeOrderDetail.IsActive).Select(od => od.SourceCodeOrderDetail).FirstOrDefault(); string sourceCode = string.Empty; decimal sourceCodeDisc = 0; if (sourceCodeOrderDetail != null) { var coupon = sourceCodes.FirstOrDefault(sc => sc.Id == sourceCodeOrderDetail.SourceCodeId); sourceCode = coupon.CouponCode; sourceCodeDisc = sourceCodeOrderDetail.Amount; } var customer = customers.FirstOrDefault(c => c.CustomerId == ec.CustomerId); var customerLanguage = "N/A"; if (customer.LanguageId.HasValue) { var language = languages.FirstOrDefault(x => x.Id == customer.LanguageId); if (language != null) { customerLanguage = language.Name; } } var displayFielAandAdditionalFieldsPairs = new List <OrderedPair <string, string> >(); if (corporateAccounts != null && corporateAccounts.Any() && !string.IsNullOrEmpty(customer.Tag) && accountAdditionalFields != null && accountAdditionalFields.Any()) { var corporateAccount = corporateAccounts.FirstOrDefault(a => a.Tag == customer.Tag); if (corporateAccount != null) { var additionalFields = accountAdditionalFields.Where(x => x.AccountId == corporateAccount.Id).ToArray(); foreach (var additionalField in additionalFields) { displayFielAandAdditionalFieldsPairs.Add(new OrderedPair <string, string>(additionalField.DisplayName, GetCustomersAdditionFiledValue(customer, (AdditionalFieldsEnum)additionalField.AdditionalFieldId))); } } } var productPurchased = string.Empty; decimal remibursmentRateSum = 0; if (order != null && order.OrderDetails != null && order.OrderDetails.Any()) { var packageOrderItem = order.OrderDetails.FirstOrDefault(od => od.DetailType == OrderItemType.EventPackageItem && od.IsCompleted); var testOrderItems = order.OrderDetails.Where(od => od.DetailType == OrderItemType.EventTestItem && od.IsCompleted); if (packageOrderItem != null) { var eventPackage = eventPackages.FirstOrDefault(x => x.Id == packageOrderItem.OrderItem.ItemId); if (eventPackage != null) { productPurchased = eventPackage.Package.Name; remibursmentRateSum = eventPackage.Tests.Sum(t => t.ReimbursementRate); } } if (!testOrderItems.IsNullOrEmpty()) { var orderIds = testOrderItems.Select(x => x.OrderItem.ItemId); var customerTests = eventTests.Where(x => orderIds.Contains(x.Id)); if (!customerTests.IsNullOrEmpty()) { var testNames = customerTests.Select(x => x.Test.Name).ToArray(); remibursmentRateSum = remibursmentRateSum + customerTests.Sum(x => x.ReimbursementRate); productPurchased = string.IsNullOrEmpty(productPurchased) ? string.Join(", ", testNames) : productPurchased + ", " + string.Join(", ", testNames); } } } var registeredBy = (ec.DataRecorderMetaData == null || ec.DataRecorderMetaData.DataRecorderCreator == null ? null : agents.Where(a => a.Id == ec.DataRecorderMetaData.DataRecorderCreator.Id).FirstOrDefault()); string agentName, agentRole, callType; agentRole = agentName = callType = string.Empty; var incomingLine = calls.Where(c => c.CalledCustomerId == ec.CustomerId && !string.IsNullOrEmpty(c.CalledInNumber)).Select(c => c.CalledInNumber).LastOrDefault(); var callerNumber = calls.Where(c => c.CalledCustomerId == ec.CustomerId && !string.IsNullOrEmpty(c.CallerNumber)).Select(c => c.CallerNumber).LastOrDefault(); if (registeredBy != null) { if (GetParentRoleIdByRoleId(roles, registeredBy.RoleId) != (long)Roles.CallCenterRep) { incomingLine = ""; } if (GetParentRoleIdByRoleId(roles, registeredBy.RoleId) == (long)Roles.Customer) { agentRole = "Internet"; agentName = ""; } else { agentRole = roles.Where(r => r.Id == registeredBy.RoleId).FirstOrDefault().DisplayName; agentName = agentIdNamePairs.Where(ap => ap.FirstValue == registeredBy.Id).FirstOrDefault().SecondValue; if (GetParentRoleIdByRoleId(roles, registeredBy.RoleId) == (long)Roles.CallCenterRep) { var isIncoming = calls.Where(c => c.CalledCustomerId == ec.CustomerId && c.CreatedByOrgRoleUserId == registeredBy.Id && c.EventId == ec.EventId).Select(c => c.IsIncoming).LastOrDefault(); if (isIncoming) { callType = "Inbound "; } else { callType = "Outbound"; } } } } var corporateCustomTags = "N/A"; if (customTags != null && customTags.Any()) { var customerCustomTags = customTags.Where(ct => ct.CustomerId == customer.CustomerId).Select(ct => ct.Tag).ToArray(); if (customerCustomTags.Any()) { corporateCustomTags = string.Join(",", customerCustomTags); } } var shippingDetailIds = order == null ? new long[0] : order.OrderDetails.SelectMany(od => od.ShippingDetailOrderDetails.Where(sdod => sdod.IsActive).Select(sdod => sdod.ShippingDetailId)).ToArray(); var customerShippingDetails = shippingDetails.Where(sd => shippingDetailIds.Contains(sd.Id) && sd.ShippingOption.Id != (cdShippingOption != null ? cdShippingOption.Id : 0)).Select(sd => sd).ToArray(); IEnumerable <string> customerShippingOptions = null; var shippingCost = 0.0m; if (customerShippingDetails != null && customerShippingDetails.Count() > 0) { var shippingoptionIds = customerShippingDetails.Select(csd => csd.ShippingOption.Id).ToArray(); shippingCost = customerShippingDetails.Sum(sd => sd.ActualPrice); customerShippingOptions = shippingOptions.Where(so => shippingoptionIds.Contains(so.Id)).Select(so => so.Name).ToArray(); } else { customerShippingOptions = new[] { "Online" }; } var rescheduleApplointmentModels = new List <RescheduleApplointmentModel>(); var eventCustomerReschedules = eventAppointmentChangeLogs.Where(eacl => eacl.EventCustomerId == ec.Id).Select(eacl => eacl).ToArray(); if (eventCustomerReschedules != null && eventCustomerReschedules.Any()) { foreach (var ecr in eventCustomerReschedules) { var rescheduledBy = agents.Single(a => a.Id == ecr.CreatedByOrgRoleUserId); var rescheduleAgentRole = roles.Single(r => r.Id == rescheduledBy.RoleId).DisplayName; var rescheduleAgentName = agentIdNamePairs.Single(ap => ap.FirstValue == rescheduledBy.Id).SecondValue; rescheduleApplointmentModels.Add(new RescheduleApplointmentModel() { RescheduledOn = ecr.DateCreated, RescheduledBy = rescheduleAgentName + "(" + rescheduleAgentRole + ")", Reason = ecr.ReasonId.HasValue && ecr.ReasonId > 0 ? ((RescheduleAppointmentReason)ecr.ReasonId.Value).GetDescription() : "N/A", Notes = ecr.Notes, SubReason = ecr.SubReasonId.HasValue && ecr.SubReasonId > 0 ? ((RescheduleAppointmentSubReason)ecr.SubReasonId.Value).GetDescription() : string.Empty, }); } } var pcp = primaryCarePhysicians.Where(p => p.CustomerId == ec.CustomerId).Select(p => p).FirstOrDefault(); var appointment = ec.AppointmentId.HasValue ? appointments.FirstOrDefault(a => a.Id == ec.AppointmentId.Value) : null; PcpAppointment pcpAppointment = null; if (!pcpAppointments.IsNullOrEmpty()) { pcpAppointment = pcpAppointments.FirstOrDefault(x => x.EventCustomerId == ec.Id); } //bool? isHafPrefilled = null; //if (appointment != null) // isHafPrefilled = _healthAssessmentHelper.IsKynHafPrefilled(ec.EventId, ec.CustomerId, appointment.StartTime, false); var isEligible = "N/A"; if (customerEligibility != null && customerEligibility.IsEligible.HasValue) { isEligible = customerEligibility.IsEligible.Value ? "Yes" : "No"; } var groupName = "N/A"; if (!string.IsNullOrEmpty(customer.GroupName)) { groupName = customer.GroupName; } var status = (appointment != null && appointment.CheckInTime.HasValue && appointment.CheckOutTime.HasValue && !ec.LeftWithoutScreeningReasonId.HasValue) ? "Availed" : "Not Availed"; var customerPredictedZip = customerPredictedZips != null ? customerPredictedZips.Where(x => x.CustomerId == customer.CustomerId) : null; var confirmedByAgentName = ec.ConfirmedBy.HasValue && ec.ConfirmedBy.Value > 0 ? confirmedByAgentNameIdPairs.First(x => x.FirstValue == ec.ConfirmedBy.Value).SecondValue : string.Empty; var apptModel = new AppointmentsBookedModel { Address = customer.Address, AmountPaid = order == null ? 0 : order.TotalAmountPaid, AppointmentTime = ec.AppointmentId.HasValue ? (DateTime?)appointment.StartTime : null, CustomerId = ec.CustomerId, CustomerCode = customer.CustomerId.ToString(), CustomerName = customer.NameAsString, RequestedNewsLetter = customer.RequestForNewsLetter ? "Yes" : "No", DateofBirth = customer.DateOfBirth, Email = customer.Email != null ? customer.Email.ToString() : string.Empty, EventDate = eventModel.EventDate, Gender = customer.Gender.ToString(), Host = eventModel.Location, HostAddress = eventModel.Address, Package = productPurchased, PackageCost = order == null ? 0 : order.UndiscountedTotal, // Need the Package Cost This includes CD also PhoneBusiness = customer.OfficePhoneNumber != null ? customer.OfficePhoneNumber.ToString() : string.Empty, PhoneCell = customer.MobilePhoneNumber != null ? customer.MobilePhoneNumber.ToString() : string.Empty, PhoneHome = customer.HomePhoneNumber != null ? customer.HomePhoneNumber.ToString() : string.Empty, RegistrationDate = ec.DataRecorderMetaData.DateCreated, RegistrationStatus = !ec.AppointmentId.HasValue ? "Cancelled" : string.Empty, IsConfirmed = ec.IsAppointmentConfirmed ? "Yes" : "No", ConfirmedBy = confirmedByAgentName, Pod = eventModel.Pod, TotalAmount = order == null ? 0 : order.DiscountedTotal, PriortyCode = sourceCode, // PriortyCodeDiscount = sourceCodeDisc, RegisteredBy = agentName, AdSource = ec.MarketingSource, EventType = eventModel.EventType, RegisterationByRole = agentRole, IncomingPhoneLine = incomingLine, CallersPhoneNumber = callerNumber, PhoneOfficeExtension = customer.PhoneOfficeExtension, LastScreeningDate = string.Empty, ShippingOptions = customerShippingOptions, ShippingCost = shippingCost, ImagesPurchased = productCost.HasValue ? "Yes" : "No", ImagesCost = productCost.HasValue ? productCost.Value : 0, InsuranceId = string.IsNullOrEmpty(customer.InsuranceId) ? "N/A" : customer.InsuranceId, Hicn = string.IsNullOrEmpty(customer.Hicn) ? "N/A" : customer.Hicn, MedicareAdvantageNumber = string.IsNullOrEmpty(customer.MedicareAdvantageNumber) ? "N/A" : customer.MedicareAdvantageNumber, MedicareAdvantagePlanName = string.IsNullOrEmpty(customer.MedicareAdvantagePlanName) ? "N/A" : customer.MedicareAdvantagePlanName, RescheduleInfo = rescheduleApplointmentModels, SsnCaptured = string.IsNullOrEmpty(customer.Ssn) ? "No" : "Yes", SponsoredBy = string.IsNullOrEmpty(eventModel.CorporateAccount) && string.IsNullOrEmpty(eventModel.HospitalPartner) ? "N/A" : (string.IsNullOrEmpty(eventModel.CorporateAccount) ? eventModel.HospitalPartner : eventModel.CorporateAccount), CheckInTime = (appointment != null && appointment.CheckInTime.HasValue) ? (DateTime?)appointment.CheckInTime.Value : null, CheckOutTime = (appointment != null && appointment.CheckOutTime.HasValue) ? (DateTime?)appointment.CheckOutTime.Value : null, Status = status, EventId = ec.EventId.ToString(), Tag = string.IsNullOrEmpty(customer.Tag) ? "N/A" : customer.Tag, CustomTag = corporateCustomTags, ReimbursementRate = remibursmentRateSum, RecommendPackage = eventModel.RecommendPackage ? "Yes" : "No", //HafStatus = isHafPrefilled.HasValue ? (isHafPrefilled.Value ? "Filled" : "Not Filled") : "N/A" PcpAppointmentDate = pcpAppointment != null ? pcpAppointment.AppointmentOn : (DateTime?)null, Language = customerLanguage, Market = string.IsNullOrEmpty(customer.Market) ? "N/A" : customer.Market, IsEligible = isEligible, GroupName = groupName, AdditionalFields = displayFielAandAdditionalFieldsPairs, CallType = callType, PredictedZip = customerPredictedZip != null ? string.Join(", ", customerPredictedZip.Select(x => x.PredictedZip)) : "N/A", PreferredContactType = ec.PreferredContactType.HasValue && ec.PreferredContactType.Value > 0 ? ((PreferredContactType)ec.PreferredContactType).GetDescription() : "N/A", Product = customer.ProductTypeId.HasValue && customer.ProductTypeId.Value > 0 ? ((ProductType)customer.ProductTypeId.Value).GetDescription() : "N/A", }; if (pcp != null) { apptModel.PcpName = pcp.Name.FullName; apptModel.PcpPhone = pcp.Primary != null ? pcp.Primary.ToString() : string.Empty; apptModel.PcpFax = pcp.Fax != null ? pcp.Fax.ToString() : string.Empty; apptModel.PcpNpi = pcp.Npi; } appointmentsBookedModels.Add(apptModel); }); //if (appointmentsBookedModels != null) appointmentsBookedModels = appointmentsBookedModels.OrderBy(a => a.RegistrationDate).ToList(); model.Collection = appointmentsBookedModels; return(model); }