/// <summary>
        /// Función utilizada para validar la fila del detalle del inventario
        /// </summary>
        /// <returns></returns>
        public string funValidarFila()
        {
            string varMensaje = "";

            //Validamos si la fila no tiene errores o inconsistencias
            if (DetComentario.Trim().Length > 50)
            {
                return(varMensaje = string.Format("Error en el campo comentario en la linea {0} sobrepasa los 50 caracteres permitidos", DetSecuencia));
            }
            if (DetReferencia1.Trim().Length > 100)
            {
                return(varMensaje = string.Format("Error en el campo referencia 1 en la linea {0} sobrepasa los 100 caracteres permitidos", DetSecuencia));
            }
            if (DetReferencia2.Trim().Length > 100)
            {
                return(varMensaje = string.Format("Error en el campo referencia 2 en la linea {0} sobrepasa los 100 caracteres permitidos", DetSecuencia));
            }
            if (DetDebe > 0 && DetHaber > 0)
            {
                return(varMensaje = string.Format("Error en el campo debe y haber en la linea {0} no puede tener ambos campos valores mayores a cero", DetSecuencia));
            }
            if (!CueCodigo.Equals("") && CueNombre.Equals(""))
            {
                return(varMensaje = string.Format("Error en el campo cuenta contable en la linea {0} la cuenta no existe", DetSecuencia));
            }
            if (!CcoCodigo.Equals("") && CcoNombre.Equals(""))
            {
                return(varMensaje = string.Format("Error en el campo centro de costo en la linea {0} el centro de costo no existe", DetSecuencia));
            }
            return(varMensaje);
        }
