Beispiel #1
0
        public InventariosSaldos LlenarObjetoInventartiosSaldos(MovimientosES item, Detalles_ES mov, List <Articulo> ArticuloCompletoServer, List <InventariosSaldos> InventariosSaldosCompletoServer)
        {
            ////////////////////////////////////PARA LA TABLA SALDOS//////////////////////////////////////////////////////
            try
            {
                InventariosSaldos Saldo       = new InventariosSaldos();
                InventariosSaldos SaldoActual = new InventariosSaldos();

                mov.Articulo = ArticuloCompletoServer.Find(b => b._id == mov.Articulo._id);
                SaldoActual  = InventariosSaldosCompletoServer.Find(b => b.ArticuloId == mov.Articulo._id && b.AlmacenId == item.Almacen._id && b.Ano == item.Fecha.Year && b.Mes == item.Fecha.Month);

                if (SaldoActual == null)
                {//SI ES UN NUEVO  REGITRO EN LA TABLA INVENTARIOS SALDOS, ES UNO POR CADA MES DEL AÑO EN LA COMBINACION ARTICULO ALMACEN
                    Saldo.ArticuloId = mov.Articulo._id;
                    Saldo.AlmacenId  = item.Almacen._id;
                    Saldo.Ano        = item.Fecha.Year;
                    Saldo.Mes        = item.Fecha.Month;
                    Saldo.UltimoDia  = item.Fecha.Day;


                    if (item.Concepto.Naturaleza == "ENTRADA")
                    {
                        Saldo.EntradaUnidades = mov.Cantidad;
                        Saldo.EntradasCosto   = mov.Costo * mov.Cantidad;
                    }
                    else if (item.Concepto.Naturaleza == "SALIDA")
                    {
                        Saldo.SalidasUnidades = mov.Cantidad;
                        Saldo.SalidasCosto    = mov.Costo * mov.Cantidad;
                    }

                    return(Saldo);
                }
                else
                {
                    if (item.Fecha.Day > SaldoActual.UltimoDia)
                    {
                        SaldoActual.UltimoDia = item.Fecha.Day;
                    }



                    if (item.Concepto.Naturaleza == "ENTRADA")
                    {
                        SaldoActual.EntradaUnidades += mov.Cantidad;
                        SaldoActual.EntradasCosto   += mov.Costo * mov.Cantidad;
                    }
                    else if (item.Concepto.Naturaleza == "SALIDA")
                    {
                        SaldoActual.SalidasUnidades += mov.Cantidad;
                        SaldoActual.SalidasCosto    += mov.Costo * mov.Cantidad;
                    }
                    return(SaldoActual);
                }
            }
            catch (Exception ex)
            {
                throw;
            }
        }
