Exemplo n.º 1
0
        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);
                }
            }
        }