Beispiel #1
0
        public void Save(PcpAppointment pcpAppointment)
        {
            using (var adapter = PersistenceLayer.GetDataAccessAdapter())
            {
                var linqMetaData  = new LinqMetaData(adapter);
                var inPersistence = (from pa in linqMetaData.PcpAppointment where pa.EventCustomerId == pcpAppointment.EventCustomerId select pa).SingleOrDefault();
                var entity        = Mapper.Map <PcpAppointment, PcpAppointmentEntity>(pcpAppointment);
                entity.IsNew = inPersistence == null;

                adapter.SaveEntity(entity, true);
            }
        }
        public void UpdatePcpAppointmentTime(EventCustomerPcpAppointmentEditModel model, long orgRoleUserId)
        {
            _primaryCarePhysicianHelper.UpdatePrimaryCarePhysician(model.Pcp, model.CustomerId, orgRoleUserId);

            if (!model.NotAbleToSchedule && model.AppointmentDateTime.HasValue)
            {
                var pcpAppointment = _pcpAppointmentRepository.GetByEventCustomerId(model.EventCustomerId);

                if (pcpAppointment != null)
                {
                    pcpAppointment.ModifiedOn = DateTime.Now;
                    pcpAppointment.ModifiedBy = orgRoleUserId;
                }
                else
                {
                    pcpAppointment = new PcpAppointment
                    {
                        CreatedOn = DateTime.Now,
                        CreatedBy = orgRoleUserId,
                        ModifiedOn = DateTime.Now,
                        ModifiedBy = orgRoleUserId,
                        EventCustomerId = model.EventCustomerId,
                    };
                }

                pcpAppointment.AppointmentOn = model.AppointmentDateTime.Value;
                pcpAppointment.PreferredContactMethod = model.PreferredContactMethod.HasValue && model.PreferredContactMethod > 0 ? model.PreferredContactMethod : null;

                _pcpAppointmentRepository.Save(pcpAppointment);
            }
            else if (model.NotAbleToSchedule)
            {
                var pcpDiposition = new PcpDisposition
                  {
                      Disposition = (PcpAppointmentDisposition)model.DispositionId,
                      EventCustomerId = model.EventCustomerId,
                      Notes = model.Notes,
                      DataRecorderMetaData = new DataRecorderMetaData(orgRoleUserId, DateTime.Now, DateTime.Now)
                  };

                pcpDiposition.DataRecorderMetaData.DataRecorderModifier = new OrganizationRoleUser(orgRoleUserId);

                _pcpDispositionRepository.Save(pcpDiposition);
            }
        }
        public AppointmentEncounterListModel Create(IEnumerable <EventCustomer> evnetEventCustomers, IEnumerable <Customer> customers,
                                                    IEnumerable <PcpAppointment> pcpAppointments, IEnumerable <Appointment> appointments, IEnumerable <Event> eventsCollection)
        {
            var model = new AppointmentEncounterListModel();
            var appointmentEncounterModel = new List <AppointmentEncounterModel>();

            foreach (var eventCustomer in evnetEventCustomers)
            {
                Appointment appointment = null;

                if (eventCustomer.AppointmentId.HasValue)
                {
                    appointment = appointments.Single(x => x.Id == eventCustomer.AppointmentId.Value);
                }


                var eventData = eventsCollection.Single(x => x.Id == eventCustomer.EventId);

                var customer = customers.Single(x => x.CustomerId == eventCustomer.CustomerId);

                PcpAppointment pcpAppointment = null;

                if (!pcpAppointments.IsNullOrEmpty())
                {
                    pcpAppointment = pcpAppointments.FirstOrDefault(x => x.EventCustomerId == eventCustomer.Id);
                }

                appointmentEncounterModel.Add(new AppointmentEncounterModel
                {
                    CustomerId         = eventCustomer.CustomerId,
                    EventId            = eventCustomer.EventId,
                    ArrivedStatus      = GetStatusCode(eventCustomer, appointment, eventData),
                    ScheduledDate      = eventData.EventDate,
                    Hicn               = customer.Hicn,
                    Mrn                = string.IsNullOrEmpty(customer.Mrn) ? string.Empty : customer.Mrn,
                    PcpAppointmentDate = pcpAppointment != null ? pcpAppointment.AppointmentOn : (DateTime?)null
                });
            }
            model.Collection = appointmentEncounterModel;

            return(model);
        }
