示例#1
0
        public static ResAcc RecibirTraspaso(int iUsuarioID, string sMotivo, List <modDetalleTraspaso> oDetalle, bool bValidarContingencia)
        {
            if (oDetalle.Count <= 0)
            {
                return(new ResAcc("No hay nada que recibir."));
            }

            // Validar que lo recibido sea menor o igual que lo enviado
            foreach (var oReg in oDetalle)
            {
                if (oReg.Recibido > oReg.Cantidad)
                {
                    return(new ResAcc("Existen uno o más artículos que tienen una cantidad recibida mayor a lo enviado."));
                }
            }

            // Se verifica si existe alguna contingencia
            bool bExisteContingencia = false;

            foreach (var oReg in oDetalle)
            {
                if (oReg.Recibido < oReg.Cantidad)
                {
                    bExisteContingencia = true;
                    break;
                }
            }

            if (bExisteContingencia && bValidarContingencia)
            {
                return(new ResAcc("El traspaso tiene uno o más conflictos.", Cat.CodigosRes.ConflictoEnTraspasos));
            }

            // Se valida el motivo, en caso de que haya habido contingencia
            if (bExisteContingencia && string.IsNullOrEmpty(sMotivo))
            {
                return(new ResAcc("Debes especificar un motivo."));
            }

            // Se obtiene el MovimientoInventario correspondiente al traspaso
            int iRecibirUnoID = oDetalle[0].MovimientoInventarioDetalleID;
            var oRecibirUno   = Datos.GetEntity <MovimientoInventarioDetalle>(c => c.MovimientoInventarioDetalleID == iRecibirUnoID && c.Estatus);
            int iMovID        = oRecibirUno.MovimientoInventarioID;
            var oTraspasoV    = Datos.GetEntity <MovimientoInventarioView>(c => c.MovimientoInventarioID == iMovID);
            int iSucursalID   = oTraspasoV.SucursalDestinoID.Valor();

            //
            decimal mCostoTotal = 0;

            foreach (var oReg in oDetalle)
            {
                // Si la cantidad recibida es menor a lo enviado, almacenar la contingencia
                if (oReg.Recibido < oReg.Cantidad)
                {
                    var contingencia = new MovimientoInventarioTraspasoContingencia()
                    {
                        MovimientoInventarioID        = iMovID,
                        MovimientoInventarioDetalleID = oReg.MovimientoInventarioDetalleID,
                        ParteID            = oReg.ParteID,
                        CantidadEnviada    = oReg.Cantidad,
                        CantidadRecibida   = oReg.Recibido,
                        CantidadDiferencia = (oReg.Cantidad - oReg.Recibido),
                        Comentario         = sMotivo,
                        UsuarioID          = iUsuarioID,
                        MovimientoInventarioEstatusContingenciaID = Cat.TraspasoEstatusContingencias.NoSolucionado
                    };
                    Datos.Guardar <MovimientoInventarioTraspasoContingencia>(contingencia);
                }

                //Aumentar la existencia actual de la sucursal destino
                var oParte = Datos.GetEntity <Parte>(c => c.ParteID == oReg.ParteID && c.Estatus);
                if (!oParte.EsServicio.Valor())
                {
                    var existencia = Datos.GetEntity <ParteExistencia>(p => p.ParteID == oReg.ParteID && p.SucursalID == iSucursalID);
                    if (existencia != null)
                    {
                        var inicial = existencia.Existencia;
                        existencia.Existencia       += oReg.Recibido;
                        existencia.UsuarioID         = iUsuarioID;
                        existencia.FechaModificacion = DateTime.Now;
                        Datos.Guardar <ParteExistencia>(existencia);

                        var historial = new MovimientoInventarioHistorial()
                        {
                            MovmientoInventarioID = iMovID,
                            ParteID           = oReg.ParteID,
                            ExistenciaInicial = Util.Decimal(inicial),
                            ExistenciaFinal   = Util.Decimal(existencia.Existencia),
                            SucursalID        = iSucursalID,
                            UsuarioID         = iUsuarioID
                        };
                        Datos.Guardar <MovimientoInventarioHistorial>(historial);
                    }
                }

                // Se agrega al Kardex
                var oPartePrecio = Datos.GetEntity <PartePrecio>(c => c.ParteID == oReg.ParteID && c.Estatus);
                AdmonProc.RegistrarKardex(new ParteKardex()
                {
                    ParteID          = oReg.ParteID,
                    OperacionID      = Cat.OperacionesKardex.EntradaTraspaso,
                    SucursalID       = iSucursalID,
                    Folio            = iMovID.ToString(),
                    Fecha            = DateTime.Now,
                    RealizoUsuarioID = iUsuarioID,
                    Entidad          = Util.Cadena(oTraspasoV.NombreProveedor),
                    Origen           = oTraspasoV.SucursalOrigen,
                    Destino          = oTraspasoV.SucursalDestino,
                    Cantidad         = oReg.Recibido,
                    Importe          = oPartePrecio.Costo.Valor()
                });

                // Se suma el importe de cada parte, para crear la póliza
                mCostoTotal += oPartePrecio.Costo.Valor();
            }

            // Se genera la póliza especial correspondiente (AfeConta)
            var oUsuario = Datos.GetEntity <Usuario>(c => c.UsuarioID == iUsuarioID && c.Estatus);
            var oPoliza  = ContaProc.CrearPoliza(Cat.ContaTiposDePoliza.Diario, string.Format("TRASPASO ORIGEN {0:00} DESTINO {1:00}"
                                                                                              , oTraspasoV.SucursalOrigenID, oTraspasoV.SucursalDestinoID), Cat.ContaCuentasAuxiliares.Inventario, 0, mCostoTotal
                                                 , oUsuario.NombreUsuario, Cat.Tablas.MovimientoInventario, iMovID, iSucursalID);

            //Actualizar el movimiento con los datos (fecha y usuario que recibio)
            var movimiento = Datos.GetEntity <MovimientoInventario>(m => m.MovimientoInventarioID == iMovID);

            if (null != movimiento)
            {
                movimiento.ExisteContingencia       = bExisteContingencia;
                movimiento.UsuarioRecibioTraspasoID = iUsuarioID;
                movimiento.FechaRecepcion           = DateTime.Now;
                movimiento.FechaModificacion        = DateTime.Now;
                Datos.Guardar <MovimientoInventario>(movimiento);
            }

            return(new ResAcc());
        }
