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