public async Task <IActionResult> PostSalidaInsumo([FromBody] SalidaInsumo salidaInsumo)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            using (var sn = factory.OpenSession())
            {
                using (var tx = sn.BeginTransaction())
                {
                    try
                    {
                        salidaInsumo.FechaCreacion = DateTime.Now;

                        sn.Save(salidaInsumo);

                        foreach (var item in salidaInsumo.Items)
                        {
                            InventarioInsumo inventario = await sn.Query <InventarioInsumo>()
                                                          .Where(x => x.IdAlmacen == salidaInsumo.Almacen.IdAlmacen &&
                                                                 x.IdInsumo == item.Insumo.IdProducto)
                                                          .FirstOrDefaultAsync();

                            if (inventario != null && inventario.Stock >= (item.Cantidad * item.Factor))
                            {
                                inventario.Stock = inventario.Stock - (item.Cantidad * item.Factor);
                            }
                            else
                            {
                                throw new Exception("Sin stock para el insumo: " + item.Insumo.Nombre);
                            }

                            item.IdSalidaInsumo = salidaInsumo.IdSalidaInsumo;

                            sn.Save(item);
                        }

                        await tx.CommitAsync();
                    }
                    catch (Exception ex)
                    {
                        await tx.RollbackAsync();

                        return(StatusCode(500, ex.Message));
                    }
                }
            }

            return(Ok(true));
        }
        public async Task <IActionResult> DeleteSalidaInsumo([FromRoute] int id)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            using (var sn = factory.OpenSession())
            {
                using (var tx = sn.BeginTransaction())
                {
                    try
                    {
                        SalidaInsumo salidaInsumo = sn.Get <SalidaInsumo>(id);

                        List <ItemSalidaInsumo> items = await sn.Query <ItemSalidaInsumo>()
                                                        .Where(x => x.IdSalidaInsumo == id)
                                                        .ToListAsync();

                        foreach (var item in items)
                        {
                            InventarioInsumo inventario = await sn.Query <InventarioInsumo>()
                                                          .Where(x => x.IdAlmacen == salidaInsumo.Almacen.IdAlmacen &&
                                                                 x.IdInsumo == item.Insumo.IdProducto)
                                                          .FirstOrDefaultAsync();

                            inventario.Stock = inventario.Stock + (item.Cantidad * item.Factor);
                        }

                        sn.Delete(string.Format("FROM ItemSalidaInsumo WHERE IdSalidaInsumo = {0}", id));

                        sn.Delete(salidaInsumo);

                        await tx.CommitAsync();
                    }
                    catch (Exception ex)
                    {
                        await tx.RollbackAsync();

                        return(StatusCode(500, ex.Message));
                    }
                }
            }

            return(Ok(true));
        }
        public async Task <IActionResult> GetSalidaInsumo([FromRoute] int id)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            SalidaInsumo salidaInsumo = null;

            using (var sn = factory.OpenSession())
            {
                salidaInsumo = await sn.GetAsync <SalidaInsumo>(id);

                salidaInsumo.Items = await sn.Query <ItemSalidaInsumo>().Where(x => x.IdSalidaInsumo == id).ToListAsync();
            }

            if (salidaInsumo == null)
            {
                return(NotFound());
            }

            return(Ok(salidaInsumo));
        }
        public async Task <IActionResult> PutSalidaInsumo([FromRoute] int id, [FromBody] SalidaInsumo salidaInsumo)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != salidaInsumo.IdSalidaInsumo)
            {
                return(BadRequest());
            }

            using (var sn = factory.OpenSession())
            {
                using (var tx = sn.BeginTransaction())
                {
                    try
                    {
                        List <ItemSalidaInsumo> items = await sn.Query <ItemSalidaInsumo>()
                                                        .Where(x => x.IdSalidaInsumo == id)
                                                        .ToListAsync();

                        foreach (var item in items)
                        {
                            InventarioInsumo inventario = await sn.Query <InventarioInsumo>()
                                                          .Where(x => x.IdAlmacen == salidaInsumo.Almacen.IdAlmacen &&
                                                                 x.IdInsumo == item.Insumo.IdProducto)
                                                          .FirstOrDefaultAsync();

                            inventario.Stock = inventario.Stock + (item.Cantidad * item.Factor);
                        }

                        sn.Delete(string.Format("FROM ItemSalidaInsumo WHERE IdSalidaInsumo = {0}", id));

                        foreach (var item in salidaInsumo.Items)
                        {
                            InventarioInsumo inventario = await sn.Query <InventarioInsumo>()
                                                          .Where(x => x.IdAlmacen == salidaInsumo.Almacen.IdAlmacen &&
                                                                 x.IdInsumo == item.Insumo.IdProducto)
                                                          .FirstOrDefaultAsync();

                            if (inventario != null && inventario.Stock >= (item.Cantidad * item.Factor))
                            {
                                inventario.Stock = inventario.Stock - (item.Cantidad * item.Factor);
                            }
                            else
                            {
                                throw new Exception("Sin stock para el insumo: " + item.Insumo.Nombre);
                            }

                            item.IdSalidaInsumo = id;

                            sn.Save(item);
                        }

                        SalidaInsumo salidaInsumoBD = sn.Get <SalidaInsumo>(id);

                        salidaInsumoBD.IdLote     = salidaInsumo.IdLote;
                        salidaInsumoBD.Comentario = salidaInsumo.Comentario;

                        await tx.CommitAsync();
                    }
                    catch (Exception ex)
                    {
                        await tx.RollbackAsync();

                        return(StatusCode(500, ex.Message));
                    }
                }
            }

            return(Ok(true));
        }