Exemplo n.º 1
0
        public List<ProviderReport> SearchProvidersByName(string apiKey, string query)
        {
            string procName = "[dbo].[ProvidersReport_ExtDev_Search_byName]";

            List<ProviderReport> list = null;

            _data.ExecuteCmd(procName, paramCol =>
            {
                paramCol.AddWithValue("@apiKey", apiKey);
                paramCol.AddWithValue("@search", query);
            }, (reader, set) =>
            {
                ProviderReport providerReport = HydrateProvidersReport(reader);

                if (list == null)
                {
                    list = new List<ProviderReport>();
                }

                list.Add(providerReport);

            });

            return list;

        }
Exemplo n.º 2
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "Tobii Interaction (Core)",
                Description        = "Tracks head and eye movement. Requires a Tobii device, see https://tobiigaming.com/",
                API                = "Tobii.Interaction",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                },
                ErrorMessage = _providerError
            };

            if (_isLive)
            {
                foreach (var deviceReport in _deviceReports)
                {
                    var report = GetDeviceReport(deviceReport.Key);
                    if (report != null)
                    {
                        providerReport.Devices.Add(report);
                    }
                }
            }
            return(providerReport);
        }
Exemplo n.º 3
0
        private static ProviderReport HydrateProvidersReport(IDataReader reader, out int index)
        {
            ProviderReport providerReport = new ProviderReport();

            index                       = 0;
            providerReport.Id           = reader.GetSafeInt32(index++);
            providerReport.Title        = reader.GetSafeString(index++);
            providerReport.FirstName    = reader.GetSafeString(index++);
            providerReport.Mi           = reader.GetSafeString(index++);
            providerReport.LastName     = reader.GetSafeString(index++);
            providerReport.Gender       = reader.GetSafeString(index++);
            providerReport.Phone        = reader.GetSafeString(index++);
            providerReport.Fax          = reader.GetSafeString(index++);
            providerReport.Email        = reader.GetSafeString(index++);
            providerReport.UserId       = reader.GetSafeInt32(index++);
            providerReport.DateAttested = reader.GetSafeDateTime(index++);
            providerReport.Compliant    = reader.GetSafeInt32(index++);
            //refactor this code with hydrateproviderdetails after hector gives guidance
            providerReport.Professional    = reader.GetSafeJSON <ProfessionalDetailsReport>(index++);
            providerReport.Practices       = reader.GetSafeJSON <List <PracticeReport> >(index++);
            providerReport.Affiliations    = reader.GetSafeJSON <List <AffiliationReport> >(index++);
            providerReport.Certifications  = reader.GetSafeJSON <List <TypeTableBase> >(index++);
            providerReport.Expertise       = reader.GetSafeJSON <List <TypeTableBase> >(index++);
            providerReport.Languages       = reader.GetSafeJSON <List <TypeTableBase> >(index++);
            providerReport.Licenses        = reader.GetSafeJSON <List <ProviderLicenseReport> >(index++);
            providerReport.Specializations = reader.GetSafeJSON <List <SpecializationReport> >(index++);

            return(providerReport);
        }
Exemplo n.º 4
0
        public List<ProviderReport> GetProvidersByExpertise(string apiKey, string expertise)
        {
            string procName = "[dbo].[ProvidersReport_ExtDev_Select_byExpertise]";

            List<ProviderReport> list = null;

            _data.ExecuteCmd(procName, paramCol =>
            {
                paramCol.AddWithValue("@apiKey", apiKey);
                paramCol.AddWithValue("@expertise", expertise);
            }, (reader, set) =>
            {
                ProviderReport providerReport = HydrateProvidersReport(reader);

                if (list == null)
                {
                    list = new List<ProviderReport>();
                }

                list.Add(providerReport);

            });

            return list;

        }
Exemplo n.º 5
0
 private static void PopulateSharedBaseExcelCells(ExcelWorksheet worksheet, ProviderReport providerReport, int rowIndex, out int colIndex)
 {
     colIndex = 1;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Id;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.FirstName;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.LastName;
 }
