public async Task <bool> Facturar(Comprobante comprobante) { _db.Open(); using (var t = await _db.BeginTransactionAsync()) { try { string query = "INSERT INTO Comprobante(ClienteId, EmpleadoId, Numero, SubTotal, Total, Descuento, " + "TotalIva, Fecha, TipoComprobante, EstadoComprobante) " + "VALUES(@Cliente, @Empleado, @Numero, @SubTotal, @Total, @Descuento, @TotalIva, @Fecha, @Tipo, @Estado) " + "returning Id;"; var parametrosComprobante = new DynamicParameters(); var total = comprobante.Items.Sum(x => x.Total * x.Cantidad) - comprobante.Descuento; parametrosComprobante.Add("@Cliente", comprobante.ClienteId); parametrosComprobante.Add("@Empleado", IdentidadUsuarioLogin.EmpleadoId); parametrosComprobante.Add("@Numero", comprobante.Numero); parametrosComprobante.Add("@SubTotal", comprobante.Items.Sum(x => x.Total * x.Cantidad)); parametrosComprobante.Add("@Total", total); parametrosComprobante.Add("@Descuento", comprobante.Descuento); parametrosComprobante.Add("@TotalIva", comprobante.Items.Sum(x => x.TotalIva)); parametrosComprobante.Add("@Fecha", DateTime.Now); parametrosComprobante.Add("@Tipo", comprobante.TipoComprobante); parametrosComprobante.Add("@Estado", comprobante.EstadoComprobante); var comprobanteId = await _db.QueryFirstOrDefaultAsync <long>(query, param : parametrosComprobante, commandType : System.Data.CommandType.Text, transaction : t); // GRABAMOS EL DETALLE DEL COMPROBANTE foreach (var item in comprobante.Items) { var articulo = _articuloServicio.GetByCodigo(item.Codigo); string queryDetalle = "INSERT INTO DetalleComprobante(ComprobanteId, ArticuloId, Codigo, " + "Descripcion, Cantidad, Precio, Iva) VALUES(@Comprobante, @Articulo, @Codigo, @Descrip, @Cantidad, @Precio, @Iva)"; var parametrosDetalle = new DynamicParameters(); parametrosDetalle.Add("@Comprobante", comprobanteId); parametrosDetalle.Add("@Articulo", articulo.Id); parametrosDetalle.Add("@Codigo", item.Codigo); parametrosDetalle.Add("@Cantidad", item.Cantidad); parametrosDetalle.Add("@Descrip", articulo.Descripcion); parametrosDetalle.Add("@Precio", articulo.PrecioPublico); parametrosDetalle.Add("@Iva", item.TotalIva); _db.Execute(queryDetalle, param: parametrosDetalle, transaction: t, commandType: System.Data.CommandType.Text); } GrabarMovimientos(comprobanteId, comprobante.Numero, total, t); GrabarDetalleCaja(total, comprobante.TipoPago, t); // Incrementamos la secuencia de postgres para el numero de comprobante _db.Execute("select nextval('seq_numero_comprobante')", commandType: System.Data.CommandType.Text); await t.CommitAsync(); _db.Close(); return(true); } catch (Exception e) { _db.Close(); await t.RollbackAsync(); throw new Exception(e.Message); } } }