示例#2
0
        private void btnFinish_Click(object sender, EventArgs e)
        {
            try
            {
                if (!this.ValidarFinal())
                    return;

                int iAutorizoID = 0;
                var ResU = UtilLocal.ValidarObtenerUsuario(null, "Autorización");
                if (ResU.Exito)
                    iAutorizoID = ResU.Respuesta.UsuarioID;
                else
                {
                    Util.MensajeError("Error al validar el usuario.", GlobalClass.NombreApp);
                    return;
                }

                var res = Util.MensajePregunta("¿Está seguro de que la información es correcta?", GlobalClass.NombreApp);
                if (res == DialogResult.No)
                    return;

                SplashScreen.Show(new Splash());
                this.btnFinish.Enabled = false;

                var proveedorId = Util.Entero(this.cboProveedor.SelectedValue);
                var sucursalId = Util.Entero(this.cboUbicacionDestino.SelectedValue);
                var iva = 1 + (GlobalClass.ConfiguracionGlobal.IVA / 100);

                switch (Util.Entero(cboTipoOperacion.SelectedValue))
                {
                    case 1:

                        #region [ Entrada Compra ]

                        // Se valida que no se haya utilizado ese folio de factura
                        var folio = Datos.GetEntity<MovimientoInventario>(m => m.ProveedorID == proveedorId
                            && m.FolioFactura == this.txtFolioFactura.Text && m.Estatus.Equals(true));
                        if (folio != null)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            var msj = string.Format("{0} {1} {2}", "El Folio Factura", this.txtFolioFactura.Text, "Ya fue utilizado con el proveedor seleccionado.");
                            Util.MensajeError(msj, GlobalClass.NombreApp);
                            return;
                        }

                        //Insertar Movimiento
                        var subtotal = Util.Decimal(this.txtSubtotal.Text);
                        var importeTotal = Util.Decimal(this.lblTotal.Text);
                        var movimientoEntrada = new MovimientoInventario()
                        {
                            TipoOperacionID = Util.Entero(this.cboTipoOperacion.SelectedValue),
                            TipoPagoID = Util.Entero(this.cboTipoPago.SelectedValue),
                            ProveedorID = proveedorId,
                            SucursalOrigenID = Util.Entero(this.cboUbicacionOrigen.SelectedValue),
                            SucursalDestinoID = Util.Entero(this.cboUbicacionDestino.SelectedValue),
                            FechaFactura = this.dtpFechaFacturacion.Value,
                            FechaRecepcion = this.dtpFechaRecepcion.Value,
                            FolioFactura = this.txtFolioFactura.Text,
                            Subtotal = subtotal,
                            IVA = importeTotal - subtotal,
                            ImporteTotal = importeTotal,
                            FueLiquidado = false,
                            TipoConceptoOperacionID = null,
                            Observacion = this.txtObservaciones.Text,
                            Articulos = Util.Decimal(this.txtArticulos.Text),
                            Unidades = Util.Decimal(this.txtUnidades.Text),
                            Seguro = Util.Decimal(this.txtSeguro.Text),
                            ImporteTotalSinDescuento = Util.Decimal(this.lblTotalSinDescuento.Text),
                            ImporteFactura = Util.Decimal(this.lblImporteFactura.Text)
                        };
                        Datos.Guardar<MovimientoInventario>(movimientoEntrada);

                        if (movimientoEntrada.MovimientoInventarioID < 1)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            new EntityNotFoundException("MovimientoInventarioID", "MovimientoInventario");
                            return;
                        }

                        //Insertar MovimientoDetalle
                        foreach (DataGridViewRow row in this.dgvDetalleDescuentos.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["UNS"].Value);
                            var detalleMovimiento = new MovimientoInventarioDetalle()
                            {
                                MovimientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                ParteID = parteId,
                                Cantidad = cantidad,
                                PrecioUnitario = Util.Decimal(row.Cells["Unitario"].Value),
                                Importe = Util.Decimal(row.Cells["Importe"].Value),
                                FueDevolucion = false,
                                FechaRegistro = DateTime.Now,
                                Estatus = true
                            };
                            Datos.SaveOrUpdate<MovimientoInventarioDetalle>(detalleMovimiento);

                            // Se actualiza la existencia y el kardex
                            int iFilaDif = this.dgvDiferencia.EncontrarIndiceDeValor("ParteID", parteId);
                            AdmonProc.AfectarExistenciaYKardex(parteId, sucursalId, Cat.OperacionesKardex.EntradaCompra, movimientoEntrada.FolioFactura, iAutorizoID
                                , this.cboProveedor.Text, proveedorId.ToString(), this.cboUbicacionDestino.Text, cantidad
                                , Util.Decimal(this.dgvDiferencia["Costo Nuevo", iFilaDif].Value)
                                , Cat.Tablas.MovimientoInventario, movimientoEntrada.MovimientoInventarioID);

                            var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == sucursalId && c.Estatus);
                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                ParteID = parteId,
                                ExistenciaInicial = Util.Decimal(oExistencia.Existencia - cantidad),
                                ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                                SucursalID = Util.Entero(this.cboUbicacionDestino.SelectedValue)
                            };
                            Datos.Guardar<MovimientoInventarioHistorial>(historial);

                            /*
                            var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                            if (!oParte.EsServicio.Valor())
                            {
                                var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId);
                                if (existencia != null)
                                {
                                    var inicial = existencia.Existencia;
                                    existencia.Existencia += cantidad;
                                    // Datos.Guardar<ParteExistencia>(existencia);
                                    AdmonProc.AgregarExistencia(parteId, sucursalId, cantidad, Cat.Tablas.MovimientoInventario, movimientoEntrada.MovimientoInventarioID);

                                    var historial = new MovimientoInventarioHistorial()
                                    {
                                        MovmientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                        ParteID = parteId,
                                        ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                        ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                        SucursalID = Util.ConvertirEntero(this.cboUbicacionDestino.SelectedValue)
                                    };
                                    Datos.Guardar<MovimientoInventarioHistorial>(historial);
                                }
                            }
                            // Se agrega al Kardex
                            int iFilaDif = this.dgvDiferencia.EncontrarIndiceDeValor("ParteID", parteId);
                            AdmonProc.RegistrarKardex(new ParteKardex()
                            {
                                ParteID = parteId,
                                OperacionID = Cat.OperacionesKardex.EntradaCompra,
                                SucursalID = sucursalId,
                                Folio = movimientoEntrada.FolioFactura,
                                Fecha = DateTime.Now,
                                RealizoUsuarioID = iAutorizoID,
                                Entidad = this.cboProveedor.Text,
                                Origen = proveedorId.ToString(),
                                Destino = this.cboUbicacionDestino.Text,
                                Cantidad = cantidad,
                                Importe = Util.ConvertirDecimal(this.dgvDiferencia["Costo Nuevo", iFilaDif].Value),
                                RelacionTabla = Cat.Tablas.MovimientoInventario,
                                RelacionID = movimientoEntrada.MovimientoInventarioID
                            });
                            */

                            // Se afectan los datos del pedido, si aplica
                            // if (this.dgvDetalleCaptura.Tag != null)
                            if (this.iCompraDePedidoID > 0)
                            {
                                int iPedidoID = this.iCompraDePedidoID; // Util.ConvertirEntero(this.dgvDetalleCaptura.Tag);
                                var oPartesPed = Datos.GetListOf<PedidoDetalle>(c => c.PedidoID == iPedidoID && c.PedidoEstatusID == Cat.PedidosEstatus.NoSurtido
                                    && c.Estatus);
                                var oPartePed = oPartesPed.FirstOrDefault(c => c.ParteID == parteId);
                                if (oPartePed != null)
                                {
                                    oPartePed.PedidoEstatusID = Cat.PedidosEstatus.Surtido;
                                    Datos.Guardar<PedidoDetalle>(oPartePed);
                                    // Se verifica si ya no quedan pedidos pendientes, para marcar como Surtido
                                    if (oPartesPed.Count == 1)
                                    {
                                        var oPedido = Datos.GetEntity<Pedido>(c => c.PedidoID == oPartePed.PedidoID && c.Estatus);
                                        oPedido.PedidoEstatusID = Cat.PedidosEstatus.Surtido;
                                        Datos.Guardar<Pedido>(oPedido);
                                    }

                                }
                            }

                        }

                        // Para limpiar el estatus de relación con un pedido
                        // this.dgvDetalleCaptura.Tag = null;
                        this.iCompraDePedidoID = 0;

                        //Insertar MovimientoDescuentos
                        foreach (DataGridViewRow row in this.dgvHistorialDescuentos.Rows)
                        {
                            int tipoDescuento = Util.Entero(row.Cells["TipoDescuento"].Value);
                            int tipoDescuentoId = 1;
                            switch (tipoDescuento)
                            {
                                case -1: tipoDescuentoId = 2; break;
                                case 2: tipoDescuentoId = 3; break;
                                case 3: tipoDescuentoId = 4; break;
                                case -2: tipoDescuentoId = 5; break;
                                case -3: tipoDescuentoId = Cat.TiposDeDescuentoCompras.IndividualAFactura; break;
                            }

                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var hisDesc = new MovimientoInventarioDescuento()
                            {
                                MovimientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                ParteID = parteId,
                                TipoDescuentoID = tipoDescuentoId,
                                DescuentoUno = Util.Decimal(row.Cells["DescuentoUno"].Value),
                                DescuentoDos = Util.Decimal(row.Cells["DescuentoDos"].Value),
                                DescuentoTres = Util.Decimal(row.Cells["DescuentoTres"].Value),
                                DescuentoCuatro = Util.Decimal(row.Cells["DescuentoCuatro"].Value),
                                DescuentoCinco = Util.Decimal(row.Cells["DescuentoCinco"].Value)
                            };
                            Datos.Guardar<MovimientoInventarioDescuento>(hisDesc);
                        }

                        //Actualizar PartePrecio
                        foreach (DataGridViewRow row in this.dgvDiferencia.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var partePrecio = Datos.GetEntity<PartePrecio>(p => p.ParteID.Equals(parteId));
                            var oPartePrecioAnt = Datos.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            var costoNuevo = Util.Decimal(row.Cells["Costo Nuevo"].Value);
                            var costoActual = Util.Decimal(row.Cells["Costo Actual"].Value);
                            decimal costoConDescuento = 0;
                            if (partePrecio != null)
                            {
                                if (Convert.ToBoolean(row.Cells["X"].Value).Equals(true))
                                    partePrecio.Costo = costoNuevo;
                                else
                                    partePrecio.Costo = costoActual;

                                partePrecio.PorcentajeUtilidadUno = Util.Decimal(row.Cells["%1"].Value);
                                partePrecio.PorcentajeUtilidadDos = Util.Decimal(row.Cells["%2"].Value);
                                partePrecio.PorcentajeUtilidadTres = Util.Decimal(row.Cells["%3"].Value);
                                partePrecio.PorcentajeUtilidadCuatro = Util.Decimal(row.Cells["%4"].Value);
                                partePrecio.PorcentajeUtilidadCinco = Util.Decimal(row.Cells["%5"].Value);

                                partePrecio.PrecioUno = Util.Decimal(row.Cells["Precio 1"].Value);
                                partePrecio.PrecioDos = Util.Decimal(row.Cells["Precio 2"].Value);
                                partePrecio.PrecioTres = Util.Decimal(row.Cells["Precio 3"].Value);
                                partePrecio.PrecioCuatro = Util.Decimal(row.Cells["Precio 4"].Value);
                                partePrecio.PrecioCinco = Util.Decimal(row.Cells["Precio 5"].Value);

                                //CostoConDescuento, calcular el descuento por fila, si existen descuentos a Factura y a Marca Factura
                                var rowIndex = UtilLocal.findRowIndex(this.dgvDetalleDescuentos, "ParteID", parteId.ToString());
                                if (rowIndex != -1)
                                {
                                    costoConDescuento = Util.Decimal(this.dgvDetalleDescuentos.Rows[rowIndex].Cells["CostoConDescuentoNuevo"].Value);
                                    partePrecio.CostoConDescuento = costoConDescuento;

                                    /*
                                    var rowIndexHisAFactura = Util.findRowIndex(this.dgvHistorialDescuentos, "ParteID", "-1");
                                    if (rowIndexHisAFactura != -1)
                                    {
                                        var desUno = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAFactura].Cells["DescuentoUno"].Value);
                                        var desDos = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAFactura].Cells["DescuentoDos"].Value);
                                        var desTres = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAFactura].Cells["DescuentoTres"].Value);
                                        var desCuatro = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAFactura].Cells["DescuentoCuatro"].Value);
                                        var desCinco = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAFactura].Cells["DescuentoCinco"].Value);
                                        precioConDescuento = this.calcularDescuento(precioConDescuento, desUno, desDos, desTres, desCuatro, desCinco);
                                    }

                                    var rowIndexHisAMarcaF = -1;
                                    foreach (DataGridViewRow fila in this.dgvHistorialDescuentos.Rows)
                                    {
                                        if (Util.ConvertirEntero(fila.Cells["ParteID"].Value).Equals(parteId) && Util.ConvertirEntero(fila.Cells["TipoDescuento"].Value).Equals(-2))
                                        {
                                            rowIndexHisAMarcaF = fila.Index;
                                        }
                                    }
                                    if (rowIndexHisAMarcaF != -1)
                                    {
                                        var desUno = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAMarcaF].Cells["DescuentoUno"].Value);
                                        var desDos = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAMarcaF].Cells["DescuentoDos"].Value);
                                        var desTres = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAMarcaF].Cells["DescuentoTres"].Value);
                                        var desCuatro = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAMarcaF].Cells["DescuentoCuatro"].Value);
                                        var desCinco = Util.ConvertirDecimal(this.dgvHistorialDescuentos.Rows[rowIndexHisAMarcaF].Cells["DescuentoCinco"].Value);
                                        precioConDescuento = this.calcularDescuento(precioConDescuento, desUno, desDos, desTres, desCuatro, desCinco);
                                    }
                                    partePrecio.CostoConDescuento = precioConDescuento;
                                    */
                                }

                                Datos.Guardar<PartePrecio>(partePrecio);

                                //Si cambia de el valor del precio entonces
                                //Actualizar PartePrecioHistorico
                                if (partePrecio.Costo != oPartePrecioAnt.Costo || partePrecio.CostoConDescuento != oPartePrecioAnt.CostoConDescuento
                                    || partePrecio.PrecioUno != oPartePrecioAnt.PrecioUno || partePrecio.PrecioDos != oPartePrecioAnt.PrecioDos
                                    || partePrecio.PrecioDos != oPartePrecioAnt.PrecioDos || partePrecio.PrecioTres != oPartePrecioAnt.PrecioTres
                                    || partePrecio.PrecioCinco != oPartePrecioAnt.PrecioCinco)
                                {
                                    var precioHis = new PartePrecioHistorico()
                                    {
                                        ParteID = parteId,
                                        MovimientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                        CostoNuevo = costoNuevo,
                                        CostoActual = costoActual,
                                        CostoConDescuento = costoConDescuento,
                                        PorcentajeUtilidadUno = Util.Decimal(row.Cells["%1"].Value),
                                        PorcentajeUtilidadDos = Util.Decimal(row.Cells["%2"].Value),
                                        PorcentajeUtilidadTres = Util.Decimal(row.Cells["%3"].Value),
                                        PorcentajeUtilidadCuatro = Util.Decimal(row.Cells["%4"].Value),
                                        PorcentajeUtilidadCinco = Util.Decimal(row.Cells["%5"].Value),
                                        PrecioUno = Util.Decimal(row.Cells["Precio 1"].Value),
                                        PrecioDos = Util.Decimal(row.Cells["Precio 2"].Value),
                                        PrecioTres = Util.Decimal(row.Cells["Precio 3"].Value),
                                        PrecioCuatro = Util.Decimal(row.Cells["Precio 4"].Value),
                                        PrecioCinco = Util.Decimal(row.Cells["Precio 5"].Value)
                                    };
                                    Datos.Guardar<PartePrecioHistorico>(precioHis);
                                }
                            }

                            //Actualizar MovimientoInventarioEtiqueta
                            var etiqueta = new MovimientoInventarioEtiqueta()
                            {
                                MovimientoInventarioID = movimientoEntrada.MovimientoInventarioID,
                                ParteID = parteId,
                                NumeroEtiquetas = Util.Entero(row.Cells["Etiqueta"].Value),
                            };
                            Datos.Guardar<MovimientoInventarioEtiqueta>(etiqueta);
                        }

                        //Guardar Imagen en Directorio
                        //Nombre Imagen = MovimientoID_FolioFactura
                        /* De momento no se usa. Se quitó por incompatiblidad con el parámetro "pathImagenesMovimientos". Moi 07/05/2015
                        if (this.picBoxImagen.Image != null)
                        {
                            var pathProveedor = System.IO.Path.Combine(GlobalClass.ConfiguracionGlobal.pathImagenesMovimientos, "Compras", this.cboProveedor.Text, DateTime.Now.Year.ToString());
                            if (!System.IO.Directory.Exists(pathProveedor))
                                System.IO.Directory.CreateDirectory(pathProveedor);

                            //Guardar Imagen en la tabla
                            movimientoEntrada.NombreImagen = string.Format("{0}_{1}{2}", movimientoEntrada.MovimientoInventarioID, movimientoEntrada.FolioFactura, ".jpg");
                            Datos.Guardar<MovimientoInventario>(movimientoEntrada);

                            var path = System.IO.Path.Combine(pathProveedor, movimientoEntrada.NombreImagen);
                            picBoxImagen.Image.Save(path, ImageFormat.Jpeg);
                        } */

                        // Se manda a afectar contabilidad (AfeConta)
                        if (this.chkEsNota.Checked)
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.CompraCreditoNota, movimientoEntrada.MovimientoInventarioID
                                , movimientoEntrada.FolioFactura, this.cboProveedor.Text, sucursalId);
                        else
                            ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.CompraCreditoFactura, movimientoEntrada.MovimientoInventarioID
                                , movimientoEntrada.FolioFactura, this.cboProveedor.Text, sucursalId);

                        SplashScreen.Close();
                        this.btnFinish.Enabled = true;
                        this.Cursor = Cursors.Default;

                        //Visor de ticket de entrada compra
                        ReporteadorMovimientos visor = ReporteadorMovimientos.Instance;
                        visor.oID = movimientoEntrada.MovimientoInventarioID;
                        visor.oTipoReporte = 3;
                        visor.Load();

                        var resEtiqueta = Util.MensajePregunta("Desea imprimir las etiquetas?", GlobalClass.NombreApp);
                        if (resEtiqueta == DialogResult.Yes)
                        {
                            //VisorDeReportes visor = VisorDeReportes.Instance;
                            ReporteadorMovimientos visorEt = ReporteadorMovimientos.Instance;
                            visorEt.oID = movimientoEntrada.MovimientoInventarioID;
                            visorEt.oTipoReporte = 2;
                            visorEt.Load();
                        }

                        #endregion

                        break;

                    case 2:

                        #region [ Entrada Inventario ]

                        //Insertar Movimiento
                        var movimientoEntradaI = new MovimientoInventario()
                        {
                            TipoOperacionID = Util.Entero(this.cboTipoOperacion.SelectedValue),
                            TipoPagoID = Util.Entero(this.cboTipoPago.SelectedValue),
                            ProveedorID = proveedorId,
                            SucursalOrigenID = Util.Entero(this.cboUbicacionOrigen.SelectedValue),
                            SucursalDestinoID = Util.Entero(this.cboUbicacionDestino.SelectedValue),
                            FechaFactura = this.dtpFechaFacturacion.Value,
                            FechaRecepcion = this.dtpFechaRecepcion.Value,
                            FolioFactura = null,
                            Subtotal = null,
                            IVA = null,
                            ImporteTotal = 0,
                            FueLiquidado = false,
                            TipoConceptoOperacionID = Util.Entero(this.cboConceptoOperacion.SelectedValue),
                            Observacion = this.txtObservaciones.Text,
                            Articulos = null,
                            Unidades = null,
                            Seguro = null,
                            ImporteTotalSinDescuento = null
                        };
                        Datos.Guardar<MovimientoInventario>(movimientoEntradaI);

                        if (movimientoEntradaI.MovimientoInventarioID < 1)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            new EntityNotFoundException("MovimientoInventarioID", "MovimientoInventario");
                            return;
                        }

                        //Insertar MovimientoDetalle
                        foreach (DataGridViewRow row in this.dgvDetalleCaptura.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["UNS"].Value);
                            var detalleMovimiento = new MovimientoInventarioDetalle()
                            {
                                MovimientoInventarioID = movimientoEntradaI.MovimientoInventarioID,
                                ParteID = parteId,
                                Cantidad = cantidad,
                                PrecioUnitario = 0,
                                Importe = 0,
                                FueDevolucion = false,
                                FechaRegistro = DateTime.Now,
                                Estatus = true
                            };
                            Datos.SaveOrUpdate<MovimientoInventarioDetalle>(detalleMovimiento);

                            // Se actualiza la existencia y el kardex
                            bool bEntradaGarantia = (Util.Entero(this.cboConceptoOperacion.SelectedValue) == Cat.MovimientosConceptosDeOperacion.EntradaGarantia);
                            var oPartePrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.AfectarExistenciaYKardex(parteId, sucursalId, Cat.OperacionesKardex.EntradaInventario, movimientoEntradaI.MovimientoInventarioID.ToString(), iAutorizoID
                                , this.cboConceptoOperacion.Text, (bEntradaGarantia ? "GARANTÍA" : "----"), this.cboUbicacionDestino.Text, cantidad
                                , oPartePrecio.Costo.Valor(), Cat.Tablas.MovimientoInventario, movimientoEntradaI.MovimientoInventarioID);

                            var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == sucursalId && c.Estatus);
                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = movimientoEntradaI.MovimientoInventarioID,
                                ParteID = parteId,
                                ExistenciaInicial = Util.Decimal(oExistencia.Existencia - cantidad),
                                ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                                SucursalID = Util.Entero(this.cboUbicacionDestino.SelectedValue)
                            };
                            Datos.Guardar<MovimientoInventarioHistorial>(historial);

                            //Actualizar ParteExistencia
                            /*
                            var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                            if (!oParte.EsServicio.Valor())
                            {
                                var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId);
                                if (existencia != null)
                                {
                                    var inicial = existencia.Existencia;
                                    existencia.Existencia += cantidad;
                                    // Datos.Guardar<ParteExistencia>(existencia);
                                    AdmonProc.AgregarExistencia(parteId, sucursalId, cantidad, Cat.Tablas.MovimientoInventario, movimientoEntradaI.MovimientoInventarioID);

                                    var historial = new MovimientoInventarioHistorial()
                                    {
                                        MovmientoInventarioID = movimientoEntradaI.MovimientoInventarioID,
                                        ParteID = parteId,
                                        ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                        ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                        SucursalID = Util.ConvertirEntero(this.cboUbicacionDestino.SelectedValue)
                                    };
                                    Datos.Guardar<MovimientoInventarioHistorial>(historial);
                                }
                            }
                            // Se agrega al Kardex
                            var oPartePrecio = General.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.RegistrarKardex(new ParteKardex()
                            {
                                ParteID = parteId,
                                OperacionID = Cat.OperacionesKardex.EntradaInventario,
                                SucursalID = sucursalId,
                                Folio = movimientoEntradaI.MovimientoInventarioID.ToString(),
                                Fecha = DateTime.Now,
                                RealizoUsuarioID = iAutorizoID,
                                Entidad = "----",
                                Origen = (bEntradaGarantia ? "GARANTÍA" : "----"),
                                Destino = this.cboUbicacionDestino.Text,
                                Cantidad = cantidad,
                                Importe = oPartePrecio.Costo.Valor(),
                                RelacionTabla = Cat.Tablas.MovimientoInventario,
                                RelacionID = movimientoEntradaI.MovimientoInventarioID
                            });
                            */

                            // Se verifica si es una garantía, para cambiar el estatus correspondiente
                            if (bEntradaGarantia)
                            {
                                int iGarantiaID = Util.Entero(row.Tag);
                                var oGarantia = Datos.GetEntity<VentaGarantia>(c => c.VentaGarantiaID == iGarantiaID && c.Estatus);
                                if (oGarantia != null)
                                {
                                    oGarantia.RespuestaID = Cat.VentasGarantiasRespuestas.ArticuloNuevo;
                                    if (oGarantia.AccionID == Cat.VentasGarantiasAcciones.RevisionDeProveedor)
                                    {
                                        oGarantia.EstatusGenericoID = Cat.EstatusGenericos.Resuelto;
                                    }
                                    else
                                    {
                                        oGarantia.FechaCompletado = DateTime.Now;
                                        oGarantia.EstatusGenericoID = Cat.EstatusGenericos.Completada;
                                    }
                                    Datos.Guardar<VentaGarantia>(oGarantia);
                                }
                            }

                        }

                        // Se manda a afectar contabilidad (AfeConta)
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.EntradaInventario, movimientoEntradaI.MovimientoInventarioID
                            , ResU.Respuesta.NombreUsuario, movimientoEntradaI.Observacion, sucursalId);

                        SplashScreen.Close();
                        this.btnFinish.Enabled = true;
                        this.Cursor = Cursors.Default;

                        //Visor de ticket de entrada compra
                        ReporteadorMovimientos visorE = ReporteadorMovimientos.Instance;
                        visorE.oID = movimientoEntradaI.MovimientoInventarioID;
                        visorE.oTipoReporte = 4;
                        visorE.Load();

                        #endregion

                        break;

                    case 3:

                        #region [ Salida Inventario ]

                        //Valida la existencia antes  de dar de baja del inventario
                        bool bError = false;
                        foreach (DataGridViewRow row in this.dgvDetalleCaptura.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["UNS"].Value);
                            var existencia = Datos.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId && p.Estatus);
                            if (existencia.Existencia < cantidad)
                            {
                                row.ErrorText = string.Format("No hay existencia suficiente. Existencia: {0}, Salida: {1}", existencia.Existencia, cantidad);
                                row.DefaultCellStyle.ForeColor = Color.Red;
                                bError = true;
                            }
                        }
                        if (bError)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            UtilLocal.MensajeAdvertencia("Uno o más artículos no cuentan con existencia suficiente para la salida. No se puede continuar.");
                            this.btnFinish.Enabled = true;
                            return;
                        }

                        //Insertar Movimiento
                        var movimientoSalida = new MovimientoInventario()
                        {
                            TipoOperacionID = Util.Entero(this.cboTipoOperacion.SelectedValue),
                            TipoPagoID = Util.Entero(this.cboTipoPago.SelectedValue),
                            ProveedorID = proveedorId,
                            SucursalOrigenID = Util.Entero(this.cboUbicacionOrigen.SelectedValue),
                            SucursalDestinoID = Util.Entero(this.cboUbicacionDestino.SelectedValue),
                            FechaFactura = this.dtpFechaFacturacion.Value,
                            FechaRecepcion = this.dtpFechaRecepcion.Value,
                            FolioFactura = null,
                            Subtotal = null,
                            IVA = null,
                            ImporteTotal = 0,
                            FueLiquidado = false,
                            TipoConceptoOperacionID = Util.Entero(this.cboConceptoOperacion.SelectedValue),
                            Observacion = this.txtObservaciones.Text,
                            Articulos = null,
                            Unidades = null,
                            Seguro = null,
                            ImporteTotalSinDescuento = null
                        };
                        Datos.Guardar<MovimientoInventario>(movimientoSalida);

                        if (movimientoSalida.MovimientoInventarioID < 1)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            new EntityNotFoundException("MovimientoInventarioID", "MovimientoInventario");
                            return;
                        }

                        //Insertar MovimientoDetalle
                        foreach (DataGridViewRow row in this.dgvDetalleCaptura.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["UNS"].Value);
                            var detalleMovimiento = new MovimientoInventarioDetalle()
                            {
                                MovimientoInventarioID = movimientoSalida.MovimientoInventarioID,
                                ParteID = parteId,
                                Cantidad = cantidad,
                                PrecioUnitario = 0,
                                Importe = 0,
                                FueDevolucion = false,
                                FechaRegistro = DateTime.Now,
                                Estatus = true
                            };
                            Datos.SaveOrUpdate<MovimientoInventarioDetalle>(detalleMovimiento);

                            // Se actualiza la existencia y el kardex
                            var oPartePrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.AfectarExistenciaYKardex(parteId, sucursalId, Cat.OperacionesKardex.SalidaInventario
                                , movimientoSalida.MovimientoInventarioID.ToString(), iAutorizoID, this.cboConceptoOperacion.Text, "----", this.cboUbicacionDestino.Text
                                , (cantidad * -1), oPartePrecio.Costo.Valor(), Cat.Tablas.MovimientoInventario, movimientoSalida.MovimientoInventarioID);

                            var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == sucursalId && c.Estatus);
                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = movimientoSalida.MovimientoInventarioID,
                                ParteID = parteId,
                                ExistenciaInicial = Util.Decimal(oExistencia.Existencia + cantidad),
                                ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                                SucursalID = Util.Entero(this.cboUbicacionDestino.SelectedValue)
                            };
                            Datos.Guardar<MovimientoInventarioHistorial>(historial);

                            //Actualizar ParteExistencia
                            /*
                            var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                            if (!oParte.EsServicio.Valor())
                            {
                                var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId);
                                if (existencia != null)
                                {
                                    var inicial = existencia.Existencia;
                                    existencia.Existencia -= cantidad;
                                    // Datos.Guardar<ParteExistencia>(existencia);
                                    AdmonProc.AgregarExistencia(parteId, sucursalId, (cantidad * -1), Cat.Tablas.MovimientoInventario, movimientoSalida.MovimientoInventarioID);

                                    var historial = new MovimientoInventarioHistorial()
                                    {
                                        MovmientoInventarioID = movimientoSalida.MovimientoInventarioID,
                                        ParteID = parteId,
                                        ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                        ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                        SucursalID = Util.ConvertirEntero(this.cboUbicacionDestino.SelectedValue)
                                    };
                                    Datos.Guardar<MovimientoInventarioHistorial>(historial);
                                }
                            }
                            // Se agrega al Kardex
                            var oPartePrecio = General.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.RegistrarKardex(new ParteKardex()
                            {
                                ParteID = parteId,
                                OperacionID = Cat.OperacionesKardex.SalidaInventario,
                                SucursalID = sucursalId,
                                Folio = movimientoSalida.MovimientoInventarioID.ToString(),
                                Fecha = DateTime.Now,
                                RealizoUsuarioID = iAutorizoID,
                                Entidad = "----",
                                Origen = "----",
                                Destino = this.cboUbicacionDestino.Text,
                                Cantidad = cantidad,
                                Importe = oPartePrecio.Costo.Valor(),
                                RelacionTabla = Cat.Tablas.MovimientoInventario,
                                RelacionID = movimientoSalida.MovimientoInventarioID
                            });
                            */
                        }

                        // Se manda a afectar contabilidad (AfeConta)
                        ContaProc.CrearPolizaAfectacion(Cat.ContaAfectaciones.SalidaInventario, movimientoSalida.MovimientoInventarioID
                            , ResU.Respuesta.NombreUsuario, movimientoSalida.Observacion, sucursalId);

                        SplashScreen.Close();
                        this.btnFinish.Enabled = true;
                        this.Cursor = Cursors.Default;

                        //Visor de ticket de entrada compra
                        ReporteadorMovimientos visorS = ReporteadorMovimientos.Instance;
                        visorS.oID = movimientoSalida.MovimientoInventarioID;
                        visorS.oTipoReporte = 5;
                        visorS.Load();

                        #endregion

                        break;

                    case 4:

                        #region [ Devolucion ]

                        // Se obtiene el movimiento fuente (la compra a la cual se le aplica la devolución / garantía)
                        int iFuenteMovDetID = Util.Entero(this.dgvDetalleCaptura["FuenteMovimientoInventarioDetalleID", 0].Value);
                        var oFuenteMovDet = Datos.GetEntity<MovimientoInventarioDetalle>(c => c.MovimientoInventarioDetalleID == iFuenteMovDetID && c.Estatus);
                        var oFuenteMov = Datos.GetEntity<MovimientoInventario>(c => c.MovimientoInventarioID == oFuenteMovDet.MovimientoInventarioID && c.Estatus);

                        //Validaciones
                        foreach (DataGridViewRow row in this.dgvDetalleCaptura.Rows)
                        {
                            if (Util.Entero(this.cboConceptoOperacion.SelectedValue) != Cat.MovimientosConceptosDeOperacion.DevolucionGarantia)
                            {
                                //Valida existencias antes de continuar
                                var parteId = Util.Entero(row.Cells["ParteID"].Value);
                                var sucursal = Util.Entero(this.cboUbicacionDestino.SelectedValue);
                                var unidades = Util.Decimal(row.Cells["UNS"].Value);
                                var existencias = Datos.GetEntity<ParteExistencia>(p => p.ParteID.Equals(parteId) && p.SucursalID.Equals(sucursal) && p.Estatus);
                                if (existencias.Existencia < unidades)
                                {
                                    this.Cursor = Cursors.Default;
                                    SplashScreen.Close();
                                    Util.MensajeError(string.Format("{0} {1} {2}", "El articulo", row.Cells["Numero Parte"].Value, "no cuenta con la existencia suficiente para realizar la operación"), GlobalClass.NombreApp);
                                    return;
                                }
                            }

                            //Valida que la cantidad a devolver sea igual o menor a la del movimiento
                            //if (movimientoInventario.MovimientoInventarioID > 0)
                            //{
                            //    var detalle = General.GetEntity<MovimientoInventarioDetalle>(m => m.MovimientoInventarioID.Equals(movimientoInventario.MovimientoInventarioID)
                            //        && m.ParteID.Equals(parteId) && m.Estatus);
                            //    if (unidades > detalle.Cantidad)
                            //    {
                            //        this.Cursor = Cursors.Default;
                            //        SplashScreen.Close();
                            //        Util.MensajeError(string.Format("{0} {1} {2}", "El articulo", row.Cells["Numero Parte"].Value, "tiene registrada una cantidad menor a la que intenta devolver."), GlobalClass.NombreApp);
                            //        return;
                            //    }
                            //}

                            //Validar que LA CANTIDAD del movimiento de compra, sea menor o igual que la suma de las devoluciones

                            /*
                            var mov = General.GetEntity<MovimientoInventarioView>(m => m.MovimientoInventarioID == movimientoInventario.MovimientoInventarioID && m.FolioFactura == m.FolioFactura);
                            if (mov != null)
                            {
                                var det = General.GetEntity<MovimientoInventarioDetalleView>(m => m.MovimientoInventarioID == mov.MovimientoInventarioID && m.ParteID == parteId);
                                if (det != null)
                                {
                                    var dev = General.GetEntity<MovimientosInventarioContadorDevolucionesView>(m => m.MovimientoInventarioID == movimientoInventario.MovimientoInventarioID
                                        && m.ParteID == parteId);
                                    if (dev != null)
                                    {
                                        if (det.Cantidad > dev.Cantidad)
                                        {
                                            this.Cursor = Cursors.Default;
                                            SplashScreen.Close();
                                            Util.MensajeError(string.Format("{0} {1} {2}", "El articulo", row.Cells["Numero Parte"].Value, "tiene registrada una cantidad menor en la Factura a la que intenta devolver."), GlobalClass.NombreApp);
                                            return;
                                        }
                                    }
                                }
                                else
                                {
                                    this.Cursor = Cursors.Default;
                                    SplashScreen.Close();
                                    Util.MensajeError("Error al tratar de validar la cantidad comprada.", GlobalClass.NombreApp);
                                    return;
                                }
                            }
                            else
                            {
                                this.Cursor = Cursors.Default;
                                SplashScreen.Close();
                                Util.MensajeError("Error al tratar de validar el movmiento de Compra.", GlobalClass.NombreApp);
                                return;
                            }
                            */

                            decimal mCantidad = Util.Decimal(row.Cells["UNS"].Value);
                            if (oFuenteMovDet != null && (oFuenteMovDet.Cantidad - oFuenteMovDet.CantidadDevuelta) < mCantidad)
                            {
                                this.Cursor = Cursors.Default;
                                SplashScreen.Close();
                                UtilLocal.MensajeAdvertencia(string.Format("El artículo {0} tiene registrada una cantidad menor en la factura a la que intenta devolver."
                                    , row.Cells["Numero Parte"].Value));
                                return;
                            }

                        }

                        // Se obtiene el folio factura del primer artículo a devolver
                        if (this.dgvDetalleCaptura.Rows.Count > 0)
                        {
                            this.txtFolioFactura.Text = oFuenteMov.FolioFactura;
                        }

                        //Insertar Movimiento
                        var movimientoDevolucion = new MovimientoInventario()
                        {
                            TipoOperacionID = Util.Entero(this.cboTipoOperacion.SelectedValue),
                            TipoPagoID = Util.Entero(this.cboTipoPago.SelectedValue),
                            ProveedorID = proveedorId,
                            SucursalOrigenID = Util.Entero(this.cboUbicacionOrigen.SelectedValue),
                            SucursalDestinoID = Util.Entero(this.cboUbicacionDestino.SelectedValue),
                            FechaFactura = this.dtpFechaFacturacion.Value,
                            FechaRecepcion = this.dtpFechaRecepcion.Value,
                            FolioFactura = this.txtFolioFactura.Text,
                            Subtotal = null,
                            IVA = null,
                            ImporteTotal = Util.Decimal(this.lblTotal.Text),
                            FueLiquidado = false,
                            TipoConceptoOperacionID = Util.Entero(this.cboConceptoOperacion.SelectedValue),
                            Observacion = this.txtObservaciones.Text,
                            Articulos = Util.Decimal(this.txtArticulos.Text),
                            Unidades = Util.Decimal(this.lblUnidades.Text),
                            Seguro = null,
                            ImporteTotalSinDescuento = null,
                            DeMovimientoInventarioID = oFuenteMov.MovimientoInventarioID
                        };
                        Datos.Guardar<MovimientoInventario>(movimientoDevolucion);

                        if (movimientoDevolucion.MovimientoInventarioID < 1)
                        {
                            this.Cursor = Cursors.Default;
                            SplashScreen.Close();
                            new EntityNotFoundException("MovimientoInventarioID", "MovimientoInventario");
                            return;
                        }

                        //Insertar MovimientoDetalle
                        foreach (DataGridViewRow row in this.dgvDetalleCaptura.Rows)
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["UNS"].Value);
                            var detalleMovimiento = new MovimientoInventarioDetalle()
                            {
                                MovimientoInventarioID = movimientoDevolucion.MovimientoInventarioID,
                                ParteID = parteId,
                                Cantidad = cantidad,
                                PrecioUnitario = Util.Decimal(row.Cells["Costo Inicial"].Value),
                                Importe = Util.Decimal(row.Cells["Importe"].Value),
                                FueDevolucion = true,
                                FechaRegistro = DateTime.Now,
                                Estatus = true
                            };
                            Datos.SaveOrUpdate<MovimientoInventarioDetalle>(detalleMovimiento);

                            // Se actualiza la existencia y el kardex
                            bool bDevGarantia = (Util.Entero(this.cboConceptoOperacion.SelectedValue) == Cat.MovimientosConceptosDeOperacion.DevolucionGarantia);
                            // Si no es de garantía, igual se mete un registro de existencia pero en cero, sólo para que quede el dato del movimiento que se hizo
                            AdmonProc.AfectarExistenciaYKardex(parteId, sucursalId, Cat.OperacionesKardex.DevolucionAProveedor,
                                movimientoDevolucion.MovimientoInventarioID.ToString(), iAutorizoID, this.cboProveedor.Text, this.cboUbicacionDestino.Text
                                , this.cboConceptoOperacion.Text, (bDevGarantia ? 0 : (cantidad * -1))
                                , Util.Decimal(row.Cells["Costo Inicial"].Value), Cat.Tablas.MovimientoInventario, movimientoDevolucion.MovimientoInventarioID);

                            var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == sucursalId && c.Estatus);
                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = movimientoDevolucion.MovimientoInventarioID,
                                ParteID = parteId,
                                ExistenciaInicial = Util.Decimal(oExistencia.Existencia + cantidad),
                                ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                                SucursalID = Util.Entero(this.cboUbicacionDestino.SelectedValue)
                            };
                            Datos.Guardar<MovimientoInventarioHistorial>(historial);

                            //Actualizar ParteExistencia, si no es garantía y no es servicio
                            /*
                            bool bDevGarantia = (Util.ConvertirEntero(this.cboConceptoOperacion.SelectedValue) == Cat.MovimientosConceptosDeOperacion.DevolucionGarantia);
                            var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                            if (!oParte.EsServicio.Valor() && !bDevGarantia) {
                                var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId);
                                if (existencia != null)
                                {
                                    var inicial = existencia.Existencia;
                                    existencia.Existencia -= cantidad;
                                    // Datos.Guardar<ParteExistencia>(existencia);
                                    AdmonProc.AgregarExistencia(parteId, sucursalId, (cantidad * -1), Cat.Tablas.MovimientoInventario
                                        , movimientoDevolucion.MovimientoInventarioID);

                                    var historial = new MovimientoInventarioHistorial()
                                    {
                                        MovmientoInventarioID = movimientoDevolucion.MovimientoInventarioID,
                                        ParteID = parteId,
                                        ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                        ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                        SucursalID = Util.ConvertirEntero(this.cboUbicacionDestino.SelectedValue)
                                    };
                                    Datos.Guardar<MovimientoInventarioHistorial>(historial);
                                }
                            }
                            // Se agrega al Kardex
                            AdmonProc.RegistrarKardex(new ParteKardex()
                            {
                                ParteID = parteId,
                                OperacionID = Cat.OperacionesKardex.DevolucionAProveedor,
                                SucursalID = sucursalId,
                                Folio = movimientoDevolucion.MovimientoInventarioID.ToString(),
                                Fecha = DateTime.Now,
                                RealizoUsuarioID = iAutorizoID,
                                Entidad = this.cboProveedor.Text,
                                Origen = this.cboUbicacionDestino.Text,
                                Destino = (bDevGarantia ? "GARANTÍA" : proveedorId.ToString()),
                                Cantidad = (bDevGarantia ? 0 : cantidad),
                                Importe = Util.ConvertirDecimal(row.Cells["Costo Inicial"].Value),
                                RelacionTabla = Cat.Tablas.MovimientoInventario,
                                RelacionID = movimientoDevolucion.MovimientoInventarioID
                            });
                            */

                            // Se modifica la cantidad devuelta, en el detalle de la compra utilizada
                            if (oFuenteMovDet != null)
                            {
                                oFuenteMovDet.CantidadDevuelta += cantidad;
                                Datos.Guardar<MovimientoInventarioDetalle>(oFuenteMovDet);
                            }

                            // Se verifica si es una garantía, para cambiar el estatus correspondiente, y relacionar la garantía con el Mov
                            if (Util.Entero(this.cboConceptoOperacion.SelectedValue) == Cat.MovimientosConceptosDeOperacion.DevolucionGarantia)
                            {
                                int iGarantiaID = Util.Entero(row.Tag);
                                var oGarantia = Datos.GetEntity<VentaGarantia>(c => c.VentaGarantiaID == iGarantiaID && c.Estatus);
                                if (oGarantia != null)
                                {
                                    oGarantia.EstatusGenericoID = Cat.EstatusGenericos.EnRevision;
                                    oGarantia.MovimientoInventarioID = oFuenteMov.MovimientoInventarioID;
                                    Datos.Guardar<VentaGarantia>(oGarantia);
                                }
                            }
                        }

                        SplashScreen.Close();
                        this.btnFinish.Enabled = true;
                        this.Cursor = Cursors.Default;

                        //Visor de ticket de devolucion
                        ReporteadorMovimientos visorD = ReporteadorMovimientos.Instance;
                        visorD.oID = movimientoDevolucion.MovimientoInventarioID;
                        visorD.oTipoReporte = 6;
                        visorD.Load();
                        #endregion

                        break;

                    default:
                        break;
                }

                new Notificacion(string.Format("{0} {1}", this.cboTipoOperacion.Text, "Guardado exitosamente"), 2 * 1000).Mostrar(Principal.Instance);
                this.finalizar();
            }
            catch (Exception ex)
            {
                SplashScreen.Close();
                this.btnFinish.Enabled = true;
                this.Cursor = Cursors.Default;
                UtilLocal.MensajeError(ex.MensajeDeError());
            }
        }