Beispiel #2
0
        public string funEnviarSalMercanciaSAP()
        {
            try {
                string mError = "";
                int    iError = 0;
                int    i      = 0;
                //Realizamos la conexion a SAP
                csAccesoDatos.proIniciarSesionSAP();
                //Verificamos si el documento ya se encuentra en SAP
                DataTable dtInventarioSAP = funVerificarSalInventarioSAP(DocNombre, CabNumero);
                if (dtInventarioSAP.Rows.Count > 0)
                {
                    //Recuperamos en las variables los valores de SAP
                    CabDocEntrySAP = int.Parse(dtInventarioSAP.Rows[0]["DocEntry"].ToString());
                    CabNumeroSAP   = int.Parse(dtInventarioSAP.Rows[0]["DocNum"].ToString());
                    //Actualizamos en el movimiento los datos de SAP
                    proActMovInventarioSalida(CabDocEntrySAP, CabNumeroSAP, CabCodigo);
                    return(mError);
                }
                else
                {
                    //Instanciamos la variable con el objeto de SAP Salida de mercancias
                    SAPbobsCOM.Documents varOIGE = csConexionSap.objConexionSap.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInventoryGenExit);

                    varOIGE.Series           = clsSegDocumento.funRecNumSerieSAPSalida(DocCodigo);                          //Serie
                    varOIGE.DocDate          = (DateTime)CabFecha;                                                          //Fecha de contabilización
                    varOIGE.TaxDate          = (DateTime)CabFecha;                                                          //Fecha de documento
                    varOIGE.Comments         = CabComentario;                                                               //Comentarios
                    varOIGE.JournalMemo      = DocNombre + "-" + CabNumero + " " + CabComenDiario;                          //Comentario asiento contable
                    varOIGE.PaymentGroupCode = -2;                                                                          //Lista de precios (Ultimo precio determinado)
                    //Valores del codigo y nombre del movimiento
                    varOIGE.UserFields.Fields.Item("U_Ita_codmovimiento").Value = IdMotivo.ToString();                      //Codigo movimiento
                    varOIGE.UserFields.Fields.Item("U_Ita_movimiento").Value    = Motivo;                                   //Movimientos
                    //Valores de la auditoria del sistema umbrella
                    varOIGE.UserFields.Fields.Item("U_Ita_sysusuario").Value   = clsVariablesGlobales.varCodUsuario;        //Usuario del sistema umbrella
                    varOIGE.UserFields.Fields.Item("U_Ita_sysfecha").Value     = DateTime.Now.ToString("dd/MM/yyyy HH:mm"); //Fecha del sistema umbrella
                    varOIGE.UserFields.Fields.Item("U_Ita_sysip").Value        = clsVariablesGlobales.varIpMaquina;         //Ip del sistema umbrella
                    varOIGE.UserFields.Fields.Item("U_Ita_sysdocumento").Value = DocNombre;                                 //Documento del sistema umbrella
                    varOIGE.UserFields.Fields.Item("U_Ita_sysnumero").Value    = CabNumero.ToString();                      //Numero del sistema umbrella
                    //Recuperamos informacion de los detalles del movimiento
                    List <clsInvMovimientoDet> objDetalle = new List <clsInvMovimientoDet>();
                    clsInvMovimientoDet.proListar(CabCodigo, out objDetalle);
                    //Recorremos los detalles del movimiento
                    foreach (clsInvMovimientoDet objFilaDetalle in objDetalle)
                    {
                        //En caso de que la variable i se ha mayor a cero se debe agregar una nueva linea
                        if (!i.Equals(0))
                        {
                            varOIGE.Lines.Add();
                        }
                        varOIGE.Lines.SetCurrentLine(i);
                        varOIGE.Lines.WarehouseCode   = BodCodigo;                //Almacen
                        varOIGE.Lines.ItemCode        = objFilaDetalle.IteCodigo; //Código
                        varOIGE.Lines.ItemDescription = objFilaDetalle.IteNombre; //Descripción
                        //Informacion de la chapeta en caso de que sea requerido la chapeta/lote
                        if (objFilaDetalle.DetIdDestino != null)
                        {
                            if (objFilaDetalle.DetTipDestino.Equals("A"))
                            {
                                varOIGE.Lines.UserFields.Fields.Item("U_Ita_arete").Value = objFilaDetalle.DetIdDestino;                                          //Arete
                            }
                            else if (objFilaDetalle.DetTipDestino.Equals("L"))
                            {
                                varOIGE.Lines.UserFields.Fields.Item("U_Ita_lote").Value = objFilaDetalle.DetIdDestino;                                               //Lote
                            }
                        }
                        //Informacion de los valores del detalle
                        varOIGE.Lines.Quantity    = double.Parse(objFilaDetalle.DetCantidad.ToString()); //Cantidad
                        varOIGE.Lines.AccountCode = CtaContable;                                         //Compensación de stocks reducir cuenta
                        //Verificamos si tiene centro de costo
                        if (!CcoCodigo.Equals(""))
                        {
                            varOIGE.Lines.CostingCode = CcoCodigo.Substring(0, 2);                      //Centro de responsabilidad
                        }
                        if (!CcoCodigo.Equals(""))
                        {
                            varOIGE.Lines.CostingCode2 = CcoCodigo.Substring(0, 3);                       //Centro de actividad
                        }
                        if (!CcoCodigo.Equals(""))
                        {
                            varOIGE.Lines.CostingCode3 = CcoCodigo;                       //Centro de costo
                        }
                        //Verificamos si tiene proyecto
                        if (!PryCodigo.Equals(""))
                        {
                            varOIGE.Lines.ProjectCode = PryCodigo; //Proyecto
                        }
                        int j = 0;                                 //Variable utilizada para los lotes
                        //Verificamos si el item requiere lote
                        if (objFilaDetalle.IteTieLote.ToUpper().Equals("Y"))
                        {
                            //Recuperamos la informacion de los lotes segun el item y la bodega
                            DataTable dtLote      = clsInvItem.funRecLote(objFilaDetalle.IteCodigo, BodCodigo);
                            double    varSaldo    = dtLote.Rows.Count.Equals(0) ? 0 : double.Parse(dtLote.Compute("Sum(StkDisponible)", "").ToString());
                            double    varCantidad = double.Parse(objFilaDetalle.DetCantidad.ToString());
                            //Verificamos si el saldo del item no cae en negativo con respecto a lo que se necesita
                            if (varCantidad > varSaldo)
                            {
                                throw new Exception(string.Format("El Item {0} - {1} tiene un saldo de {2} y lo requerido es {3}", objFilaDetalle.IteCodigo, objFilaDetalle.IteNombre, varSaldo, varCantidad));
                            }
                            //Recorremos los lotes disponibles hasta cumplir con la candidad deseada
                            foreach (DataRow drLote in dtLote.Rows)
                            {
                                string varLotCodigo     = drLote["LotCodigo"].ToString();                   //Recuperamos el codigo del lote
                                double varStkDisponible = double.Parse(drLote["StkDisponible"].ToString()); //Recuperamos la cantidad disponible de ese lote
                                //Agragamos una nueva linea de Lote
                                if (j > 0)
                                {
                                    varOIGE.Lines.BatchNumbers.Add();
                                }
                                varOIGE.Lines.BatchNumbers.SetCurrentLine(j);          //Nos posicionamos en la linea del lote recien creada
                                varOIGE.Lines.BatchNumbers.BatchNumber = varLotCodigo; //Codigo del lote que vamos a utilizar
                                //Validamos si la cantidad que dispone el lote seleccionado es suficiente para la cantidad requerida
                                if (varCantidad <= varStkDisponible)
                                {
                                    varOIGE.Lines.BatchNumbers.Quantity = varCantidad;
                                    break;
                                }
                                else
                                {
                                    varOIGE.Lines.BatchNumbers.Quantity = varStkDisponible;
                                    varCantidad -= varStkDisponible;
                                    j++; //Secuencial utilizado para las lineas del lote
                                }
                            }
                        }
                        i++; //Secuencial utilizado para las lineas del detalle
                    }
                    iError = varOIGE.Add();
                    if (!iError.Equals(0))
                    {
                        csConexionSap.objConexionSap.GetLastError(out iError, out mError);
                        return(mError);
                    }
                    else
                    {
                        int varDocEntrySAPSalida = 0;
                        int.TryParse(csConexionSap.objConexionSap.GetNewObjectKey().ToString(), out varDocEntrySAPSalida);
                        varOIGE.GetByKey(varDocEntrySAPSalida);
                        int varDocNumSAPSalida = varOIGE.DocNum;
                        //Actualizamos los costos de los movimientoes de inventario
                        proActCstAcumulado(varDocEntrySAPSalida, CabCodigo);
                        //Actualizamos en el movimiento los datos de SAP
                        proActMovInventarioSalida(varDocEntrySAPSalida, varDocNumSAPSalida, CabCodigo);
                        return(mError);
                    }
                }
            }
            catch (Exception e) { throw new Exception(e.Message); }
            finally { csAccesoDatos.proFinalizarSesionSAP(); }
        }