using System; using System.Threading.Tasks; using ComplianceNFs.Core.Entities; using ComplianceNFs.Core.Ports; using Npgsql; using Newtonsoft.Json; using System.Numerics; namespace ComplianceNFs.Infrastructure.Repositories { // Placeholder: fill in actual SQL and mapping logic public class AttachmentRepository(string connectionString) : IAttachmentRepository { private readonly string _connectionString = connectionString; public async Task SaveRawAsync(EnergyInvoice invoice) { using var conn = new NpgsqlConnection(_connectionString); await conn.OpenAsync(); var cmd = conn.CreateCommand(); cmd.CommandText = @"INSERT INTO attachments ( filename, supplier_email, conversation_id, received_date, md5, cnpj_comp, cnpj_vend, mont_nf, prec_nf, valor_sem_imp, valor_com_imp, rs_comp, rs_vend, numero_nf, icms_nf, uf_comp, uf_vend, matched_cod_te, status, discrepancy, metadata ) VALUES ( @filename, @supplier_email, @conversation_id, @received_date, @md5, @cnpj_comp, @cnpj_vend, @mont_nf, @prec_nf, @valor_sem_imp, @valor_com_imp, @rs_comp, @rs_vend, @numero_nf, @icms_nf, @uf_comp, @uf_vend, @matched_cod_te, @status, @discrepancy, @metadata )"; cmd.Parameters.AddWithValue("@filename", invoice.Filename); cmd.Parameters.AddWithValue("@supplier_email", invoice.SupplierEmail); cmd.Parameters.AddWithValue("@conversation_id", (object?)invoice.ConversationId ?? DBNull.Value); cmd.Parameters.AddWithValue("@received_date", invoice.ReceivedDate); cmd.Parameters.AddWithValue("@md5", (object?)invoice.Md5 ?? DBNull.Value); cmd.Parameters.AddWithValue("@cnpj_comp", (object?)invoice.CnpjComp ?? DBNull.Value); cmd.Parameters.AddWithValue("@cnpj_vend", (object?)invoice.CnpjVend ?? DBNull.Value); cmd.Parameters.AddWithValue("@mont_nf", (object?)invoice.MontNF ?? DBNull.Value); cmd.Parameters.AddWithValue("@prec_nf", (object?)invoice.PrecNF ?? DBNull.Value); cmd.Parameters.AddWithValue("@valor_sem_imp", (object?)invoice.ValorSemImpostos ?? DBNull.Value); cmd.Parameters.AddWithValue("@valor_com_imp", (object?)invoice.ValorFinalComImpostos ?? DBNull.Value); cmd.Parameters.AddWithValue("@rs_comp", (object?)invoice.RsComp ?? DBNull.Value); cmd.Parameters.AddWithValue("@rs_vend", (object?)invoice.RsVend ?? DBNull.Value); cmd.Parameters.AddWithValue("@numero_nf", (object?)invoice.NumeroNF ?? DBNull.Value); cmd.Parameters.AddWithValue("@icms_nf", (object?)invoice.IcmsNF ?? DBNull.Value); cmd.Parameters.AddWithValue("@uf_comp", (object?)invoice.UfComp ?? DBNull.Value); cmd.Parameters.AddWithValue("@uf_vend", (object?)invoice.UfVend ?? DBNull.Value); cmd.Parameters.AddWithValue("@matched_cod_te", (object?)invoice.MatchedCodTE ?? DBNull.Value); cmd.Parameters.AddWithValue("@status", invoice.Status.ToString()); cmd.Parameters.AddWithValue("@discrepancy", (object?)invoice.DiscrepancyNotes ?? DBNull.Value); cmd.Parameters.AddWithValue("@metadata", Newtonsoft.Json.JsonConvert.SerializeObject(invoice)); await cmd.ExecuteNonQueryAsync(); } public async Task UpdateMatchAsync(int invoiceId, BigInteger matchedCodTE, InvoiceStatus status, string notes) { using var conn = new NpgsqlConnection(_connectionString); await conn.OpenAsync(); var cmd = conn.CreateCommand(); cmd.CommandText = @"UPDATE attachments SET matched_cod_te = @matched_cod_te, status = @status, discrepancy = @discrepancy WHERE invoice_id = @invoice_id"; cmd.Parameters.AddWithValue("@matched_cod_te", matchedCodTE); cmd.Parameters.AddWithValue("@status", status.ToString()); cmd.Parameters.AddWithValue("@discrepancy", (object?)notes ?? DBNull.Value); cmd.Parameters.AddWithValue("@invoice_id", invoiceId); await cmd.ExecuteNonQueryAsync(); } } }