using Domain.Entities; using Models.Helpers; using Models.Interfaces; using Models.Models; namespace Models.Repositories { public class PhSQuoteRepository(PhronCareOperationsHubContext context, IPhSFormSeriesRepository formSeriesRepository) : IPhSQuoteRepository { private readonly PhronCareOperationsHubContext _context = context; private readonly IPhSFormSeriesRepository _formSeriesRepository = formSeriesRepository; #region Guardado completo de presupuesto (encabezado + detalles + roles + ajustes + impuestos) /// /// Crea un nuevo presupuesto, incluyendo encabezado, detalles, roles, ajustes e impuestos asociados. /// Genera automáticamente el número de presupuesto en base a la serie indicada. /// Presupuesto a registrar, incluyendo entidades relacionadas. /// Identificador de la serie de numeración a utilizar. /// Cadena con el número generado del presupuesto. /// public async Task CreateFullQuoteAsync(EQuoteHeader quote, int formSeriesId) { using var transaction = await _context.Database.BeginTransactionAsync(); try { var nextNumber = await _formSeriesRepository.GetNextInternalNumberAsync(formSeriesId); var series = await _formSeriesRepository.GetByIdAsync(formSeriesId) ?? throw new InvalidOperationException("Serie no encontrada"); int padding = 8; /* format "00000000" */ quote.Quotenumber = $"{series.Letter}-{nextNumber.ToString($"D{padding}")}"; var headerEntity = EntityMapper.MapEntity(quote); _context.PhSQuoteHeaders.Add(headerEntity); #region Nota: Esta seccion queda para futura modificacion en caso de cambiar CASCADE INSERT de las entidades relacionadas //// Guardado de Detalles //if (quote.PhSQuoteDetails?.Any() == true) //{ // foreach (var detail in quote.PhSQuoteDetails) // { // detail.QuoteheaderId = headerEntity.Id; // var dbDetail = EntityMapper.MapEntity(detail); // _context.PhSQuoteDetails.Add(dbDetail); // } //} //// Guardado de Roles //if (quote.PhSQuoteRoles?.Any() == true) //{ // foreach (var role in quote.PhSQuoteRoles) // { // role.QuoteheaderId = headerEntity.Id; // var dbRole = EntityMapper.MapEntity(role); // _context.PhSQuoteRoles.Add(dbRole); // } //} //// Guardado de Ajustes //if (quote.PhSQuoteAdjustments?.Any() == true) //{ // foreach (var adj in quote.PhSQuoteAdjustments) // { // adj.QuoteheaderId = headerEntity.Id; // var dbAdj = EntityMapper.MapEntity(adj); // _context.PhSQuoteAdjustments.Add(dbAdj); // } //} //// Guardado de Impuestos //if (quote.PhSQuoteTaxes?.Any() == true) //{ // foreach (var tax in quote.PhSQuoteTaxes) // { // tax.QuoteheaderId = headerEntity.Id; // var dbTax = EntityMapper.MapEntity(tax); // _context.PhSQuoteTaxes.Add(dbTax); // } //} #endregion await _context.SaveChangesAsync(); await transaction.CommitAsync(); return headerEntity.Quotenumber; } catch { await transaction.RollbackAsync(); throw; } } #endregion } }