示例#3
0
        private void btnProcesarRecibir_Click(object sender, EventArgs e)
        {
            // var log = new Log();
            try
            {
                var movimientoId = Util.Entero(this.dgvRecibir.Rows[this.dgvRecibir.SelectedRows[0].Index].Cells["MovimientoInventarioID"].Value);
                if (movimientoId <= 0)
                {
                    Util.MensajeError("Ocurrio un error al intentar recibir el traspaso.", GlobalClass.NombreApp);
                    return;
                }

                // Se valida que no se haya procesado ya el traspaso en cuestión
                if (Datos.Exists<MovimientoInventario>(c => c.MovimientoInventarioID == movimientoId && c.FechaRecepcion.HasValue))
                {
                    UtilLocal.MensajeAdvertencia("El traspaso seleccionado ya fue procesado. Actualiza el listado para ver sólo los traspasos pendientes.");
                    return;
                }
                //

                int iAutorizoID = 0;
                var ResU = UtilLocal.ValidarObtenerUsuario(null, "Autorización");
                if (ResU.Exito)
                    iAutorizoID = ResU.Respuesta.UsuarioID;
                else
                {
                    Util.MensajeError("Error al validar el usuario.", GlobalClass.NombreApp);
                    return;
                }

                bool existeContingencia = false;

                var res = Util.MensajePregunta("¿Está seguro de que la información es correcta?", GlobalClass.NombreApp);
                if (res == DialogResult.No)
                    return;

                if (this.dgvRecibir.SelectedRows.Count <= 0)
                {
                    Util.MensajeError("Debe seleccionar al menos un traspaso.", GlobalClass.NombreApp);
                    return;
                }

                //Validar que lo recibido sea menor o igual que lo enviado
                foreach (DataGridViewRow row in this.dgvRecibirDetalle.Rows)
                {
                    var enviado = Util.Decimal(row.Cells["Cantidad"].Value);
                    var recibido = Util.Decimal(row.Cells["Recibido"].Value);
                    if (recibido > enviado)
                    {
                        Util.MensajeError(string.Format("{0}{1}{2}", "El articulo ", row.Cells["NumeroParte"].Value, " No tiene una cantidad valida en la columna Recibido."), GlobalClass.NombreApp);
                        return;
                    }
                }

                //SplashScreen.Show(new Splash());
                // log.Text = "Ingresando Traspaso, espere un momento...";
                // log.Show();

                foreach (DataGridViewRow row in this.dgvRecibirDetalle.Rows)
                {
                    var enviado = Util.Decimal(row.Cells["Cantidad"].Value);
                    var recibido = Util.Decimal(row.Cells["Recibido"].Value);
                    if (recibido < enviado)
                    {
                        existeContingencia = true;
                    }
                }

                if (existeContingencia)
                {
                    var resp = Util.MensajePregunta("El Traspaso tiene uno o mas conflictos. ¿Está seguro de continuar y recibir esté Traspaso?", GlobalClass.NombreApp);
                    if (resp == DialogResult.No)
                        return;
                }

                if (!this.ValidacionesAlRecibir(existeContingencia))
                    return;

                Cargando.Mostrar();
                this.Cursor = Cursors.WaitCursor;
                this.btnProcesarRecibir.Enabled = false;

                // Se obtienen la Sucursal Origen y Destino para el traspaso seleccionado
                string sOrigen = Util.Cadena(this.dgvRecibir.CurrentRow.Cells["Origen"].Value);
                string sDestino = Util.Cadena(this.dgvRecibir.CurrentRow.Cells["Destino"].Value);

                //
                decimal mCostoTotal = 0;
                foreach (DataGridViewRow row in this.dgvRecibirDetalle.Rows)
                {
                    var enviado = Util.Decimal(row.Cells["Cantidad"].Value);
                    var recibido = Util.Decimal(row.Cells["Recibido"].Value);
                    var parteId = Util.Entero(row.Cells["ParteID"].Value);
                    var numeroParte = Util.Cadena(row.Cells["NumeroParte"].Value);
                    // Si la cantidad recibida es menor a lo enviado, almacenar la contingencia
                    if (recibido < enviado)
                    {
                        var contingencia = new MovimientoInventarioTraspasoContingencia()
                        {
                            MovimientoInventarioID = movimientoId,
                            MovimientoInventarioDetalleID = Util.Entero(row.Cells["MovimientoInventarioDetalleID"].Value),
                            ParteID = parteId,
                            CantidadEnviada = enviado,
                            CantidadRecibida = recibido,
                            CantidadDiferencia = enviado - recibido,
                            Comentario = this.txtMotivo.Text,
                            UsuarioID = iAutorizoID,
                            FechaRegistro = DateTime.Now,
                            MovimientoInventarioEstatusContingenciaID = 2,
                            Estatus = true,
                            Actualizar = true
                        };
                        // log.AppendTextBox("Almacenando Contingencia...");
                        Datos.SaveOrUpdate<MovimientoInventarioTraspasoContingencia>(contingencia);
                    }

                    // Se actualiza la existencia y el kardex
                    int iSucursalID = GlobalClass.SucursalID;
                    var oPartePrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                    AdmonProc.AfectarExistenciaYKardex(parteId, iSucursalID, Cat.OperacionesKardex.EntradaTraspaso, movimientoId.ToString(), iAutorizoID
                        , (existeContingencia ? "CONFLICTO" : this.cboProveedor.Text), sOrigen, sDestino, recibido, oPartePrecio.Costo.Valor(), Cat.Tablas.MovimientoInventario, movimientoId);

                    var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == iSucursalID && c.Estatus);
                    var historial = new MovimientoInventarioHistorial()
                    {
                        MovmientoInventarioID = movimientoId,
                        ParteID = parteId,
                        ExistenciaInicial = Util.Decimal(oExistencia.Existencia - recibido),
                        ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                        SucursalID = GlobalClass.SucursalID
                    };
                    Datos.Guardar<MovimientoInventarioHistorial>(historial);

                    //Aumentar la existencia actual de la sucursal destino
                    /*
                    var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                    if (!oParte.EsServicio.Valor())
                    {
                        var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == GlobalClass.SucursalID);
                        if (existencia != null)
                        {
                            var inicial = existencia.Existencia;
                            existencia.Existencia += recibido;
                            existencia.UsuarioID = iAutorizoID;
                            // existencia.FechaModificacion = DateTime.Now;
                            // log.AppendTextBox(string.Format("{0} {1}", "Actualizando existencia de:", numeroParte));
                            // General.SaveOrUpdate<ParteExistencia>(existencia, existencia);
                            AdmonProc.AgregarExistencia(parteId, GlobalClass.SucursalID, recibido, Cat.Tablas.MovimientoInventario, movimientoId);

                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = movimientoId,
                                ParteID = parteId,
                                ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                SucursalID = GlobalClass.SucursalID,
                                UsuarioID = iAutorizoID,
                                FechaRegistro = DateTime.Now,
                                Estatus = true,
                                Actualizar = true
                            };
                            // log.AppendTextBox("Almacenando en Historial...");
                            General.SaveOrUpdate<MovimientoInventarioHistorial>(historial, historial);
                        }
                    }

                    // Se agrega al Kardex
                    var oPartePrecio = General.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                    AdmonProc.RegistrarKardex(new ParteKardex()
                    {
                        ParteID = parteId,
                        OperacionID = Cat.OperacionesKardex.EntradaTraspaso,
                        SucursalID = GlobalClass.SucursalID,
                        Folio = movimientoId.ToString(),
                        Fecha = DateTime.Now,
                        RealizoUsuarioID = iAutorizoID,
                        Entidad = this.cboProveedor.Text,
                        Origen = sOrigen,
                        Destino = sDestino,
                        Cantidad = recibido,
                        Importe = oPartePrecio.Costo.Valor(),
                        RelacionTabla = Cat.Tablas.MovimientoInventario,
                        RelacionID = movimientoId
                    });
                    */

                    // Se suma el importe de cada parte, para crear la póliza
                    mCostoTotal += (oPartePrecio.Costo.Valor() * recibido);
                }

                // Se genera la póliza especial correspondiente (AfeConta)
                int iSucursalOrigenID = Util.Entero(this.dgvRecibir.CurrentRow.Cells["SucursalOrigenID"].Value);
                int iSucursalDestinoID = Util.Entero(this.dgvRecibir.CurrentRow.Cells["SucursalDestinoID"].Value);
                var oPoliza = ContaProc.CrearPoliza(Cat.ContaTiposDePoliza.Diario, string.Format("TRASPASO ORIGEN {0:00} DESTINO {1:00}", iSucursalOrigenID, iSucursalDestinoID)
                    , Cat.ContaCuentasAuxiliares.Inventario, Cat.ContaCuentasAuxiliares.Inventario, mCostoTotal, ResU.Respuesta.NombreUsuario
                    , Cat.Tablas.MovimientoInventario, movimientoId, iSucursalDestinoID);
                var oCuentaQuitar = Datos.GetEntity<ContaPolizaDetalle>(c => c.ContaPolizaID == oPoliza.ContaPolizaID && c.Abono > 0);
                if (oCuentaQuitar != null)
                {
                    oCuentaQuitar.Abono = 0;
                    Datos.Guardar<ContaPolizaDetalle>(oCuentaQuitar);
                }

                //Actualizar el movimiento con los datos (fecha y usuario que recibio)
                var movimiento = Datos.GetEntity<MovimientoInventario>(m => m.MovimientoInventarioID == movimientoId);
                if (null != movimiento)
                {
                    movimiento.ExisteContingencia = existeContingencia;
                    movimiento.UsuarioRecibioTraspasoID = iAutorizoID;
                    movimiento.FechaRecepcion = DateTime.Now;
                    movimiento.FechaModificacion = DateTime.Now;
                    // log.AppendTextBox("Finalizando...");
                    Datos.SaveOrUpdate<MovimientoInventario>(movimiento);
                }

                this.LimpiarFormulario();
                this.Cursor = Cursors.Default;
                //SplashScreen.Close();
                // log.finalizo = true;
                // log.Close();
                this.btnProcesarRecibir.Enabled = true;
                new Notificacion("Traspaso Recibido exitosamente", 2 * 1000).Mostrar(Principal.Instance);
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                //SplashScreen.Close();
                // log.finalizo = true;
                // log.Close();
                this.btnProcesarRecibir.Enabled = true;
                Util.MensajeError(ex.Message, GlobalClass.NombreApp);
            }

            Cargando.Cerrar();
        }