Beispiel #2
0
        public MovimientosES EntradaInventario(string desc, string concepto, PuntoVenta_Documento item, EmpresaContext db)
        {
            try
            {
                MovimientosES documentoentrada = new MovimientosES();
                documentoentrada.Concepto       = db.Concepto.get(concepto, db); ////Concepto de entrada por devolución
                documentoentrada.Almacen        = item.Almacen;
                documentoentrada.Fecha          = DateTime.Now;
                documentoentrada.Descripcion    = desc + item.Folio;
                documentoentrada.Sistema_Origen = "DEV";
                documentoentrada.Cancelado      = "NO";


                //Separo la fecha del doumento en dia mes y año
                documentoentrada.Dia = documentoentrada.Fecha.Day;
                documentoentrada.Mes = documentoentrada.Fecha.Month;
                documentoentrada.Ano = documentoentrada.Fecha.Year;

                foreach (PuntoVtaDet detalle in item.PuntoVtaDet)
                {
                    //Se crea el articulo dentro del documento de salida
                    documentoentrada.Detalles_ES.Add(new Detalles_ES
                    {
                        Articulo = detalle.Articulo,
                        Cantidad = Math.Abs((double)detalle.Cantidad),
                        Clave    = detalle.Articulo.Clave,
                    });
                }
                return(documentoentrada);
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #3
0
        public MovimientosES SalidaInventario(MovimientosES documentosalida, PuntoVenta_Documento item, EmpresaContext db)
        {
            try
            {
                documentosalida.Cancelado = "NO";

                //Separo la fecha del doumento en dia mes y año
                documentosalida.Dia = item.Fecha.Day;
                documentosalida.Mes = item.Fecha.Month;
                documentosalida.Ano = item.Fecha.Year;

                foreach (PuntoVtaDet detalle in item.PuntoVtaDet)
                {
                    //Se crea el articulo dentro del documento de salida
                    documentosalida.Detalles_ES.Add(new Detalles_ES
                    {
                        Articulo = detalle.Articulo,
                        Cantidad = Math.Abs((double)detalle.Cantidad),
                        Clave    = detalle.Articulo.Clave,
                    });
                }
                return(documentosalida);
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #4
0
        //Funciones de ayuda
        public PuntoVenta_Documento CrearInventarioEntrada(string desc, string concepto, string estado, PuntoVenta_Documento item, EmpresaContext db, IClientSessionHandle session = null)
        {
            try
            {
                PuntoVenta_Documento venta = db.PuntoVenta_Documento.get(item._id, db);

                if (venta.Estatus == "CANCELADOE" || venta.Estatus == "CANCELADO" || venta.Estatus == "DEVOLUCION")
                {
                    return(null);
                }

                /*Entrada de inventario*/
                MovimientosES documentoentrada = EntradaInventario(desc, concepto, venta, db);
                WcfErp.Servicios.Inventarios.Inventarios inv = new WcfErp.Servicios.Inventarios.Inventarios();

                venta.Estatus = estado;
                inv.add(documentoentrada, db, session);
                db.PuntoVenta_Documento.update(venta, venta._id, db, session);
                return(venta);
            }
            catch (Exception ex)
            {
                Error(ex, "");
                return(null);
            }
        }
Beispiel #5
0
 public void InventarioNormal(InventarioFisicoDetalle detalle, MovimientosES documentoEntrada, MovimientosES documentoSalida, EmpresaContext db)
 {
     try
     {
         if (detalle.Diferencia < 0.0) //Entrada
         {
             documentoEntrada.Detalles_ES.Add(new Detalles_ES
             {
                 Articulo = detalle.Articulo,
                 Cantidad = Math.Abs((double)detalle.Diferencia),
                 Clave    = detalle.Articulo.Clave,
             });
         }
         else if (detalle.Diferencia > 0.0) //Salida
         {
             documentoSalida.Detalles_ES.Add(new Detalles_ES
             {
                 Articulo = detalle.Articulo,
                 Cantidad = Math.Abs((double)detalle.Diferencia),
                 Clave    = detalle.Articulo.Clave,
             });
         }
     }
     catch (Exception)
     {
         throw;
     }
 }
Beispiel #6
0
        public KardexArticulos saldoInicial(KardexArticulos articulo, DateTime FechaInicio, List <InventariosSaldos> InventariosSaldosCompletoServer, MovimientosES mov, Detalles_ES detalle, int dia, int mes, int ano, EmpresaContext db)
        {
            try
            {
                //Se declaro asi por un conflico de nombre
                Servicios.Inventarios.Inventarios inventario = new Servicios.Inventarios.Inventarios();

                articulo.Almacen  = mov.Almacen;
                articulo.Folio    = "";
                articulo.Concepto = new Concepto
                {
                    Nombre = "SI - SALDO INICIAL"
                };

                //Caracteristicas del articulo
                articulo.Articulo           = detalle.Articulo;
                articulo.SubgrupoComponente = detalle.Articulo.SubGrupoComponente;
                articulo.GrupoComponente    = detalle.Articulo.SubGrupoComponente.GrupoComponente;

                ExistenciaValorInventario existencia = inventario.ExistenciaArticulo(detalle.Articulo._id, articulo.Almacen.id, FechaInicio, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db);

                articulo.EntradaUnidad        = existencia.Existencia;
                articulo.EntradaCostoUnitario = 0.0;
                articulo.EntradaCostoTotal    = existencia.CostoUnitario * existencia.Existencia;

                articulo.ExistenciaUnidades   = existencia.Existencia;
                articulo.ExistenciaCostoTotal = articulo.EntradaCostoTotal;

                return(articulo);
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #7
0
        public InventariosCostos LlenarObjetoInventartiosCostos(MovimientosES item, Detalles_ES mov, List <Articulo> ArticuloCompletoServer, List <InventariosCostos> InventariosCostosCompletoServer)
        {
            ////////////////////////////////////PARA LA TABLA INVENTARIOSCOSTOS/////////////////////////////////////////////
            /*------------------- PROMEDIO PONDERADO------------------------*/

            InventariosCostos Costo       = new InventariosCostos();
            InventariosCostos CostoActual = new InventariosCostos();

            mov.Articulo     = ArticuloCompletoServer.Find(b => b._id == mov.Articulo._id);
            CostoActual      = InventariosCostosCompletoServer.Find(b => b.ArticuloId == mov.Articulo._id && b.AlmacenId == item.Almacen._id);
            Costo.ArticuloId = mov.Articulo._id;
            Costo.AlmacenId  = item.Almacen._id;
            Costo.Fecha      = item.Fecha;

            if (CostoActual == null)                           // SI ES LA PRIMERA ENTRADA X ARTICULO  Y ALMACEN,SI ES UN NUEVO  REGITRO EN LA TABLA INVENTARIOS COSTOS,
            {
                if (item.Concepto.Naturaleza == "ENTRADA")     //Revisar si es un documento de entrada o de salida
                {
                    if (item.Concepto.CostoAutomatico == "NO") // SI NO ES COSTO AUTOMATICO: ya que es la primera entrada de costo se multiplica la cantidad de entrada del articulo * el costo que viene desde el cliente
                    {
                        mov.CostoTotal   = mov.Cantidad * mov.Costo;
                        Costo.ValorTotal = mov.CostoTotal;
                    }
                    else if (item.Concepto.CostoAutomatico == "SI") // SI ES COSTO AUTOMATICO:  YA QUE ES LA PRIMERA ENTRADA SE LE ASIGNA 0.00 YA QUE NO HAY REGISTRO DE COSTOS
                    {
                        mov.CostoTotal   = 0.00;
                        Costo.ValorTotal = mov.CostoTotal;
                    }
                    Costo.Existencia = mov.Cantidad;
                }
                else if (item.Concepto.Naturaleza == "SALIDA")
                {
                    if (item.Concepto.CostoAutomatico == "NO") // SI NO ES COSTO AUTOMATICO: ya que es la primera entrada de costo se multiplica la cantidad de entrada del articulo * el costo que viene desde el cliente
                    {
                        mov.CostoTotal    = mov.Cantidad * mov.Costo;
                        Costo.ValorTotal -= mov.CostoTotal;
                    }
                    else if (item.Concepto.CostoAutomatico == "SI") // SI ES COSTO AUTOMATICO:  YA QUE ES LA PRIMERA ENTRADA SE LE ASIGNA 0.00 YA QUE NO HAY REGISTRO DE COSTOS
                    {
                        mov.CostoTotal    = 0.00;
                        Costo.ValorTotal -= mov.CostoTotal;
                    }
                    Costo.Existencia -= mov.Cantidad;
                }
                Costo.CapaAgotada = Costo.Existencia <= 0 ? "SI" : "NO";

                return(Costo);
            }
            else     // EN CASO DE QUE NO SEA EL PRIMER MOVIMIENTO EN LA TABLA INVENTARIOSCOSTOS
            {
                if (item.Concepto.Naturaleza == "ENTRADA")
                {
                    if (item.Concepto.CostoAutomatico == "SI")// SI ES COSTO AUTOMATICO
                    {
                        mov.CostoTotal         = CostoActual.ValorTotal > 0 ? (CostoActual.ValorTotal / CostoActual.Existencia) * mov.Cantidad : 0.00;
                        mov.Costo              = CostoActual.ValorTotal > 0 ? (CostoActual.ValorTotal / CostoActual.Existencia) : 0.00;
                        CostoActual.Existencia = CostoActual.Existencia + mov.Cantidad;
                        CostoActual.ValorTotal = CostoActual.ValorTotal + mov.CostoTotal;
                    }
                    else if (item.Concepto.CostoAutomatico == "NO")
                    {
                        mov.CostoTotal         = mov.Cantidad * mov.Costo;
                        CostoActual.Existencia = CostoActual.Existencia + mov.Cantidad;
                        CostoActual.ValorTotal = CostoActual.ValorTotal + mov.CostoTotal;
                    }


                    CostoActual.CapaAgotada = CostoActual.Existencia <= 0 ? "SI" : "NO";
                }
                else if (item.Concepto.Naturaleza == "SALIDA")
                {
                    if (item.Concepto.CostoAutomatico == "SI")                                                                                         // SI ES COSTO AUTOMATICO
                    {
                        mov.CostoTotal         = CostoActual.Existencia > 0 ? (CostoActual.ValorTotal / CostoActual.Existencia) * mov.Cantidad : 0.00; //SI EL VALOR TOTAL DE LA CAPA
                        mov.Costo              = CostoActual.Existencia > 0 ? (CostoActual.ValorTotal / CostoActual.Existencia) : 0.00;
                        CostoActual.Existencia = CostoActual.Existencia > 0 ? CostoActual.Existencia - mov.Cantidad : 0.00;
                        CostoActual.ValorTotal = CostoActual.Existencia > 0 ? CostoActual.ValorTotal - mov.CostoTotal : 0.00;
                    }
                    else if (item.Concepto.CostoAutomatico == "NO")
                    {
                        mov.CostoTotal         = mov.Cantidad * mov.Costo;
                        CostoActual.Existencia = CostoActual.Existencia - mov.Cantidad;
                        CostoActual.ValorTotal = CostoActual.ValorTotal - mov.CostoTotal;
                    }



                    CostoActual.CapaAgotada = CostoActual.Existencia <= 0 ? "SI" : "NO";
                }
                return(CostoActual);
            }
        }
Beispiel #8
0
        public MovimientosES add(MovimientosES item, EmpresaContext db, IClientSessionHandle session = null)
        {
            try
            {
                item.Concepto = db.Concepto.getbyFields(item.Concepto.id, "_id,Clave,Nombre,Naturaleza,CostoAutomatico,FolioAutomatico", db);
                item.Almacen  = db.Almacen.getbyFields(item.Almacen.id, "_id,Nombre", db);

                if (item.Concepto.FolioAutomatico == "SI")
                {
                    if (item.Concepto.Clave == null)
                    {
                        throw new Exception("El concepto seleccionado no tiene una clave asignada");
                    }

                    item.Folio = AutoIncrement(item.Concepto.Clave, db.db, session).ToString();
                }


                //Genera filtros para busqueda
                var builderSaldos = Builders <InventariosSaldos> .Filter;
                var builderCostos = Builders <InventariosCostos> .Filter;

                var Ids    = (from an in item.Detalles_ES select an.Articulo).ToList().Select(ab => ab._id); //recolectamos en una lista los ids que nos manda el cliente
                var filter = Builders <Articulo> .Filter.In(myClass => myClass._id, Ids);                    //creamos un filtro con la clapsula In

                //Realizamos una sola query a la bd obteniendo solo datos necesarios (en este caso solo el nombre,id y unidad de inventario) para hacerla lo mas liviana
                List <Articulo> ArticuloCompletoServer = db.Articulo.Filters(filter, "Nombre,Clave,UnidadInventario.Abreviatura,SubGrupoComponente");

                List <InventariosSaldos> InventariosSaldosCompletoServer = db.InventariosSaldos.Filters(builderSaldos.In("ArticuloId", Ids) & builderSaldos.Eq("AlmacenId", item.Almacen._id));
                List <InventariosCostos> InventariosCostosCompletoServer = db.InventariosCostos.Filters(builderCostos.In("ArticuloId", Ids) & builderCostos.Eq("AlmacenId", item.Almacen._id));

                item.Sistema_Origen = "IN";
                item.Cancelado      = "NO";
                item.Fecha          = item.Fecha.Date < DateTime.Now.Date ? item.Fecha.AddHours(DateTime.Now.Hour).AddMinutes(DateTime.Now.Minute).AddSeconds(DateTime.Now.Second) : item.Fecha;
                item.Ano            = item.Fecha.Year;
                item.Mes            = item.Fecha.Month;
                item.Dia            = item.Fecha.Day;

                var updatesSaldos = new List <WriteModel <InventariosSaldos> >();
                var updatesCostos = new List <WriteModel <InventariosCostos> >();

                item.ValidarModel(item); //Revisar reglas de validacion para el documento

                foreach (Detalles_ES mov in item.Detalles_ES)
                {
                    mov.Articulo = ArticuloCompletoServer.Find(b => b._id == mov.Articulo._id);

                    //PRIMERO SE SE LLENA LA COLECCION INVENTARIOS COSTOS ANTES QUE INVENTARIOS SALDOS.
                    InventariosCostos invcosto = LlenarObjetoInventartiosCostos(item, mov, ArticuloCompletoServer, InventariosCostosCompletoServer);
                    InventariosSaldos invsaldo = LlenarObjetoInventartiosSaldos(item, mov, ArticuloCompletoServer, InventariosSaldosCompletoServer);

                    var filtercostos = Builders <InventariosCostos> .Filter.Eq(s => s._id, invcosto._id);

                    var filtersaldos = Builders <InventariosSaldos> .Filter.Eq(s => s._id, invsaldo._id);

                    if (!(invcosto._id == null || invcosto._id == ""))
                    {
                        updatesCostos.Add(new ReplaceOneModel <InventariosCostos>(filtercostos, invcosto)
                        {
                            IsUpsert = true
                        });
                    }
                    else
                    {
                        updatesCostos.Add(new InsertOneModel <InventariosCostos>(invcosto));
                    }

                    //si  no existe un registro en la coleccion inventarios saldos de la combinacion articulo almacen crea uno nuevo de lo contrario hace un update al existente
                    if (!(invsaldo._id == null || invsaldo._id == ""))
                    {
                        updatesSaldos.Add(new ReplaceOneModel <InventariosSaldos>(filtersaldos, invsaldo)
                        {
                            IsUpsert = true
                        });
                    }
                    else
                    {
                        updatesSaldos.Add(new InsertOneModel <InventariosSaldos>(invsaldo));
                    }
                }

                db.InventariosCostos.updateMany(updatesCostos, db, session);
                db.InventariosSaldos.updateMany(updatesSaldos, db, session);

                db.MovimientosES.add(item, db, session);

                // SI ES UN TRASPASO DE SALIDA VOLVEMOS A LLAMAR EL METODO ADD PARA DAR ENTRADA AL ALMACEN DE DESTINO
                if (item.Concepto._id == "5c59c84f6886742388d9bbcc")
                {
                    item.Almacen_Destino = db.Almacen.getbyFields(item.Almacen_Destino._id, "_id,Nombre", db);

                    item._id             = null;
                    item.Concepto._id    = "5c59d6c16886742450e4527f";
                    item.Almacen._id     = item.Almacen_Destino._id;
                    item.Almacen_Destino = item.Almacen;
                    add(item, db, session);
                }


                return(item);
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #9
0
        //creación de la cancelación
        public List <PuntoVenta_Documento> CrearCancelacionMerma(ListaPuntoVenta_Documento lista)
        {
            try
            {
                List <PuntoVenta_Documento> items = lista.PuntoVenta_Documentos;
                if (items.Count == 0)
                {
                    throw new Exception("Se debe de seleccionar al menos una venta.");
                }
                string         vtaCan = "";
                EmpresaContext db     = new EmpresaContext();
                using (var session = db.client.StartSession())
                {
                    session.StartTransaction();
                    //CREACIÓN DEL DOCUMENTO DE SALIDA

                    //crear inventario de salida
                    MovimientosES documentosalida = new MovimientosES();
                    documentosalida.Concepto       = db.Concepto.get(ConceptoRandom(), db); ////Concepto de salida por venta de mostrador
                    documentosalida.Descripcion    = "Salida de inventario por " + documentosalida.Concepto.Nombre;
                    documentosalida.Sistema_Origen = "CAN";
                    documentosalida.Cancelado      = "NO";
                    documentosalida.Almacen        = db.Almacen.get("5c93c7917d7b3011b8ea951e", db); //PREGUNTAR POR ALMACEN
                    documentosalida.Fecha          = DateTime.Now;

                    foreach (PuntoVenta_Documento item in items)
                    {
                        //ENTRADA DE LOS ARTICULOS DE LOS TICKETS CANCELADOS
                        PuntoVenta_Documento venta = db.PuntoVenta_Documento.get(item._id, db);
                        venta = CrearInventarioEntrada("Entrada de inventario por cancelación de venta de mostrador con el Folio ", "5dfd238d2938b553f0198f2d", "CANCELADOE", venta, db, session);
                        if (venta == null)
                        {
                            vtaCan = item.Folio + ",";
                        }
                        else
                        {
                            //documentosalida = SalidaInventario(documentosalida, venta, db);
                            foreach (PuntoVtaDet detalle in venta.PuntoVtaDet)
                            {
                                //Se crea el articulo dentro del documento de salida
                                documentosalida.Detalles_ES.Add(new Detalles_ES
                                {
                                    Articulo = detalle.Articulo,
                                    Cantidad = Math.Abs((double)detalle.Cantidad),
                                    Clave    = detalle.Articulo.Clave,
                                });
                            }
                        }
                    }

                    documentosalida.Cancelado = "NO";

                    //Separo la fecha del doumento en dia mes y año
                    DateTime fecha = DateTime.Now;
                    documentosalida.Dia = documentosalida.Fecha.Day;
                    documentosalida.Mes = documentosalida.Fecha.Month;
                    documentosalida.Ano = documentosalida.Fecha.Year;

                    //documentos de salida e inventario de salida - guardado
                    WcfErp.Servicios.Inventarios.Inventarios inv = new WcfErp.Servicios.Inventarios.Inventarios();
                    inv.add(documentosalida, db, session);
                    session.CommitTransaction();
                }

                if (vtaCan != "")
                {
                    throw new Exception("Las ventas con los siguientes folios no se pudieron cancelar ya que ya se encuntran canceladas: " + vtaCan.Remove(vtaCan.Length - 1));
                }
                return(items);
            }
            catch (Exception ex)
            {
                Error(ex, "");
                return(null);
            }
        }
Beispiel #10
0
        //agrega una compra
        public override PuntoVenta_Documento add(PuntoVenta_Documento item)
        {
            try
            {
                EmpresaContext db = new EmpresaContext();

                using (var session = db.client.StartSession())
                {
                    session.StartTransaction();

                    item.Folio = AutoIncrement("Ticket", db.db, session).ToString();


                    /*Colocar el tipo de cambio dependiendo de la moneda*/
                    var builder = Builders <TipodeCambio> .Sort;
                    var filter  = builder.Descending("Fecha");

                    List <TipodeCambio> Lst_Tipos = db.TipodeCambio.Filters(filter);
                    String monedaAnterior         = "";
                    foreach (PuntoVtaCobros cobro in item.PuntoVtaCobros)
                    {
                        Boolean entro  = false;
                        String  moneda = "MXN";
                        if (cobro.Tipo.Contains("DLS"))
                        {
                            moneda = "DLS";
                        }
                        foreach (TipodeCambio cambio in Lst_Tipos)
                        {
                            if (monedaAnterior != moneda)
                            {
                                entro = false;
                            }

                            if (cambio.Moneda.Simbolo == moneda && entro == false)
                            {
                                cobro.TipodeCambio = cambio;
                                entro          = true;
                                monedaAnterior = moneda;
                            }
                        }
                    }

                    /*Salida de inventario*/
                    MovimientosES documentosalida = new MovimientosES();
                    documentosalida.Concepto       = db.Concepto.get("5d4cbb5d92a3d9c568660d2a", db); ////Concepto de salida por venta de mostrador
                    documentosalida.Descripcion    = "Salida de inventario de venta de mostrador con el Folio " + item.Folio;
                    documentosalida.Sistema_Origen = "PV";
                    documentosalida.Cancelado      = "NO";
                    documentosalida.Almacen        = item.Almacen;
                    documentosalida.Fecha          = item.Fecha;

                    documentosalida = SalidaInventario(documentosalida, item, db);

                    WcfErp.Servicios.Inventarios.Inventarios inv = new WcfErp.Servicios.Inventarios.Inventarios();

                    inv.add(documentosalida, db, session);
                    db.PuntoVenta_Documento.add(item, db, session);

                    session.CommitTransaction();
                }

                return(item);
            }
            catch (Exception ex)
            {
                Error(ex, "");
                return(null);
            }
        }
Beispiel #11
0
        public string aplicarInventario(string id)
        {
            try
            {
                EmpresaContext db = new EmpresaContext();

                using (var session = db.client.StartSession())
                {
                    session.StartTransaction();

                    InventarioFisico DocumentoInventario = db.InventarioFisico.get(id, db);

                    if (DocumentoInventario.Estado == "APLICADO")
                    {
                        throw new Exception("Esta toma de inventario ya se encuentra aplicada,no es posible continuar");
                    }


                    MovimientosES documentoentrada = new MovimientosES();
                    documentoentrada.Concepto       = db.Concepto.get("5d19676ba9c67230a05ebe7b", db); ////Concepto de entrada por toma de inventatario fisico
                    documentoentrada.Almacen        = DocumentoInventario.Almacen;
                    documentoentrada.Fecha          = DocumentoInventario.Fecha;
                    documentoentrada.Descripcion    = "Toma de inventario con el Folio" + DocumentoInventario.Folio;
                    documentoentrada.Sistema_Origen = "IF";
                    documentoentrada.Cancelado      = "NO";

                    MovimientosES documentosalida = new MovimientosES();
                    documentosalida.Concepto       = db.Concepto.get("5d196788a9c67230a05ebe7c", db); ////Concepto de entrada por toma de inventatario fisico
                    documentosalida.Almacen        = DocumentoInventario.Almacen;
                    documentosalida.Fecha          = DocumentoInventario.Fecha;
                    documentosalida.Descripcion    = "Toma de inventario con el Folio " + DocumentoInventario.Folio;
                    documentosalida.Sistema_Origen = "IF";
                    documentosalida.Cancelado      = "NO";

                    Inventarios inv = new Inventarios();

                    //Separo la fecha del doumento en dia mes y año
                    int dia = DocumentoInventario.Fecha.Day;
                    int mes = DocumentoInventario.Fecha.Month;
                    int ano = DocumentoInventario.Fecha.Year;

                    //Recolectamos en una lista los ids que nos manda el cliente
                    var Ids = (from an in DocumentoInventario.InventarioFisicoDetalle select an.Articulo._id).ToList();

                    //Selecciono los articulos que no estan incluido en el invetario fisico
                    //var filtroArticulos = Builders<Articulo>.Filter.Nin("_id", Ids);
                    //List<Articulo> LstArticulosNoIncluidos = db.Articulo.find(filtroArticulos, "_id,Nombre,Clave,UnidadInventario", db);

                    //Genero el detalle para los articulso que no se encuntran

                    /*foreach(Articulo art in LstArticulosNoIncluidos)
                     * {
                     *  DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle
                     *  {
                     *      ExistenciaFisica = 0,
                     *      Articulo = art
                     *  });
                     * }*/

                    //var builderSaldos = Builders<InventariosSaldos>.Filter.In("ArticuloId", Ids) & Builders<InventariosSaldos>.Filter.Eq("AlmacenId", DocumentoInventario.Almacen._id);
                    var builderSaldos = Builders <InventariosSaldos> .Filter.Eq("AlmacenId", DocumentoInventario.Almacen._id);

                    List <InventariosSaldos> InventariosSaldosCompletoServer = db.InventariosSaldos.find(builderSaldos, db);

                    //var List = InventariosSaldosCompletoServer.GroupBy(a => a.ArticuloId).Select(a => a.ToList().First()).ToList();

                    foreach (InventariosSaldos saldo in InventariosSaldosCompletoServer.GroupBy(a => a.ArticuloId).Select(a => a.ToList().First()).ToList())
                    {
                        bool ArticuloIncluido           = true; //Controla si articulo venia capturado por el usuario
                        InventarioFisicoDetalle detalle = DocumentoInventario.InventarioFisicoDetalle.Where(a => a.Articulo._id == saldo.ArticuloId).SingleOrDefault();

                        if (detalle == null)
                        {
                            ArticuloIncluido     = false;
                            detalle              = new InventarioFisicoDetalle();
                            detalle.Articulo     = new Articulo();
                            detalle.Articulo._id = saldo.ArticuloId;
                        }

                        ExistenciaValorInventario exitencia = inv.ExistenciaArticulo(detalle.Articulo._id, DocumentoInventario.Almacen.id, DocumentoInventario.Fecha, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db);
                        detalle.ExistenciaTeorica = exitencia.Existencia;

                        if (detalle.ExistenciaTeorica != 0.0 && detalle.ExistenciaFisica != 0)
                        {
                            if (ArticuloIncluido == false)
                            {
                                DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle
                                {
                                    ExistenciaFisica = 0,
                                    Articulo         = db.Articulo.get(detalle.Articulo._id, "_id,Clave,Nombre,UnidadInventario", db)
                                });
                            }

                            detalle.Diferencia = detalle.ExistenciaTeorica - detalle.ExistenciaFisica;

                            //Falta agregar el tipo de seguimiento al articulo
                            InventarioNormal(detalle, documentoentrada, documentosalida, db);
                        }
                    }

                    /*foreach (InventarioFisicoDetalle detalle in DocumentoInventario.InventarioFisicoDetalle)
                     * {
                     *  ExistenciaValorInventario exitencia = inv.ExistenciaArticulo(detalle.Articulo._id, DocumentoInventario.Almacen.id, DocumentoInventario.Fecha, InventariosSaldosCompletoServer, detalle.Articulo, dia, mes, ano, db);
                     *  detalle.ExistenciaTeorica = exitencia.Existencia;
                     *
                     *  if(detalle.ExistenciaTeorica != 0.0)
                     *  {
                     *      detalle.Diferencia = detalle.ExistenciaTeorica - detalle.ExistenciaFisica;
                     *      DocumentoInventario.InventarioFisicoDetalle.Add(new InventarioFisicoDetalle
                     *      {
                     *          ExistenciaFisica = 0,
                     *          Articulo = exitencia.Articulo
                     *      });
                     *  }
                     *
                     *  //Falta agregar el tipo de seguimiento al articulo
                     *  InventarioNormal(detalle, documentoentrada, documentosalida, db);
                     * }*/

                    if (documentoentrada.Detalles_ES.Count > 0)
                    {
                        inv.add(documentoentrada, db, session);
                    }
                    if (documentosalida.Detalles_ES.Count > 0)
                    {
                        inv.add(documentosalida, db, session);
                    }

                    DocumentoInventario.Estado = "APLICADO";
                    DocumentoInventario.FechaHoraAplicacion = DateTime.Now;

                    db.InventarioFisico.update(DocumentoInventario, DocumentoInventario._id, db, session);

                    session.CommitTransaction();
                }

                return("");
            }
            catch (Exception ex)
            {
                Error(ex, "");
                return(null);
            }
        }