Exemplo n.º 6
0
        public List<ProviderReport> GetProvidersBySpecialization(string apiKey, string specialization)
        {
            string procName = "[dbo].[ProvidersReport_ExtDev_Select_bySpecialization]";

            List<ProviderReport> list = null;

            _data.ExecuteCmd(procName, paramCol =>
            {
                paramCol.AddWithValue("@apiKey", apiKey);
                paramCol.AddWithValue("@specialization", specialization);
            }, (reader, set) =>
            {
                ProviderReport providerReport = HydrateProvidersReport(reader);

                if (list == null)
                {
                    list = new List<ProviderReport>();
                }

                list.Add(providerReport);

            });

            return list;

        }
Exemplo n.º 7
0
        public List<ProviderReport> GetAllProviderDetails(string apiKey)
        {
            string procName = "[dbo].[ProvidersReport_ExtDev_SelectAll_Details]";

            List<ProviderReport> list = null;

            _data.ExecuteCmd(procName, paramCol =>
             {
                 paramCol.AddWithValue("@apiKey", apiKey);
             }, (reader, set) =>
             {
                 ProviderReport providerReport = HydrateProvidersReport(reader);

                 if (list == null)
                 {
                     list = new List<ProviderReport>();
                 }

                 list.Add(providerReport);

             });

            return list;

        }
Exemplo n.º 8
0
 public Device(DeviceReport device, ProviderReport providerReport, DeviceIoType type) : this()
 {
     Title             = device.DeviceName;
     ProviderName      = providerReport.ProviderDescriptor.ProviderName;
     DeviceHandle      = device.DeviceDescriptor.DeviceHandle;
     DeviceNumber      = device.DeviceDescriptor.DeviceInstance;
     DeviceBindingMenu = GetDeviceBindingMenu(device.Nodes, type);
 }
Exemplo n.º 9
0
 public Device(DeviceReport device, ProviderReport providerReport, List <DeviceBindingNode> deviceBindingMenu) : this()
 {
     Title             = device.DeviceName;
     ProviderName      = providerReport.ProviderDescriptor.ProviderName;
     DeviceHandle      = device.DeviceDescriptor.DeviceHandle;
     DeviceNumber      = device.DeviceDescriptor.DeviceInstance;
     DeviceBindingMenu = deviceBindingMenu;
     IsCache           = false;
 }
Exemplo n.º 10
0
        public static string GetProviderStatus(string name, ProviderReport providerReport)
        {
            var providerInstance = IOW.Instance.GetProvider(name);
            var str = $"{name} with {providerReport.Devices.Count} devices. IsLive = {providerInstance.IsLive}";

            if (!providerInstance.IsLive)
            {
                str += $", Reason = {providerReport.ErrorMessage}";
            }
            return(str);
        }
Exemplo n.º 11
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "XInput (Core)",
                Description        = "Reads Xbox gamepads",
                API                = "XInput",
                ProviderDescriptor = _providerDescriptor,
                Devices            = _deviceReports
            };

            return(providerReport);
        }
Exemplo n.º 12
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "SpaceMouse (Core)",
                Description        = "Allows reading of SpaceMouse devices.",
                API                = "HidLibrary",
                ProviderDescriptor = _providerDescriptor
            };

            providerReport.Devices.Add(GetInputDeviceReport(_spaceMouseProDescriptor));

            return(providerReport);
        }
Exemplo n.º 13
0
 public ProviderReport GetOutputList()
 {
     providerReport = new ProviderReport
     {
         Title              = "ViGEm",
         API                = "ViGEm",
         Description        = "Allows emulation of Gamepads (Xbox, PS etc)",
         ProviderDescriptor = new ProviderDescriptor
         {
             ProviderName = ProviderName
         }
     };
     providerReport.Devices = devicesHandler.GetDeviceList();
     return(providerReport);
 }
