line-gestao-api/Services/GeralSpreadsheetTemplateSer...

181 lines
6.2 KiB
C#

using ClosedXML.Excel;
namespace line_gestao_api.Services
{
public class GeralSpreadsheetTemplateService
{
private const string WorksheetName = "GERAL";
private const int HeaderRow = 1;
private const int FirstDataRow = 2;
private const int LastColumn = 31; // A..AE
private static readonly string[] Headers =
{
"CONTA",
"LINHA",
"CHIP",
"CLIENTE",
"USUÁRIO",
"PLANO CONTRATO",
"FRAQUIA",
"VALOR DO PLANO R$",
"GESTÃO VOZ E DADOS R$",
"SKEELO",
"VIVO NEWS PLUS",
"VIVO TRAVEL MUNDO",
"VIVO SYNC",
"VIVO GESTÃO DISPOSITIVO",
"VALOR CONTRATO VIVO",
"FRANQUIA LINE",
"FRANQUIA GESTÃO",
"LOCAÇÃO AP.",
"VALOR CONTRATO LINE",
"DESCONTO",
"LUCRO",
"STATUS",
"DATA DO BLOQUEIO",
"SKIL",
"MODALIDADE",
"CEDENTE",
"SOLICITANTE",
"DATA DA ENTREGA OPERA.",
"DATA DA ENTREGA CLIENTE",
"VENC. DA CONTA",
"TIPO DE CHIP"
};
private static readonly double[] ColumnWidths =
{
11.00, 12.00, 21.43, 70.14, 58.29, 27.71, 11.00, 18.14,
20.71, 11.00, 14.57, 18.14, 11.00, 19.57, 21.43, 14.57,
16.29, 13.00, 20.71, 13.00, 13.00, 14.57, 16.29, 13.00,
16.29, 39.43, 27.86, 25.00, 27.71, 16.29, 13.00
};
private static readonly int[] TextColumns =
{
1, 2, 3, 4, 5, 6, 7, 16, 17, 22, 24, 25, 26, 27, 31
};
private static readonly int[] CurrencyColumns =
{
8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 20, 21
};
private static readonly int[] DateColumns =
{
23, 28, 29, 30
};
public byte[] BuildPlanilhaGeralTemplate()
{
using var workbook = new XLWorkbook();
var ws = workbook.Worksheets.Add(WorksheetName);
BuildHeader(ws);
ConfigureColumns(ws);
ConfigureDataFormatting(ws);
ConfigureSheetView(ws);
using var stream = new MemoryStream();
workbook.SaveAs(stream);
return stream.ToArray();
}
private static void BuildHeader(IXLWorksheet ws)
{
for (var i = 0; i < Headers.Length; i++)
{
ws.Cell(HeaderRow, i + 1).Value = Headers[i];
}
var headerRange = ws.Range(HeaderRow, 1, HeaderRow, LastColumn);
headerRange.Style.Font.FontName = "Calibri";
headerRange.Style.Font.FontSize = 11;
headerRange.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
headerRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
headerRange.Style.Border.TopBorder = XLBorderStyleValues.Thin;
headerRange.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
headerRange.Style.Border.LeftBorder = XLBorderStyleValues.Thin;
headerRange.Style.Border.RightBorder = XLBorderStyleValues.Thin;
ws.Row(HeaderRow).Height = 14.25;
var navy = XLColor.FromHtml("#002060");
var purple = XLColor.FromHtml("#7030A0");
var orange = XLColor.FromHtml("#D9A87E");
var red = XLColor.FromHtml("#FF0000");
var yellow = XLColor.FromHtml("#FFFF00");
var white = XLColor.White;
var black = XLColor.Black;
ApplyHeaderBlock(ws, 1, 6, navy, white, bold: true); // A-F
ApplyHeaderBlock(ws, 22, 31, navy, white, bold: true); // V-AE
ApplyHeaderBlock(ws, 7, 15, purple, white, bold: true); // G-O
ApplyHeaderBlock(ws, 16, 19, orange, white, bold: true);// P-S
ApplyHeaderBlock(ws, 20, 20, red, white, bold: true); // T
ApplyHeaderBlock(ws, 21, 21, yellow, black, bold: true);// U
// Exceções no bloco azul (sem negrito): CHIP, CLIENTE, USUÁRIO => C, D, E
ws.Cell(1, 3).Style.Font.Bold = false;
ws.Cell(1, 4).Style.Font.Bold = false;
ws.Cell(1, 5).Style.Font.Bold = false;
}
private static void ApplyHeaderBlock(
IXLWorksheet ws,
int startCol,
int endCol,
XLColor bgColor,
XLColor fontColor,
bool bold)
{
var range = ws.Range(HeaderRow, startCol, HeaderRow, endCol);
range.Style.Fill.BackgroundColor = bgColor;
range.Style.Font.FontColor = fontColor;
range.Style.Font.Bold = bold;
}
private static void ConfigureColumns(IXLWorksheet ws)
{
for (var i = 0; i < ColumnWidths.Length; i++)
{
ws.Column(i + 1).Width = ColumnWidths[i];
}
}
private static void ConfigureDataFormatting(IXLWorksheet ws)
{
// Prepara um range vazio com estilo base para facilitar preenchimento manual
var dataPreviewRange = ws.Range(FirstDataRow, 1, 1000, LastColumn);
dataPreviewRange.Style.Font.FontName = "Calibri";
dataPreviewRange.Style.Font.FontSize = 11;
dataPreviewRange.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
foreach (var col in TextColumns)
{
ws.Column(col).Style.NumberFormat.Format = "@";
}
foreach (var col in CurrencyColumns)
{
ws.Column(col).Style.NumberFormat.Format = "\"R$\" #,##0.00";
}
foreach (var col in DateColumns)
{
ws.Column(col).Style.DateFormat.Format = "dd/MM/yyyy";
}
// O campo ITÉM é gerado internamente pelo sistema e não faz parte do template.
}
private static void ConfigureSheetView(IXLWorksheet ws)
{
ws.ShowGridLines = false;
ws.SheetView.FreezeRows(1); // Freeze em A2 (mantém linha 1 fixa)
ws.Range(1, 1, 1, LastColumn).SetAutoFilter();
}
}
}