public void InsertPedidoItem(Orden orden)
        {
            using (var dbTransaction = _applicationDbContext.Database.BeginTransaction())
            {
                try
                {
                    //Lista de bienes patrimoniales
                    List <int> bienServList = orden.OrdenItem.Select(x => x.BienServicioId).ToList();

                    string      mes         = orden.FechaOrden.Month.ToString(new string(DigitosConstante.CERO[0], 2));
                    MesContable mesContable = _applicationDbContext
                                              .MesContable.Where(x => x.Codigo == mes).FirstOrDefault();


                    foreach (int item in bienServList)
                    {
                        OrdenSaldo ordenSaldo = _applicationDbContext
                                                .OrdenSaldo.Where(x => x.BienServicioId == item &&
                                                                  x.AlmacenId == orden.AlmacenId &&
                                                                  x.PeriodoEmpresaId == orden.PeriodoEmpresaId).FirstOrDefault();


                        foreach (var ordenItem in orden.OrdenItem)
                        {
                            if (ordenItem.BienServicioId.Equals(ordenSaldo.BienServicioId))
                            {
                                _applicationDbContext.OrdenSaldo.Where(x => x.BienServicioId == item && x.AlmacenId == orden.AlmacenId &&
                                                                       x.PeriodoEmpresaId == orden.PeriodoEmpresaId).ToList().ForEach(x =>
                                {
                                    x.CantidadSalida  += ordenItem.Cantidad;
                                    x.CantidadReserva -= ordenItem.Cantidad;
                                    x.ValorSalida     += ordenItem.Cantidad * ordenItem.ValorUnitario;
                                    x.MontoSaldo      -= x.ValorSalida;
                                });

                                _applicationDbContext.SaveChanges();
                                break;
                            }
                        }
                    }

                    _applicationDbContext.OrdenItem.AddRange(orden.OrdenItem);
                    orden.Cantidad      = orden.OrdenItem.Sum(x => x.Cantidad);
                    orden.SubTotal      = orden.OrdenItem.Sum(x => x.ValorUnitario) * orden.Cantidad;
                    orden.TotalPedido   = orden.SubTotal;
                    orden.MesContableId = mesContable.MesContableId;
                    orden.Impuesto      = 0;
                    _applicationDbContext.Orden.Add(orden);
                    _applicationDbContext.SaveChanges();

                    dbTransaction.Commit();
                }
                catch (DbEntityValidationException ex)
                {
                    dbTransaction.Rollback();
                    string entityValidationError = GetEntityValidationErrorMessage(ex);
                    throw new Exception(entityValidationError);
                }
            }
        }
 public decimal VerificarSaldo(OrdenSaldo saldo)
 {
     throw new NotImplementedException();
 }
        public async Task InsertarCompra(Orden orden)
        {
            using (var dbTransaction = _applicationDbContext.Database.BeginTransaction())
            {
                try
                {
                    List <int>  bienServList = orden.OrdenItem.Select(x => x.BienServicioId).ToList();
                    string      mes          = orden.FechaOrden.Month.ToString(new string(DigitosConstante.CERO[0], 2));
                    MesContable mesContable  = await _applicationDbContext.MesContable.Where(x => x.Codigo == mes).FirstOrDefaultAsync();


                    foreach (int item in bienServList)
                    {
                        OrdenSaldo ordenSaldo = await _applicationDbContext.OrdenSaldo
                                                .Where(x => x.BienServicioId == item &&
                                                       x.AlmacenId == orden.AlmacenId &&
                                                       x.PeriodoEmpresaId == orden.PeriodoEmpresaId).FirstOrDefaultAsync();

                        if (ordenSaldo == null)
                        {
                            foreach (var ordenItem in orden.OrdenItem)
                            {
                                if (item.Equals(ordenItem.BienServicioId))
                                {
                                    var ordeSaldo = new OrdenSaldo
                                    {
                                        AlmacenId        = orden.AlmacenId,
                                        MesContableId    = mesContable.MesContableId,
                                        PeriodoEmpresaId = orden.PeriodoEmpresaId,
                                        BienServicioId   = ordenItem.BienServicioId
                                    };

                                    ordeSaldo.CantidadIngreso += ordenItem.Cantidad;
                                    ordeSaldo.ValorIngreso    += ordenItem.Cantidad * ordenItem.ValorUnitario;
                                    ordeSaldo.MontoSaldo      += ordenItem.Cantidad * ordenItem.ValorUnitario;
                                    ordeSaldo.CantidadReserva += ordenItem.Cantidad;

                                    _applicationDbContext.OrdenSaldo.Add(ordeSaldo);
                                    await _applicationDbContext.SaveChangesAsync();

                                    break;
                                }
                            }
                        }
                        else
                        {
                            foreach (var ordenItem in orden.OrdenItem)
                            {
                                if (ordenItem.BienServicioId.Equals(ordenSaldo.BienServicioId))
                                {
                                    _applicationDbContext.OrdenSaldo.Where(x => x.BienServicioId == item && x.AlmacenId == orden.AlmacenId &&
                                                                           x.PeriodoEmpresaId == orden.PeriodoEmpresaId).ToList().ForEach(x =>
                                    {
                                        x.CantidadIngreso += ordenItem.Cantidad;
                                        x.ValorIngreso     = ordenItem.Cantidad * ordenItem.ValorUnitario;
                                    });
                                    await _applicationDbContext.SaveChangesAsync();

                                    break;
                                }
                            }
                        }
                    }

                    _applicationDbContext.OrdenItem.AddRange(orden.OrdenItem);

                    decimal impuesto = ParametrosSistema.VALOR_IMPUESTO / 100;

                    orden.Cantidad      = orden.OrdenItem.Sum(x => x.Cantidad);
                    orden.SubTotal      = orden.OrdenItem.Sum(x => x.ValorUnitario) * orden.Cantidad;
                    orden.Impuesto      = orden.SubTotal * impuesto;
                    orden.TotalPedido   = orden.SubTotal + orden.Impuesto;
                    orden.MesContableId = mesContable.MesContableId;
                    _applicationDbContext.Orden.Add(orden);
                    await _applicationDbContext.SaveChangesAsync();

                    dbTransaction.Commit();
                }
                catch (DbEntityValidationException ex)
                {
                    dbTransaction.Rollback();
                    string entityValidationError = GetEntityValidationErrorMessage(ex);
                    throw new Exception(entityValidationError);
                }
            }
        }