Exemplo n.º 14
0
 private static void PopulateBaseExcelCells(ExcelWorksheet worksheet, ProviderReport providerReport, int rowIndex, out int colIndex)
 {
     colIndex = 1;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Id;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Title;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.FirstName;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Mi;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.LastName;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Gender;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Phone;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Fax;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Email;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.DateAttested;
     worksheet.Cells[rowIndex, colIndex++].Value = providerReport.Compliant == 1 ? "Compliant" : "Noncompliant";
 }
Exemplo n.º 15
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "Tobii Interaction (Core)",
                Description        = "Tracks head and eye movement. Requires a Tobii device, see https://tobiigaming.com/",
                API                = "Tobii.Interaction",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                },
                Devices = deviceReports
            };

            return(providerReport);
        }
Exemplo n.º 16
0
        public Core_ViGEm()
        {
            logger          = new Logger(ProviderName);
            _providerReport = new ProviderReport
            {
                Title              = "ViGEm",
                API                = "ViGEm",
                Description        = "Allows emulation of Gamepads (Xbox, PS etc)",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                }
            };

            InitLibrary();
        }
Exemplo n.º 17
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                API                = "DS4WindowsApi",
                Description        = "Provides access to DS4 controllers",
                Title              = "DS4Windows",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                }
            };

            providerReport.Devices.Add(GetInputDeviceReport(0));
            return(providerReport);
        }
Exemplo n.º 18
0
        public ProviderReport GetOutputList()
        {
            var pr = new ProviderReport
            {
                Title              = "vJoy (Core)",
                Description        = "Allows emulation of DirectInput sticks. Requires driver from http://vjoystick.sourceforge.net/",
                API                = "vJoy",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                },
                Devices = deviceReports
            };

            return(pr);
        }
Exemplo n.º 19
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "SpaceMouse (Core)",
                Description        = "Allows reading of SpaceMouse devices.",
                API                = "HidLibrary",
                ProviderDescriptor = _providerDescriptor
            };

            for (var i = 0; i < _connectedDevices.Count; i++)
            {
                providerReport.Devices.Add(GetInputDeviceReport(BuildDeviceDescriptor(i)));
            }

            return(providerReport);
        }
Exemplo n.º 20
0
        public ProviderReport GetOutputList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "Titan One",
                Description        = "Allows interaction with the ConsoleTuner Titan One device",
                API                = "TitanOne",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = "Core_TitanOne"
                }
            };

            foreach (var deviceClass in outputHandlers)
            {
                providerReport.Devices.Add(deviceClass.Value.GetOutputReport());
            }
            return(providerReport);
        }
Exemplo n.º 21
0
        public ProviderReport GetInputList()
        {
            var providerReport = new ProviderReport
            {
                API                = "DS4WindowsApi",
                Description        = "Provides access to DS4 controllers",
                Title              = "DS4Windows",
                ProviderDescriptor = new ProviderDescriptor
                {
                    ProviderName = ProviderName
                }
            };

            for (var i = 0; i < connectedControllers.Count; i++)
            {
                providerReport.Devices.Add(GetInputDeviceReport(i));
            }
            return(providerReport);
        }
Exemplo n.º 22
0
 private void BuildProviderReport()
 {
     _providerReport = new ProviderReport
     {
         Title              = "DirectInput (Core)",
         Description        = "Allows reading of generic (DirectInput) joysticks.",
         API                = "DirectInput",
         ProviderDescriptor = _providerDescriptor
     };
     foreach (var guidList in _connectedDevices)
     {
         for (var i = 0; i < guidList.Value.Count; i++)
         {
             var deviceDescriptor = new DeviceDescriptor {
                 DeviceHandle = guidList.Key, DeviceInstance = i
             };
             _providerReport.Devices.Add(GetInputDeviceReport(deviceDescriptor));
         }
     }
 }
Exemplo n.º 23
0
        private void BuildInputDeviceList()
        {
            var providerReport = new ProviderReport
            {
                Title              = "MIDI Input (Core)",
                Description        = "Provides support for MIDI devices",
                API                = "Midi",
                ProviderDescriptor = _providerDescriptor
            };

            foreach (var deviceIdList in _connectedInputDevices)
            {
                for (var i = 0; i < deviceIdList.Value.Count; i++)
                {
                    var deviceDescriptor = new DeviceDescriptor {
                        DeviceHandle = deviceIdList.Key, DeviceInstance = i
                    };
                    providerReport.Devices.Add(GetInputDeviceReport(deviceDescriptor));
                }
            }
            _inputProviderReport = providerReport;
        }
