public async Task <bool> CreateFacturaAsync(FacturasHeader factura, string NombrePaciente) { var paciente = await _pacientesDbContext.Pacientes.FirstOrDefaultAsync(x => x.Nombre == NombrePaciente); if (paciente is null) { return(false); } var lastFacturas = _pacientesDbContext.FacturasHeaders .Where(x => x.Codigo.Contains($"/{factura.Fecha:yy}")) .Select(x => Convert.ToInt32(x.Codigo.Substring(0, 7))); if (await lastFacturas.AnyAsync()) { var last = await lastFacturas.MaxAsync(); last++; factura.Codigo = $"{last.ToString("D" + 7)}/{factura.Fecha:yy}"; } else { factura.Codigo = $"0000001/{factura.Fecha:yy}"; } factura.IdPaciente = paciente.IdPaciente; factura.Paciente = paciente; await _pacientesDbContext.FacturasHeaders.AddAsync(factura); await _pacientesDbContext.SaveChangesAsync(); return(true); }
public async Task <bool> UpdateFacturaAsync(FacturasHeader factura, string NombrePaciente) { var paciente = await _pacientesDbContext.Pacientes.FirstOrDefaultAsync(x => x.Nombre == NombrePaciente); if (paciente is null) { return(false); } factura.IdPaciente = paciente.IdPaciente; factura.Paciente = paciente; var idLines = factura.Lineas.Select(x => x.IdLine).ToList(); var previousLines = _pacientesDbContext.FacturasLineas.Where(x => x.IdFactura == factura.IdFactura).ToList(); foreach (var line in previousLines) { if (!idLines.Contains(line.IdLine)) { _pacientesDbContext.FacturasLineas.Remove(line); } else { var lineToRemove = factura.Lineas.First(x => x.IdLine == line.IdLine); factura.Lineas.Remove(lineToRemove); } } await _pacientesDbContext.SaveChangesAsync(); _pacientesDbContext.FacturasHeaders.Update(factura); await _pacientesDbContext.SaveChangesAsync(); return(true); }
public async Task <IActionResult> Edit(string paciente, FacturasHeader factura, FacturaLine[] lineas) { factura.Lineas = lineas.ToList(); if (await _facturasServices.UpdateFacturaAsync(factura, paciente)) { return(Ok()); } else { return(BadRequest()); } }
public async Task <Stream> GeneratePdf(FacturasHeader factura) { var stream = new MemoryStream(); var document = new Document(PageSize.A4, 70, 70, 70, 70); var writer = PdfWriter.GetInstance(document, stream); // First, create our fonts var datosPropiosFont = FontFactory.GetFont("Arial", 8); var metadatosFont = FontFactory.GetFont("Arial", 11); var totalFont = FontFactory.GetFont("Arial", 12, Font.BOLD); var boldTableFont = FontFactory.GetFont("Arial", 10, Font.BOLD); var bodyFont = FontFactory.GetFont("Arial", 10, Font.NORMAL); var clausulaFont = FontFactory.GetFont("Arial", 8, Font.NORMAL); var pageSize = writer.PageSize; document.Open(); //Logo var logo = iTextSharp.text.Image.GetInstance(File.Open(Path.Combine(_hostingEnvironment.WebRootPath, "logo", "akari.jfif"), FileMode.Open)); logo.SetAbsolutePosition(pageSize.GetLeft(45), 650); logo.ScalePercent(12f); document.Add(logo); #region Metadatos var tablaMetadatos = new PdfPTable(1) { HorizontalAlignment = 0, WidthPercentage = 100 }; tablaMetadatos.DefaultCell.Border = Rectangle.NO_BORDER; tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); tablaMetadatos.AddCell(""); var celda = new PdfPCell(new Phrase($"Factura: {factura.Codigo}", metadatosFont)) { Border = Rectangle.NO_BORDER, HorizontalAlignment = 0 }; tablaMetadatos.AddCell(celda); celda = new PdfPCell(new Phrase($"Fecha: {factura.Fecha.ToString("dd-MM-yyyy")}", metadatosFont)) { Border = Rectangle.NO_BORDER, HorizontalAlignment = 0 }; tablaMetadatos.AddCell(celda); //document.Add(tablaMetadatos); #endregion //Datos propios #region Datos propios var emptyCell = new PdfPCell(new Phrase("")) { Border = Rectangle.NO_BORDER }; var cabecera = new PdfPTable(3) { HorizontalAlignment = 0, WidthPercentage = 100, }; cabecera.DefaultCell.Border = Rectangle.NO_BORDER; cabecera.SetWidths(new float[] { 4, 4, 3 }); cabecera.AddCell(tablaMetadatos); cabecera.AddCell(emptyCell); var datosPropios = new PdfPTable(1); datosPropios.DefaultCell.Border = Rectangle.NO_BORDER; celda = new PdfPCell(new Phrase("Nuria Turrado Ferrero", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("NIF: 72737422Z", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("Nº Colegiado: 270", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("Colegio: Euskadi", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("AKARI PODOLOGIA", datosPropiosFont)) { Border = Rectangle.TOP_BORDER, BorderWidth = 1 }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("945 23 40 61", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("695 82 37 77", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("Senda del rio Ali, 2", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); celda = new PdfPCell(new Phrase("01015 Vitoria-Gasteiz, Álava", datosPropiosFont)) { Border = Rectangle.NO_BORDER }; datosPropios.AddCell(celda); cabecera.AddCell(datosPropios); document.Add(cabecera); #endregion #region Paciente // Create the header table var seccionPaciente = new PdfPTable(2) { HorizontalAlignment = 0, WidthPercentage = 100 }; seccionPaciente.SetWidths(new float[] { 5, 5 }); // then set the column's __relative__ widths seccionPaciente.DefaultCell.Border = Rectangle.NO_BORDER; //headertable.DefaultCell.Border = Rectangle.BOX; //for testing seccionPaciente.SpacingAfter = 30; var pacienteTabla = new PdfPTable(1); pacienteTabla.DefaultCell.Border = Rectangle.BOX; var nombrePaciente = new PdfPCell(new Phrase($"{factura.Paciente.Nombre}", bodyFont)) { Border = Rectangle.LEFT_BORDER | Rectangle.RIGHT_BORDER | Rectangle.TOP_BORDER }; pacienteTabla.AddCell(nombrePaciente); var telefonoPaciente = new PdfPCell(new Phrase($"NIF:{factura.Paciente.DNI ?? ""}", bodyFont)) { Border = Rectangle.LEFT_BORDER | Rectangle.RIGHT_BORDER }; pacienteTabla.AddCell(telefonoPaciente); var ciudad = await GetCiudad(factura.Paciente.CP); var direccionPaciente = new PdfPCell(new Phrase($"{factura.Paciente.Direccion} {factura.Paciente.CP:D5} {ciudad}", bodyFont)) { Border = Rectangle.LEFT_BORDER | Rectangle.RIGHT_BORDER | Rectangle.BOTTOM_BORDER }; pacienteTabla.AddCell(direccionPaciente); seccionPaciente.AddCell(pacienteTabla); seccionPaciente.AddCell(""); document.Add(seccionPaciente); #endregion #region Items Table //Create body table var itemTable = new PdfPTable(4) { HorizontalAlignment = 0, WidthPercentage = 100 }; itemTable.SetWidths(new float[] { 55, 15, 15, 15 }); // then set the column's __relative__ widths itemTable.SpacingAfter = 40; itemTable.DefaultCell.Border = Rectangle.NO_BORDER; var cell1 = new PdfPCell(new Phrase("Descripción", boldTableFont)) { HorizontalAlignment = 0, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(cell1); var cell2 = new PdfPCell(new Phrase("Cantidad", boldTableFont)) { HorizontalAlignment = 2, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(cell2); var cell3 = new PdfPCell(new Phrase("Precio unitario", boldTableFont)) { HorizontalAlignment = 2, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(cell3); var cell4 = new PdfPCell(new Phrase("Total (€)", boldTableFont)) { HorizontalAlignment = 2, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(cell4); foreach (var row in factura.Lineas) { var numberCell = new PdfPCell(new Phrase(row.Concepto, bodyFont)) { HorizontalAlignment = 0, PaddingLeft = 10f, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(numberCell); var descCell = new PdfPCell(new Phrase(row.Cantidad.ToString(), bodyFont)) { HorizontalAlignment = 2, PaddingLeft = 10f, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(descCell); var qtyCell = new PdfPCell(new Phrase(row.Precio.ToString("0.00"), bodyFont)) { HorizontalAlignment = 2, PaddingLeft = 10f, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(qtyCell); var amtCell = new PdfPCell(new Phrase((row.Cantidad * row.Precio).ToString("0.00"), bodyFont)) { HorizontalAlignment = 2, Border = Rectangle.BOTTOM_BORDER }; itemTable.AddCell(amtCell); } document.Add(itemTable); #endregion #region Footer var cb = writer.DirectContent; var footerTable = new PdfPTable(6) { HorizontalAlignment = 0, TotalWidth = 500f }; footerTable.SetWidths(new float[] { 20, 20, 20, 10, 15, 15 }); // then set the column's __relative__ widths footerTable.DefaultCell.Border = Rectangle.NO_BORDER; var sumaCell = new PdfPCell(new Phrase("Importe", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(sumaCell); var descuentoCell = new PdfPCell(new Phrase($"{factura.Descuento}% Desc", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(descuentoCell); var irpfCell = new PdfPCell(new Phrase($"{factura.IRPF}% IRPF", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(irpfCell); var ivaCell = new PdfPCell(new Phrase("% IVA", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(ivaCell); var cuotaIvaCell = new PdfPCell(new Phrase("Cuota IVA", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(cuotaIvaCell); var totalCell = new PdfPCell(new Phrase("Total", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(totalCell); var totalBruto = factura.Lineas.Sum(x => x.Precio * x.Cantidad); sumaCell = new PdfPCell(new Phrase($"{totalBruto:0.00} €", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(sumaCell); var descuento = (totalBruto * factura.Descuento) / 100.0; descuentoCell = new PdfPCell(new Phrase($"{descuento:0.00} €", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(descuentoCell); var descontado = totalBruto - descuento; var irpf = (descontado * factura.IRPF) / 100.0; irpfCell = new PdfPCell(new Phrase($"{irpf:0.00} €", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(irpfCell); ivaCell = new PdfPCell(new Phrase("EXENTO", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(ivaCell); cuotaIvaCell = new PdfPCell(new Phrase("0.00 €", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(cuotaIvaCell); var totalSuma = factura.Lineas.Sum(x => x.Precio * x.Cantidad); var totalDescuento = totalSuma * (1 - factura.Descuento / 100.0); var totalFinal = totalDescuento * (1 - factura.IRPF / 100.0); totalCell = new PdfPCell(new Phrase($"{totalFinal:0.00} €", bodyFont)) { HorizontalAlignment = 0, Border = Rectangle.NO_BORDER }; footerTable.AddCell(totalCell); footerTable.WriteSelectedRows(0, -1, 75, 150, cb); #endregion #region Total var totalTable = new PdfPTable(2) { HorizontalAlignment = 0, TotalWidth = 200f }; totalTable.SetWidths(new float[] { 5, 5 }); // then set the column's __relative__ widths totalTable.DefaultCell.Border = Rectangle.NO_BORDER; var sumaTotalCell = new PdfPCell(new Phrase($"SUMA: ", totalFont)) { Border = Rectangle.NO_BORDER, HorizontalAlignment = 2 }; totalTable.AddCell(sumaTotalCell); var valorSumaTotalCell = new PdfPCell(new Phrase($"{ totalFinal:0.00} €", totalFont)) { Border = Rectangle.NO_BORDER, HorizontalAlignment = 2 }; totalTable.AddCell(valorSumaTotalCell); totalTable.WriteSelectedRows(0, -1, 349, 100, cb); #endregion #region Disclaimer cb.BeginText(); var bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb.SetFontAndSize(bf, 10); cb.SetTextMatrix(75, 50); cb.ShowText("*Los servicios sanitarios estan exentos de IVA"); cb.EndText(); #endregion writer.CloseStream = false; //set the closestream property // Close the Document without closing the underlying stream document.Close(); stream.Seek(0, SeekOrigin.Begin); return(stream); }
public async Task RemoveAsync(FacturasHeader factura) { _pacientesDbContext.FacturasHeaders.Remove(factura); await _pacientesDbContext.SaveChangesAsync(); }