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()); }
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()); } }
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(); }
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); } }
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(); }