Exemplo n.º 24
0
        public int GetWeeklyProviderReports()
        {
            int result = 0; //0: success, 1: member is null, 2: serveList

            if (Validator.OnlyRunOnceFlagForProvider)
            {
                Validator.OnlyRunOnceFlagForProvider = false;
                List <ProviderReport> providerReports = null;
                try
                {
                    //TimeSpan startDate;//calculate start date from schedule; //NOT USED! REMOVE?
                    //TimeSpan endDate;//calculate end date from schedule;     //NOT USED! REMOVE?

                    //compare the current time with the time set
                    while (true)
                    {
                        Schedule _schedule = scheduleList.GetSchedule(ReportType.ProviderReportType);
                        DateTime nTime     = DateTime.Now;

                        //String _nowTime = DateTime.Now.ToString("hh:mm");
                        String _nowTime = nTime.Hour.ToString() + ":" + nTime.Minute.ToString();
                        String _schTime = _schedule.Time.Hours.ToString() + ":" + _schedule.Time.Minutes.ToString();
                        Console.WriteLine("now -> system: " + _nowTime + "->" + _schTime);
                        if (_nowTime.Equals(_schTime))
                        {
                            providerReports = new List <ProviderReport>();
                            List <Provider> providers = providerList.GetAllProviders();
                            if (providers != null)
                            {
                                foreach (Provider provider in providers)
                                {
                                    ProviderReport providerReport = new ProviderReport();
                                    String         fileName;
                                    _nowTime = _nowTime.Replace(":", "_");

                                    fileName = "Provider_" + provider.Name + "_" + _nowTime + ".txt";
                                    // System.IO.File.WriteAllText(@"WriteText.txt", text);
                                    using (System.IO.StreamWriter file = new System.IO.StreamWriter(PathFactory.ReportPath() + fileName))
                                    {
                                        file.WriteLine("----------------------Provider Report--------------------");
                                        file.WriteLine("Provider ID: " + provider.ID);
                                        file.WriteLine("Provider Name: " + provider.Name);
                                        file.WriteLine("City: " + provider.City);
                                        file.WriteLine("State: " + provider.State);
                                        file.WriteLine("Street Address: " + provider.StreetAddress);
                                        file.WriteLine("Zip Code: " + provider.ZipCode);

                                        List <ServiceRecord> serveList = serviceRecordList.GetAllServiceRecordForProvider(provider.ID);
                                        if (serveList != null)
                                        {
                                            int counter = 0;
                                            foreach (ServiceRecord s in serveList)
                                            {
                                                counter++;
                                                int     serviceCode = s.ServiceCode;
                                                Service service     = providerDirectory.GetService(serviceCode);
                                                if (service != null)
                                                {
                                                    file.WriteLine("\nService:" + counter);
                                                    file.WriteLine("Service Name: " + service.ServiceName);
                                                    file.WriteLine("Service Code: " + service.ServiceCode);
                                                    file.WriteLine("Service Fee: " + service.ServiceFee);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            result = 2;//serveList is null;
                                            //break;
                                        }
                                    }
                                    providerReports.Add(providerReport);
                                }
                            }
                            else
                            {
                                result = 1;//providers is null;
                                //break;
                            }
                        }
                        Thread.Sleep(40000);
                    }
                }
                catch (Exception e)
                {
                    providerReports = null;
                    if (e.GetType() != typeof(HttpResponseException))
                    {
                        throw new HttpResponseException(
                                  Request.CreateErrorResponse(HttpStatusCode.BadRequest, e.Message));
                    }
                    else
                    {
                        throw e;
                    }
                }
            }
            return(result);
        }
Exemplo n.º 25
0
        public string GenerateProviderReport(User provider, List <UserServiceLinker> services)
        {
            Report providerReport = new ProviderReport(provider, services);

            return(providerReport.ReportBody);
        }
Exemplo n.º 26
0
        public void RefreshConnectedDevices()
        {
            _deviceHandleToId = new Dictionary <string, List <int> >();
            _deviceReports    = new List <DeviceReport>();

            string handle;

            for (var i = 1; i < 11; i++)
            {
                if (ManagedWrapper.IsKeyboard(i) != 1)
                {
                    continue;
                }
                handle = ManagedWrapper.GetHardwareStr(_deviceContext, i, 1000);
                if (handle == "")
                {
                    continue;
                }
                int vid = 0, pid = 0;
                GetVidPid(handle, ref vid, ref pid);
                var name = "";
                if (vid != 0 && pid != 0)
                {
                    name = DeviceHelper.GetDeviceName(vid, pid);
                }

                if (name == "")
                {
                    name = handle;
                }

                handle = $@"Keyboard\{handle}";

                if (!_deviceHandleToId.ContainsKey(handle))
                {
                    _deviceHandleToId.Add(handle, new List <int>());
                }

                var instance = _deviceHandleToId[handle].Count;
                _deviceHandleToId[handle].Add(i);

                name = $"K: {name}";
                if (instance > 0)
                {
                    name += $" #{instance + 1}";
                }

                _deviceReports.Add(new DeviceReport
                {
                    DeviceName       = name,
                    DeviceDescriptor = new DeviceDescriptor
                    {
                        DeviceHandle   = handle,
                        DeviceInstance = instance
                    },
                    Nodes = new List <DeviceReportNode>
                    {
                        _keyboardList
                    }
                });
                //Log(String.Format("{0} (Keyboard) = VID: {1}, PID: {2}, Name: {3}", i, vid, pid, name));
            }

            for (var i = 11; i < 21; i++)
            {
                if (ManagedWrapper.IsMouse(i) != 1)
                {
                    continue;
                }
                handle = ManagedWrapper.GetHardwareStr(_deviceContext, i, 1000);
                if (handle == "")
                {
                    continue;
                }
                int vid = 0, pid = 0;
                GetVidPid(handle, ref vid, ref pid);
                var name = "";
                if (vid != 0 && pid != 0)
                {
                    name = DeviceHelper.GetDeviceName(vid, pid);
                }

                if (name == "")
                {
                    name = handle;
                }

                handle = $@"Mouse\{handle}";

                if (!_deviceHandleToId.ContainsKey(handle))
                {
                    _deviceHandleToId.Add(handle, new List <int>());
                }

                var instance = _deviceHandleToId[handle].Count;
                _deviceHandleToId[handle].Add(i);

                name = $"M: {name}";
                if (instance > 0)
                {
                    name += $" #{instance + 1}";
                }

                _deviceReports.Add(new DeviceReport
                {
                    DeviceName       = name,
                    DeviceDescriptor = new DeviceDescriptor
                    {
                        DeviceHandle   = handle,
                        DeviceInstance = instance
                    },
                    Nodes = new List <DeviceReportNode>
                    {
                        _mouseButtonList,
                        StaticData.MouseAxisList
                    }
                });
                //Log(String.Format("{0} (Mouse) = VID/PID: {1}", i, handle));
                //Log(String.Format("{0} (Mouse) = VID: {1}, PID: {2}, Name: {3}", i, vid, pid, name));
            }

            _providerReport = new ProviderReport
            {
                Title              = "Interception (Core)",
                Description        = "Supports per-device Keyboard and Mouse Input/Output, with blocking\nRequires custom driver from http://oblita.com/interception",
                API                = "Interception",
                ProviderDescriptor = _providerDescriptor,
                Devices            = _deviceReports
            };
        }
Exemplo n.º 27
0
        public MemoryStream ReportSelectAll(ProviderDetailCategories categories, int userId)
        {
            string procName;

            if (userId == 0)
            {
                procName = "[dbo].[ProvidersReport_SelectAll_Details]";
            }
            else
            {
                procName = "[dbo].[ProvidersReport_SelectAll_DetailsV2]";
            }

            List <ProviderReport> list = null;

            _data.ExecuteCmd(procName, paramCol =>
            {
                if (userId == 0)
                {
                    ModifyReportParams(paramCol, categories);
                }
                else
                {
                    ModifyReportParamsV2(paramCol, categories, userId);
                }
            }, (reader, set) =>
            {
                ProviderReport provider = HydrateProvidersReport(reader, out int lastIndex);

                if (list == null)
                {
                    list = new List <ProviderReport>();
                }

                list.Add(provider);
            });


            //this dict will keep track of the longest count across each category
            Dictionary <string, int> countDict = new Dictionary <string, int>();

            bool catIsSelected;

            //filter categories by truthy, and add an entries to the dictionary "countDict"
            PropertyInfo[] truthyCategories = categories.GetType()
                                              .GetProperties()
                                              .Where(prop =>
            {
                bool.TryParse(prop.GetValue(categories).ToString(), out catIsSelected);
                return(catIsSelected);
            }).ToArray();


            foreach (PropertyInfo propertyInfo in truthyCategories)
            {
                countDict.Add(propertyInfo.Name, 0);
            }


            //get all properties of type List that are truthy within categories, and store them in arrayProperties for future access
            Type type = typeof(ProviderReport);

            PropertyInfo[] allProperties = type.GetProperties();

            PropertyInfo[] arrayProperties = allProperties
                                             .Where(property => property.PropertyType.IsGenericType &&
                                                    countDict.ContainsKey(property.Name)).ToArray();


            //iterate over each provider and update counts in dict
            foreach (ProviderReport providerReport in list)
            {
                foreach (PropertyInfo property in arrayProperties)
                {
                    //nullcheck current prop
                    ICollection propCollection = GetPropValue <ICollection>(providerReport, property.Name);
                    if (propCollection != null)
                    {
                        //compare this particular instanced count to the count in the dict
                        if (countDict[property.Name] < propCollection.Count)
                        {
                            countDict[property.Name] = propCollection.Count;
                        }
                    }
                }
            }

            var stream = new MemoryStream();

            using (var package = new ExcelPackage(stream))
            {
                #region concatenated details worksheet
                //create new worksheet with base info
                ExcelWorksheet concatenated = package.Workbook.Worksheets.Add("Concatenated Details");

                ModifyBaseExcelHeaders(concatenated, out int concatenatedHeaderIndex);

                if (categories.Professional)
                {
                    concatenated.Cells[1, concatenatedHeaderIndex++].Value = "NPI";
                    concatenated.Cells[1, concatenatedHeaderIndex++].Value = "Genders Accepted";
                }


                //sort arrayProperties to ensure consistent excel column ordering between worksheets
                PropertyInfo[] sortedArrayProperties = arrayProperties.OrderBy(p => p.Name).ToArray();

                //add cell to worksheet with value of property name
                for (int i = 0; i < sortedArrayProperties.Length; i++)
                {
                    concatenated.Cells[1, concatenatedHeaderIndex++].Value = sortedArrayProperties[i].Name;
                }

                //call this before filling concatenated w/s
                using (var r = concatenated.Cells[1, 1, 1, concatenatedHeaderIndex - 1])
                {
                    r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                }


                //fill w/s with data
                int concatenatedRowIndex = 2;
                foreach (ProviderReport providerReport in list)
                {
                    PopulateBaseExcelCells(concatenated, providerReport, concatenatedRowIndex, out int concatenatedColIndex);

                    if (categories.Professional)
                    {
                        concatenated.Cells[concatenatedRowIndex, concatenatedColIndex].Value
                            = providerReport.Professional?.NPI;
                        concatenatedColIndex++;

                        if (providerReport.Professional?.GendersAccepted != null)
                        {
                            concatenated.Cells[concatenatedRowIndex, concatenatedColIndex].Value
                                = providerReport.Professional.GendersAccepted;
                        }
                        concatenatedColIndex++;
                    }

                    for (int i = 0; i < sortedArrayProperties.Length; i++)
                    {
                        ICollection propCollection = GetPropValue <ICollection>(providerReport, sortedArrayProperties[i].Name);

                        if (propCollection != null)
                        {
                            string concatProp = "";
                            foreach (var prop in propCollection)
                            {
                                if (concatProp != "")
                                {
                                    concatProp += $"; ";
                                }
                                string propName = "";

                                if (sortedArrayProperties[i].Name == "Licenses")
                                {
                                    propName = GetPropValue <string>(prop, "State");
                                }
                                else
                                {
                                    propName = GetPropValue <string>(prop, "Name");
                                }

                                concatProp += $"{propName}";
                            }
                            concatenated.Cells[concatenatedRowIndex, concatenatedColIndex++].Value
                                = concatProp;
                        }
                        else
                        {
                            concatenatedColIndex++;
                        }
                    }
                    concatenatedRowIndex++;
                }

                concatenated.Cells.AutoFitColumns(0, 30);


                #endregion


                #region expanded details worksheet
                ExcelWorksheet expanded = package.Workbook.Worksheets.Add("Expanded Details");

                ModifyBaseExcelHeaders(expanded, out int expandedHeaderIndex);

                if (categories.Professional)
                {
                    expanded.Cells[1, expandedHeaderIndex++].Value = "NPI";
                    expanded.Column(expandedHeaderIndex).Style.Numberformat.Format = "#";
                    expanded.Cells[1, expandedHeaderIndex++].Value = "Genders Accepted";
                }

                for (int i = 0; i < sortedArrayProperties.Length; i++)
                {
                    for (int j = 0; j < countDict[sortedArrayProperties[i].Name]; j++)
                    {
                        string truncatedName = sortedArrayProperties[i].Name.EndsWith("s")
                        ? sortedArrayProperties[i].Name.Substring(0, sortedArrayProperties[i].Name.Length - 1)
                        : sortedArrayProperties[i].Name;
                        expanded.Cells[1, expandedHeaderIndex++].Value = $"{truncatedName}{j + 1}";
                    }
                }


                using (var r = expanded.Cells[1, 1, 1, expandedHeaderIndex - 1])
                {
                    r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                }


                //fill w/s with data
                int expandedRowIndex = 2;
                foreach (ProviderReport providerReport in list)
                {
                    PopulateBaseExcelCells(expanded, providerReport, expandedRowIndex, out int expandedColIndex);

                    if (categories.Professional)
                    {
                        expanded.Cells[concatenatedRowIndex, expandedColIndex].Value
                            = providerReport.Professional?.NPI;

                        expandedColIndex++;

                        if (providerReport.Professional?.GendersAccepted != null)
                        {
                            expanded.Cells[concatenatedRowIndex, expandedColIndex].Value
                                = providerReport.Professional.GendersAccepted;
                        }
                        expandedColIndex++;
                    }

                    for (int i = 0; i < sortedArrayProperties.Length; i++)
                    {
                        ICollection propCollection = GetPropValue <ICollection>(providerReport, sortedArrayProperties[i].Name);
                        int         dictCount      = countDict[sortedArrayProperties[i].Name];

                        if (propCollection != null)
                        {
                            foreach (var prop in propCollection)
                            {
                                string propName = "";

                                if (sortedArrayProperties[i].Name == "Licenses")
                                {
                                    propName = GetPropValue <string>(prop, "State");
                                }
                                else
                                {
                                    propName = GetPropValue <string>(prop, "Name");
                                }

                                expanded.Cells[expandedRowIndex, expandedColIndex++].Value = propName;
                            }
                            int propCount = propCollection.Count;

                            if (propCount < dictCount)
                            {
                                expandedColIndex += dictCount - propCount;
                            }
                        }
                        else
                        {
                            expandedColIndex += dictCount;
                        }
                    }
                    expandedRowIndex++;
                }

                expanded.Cells.AutoFitColumns(0, 40);

                #endregion


                #region individual detail worksheets

                Dictionary <string, ExcelWorksheet> worksheets = new Dictionary <string, ExcelWorksheet>();

                //creates appropriate worksheet detail names
                foreach (PropertyInfo propertyInfo in truthyCategories)
                {
                    string friendlyWsName = propertyInfo.Name.EndsWith("s")
                    ? propertyInfo.Name.Substring(0, propertyInfo.Name.Length - 1)
                    : propertyInfo.Name;
                    worksheets.Add(propertyInfo.Name, package.Workbook.Worksheets.Add(friendlyWsName + " Details"));
                }


                //populate all of the worksheets with shared headers
                foreach (var kvp in worksheets)
                {
                    //ExcelWorksheet sharedWs = GetPropValue<ExcelWorksheet>(worksheets, key);
                    ExcelWorksheet sharedWs = kvp.Value;

                    int sharedHeaderIndex = 1;
                    sharedWs.Cells[1, sharedHeaderIndex++].Value = "ID";
                    sharedWs.Cells[1, sharedHeaderIndex++].Value = "First Name";
                    sharedWs.Cells[1, sharedHeaderIndex++].Value = "Last Name";

                    if (kvp.Key == "Professional")
                    {
                        sharedWs.Cells[1, sharedHeaderIndex++].Value = "NPI";
                        sharedWs.Cells[1, sharedHeaderIndex++].Value = "Genders Accepted";
                    }
                    else
                    {
                        string truncatedName = kvp.Key.EndsWith("s")
                       ? kvp.Key.Substring(0, kvp.Key.Length - 1)
                       : kvp.Key;
                        sharedWs.Cells[1, sharedHeaderIndex++].Value = $"{truncatedName}";
                    }


                    using (var r = sharedWs.Cells[1, 1, 1, sharedHeaderIndex - 1])
                    {
                        r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                    }

                    //add data to w/s
                    int sharedWsRowIndex = 2;
                    foreach (ProviderReport providerReport in list)
                    {
                        if (kvp.Key == "Professional")
                        {
                            PopulateSharedBaseExcelCells(sharedWs, providerReport, sharedWsRowIndex, out int sharedColIndex);


                            sharedWs.Cells[sharedWsRowIndex, sharedColIndex].Value = providerReport.Professional?.NPI;
                            sharedColIndex++;

                            if (providerReport.Professional?.GendersAccepted != null)
                            {
                                sharedWs.Cells[sharedWsRowIndex, sharedColIndex].Value = providerReport.Professional.GendersAccepted;
                            }
                            sharedColIndex++;

                            sharedWsRowIndex++;
                        }
                        else
                        {
                            IList prop = GetPropValue <IList>(providerReport, kvp.Key);
                            if (prop != null)
                            {
                                for (int i = 0; i < prop.Count; i++)
                                {
                                    PopulateSharedBaseExcelCells(sharedWs, providerReport, sharedWsRowIndex, out int sharedColIndex);

                                    if (kvp.Key == "Licenses")
                                    {
                                        sharedWs.Cells[sharedWsRowIndex, sharedColIndex++].Value = GetPropValue <string>(prop[i], "State");
                                    }
                                    else
                                    {
                                        sharedWs.Cells[sharedWsRowIndex, sharedColIndex++].Value = GetPropValue <string>(prop[i], "Name");

                                        if (kvp.Key == "Specializations")
                                        {
                                            bool isPrimarySpec = GetStructValue <bool>(prop[i], "IsPrimary");

                                            if (isPrimarySpec)
                                            {
                                                sharedWs.Cells[sharedWsRowIndex, sharedColIndex - 1].Style.Font.Bold = true;
                                            }
                                        }
                                    }
                                    sharedWsRowIndex++;
                                }
                            }
                        }
                    }
                    sharedWs.Cells.AutoFitColumns(0);
                }

                #endregion


                // set some document properties
                package.Workbook.Properties.Title  = "Providers Report";
                package.Workbook.Properties.Author = "Scrubs Data";

                // save new workbook in the output directory
                package.Save();
            }
            return(stream);
        }