Beispiel #4
0
        public HourlyAppointmentsBookedListModel CreateHourlyModel(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 <CustomerEligibility> customerEligibilities)
        {
            var model = new HourlyAppointmentsBookedListModel();
            var appointmentsBookedModels = new List <HourlyAppointmentBookedModel>();

            foreach (var ec in eventCustomers)
            {
                var eventModel = eventListModel.Collection.First(e => e.EventCode == ec.EventId);

                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();

                var customerEligibility = customerEligibilities.FirstOrDefault(x => x.CustomerId == ec.CustomerId);

                string  sourceCode     = string.Empty;
                decimal sourceCodeDisc = 0;
                if (sourceCodeOrderDetail != null)
                {
                    var coupon = sourceCodes.FirstOrDefault(sc => sc.Id == sourceCodeOrderDetail.SourceCodeId);

                    sourceCode     = coupon != null ? coupon.CouponCode : string.Empty;
                    sourceCodeDisc = sourceCodeOrderDetail.Amount;
                }

                var customer = customers.First(c => c.CustomerId == ec.CustomerId);

                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, callType;
                string 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);
                }

                var isEligible = "N/A";
                if (customerEligibility != null && customerEligibility.IsEligible.HasValue)
                {
                    if (customerEligibility.IsEligible.Value)
                    {
                        isEligible = EligibleStatus.Yes.ToString();
                    }
                    else
                    {
                        isEligible = EligibleStatus.No.ToString();
                    }
                }

                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 apptModel = new HourlyAppointmentBookedModel
                {
                    CustomerId                = ec.CustomerId,
                    CustomerCode              = customer.CustomerId.ToString(),
                    EventId                   = ec.EventId.ToString(),
                    RecommendPackage          = eventModel.RecommendPackage ? "Yes" : "No",
                    MedicareAdvantagePlanName = string.IsNullOrEmpty(customer.MedicareAdvantagePlanName) ? "N/A" : customer.MedicareAdvantagePlanName,
                    RegistrationDate          = ec.DataRecorderMetaData.DateCreated,
                    //RegistrationTime
                    RegistrationStatus = !ec.AppointmentId.HasValue ? "Cancelled" : string.Empty,
                    AppointmentTime    = ec.AppointmentId.HasValue ? (DateTime?)appointment.StartTime : null,
                    Package            = productPurchased,
                    ShippingOptions    = customerShippingOptions,
                    ShippingCost       = shippingCost,
                    ImagesPurchased    = productCost.HasValue ? "Yes" : "No",
                    ImagesCost         = productCost.HasValue ? productCost.Value : 0,
                    PackageCost        = order == null ? 0 : order.UndiscountedTotal, // Need the Package Cost This includes CD also
                    TotalAmount        = order == null ? 0 : order.DiscountedTotal,
                    AmountPaid         = order == null ? 0 : order.TotalAmountPaid,
                    ReimbursementRate  = remibursmentRateSum,
                    //PrePaid
                    Pod                 = eventModel.Pod,
                    PriortyCode         = sourceCode,
                    PriortyCodeDiscount = sourceCodeDisc,
                    AdSource            = ec.MarketingSource,
                    EventDate           = eventModel.EventDate,
                    EventType           = eventModel.EventType,

                    Host        = eventModel.Location,
                    HostAddress = eventModel.Address,
                    SponsoredBy = string.IsNullOrEmpty(eventModel.CorporateAccount) && string.IsNullOrEmpty(eventModel.HospitalPartner) ? "N/A"
                    : (string.IsNullOrEmpty(eventModel.CorporateAccount) ? eventModel.HospitalPartner : eventModel.CorporateAccount),
                    IncomingPhoneLine   = incomingLine,
                    CallersPhoneNumber  = callerNumber,
                    LastScreeningDate   = string.Empty,
                    RegisterationByRole = agentRole,
                    CallType            = callType,
                    RegisteredBy        = agentName,
                    RescheduleInfo      = rescheduleApplointmentModels,
                    CheckInTime         = (appointment != null && appointment.CheckInTime.HasValue) ? (DateTime?)appointment.CheckInTime.Value : null,
                    CheckOutTime        = (appointment != null && appointment.CheckOutTime.HasValue) ? (DateTime?)appointment.CheckOutTime.Value : null,
                    Status             = status,
                    Tag                = string.IsNullOrEmpty(customer.Tag) ? "N/A" : customer.Tag,
                    CustomTag          = corporateCustomTags,
                    PcpAppointmentDate = pcpAppointment != null ? pcpAppointment.AppointmentOn : (DateTime?)null,
                    IsEligible         = isEligible,
                    GroupName          = groupName,
                    AdditionalFields   = displayFielAandAdditionalFieldsPairs,
                };
                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);
            }
            ;

            model.Collection = appointmentsBookedModels;
            return(model);
        }