ImpressaoFaturamento/Controllers/ExcelController.cs
2024-12-19 17:20:17 -03:00

183 lines
8.3 KiB
C#

using Microsoft.AspNetCore.Mvc;
using ImpressãoFaturamento.Models;
using Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
namespace ImpressãoFaturamento.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ExcelController : ControllerBase
{
[HttpPost]
public IActionResult Post([FromBody] FaturamentoModel data)
{
if (data == null)
{
return BadRequest("Invalid data.");
}
var filePath = WriteDataToExcel(data);
if (!string.IsNullOrEmpty(filePath))
{
return Ok("File created and printed successfully.");
}
return StatusCode(500, "An error occurred while processing the file.");
}
private string WriteDataToExcel(FaturamentoModel data)
{
string templatePath = Path.Combine(Directory.GetCurrentDirectory(), "template.xlsx");
string pdfOutputPath = Path.Combine(Directory.GetCurrentDirectory(), data.DadosCadastrais.NomeUnidade + ".pdf");
Application excelApp = new Application();
Workbooks workbooks = excelApp.Workbooks;
Workbook workbook = workbooks.Open(templatePath);
Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
//dados cadastrais
worksheet.Cells[3, "C"].Value = data.DadosCadastrais.NomeCliente;
worksheet.Cells[4, "C"].Value = data.DadosCadastrais.NomeUnidade;
worksheet.Cells[5, "C"].Value = data.DadosCadastrais.MesConsumo;
worksheet.Cells[6, "C"].Value = data.DadosCadastrais.BandeiraCativo;
worksheet.Cells[3, "G"].Value = data.DadosCadastrais.ICMS;
worksheet.Cells[4, "G"].Value = data.DadosCadastrais.PIS_COFINS;
worksheet.Cells[5, "G"].Value = data.DadosCadastrais.FatorTributo;
worksheet.Cells[6, "G"].Value = data.DadosCadastrais.DescontoTUSD;
worksheet.Cells[5, "L"].Value = data.DadosCadastrais.PercentualUnidade;
worksheet.Cells[4, "R"].Value = data.DadosCadastrais.CustoTotalCCEE;
//dados de faturamento - Cativo
int linha = 11;
foreach (var item in data.Faturamento.Cativo)
{
worksheet.Cells[linha, "B"].Value = item.Nome;
worksheet.Cells[linha, "C"] = item.Quantidade;
worksheet.Cells[linha, "E"] = item.Tarifa;
worksheet.Cells[linha, "G"] = item.Subtotal;
worksheet.Cells[linha, "H"] = item.TipoImposto;
worksheet.Cells[linha, "I"].Value = item.ValorFinal;
linha++;
}
//dados de faturamento - Livre
linha = 33;
foreach (var item in data.Faturamento.Livre)
{
worksheet.Cells[linha, "B"].Value = item.Nome;
worksheet.Cells[linha, "C"] = item.Quantidade;
worksheet.Cells[linha, "E"] = item.Tarifa;
worksheet.Cells[linha, "G"] = item.Subtotal;
worksheet.Cells[linha, "H"] = item.TipoImposto;
worksheet.Cells[linha, "I"].Value = item.ValorFinal;
linha++;
}
faturamento(workbook, worksheet);
workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, pdfOutputPath);
workbook.Close(false);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
return pdfOutputPath;
}
public void faturamento(Workbook workbook, Worksheet worksheet)
{
float idUnidade = worksheet.Cells[70, "A"].Value;
float mesRef = worksheet.Cells[70, "D"].Value;
float tipoFaturamento = worksheet.Cells[70, "I"].Value;
float cod_fatura = idUnidade + mesRef + tipoFaturamento;
string empresa = worksheet.Cells[70, "B"].Value;
string unidade = worksheet.Cells[70, "C"].Value;
decimal custoCativo = worksheet.Cells[70, "E"].Value;
decimal custoLivre = worksheet.Cells[70, "F"].Value;
decimal economia = worksheet.Cells[70, "G"].Value;
decimal remuneracao = worksheet.Cells[70, "H"].Value;
decimal remuneracaoFixo = worksheet.Cells[70, "J"].Value;
decimal remuneracaoPiso = worksheet.Cells[70, "K"].Value;
decimal remuneracaoTeto = worksheet.Cells[70, "L"].Value;
decimal remuneracaoPercentual = worksheet.Cells[70, "M"].Value;
int numeroUnidades = Convert.ToInt32(unidade);
var pdfOutputPath = Path.Combine(Directory.GetCurrentDirectory(), idUnidade + ".pdf");
if (remuneracaoFixo != 0 || numeroUnidades == 1)
{
//imprimir remuneracao fixa
workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, pdfOutputPath);
}
if (remuneracaoFixo == 0 || numeroUnidades != 1)
{
//imprimir remuneracao piso/teto/percentual
worksheet.Cells[61, "F"].Value = remuneracaoPiso;
//TODO: imprimir
worksheet.Cells[61, "F"].Value = remuneracaoTeto;
//TODO: imprimir
worksheet.Cells[61, "F"].Value = remuneracaoPercentual;
//TODO: imprimir
workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, pdfOutputPath);
}
//Conexão com o banco de dados Access
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=CaminhoParaSeuBancoDeDados.accdb;Jet OLEDB:Database Password=SuaSenha;";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
// Atualizar o registro se ele já existir
string updateQuery = "UPDATE TabelaResumoFaturamento SET ValorTotal = @ValorTotal WHERE IdUnidade = @IdUnidade";
using (OleDbCommand updateCommand = new OleDbCommand(updateQuery, connection))
{
updateCommand.Parameters.AddWithValue("@ValorTotal", remuneracao);
updateCommand.Parameters.AddWithValue("@IdUnidade", idUnidade);
int rowsUpdated = updateCommand.ExecuteNonQuery();
// Se nenhum registro foi atualizado, inserir um novo registro
if (rowsUpdated == 0)
{
string insertQuery = "INSERT INTO TabelaResumoFaturamento (IdUnidade, MesRef, TipoFaturamento, ValorTotal) VALUES (@IdUnidade, @MesRef, @TipoFaturamento, @ValorTotal)";
using (OleDbCommand insertCommand = new OleDbCommand(insertQuery, connection))
{
insertCommand.Parameters.AddWithValue("@IdUnidade", idUnidade);
insertCommand.Parameters.AddWithValue("@MesRef", mesRef);
insertCommand.Parameters.AddWithValue("@TipoFaturamento", tipoFaturamento);
insertCommand.Parameters.AddWithValue("@ValorTotal", remuneracao);
insertCommand.ExecuteNonQuery();
}
}
}
// Verificar se é a última unidade faturada
if (unidadesFaturadas == numeroUnidades)
{
//TODO: comparar faturamento global e atualizar faturamento final
//TODO: manter somente o faturamento correto
// Atualizar o resumo de faturamento
string updateQuery = "UPDATE TabelaResumoFaturamento SET ValorTotal = @ValorTotal WHERE IdUnidade = @IdUnidade";
using (OleDbCommand updateCommand = new OleDbCommand(updateQuery, connection))
{
updateCommand.Parameters.AddWithValue("@ValorTotal", remuneracao);
updateCommand.Parameters.AddWithValue("@IdUnidade", idUnidade);
updateCommand.ExecuteNonQuery();
}
}
}
}
}
}