示例#4
0
        private void btnProcesar_Click(object sender, EventArgs e)
        {
            try
            {
                int iAutorizoID = 0;
                var ResU = UtilLocal.ValidarObtenerUsuario(null, "Autorización");
                if (ResU.Exito)
                    iAutorizoID = ResU.Respuesta.UsuarioID;
                else
                {
                    Util.MensajeError("Error al validar el usuario.", GlobalClass.NombreApp);
                    return;
                }

                var res = Util.MensajePregunta("¿Está seguro de que la información es correcta?", GlobalClass.NombreApp);
                if (res == DialogResult.No)
                    return;

                if (this.dgvTraspasos.Rows.Count <= 0)
                {
                    Util.MensajeError("Debe seleccionar al menos un articulo.", GlobalClass.NombreApp);
                    return;
                }

                this.Cursor = Cursors.WaitCursor;
                SplashScreen.Show(new Splash());
                this.btnProcesar.Enabled = false;

                var sucursalId = Util.Entero(this.cboUbicacionOrigen.SelectedValue);
                decimal unidades = 0;
                //Validar que la cantidad de cualquier fila sea mayor a 0
                foreach (DataGridViewRow row in this.dgvTraspasos.Rows)
                {
                    var cantidad = Util.Decimal(row.Cells["Cantidad"].Value);
                    if (cantidad <= 0)
                    {
                        Util.MensajeError(string.Format("{0} {1} {2}", "No puede traspasar el Número de Parte:", Util.Cadena(row.Cells["Numero Parte"].Value), "con cantidad en 0."), GlobalClass.NombreApp);
                        this.Cursor = Cursors.Default;
                        return;
                    }
                }

                //Validar existencias de cada articulo en la sucursal origen
                foreach (DataGridViewRow row in this.dgvTraspasos.Rows)
                {
                    if (Util.Logico(row.Cells["X"].Value).Equals(true))
                    {
                        var parteId = Util.Entero(row.Cells["ParteID"].Value);
                        var cantidad = Util.Decimal(row.Cells["Cantidad"].Value);
                        unidades += cantidad;
                        var parteExistencia = Datos.GetEntity<ParteExistencia>(p => p.ParteID.Equals(parteId) && p.SucursalID.Equals(sucursalId) && p.Estatus);
                        if (null != parteExistencia)
                        {
                            if (parteExistencia.Existencia <= 0 || cantidad > parteExistencia.Existencia)
                            {
                                Util.MensajeError(string.Format("{0}{1}", row.Cells["Numero Parte"].Value, " No cuenta con la existencia suficiente en este momento."), GlobalClass.NombreApp);
                                this.Cursor = Cursors.Default;
                                SplashScreen.Close();
                                this.btnProcesar.Enabled = true;
                                this.dgvTraspasos.Select();
                                row.Cells["Cantidad"].Selected = true;
                                return;
                            }
                        }
                    }
                }

                //Almacenar traspaso
                var traspaso = new MovimientoInventario()
                {
                    TipoOperacionID = 5,
                    SucursalOrigenID = sucursalId,
                    SucursalDestinoID = Util.Entero(this.cboUbicacionDestino.SelectedValue),
                    Unidades = unidades,
                    ImporteTotal = 0,
                    FueLiquidado = false,
                    UsuarioSolicitoTraspasoID = Util.Entero(this.cboSolicito.SelectedValue),
                    ExisteContingencia = false,
                    UsuarioID = iAutorizoID,
                    FechaRegistro = DateTime.Now,
                    Estatus = true,
                    Actualizar = true
                };
                Datos.SaveOrUpdate<MovimientoInventario>(traspaso);

                //Almacenar el detalle del traspaso
                if (traspaso.MovimientoInventarioID > 0)
                {
                    decimal mCostoTotal = 0;
                    foreach (DataGridViewRow row in this.dgvTraspasos.Rows)
                    {
                        if (Util.Logico(row.Cells["X"].Value).Equals(true))
                        {
                            var parteId = Util.Entero(row.Cells["ParteID"].Value);
                            var cantidad = Util.Decimal(row.Cells["Cantidad"].Value);
                            var detalleTraspaso = new MovimientoInventarioDetalle()
                            {
                                MovimientoInventarioID = traspaso.MovimientoInventarioID,
                                ParteID = parteId,
                                Cantidad = cantidad,
                                PrecioUnitario = 0,
                                Importe = 0,
                                FueDevolucion = false,
                                FechaRegistro = DateTime.Now,
                                Estatus = true
                            };
                            Datos.SaveOrUpdate<MovimientoInventarioDetalle>(detalleTraspaso);

                            // Se actualiza la existencia y el kardex
                            var oPartePrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.AfectarExistenciaYKardex(parteId, sucursalId, Cat.OperacionesKardex.SalidaTraspaso, traspaso.MovimientoInventarioID.ToString()
                                , iAutorizoID, this.cboProveedor.Text, this.cboUbicacionOrigen.Text, this.cboUbicacionDestino.Text, (cantidad * -1)
                                , oPartePrecio.Costo.Valor(), Cat.Tablas.MovimientoInventario, traspaso.MovimientoInventarioID);

                            var oExistencia = Datos.GetEntity<ParteExistencia>(c => c.ParteID == parteId && c.SucursalID == sucursalId && c.Estatus);
                            var historial = new MovimientoInventarioHistorial()
                            {
                                MovmientoInventarioID = traspaso.MovimientoInventarioID,
                                ParteID = parteId,
                                ExistenciaInicial = Util.Decimal(oExistencia.Existencia + cantidad),
                                ExistenciaFinal = Util.Decimal(oExistencia.Existencia),
                                SucursalID = sucursalId
                            };
                            Datos.Guardar<MovimientoInventarioHistorial>(historial);

                            //Descontar la existencia actual de la sucursal origen
                            /*
                            var oParte = General.GetEntity<Parte>(c => c.ParteID == parteId && c.Estatus);
                            if (!oParte.EsServicio.Valor())
                            {
                                var existencia = General.GetEntity<ParteExistencia>(p => p.ParteID == parteId && p.SucursalID == sucursalId);
                                if (existencia != null)
                                {
                                    var inicial = existencia.Existencia;
                                    existencia.Existencia -= cantidad;
                                    existencia.UsuarioID = iAutorizoID;
                                    // existencia.FechaModificacion = DateTime.Now;
                                    // General.SaveOrUpdate<ParteExistencia>(existencia, existencia);
                                    AdmonProc.AgregarExistencia(parteId, sucursalId, (cantidad * -1), Cat.Tablas.MovimientoInventario, traspaso.MovimientoInventarioID);

                                    var historial = new MovimientoInventarioHistorial()
                                    {
                                        MovmientoInventarioID = traspaso.MovimientoInventarioID,
                                        ParteID = parteId,
                                        ExistenciaInicial = Util.ConvertirDecimal(inicial),
                                        ExistenciaFinal = Util.ConvertirDecimal(existencia.Existencia),
                                        SucursalID = sucursalId,
                                        UsuarioID = iAutorizoID,
                                        FechaRegistro = DateTime.Now,
                                        Estatus = true,
                                        Actualizar = true
                                    };
                                    General.SaveOrUpdate<MovimientoInventarioHistorial>(historial, historial);
                                }
                            }

                            // Se agrega al Kardex
                            var oPartePrecio = General.GetEntity<PartePrecio>(c => c.ParteID == parteId && c.Estatus);
                            AdmonProc.RegistrarKardex(new ParteKardex()
                            {
                                ParteID = parteId,
                                OperacionID = Cat.OperacionesKardex.SalidaTraspaso,
                                SucursalID = sucursalId,
                                Folio = traspaso.MovimientoInventarioID.ToString(),
                                Fecha = DateTime.Now,
                                RealizoUsuarioID = iAutorizoID,
                                Entidad = this.cboProveedor.Text,
                                Origen = this.cboUbicacionOrigen.Text,
                                Destino = this.cboUbicacionDestino.Text,
                                Cantidad = cantidad,
                                Importe = oPartePrecio.Costo.Valor(),
                                RelacionTabla = Cat.Tablas.MovimientoInventario,
                                RelacionID = traspaso.MovimientoInventarioID
                            });
                            */

                            // Se suma el importe de cada parte, para crear la póliza
                            mCostoTotal += (oPartePrecio.Costo.Valor() * cantidad);
                        }
                    }

                    // Se genera la póliza especial correspondiente (AfeConta)
                    var oPoliza = ContaProc.CrearPoliza(Cat.ContaTiposDePoliza.Diario, string.Format("TRASPASO ORIGEN {0:00} DESTINO {1:00}",
                        this.cboUbicacionOrigen.SelectedValue, this.cboUbicacionDestino.SelectedValue), Cat.ContaCuentasAuxiliares.Inventario
                        , Cat.ContaCuentasAuxiliares.Inventario, mCostoTotal, traspaso.MovimientoInventarioID.ToString()
                        , Cat.Tablas.MovimientoInventario, traspaso.MovimientoInventarioID, Util.Entero(this.cboUbicacionOrigen.SelectedValue));
                    var oCuentaQuitar = Datos.GetEntity<ContaPolizaDetalle>(c => c.ContaPolizaID == oPoliza.ContaPolizaID && c.Cargo > 0);
                    if (oCuentaQuitar != null)
                    {
                        oCuentaQuitar.Cargo = 0;
                        Datos.Guardar<ContaPolizaDetalle>(oCuentaQuitar);
                    }
                }

                //Visor de ticket de traspaso
                ReporteadorMovimientos visor = ReporteadorMovimientos.Instance;
                visor.oID = traspaso.MovimientoInventarioID;
                visor.oTipoReporte = 7;
                visor.Load();

                this.LimpiarFormulario();
                this.Cursor = Cursors.Default;
                SplashScreen.Close();
                this.btnProcesar.Enabled = true;
                new Notificacion("Traspaso Guardado exitosamente", 2 * 1000).Mostrar(Principal.Instance);
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                SplashScreen.Close();
                this.btnProcesar.Enabled = true;
                Util.MensajeError(ex.Message, GlobalClass.NombreApp);
            }
        }
