Untitled

 avatar
user_6104052
csharp
a year ago
6.6 kB
7
Indexable
using ClosedXML.Excel;
using Microsoft.Extensions.Options;
using Notenetic.Model.ViewModels;
using Notenetic.Service.Data.Model.Common;
using Notenetic.Service.Services.Contract;
using System.Collections.Generic;
using System.IO;


namespace Notenetic.Service.Services
{
    [ScopedService]
    public class ExportToExcelService : IExportToExcelService
    {
        private XLColor _headerColor = XLColor.FromArgb(0xFDEEDB);
        
        private readonly XLColor _greenColor = XLColor.Green;
        private readonly XLColor _redColor = XLColor.Red;
        private readonly XLColor _yellowColor = XLColor.Yellow;
        private readonly XLColor _greyColor = XLColor.Gray;
        private readonly IS3Service _s3Service;
        private readonly AppSettings _appsettings;

        public ExportToExcelService(IS3Service s3Service,
            IOptions<AppSettings> appsettings)
        {
            _s3Service = s3Service;
            _appsettings = appsettings.Value;
        }

        public async Task<string> ExportToPdf(List<ComplianceReportClientDetailsModel> complianceReport)
        {
            using var workbook = new XLWorkbook();
            workbook.Author = "Notenetic";
            workbook.Style.Font.FontName = "Manrope";
            var worksheet = workbook.Worksheets.Add("Compliance");
            var columnNames = AddFirstRow(worksheet, complianceReport.First());

            var index = columnNames.RowNumber();

            foreach (var rpt in complianceReport)
            {
                index++;
                AddRow(worksheet, index, rpt);
            }

            using var stream = new MemoryStream();
            workbook.SaveAs(stream, new SaveOptions { EvaluateFormulasBeforeSaving = false, GenerateCalculationChain = false, ValidatePackage = false });
            return await _s3Service.PutStreamInS3Bucket(_appsettings.S3Bucket, stream, $"{_appsettings.S3TempFilePath}/ComplianceReport_{Guid.NewGuid()}.xlsx");
        }

        public IXLRow AddFirstRow(IXLWorksheet workSheet, ComplianceReportClientDetailsModel rpt)
        {
            var startAddress = workSheet.FirstCell().Address;
            var row = workSheet.Row(startAddress.RowNumber);

            row.Cell(startAddress.ColumnNumber).Value = "Name";
            row.Cell(startAddress.ColumnNumber).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 1).Value = "Sites";
            row.Cell(startAddress.ColumnNumber + 1).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 2).Value = "Payer";
            row.Cell(startAddress.ColumnNumber + 2).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 3).Value = "Status";
            row.Cell(startAddress.ColumnNumber + 3).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 4).Value = "UpcomingDate";
            row.Cell(startAddress.ColumnNumber + 4).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 5).Value = "NextDueDate";
            row.Cell(startAddress.ColumnNumber + 5).Style.Fill.BackgroundColor = _headerColor;

            row.Cell(startAddress.ColumnNumber + 6).Value = "CompletedDate";
            row.Cell(startAddress.ColumnNumber + 6).Style.Fill.BackgroundColor = _headerColor;

            var index = 1;
            foreach (var compliances in rpt.complianceReport)
            {
                row.Cell(startAddress.ColumnNumber + index + 6).Value = compliances.complianceName;
                row.Cell(startAddress.ColumnNumber + index + 6).Style.Fill.BackgroundColor = _headerColor;
                index++;
            }

            return row;
        }

        public IXLRow AddRow(IXLWorksheet workSheet, int rowIndex, ComplianceReportClientDetailsModel rpt)
        {
            var row = workSheet.Row(rowIndex);
            var address = workSheet.FirstCell().Address;
            row.Cell(address.ColumnNumber).Value = $"{rpt.lName}, {rpt.fName} ({rpt.Age})";
            row.Cell(address.ColumnNumber + 1).Value = rpt.siteName;
            row.Cell(address.ColumnNumber + 2).Value = rpt.payerName;
            row.Cell(address.ColumnNumber + 3).Value = rpt.status;

            DateTime? upcomingDate = null;
            DateTime? nextDueDate = null;
            DateTime? completedDate = null;
            foreach (var compliance in rpt.complianceReport)
            {
                if (compliance.isCompleted && compliance.isRecurring)
                {
                    nextDueDate = compliance.nextDueDate;
                    completedDate = compliance.completedDate;
                    break; 
                }
                else if (compliance.isCompleted)
                {
                    completedDate = DateTime.Now.Date;
                }
                else if (compliance.isRecurring)
                {
                    nextDueDate = compliance.nextDueDate;
                }
                
            }
            row.Cell(address.ColumnNumber + 4).Value = upcomingDate;
            row.Cell(address.ColumnNumber + 5).Value = nextDueDate;
            row.Cell(address.ColumnNumber + 6).Value = completedDate;

            var index = 1;
            foreach (var compliances in rpt.complianceReport)
            {
                var complianceProps = GetComplianceProps(compliances);
                row.Cell(address.ColumnNumber + index + 6).Value = complianceProps.status;
                row.Cell(address.ColumnNumber + index + 6).Style.Fill.SetBackgroundColor(complianceProps.color);
                index++;
            }

            return row;
        }



        private (string status, XLColor color) GetComplianceProps(ComplianceReportDetails complianceReport)

        {
            Console.WriteLine(complianceReport);
            if (complianceReport.isCompleted && complianceReport.isRecurring)
            {
                return ("Complete", _greenColor);
            }

            if (complianceReport.isCompleted)
            {
                return ("Complete", _greenColor);
            }

            if (!complianceReport.isApplicable)
            {
                return ("NA", _greenColor);
            }


            if (complianceReport.isRestrictive)
            {
                return ("Pending", _redColor);
            }

            return ("Pending", _yellowColor);
        }
    }
}
Editor is loading...
Leave a Comment