示例#5
0
        public static ResAcc RecibirTraspaso(int iUsuarioID, string sMotivo, List<modDetalleTraspaso> oDetalle, bool bValidarContingencia)
        {
            if (oDetalle.Count <= 0)
                return new ResAcc("No hay nada que recibir.");

            // Validar que lo recibido sea menor o igual que lo enviado
            foreach (var oReg in oDetalle)
            {
                if (oReg.Recibido > oReg.Cantidad)
                    return new ResAcc("Existen uno o más artículos que tienen una cantidad recibida mayor a lo enviado.");
            }

            // Se verifica si existe alguna contingencia
            bool bExisteContingencia = false;
            foreach (var oReg in oDetalle)
            {
                if (oReg.Recibido < oReg.Cantidad)
                {
                    bExisteContingencia = true;
                    break;
                }
            }

            if (bExisteContingencia && bValidarContingencia)
                return new ResAcc("El traspaso tiene uno o más conflictos.", Cat.CodigosRes.ConflictoEnTraspasos);

            // Se valida el motivo, en caso de que haya habido contingencia
            if (bExisteContingencia && string.IsNullOrEmpty(sMotivo))
                return new ResAcc("Debes especificar un motivo.");

            // Se obtiene el MovimientoInventario correspondiente al traspaso
            int iRecibirUnoID = oDetalle[0].MovimientoInventarioDetalleID;
            var oRecibirUno = Datos.GetEntity<MovimientoInventarioDetalle>(c => c.MovimientoInventarioDetalleID == iRecibirUnoID && c.Estatus);
            int iMovID = oRecibirUno.MovimientoInventarioID;
            var oTraspasoV = Datos.GetEntity<MovimientoInventarioView>(c => c.MovimientoInventarioID == iMovID);
            int iSucursalID = oTraspasoV.SucursalDestinoID.Valor();

            //
            decimal mCostoTotal = 0;
            foreach (var oReg in oDetalle)
            {
                // Si la cantidad recibida es menor a lo enviado, almacenar la contingencia
                if (oReg.Recibido < oReg.Cantidad)
                {
                    var contingencia = new MovimientoInventarioTraspasoContingencia()
                    {
                        MovimientoInventarioID = iMovID,
                        MovimientoInventarioDetalleID = oReg.MovimientoInventarioDetalleID,
                        ParteID = oReg.ParteID,
                        CantidadEnviada = oReg.Cantidad,
                        CantidadRecibida = oReg.Recibido,
                        CantidadDiferencia = (oReg.Cantidad - oReg.Recibido),
                        Comentario = sMotivo,
                        UsuarioID = iUsuarioID,
                        MovimientoInventarioEstatusContingenciaID = Cat.TraspasoEstatusContingencias.NoSolucionado
                    };
                    Datos.Guardar<MovimientoInventarioTraspasoContingencia>(contingencia);
                }

                //Aumentar la existencia actual de la sucursal destino
                var oParte = Datos.GetEntity<Parte>(c => c.ParteID == oReg.ParteID && c.Estatus);
                if (!oParte.EsServicio.Valor())
                {
                    var existencia = Datos.GetEntity<ParteExistencia>(p => p.ParteID == oReg.ParteID && p.SucursalID == iSucursalID);
                    if (existencia != null)
                    {
                        var inicial = existencia.Existencia;
                        existencia.Existencia += oReg.Recibido;
                        existencia.UsuarioID = iUsuarioID;
                        existencia.FechaModificacion = DateTime.Now;
                        Datos.Guardar<ParteExistencia>(existencia);

                        var historial = new MovimientoInventarioHistorial()
                        {
                            MovmientoInventarioID = iMovID,
                            ParteID = oReg.ParteID,
                            ExistenciaInicial = Util.Decimal(inicial),
                            ExistenciaFinal = Util.Decimal(existencia.Existencia),
                            SucursalID = iSucursalID,
                            UsuarioID = iUsuarioID
                        };
                        Datos.Guardar<MovimientoInventarioHistorial>(historial);
                    }
                }

                // Se agrega al Kardex
                var oPartePrecio = Datos.GetEntity<PartePrecio>(c => c.ParteID == oReg.ParteID && c.Estatus);
                AdmonProc.RegistrarKardex(new ParteKardex()
                {
                    ParteID = oReg.ParteID,
                    OperacionID = Cat.OperacionesKardex.EntradaTraspaso,
                    SucursalID = iSucursalID,
                    Folio = iMovID.ToString(),
                    Fecha = DateTime.Now,
                    RealizoUsuarioID = iUsuarioID,
                    Entidad = Util.Cadena(oTraspasoV.NombreProveedor),
                    Origen = oTraspasoV.SucursalOrigen,
                    Destino = oTraspasoV.SucursalDestino,
                    Cantidad = oReg.Recibido,
                    Importe = oPartePrecio.Costo.Valor()
                });

                // Se suma el importe de cada parte, para crear la póliza
                mCostoTotal += oPartePrecio.Costo.Valor();
            }

            // Se genera la póliza especial correspondiente (AfeConta)
            var oUsuario = Datos.GetEntity<Usuario>(c => c.UsuarioID == iUsuarioID && c.Estatus);
            var oPoliza = ContaProc.CrearPoliza(Cat.ContaTiposDePoliza.Diario, string.Format("TRASPASO ORIGEN {0:00} DESTINO {1:00}"
                , oTraspasoV.SucursalOrigenID, oTraspasoV.SucursalDestinoID), Cat.ContaCuentasAuxiliares.Inventario, 0, mCostoTotal
                , oUsuario.NombreUsuario, Cat.Tablas.MovimientoInventario, iMovID, iSucursalID);

            //Actualizar el movimiento con los datos (fecha y usuario que recibio)
            var movimiento = Datos.GetEntity<MovimientoInventario>(m => m.MovimientoInventarioID == iMovID);
            if (null != movimiento)
            {
                movimiento.ExisteContingencia = bExisteContingencia;
                movimiento.UsuarioRecibioTraspasoID = iUsuarioID;
                movimiento.FechaRecepcion = DateTime.Now;
                movimiento.FechaModificacion = DateTime.Now;
                Datos.Guardar<MovimientoInventario>(movimiento);
            }

            return new ResAcc();
        }