private bool ValidarObtenerNumeroContab(DateTime dFecha, int nCiaContab, string sTipoAsiento, out string sMensajeError) { // esta función valida que un número de asiento contable pueda ser obtenido en forma normal. En // particular, es importante para asientos que correspondan a contabilidades cuyo número se obtiene // en base al tipo del asiento; para estos casos, si el tipo no tiene un grupo asociado en la tabla // tGruposDeTiposDeAsiento, el número Contab para el asiento NO PODRÁ ser obtenido en forma // adecuada. // Esta función debe ser ejecutada para que efectúe la validación mencionada ANTES de intentar // grabar un asiento, aunque éste tenga un número Contab negativo. Pues luego, cuando se intente // obtener su número Contab definitivo, el proceso fallará. sMensajeError = ""; // antes que nada, nos aseguramos que el tipo de asiento exista int nRecCount = (from ta in _dbContab.TiposDeAsientos where ta.Tipo == sTipoAsiento select ta).Count(); if (nRecCount == 0) { sMensajeError = "El tipo de asiento asociado al asiento contable no fue encontrado en Contab."; return(false); } int nMesCalendario = dFecha.Month; int nAnoCalendario = dFecha.Year; // determinamos si el número se genera de acuerdo al tipo bool?bNumeracionSeparadaPorTipo = (from par in _dbContab.ParametrosContabs where par.Cia == nCiaContab select par.NumeracionAsientosSeparadaFlag).FirstOrDefault(); if (bNumeracionSeparadaPorTipo == null) { sMensajeError = " ... aparentemente, no se ha definido si la numeración de los asientos es o no separada de acuerdo a su tipo.<br /><br />" + "Por favor abra la tabla <i>Parámetros</i> en <i>Contab</i> y defina un valor para este item."; return(false); } if (bNumeracionSeparadaPorTipo.Value) { // NOTESE que NO VALIDAMOS los casos en los cuales la númeración NO ES por tipo de asiento; // ASUMIMOS que, para estos casos, el número podrá ser obtenido en forma normal. // leemos el grupo de la tabla TiposDeAsiento // leemos el número del asiento de la tabla AsientosIdPorGrupo int?nGrupo = (from t in _dbContab.TiposDeAsientos where t.Tipo == sTipoAsiento select t.Grupo).FirstOrDefault(); if (nGrupo == null) { sMensajeError = " ... aparentemente, no se ha definido el Grupo que corresponde al tipo de asientos que Ud. ha indicado para el asiento contable.<br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo (según está ahora definido en el sistema <i>Contab</i>), cada tipo debe corresponder a un grupo.<br />" + "Por favor abra la tabla <i>Tipos de Asiento</i> en <i>Contab</i> y defina un valor para este item."; return(false); } AsientosIdPorGrupo MyAsientosIdPorGrupo = (from aidg in _dbContab.AsientosIdPorGrupos where aidg.Mes == nMesCalendario && aidg.Ano == nAnoCalendario && aidg.Grupo == nGrupo.Value && aidg.Cia == nCiaContab select aidg).SingleOrDefault(); if (MyAsientosIdPorGrupo == null) { // no existe un registro en la tabla para el mes, año y cia. Buscamos el número INICIAL // en la tabla tGruposDeTiposDeAsiento var MyGrupoTipoAsiento = (from g in _dbContab.tGruposDeTiposDeAsientos where g.Grupo == nGrupo select g).FirstOrDefault(); if (MyGrupoTipoAsiento == null || MyGrupoTipoAsiento.NumeroInicial == null) { sMensajeError = " ... aparentemente, no se ha definido el Grupo que corresponde al tipo de asientos que Ud. ha indicado para el asiento contable.<br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo (según está ahora definido en el sistema <i>Contab</i>), cada tipo debe corresponder a un grupo.<br />" + "Por favor abra la tabla <i>Tipos de Asiento</i> en <i>Contab</i> y defina un valor para este item;<br />" + "o, abra la tabla <i>Grupos de tipos de asiento</i> y defina un grupo y un número de inicio para este grupo."; return(false); } } } return(true); }
private bool ObtenerNumeroContab(DateTime dFecha, int nCiaContab, string sTipoAsiento, out string sMensajeError, out int nNumeroContab) { // esta función determina y regresa un número de asiento Contab. Nótese que el número determinado // depende de si se genera por grupos de tipo o no. Esto lo determina un flag en ParametrosContab: // NumeracionAsientosSeparadaFlag. sMensajeError = ""; nNumeroContab = 0; int nMesCalendario = dFecha.Month; int nAnoCalendario = dFecha.Year; // lo primero que hacemos es determinar si el número se genera de acuerdo al tipo bool?bNumeracionSeparadaPorTipo = (from par in _dbContab.ParametrosContabs where par.Cia == nCiaContab select par.NumeracionAsientosSeparadaFlag).FirstOrDefault(); if (bNumeracionSeparadaPorTipo == null) { sMensajeError = " ... aparentemente, no se ha definido si la numeración de los asientos es o no separada de acuerdo a su tipo.<br /><br />" + "Por favor abra la tabla <i>Parámetros</i> en <i>Contab</i> y defina un valor para este item."; return(false); } if (!bNumeracionSeparadaPorTipo.Value) { // la númeración NO ES separada de acuerdo al tipo del asiento. La determinación del número // es más simple // leemos el número del asiento de la tabla AsientosId AsientosId MyAsientosId = (from aid in _dbContab.AsientosIds where aid.Mes == nMesCalendario && aid.Ano == nAnoCalendario && aid.Cia == nCiaContab select aid).SingleOrDefault(); if (MyAsientosId == null) { // no existe un registro en la tabla para el mes, año y cia. Lo creamos y asumimos 1 // como número nNumeroContab = 1; AsientosId MyAsientosId_Nuevo = new AsientosId(); MyAsientosId_Nuevo.Mes = Convert.ToInt16(nMesCalendario); MyAsientosId_Nuevo.Ano = Convert.ToInt16(nAnoCalendario); MyAsientosId_Nuevo.Cia = nCiaContab; MyAsientosId_Nuevo.Numero = 2; _dbContab.AsientosIds.InsertOnSubmit(MyAsientosId_Nuevo); } else { nNumeroContab = MyAsientosId.Numero; MyAsientosId.Numero += 1; } } else { // leemos el grupo de la tabla TiposDeAsiento // leemos el número del asiento de la tabla AsientosIdPorGrupo int?nGrupo = (from t in _dbContab.TiposDeAsientos where t.Tipo == sTipoAsiento select t.Grupo).FirstOrDefault(); if (nGrupo == null) { sMensajeError = " ... aparentemente, no se ha definido el Grupo que corresponde al tipo de asientos que Ud. ha indicado para el asiento contable.<br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo (según está ahora definido en el sistema <i>Contab</i>), cada tipo debe corresponder a un grupo.<br />" + "Por favor abra la tabla <i>Tipos de Asiento</i> en <i>Contab</i> y defina un valor para este item."; return(false); } AsientosIdPorGrupo MyAsientosIdPorGrupo = (from aidg in _dbContab.AsientosIdPorGrupos where aidg.Mes == nMesCalendario && aidg.Ano == nAnoCalendario && aidg.Grupo == nGrupo.Value && aidg.Cia == nCiaContab select aidg).SingleOrDefault(); if (MyAsientosIdPorGrupo == null) { // no existe un registro en la tabla para el mes, año y cia. Buscamos el número INICIAL // en la tabla tGruposDeTiposDeAsiento var MyGrupoTipoAsiento = (from g in _dbContab.tGruposDeTiposDeAsientos where g.Grupo == nGrupo select g).FirstOrDefault(); if (MyGrupoTipoAsiento == null || MyGrupoTipoAsiento.NumeroInicial == null) { sMensajeError = " ... aparentemente, no se ha definido el Grupo que corresponde al tipo de asientos que Ud. ha indicado para el asiento contable.<br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo (según está ahora definido en el sistema <i>Contab</i>), cada tipo debe corresponder a un grupo.<br />" + "Por favor abra la tabla <i>Tipos de Asiento</i> en <i>Contab</i> y defina un valor para este item;<br />" + "o, abra la tabla <i>Grupos de tipos de asiento</i> y defina un grupo y un número de inicio para este grupo."; return(false); } nNumeroContab = MyGrupoTipoAsiento.NumeroInicial; AsientosIdPorGrupo MyAsientosIdPorGrupo_Nuevo = new AsientosIdPorGrupo(); MyAsientosIdPorGrupo_Nuevo.Mes = Convert.ToInt16(nMesCalendario); MyAsientosIdPorGrupo_Nuevo.Ano = Convert.ToInt16(nAnoCalendario); MyAsientosIdPorGrupo_Nuevo.Grupo = nGrupo.Value; MyAsientosIdPorGrupo_Nuevo.Cia = nCiaContab; MyAsientosIdPorGrupo_Nuevo.Numero = MyGrupoTipoAsiento.NumeroInicial + 1; _dbContab.AsientosIdPorGrupos.InsertOnSubmit(MyAsientosIdPorGrupo_Nuevo); } else { nNumeroContab = MyAsientosIdPorGrupo.Numero.Value; MyAsientosIdPorGrupo.Numero += 1; } } try { _dbContab.SubmitChanges(); } catch (Exception ex) { sMensajeError = " ... hemos obtenido un error al intentar efectuar una operación en la base de datos.<br />" + "El mensaje específico de error es: <br /><br />" + ex.Message; return(false); } return(true); }
public bool ObtenerNumeroAsientoContab(DateTime fechaAsiento, int ciaContab, string tipoAsiento, out short numeroAsientoContab, out string errorMessage) { // esta función determina y regresa un número de asiento Contab. Nótese que el número determinado // depende de si se genera por grupos de tipo o no. Esto lo determina un flag en ParametrosContab: // NumeracionAsientosSeparadaFlag. // nótese como, lamentablemente, tenemos que crear aquí un nuevo context, pues vamos a actualizar AsientosID // cada vez que ejecutemos la función; esto evitará que se generen números duplicados si otros usuarios // graban asientos contables en forma simultanea a la ejecución de esta función ... dbContab_Contab_Entities context = new dbContab_Contab_Entities(); errorMessage = ""; numeroAsientoContab = 0; short nMesCalendario = (short)fechaAsiento.Month; short nAnoCalendario = (short)fechaAsiento.Year; Compania companiaContab = context.Companias.Where(c => c.Numero == ciaContab).FirstOrDefault(); if (companiaContab == null) { errorMessage = " ... error inesperado: no pudimos leer la compañía Contab asociada al " + "asiento contable."; return(false); } if (companiaContab.ParametrosContab == null) { errorMessage = " ... error inesperado: no pudimos leer los parámetros de la compañía Contab " + "en la tabla Parametros Contab."; return(false); } // lo primero que hacemos es determinar si el número se genera de acuerdo al tipo bool?bNumeracionSeparadaPorTipo = companiaContab.ParametrosContab.NumeracionAsientosSeparadaFlag; if (bNumeracionSeparadaPorTipo == null) { errorMessage = "Error: aparentemente, no se ha definido si la numeración de los asientos es o " + "no separada de acuerdo a su tipo.<br /><br />" + "Por favor abra la tabla 'Parámetros' en Contab y defina un valor para este item."; return(false); } if (!bNumeracionSeparadaPorTipo.Value) { // la númeración NO ES separada de acuerdo al tipo del asiento. La determinación del número // es más simple // leemos el número del asiento de la tabla AsientosId AsientosId MyAsientosId = context.AsientosIds.Where(a => a.Mes == nMesCalendario && a.Ano == nAnoCalendario && a.Cia == ciaContab).FirstOrDefault(); if (MyAsientosId == null) { // no existe un registro en la tabla para el mes, año y cia. Lo creamos y asumimos 1 // como número numeroAsientoContab = 1; AsientosId MyAsientosId_Nuevo = new AsientosId(); MyAsientosId_Nuevo.Mes = Convert.ToInt16(nMesCalendario); MyAsientosId_Nuevo.Ano = Convert.ToInt16(nAnoCalendario); MyAsientosId_Nuevo.Cia = ciaContab; MyAsientosId_Nuevo.Numero = 2; context.AsientosIds.AddObject(MyAsientosId_Nuevo); } else { numeroAsientoContab = (short)MyAsientosId.Numero; MyAsientosId.Numero += 1; } } else { // leemos el grupo de la tabla TiposDeAsiento // leemos el número del asiento de la tabla AsientosIdPorGrupo TiposDeAsiento tipoAsientoContable = (from t in context.TiposDeAsientoes where t.Tipo == tipoAsiento select t).FirstOrDefault(); if (tipoAsientoContable.tGruposDeTiposDeAsiento == null) { errorMessage = "Error: aparentemente, no se ha definido el Grupo que corresponde al tipo " + "de asientos que Ud. ha indicado para el asiento contable.<br /><br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo " + "(según está ahora definido en el sistema Contab), cada tipo debe corresponder " + "a un grupo.<br /><br />" + "Por favor abra la tabla Tipos de Asiento en Contab y " + "defina un valor para este item."; return(false); } AsientosIdPorGrupo MyAsientosIdPorGrupo = (from aidg in context.AsientosIdPorGrupoes where aidg.Mes == nMesCalendario && aidg.Ano == nAnoCalendario && aidg.Grupo == tipoAsientoContable.tGruposDeTiposDeAsiento.Grupo && aidg.Cia == ciaContab select aidg).SingleOrDefault(); if (MyAsientosIdPorGrupo == null) { // no existe un registro en la tabla para el mes, año y cia. Buscamos el número INICIAL // en la tabla tGruposDeTiposDeAsiento var MyGrupoTipoAsiento = (from g in context.tGruposDeTiposDeAsientoes where g.Grupo == tipoAsientoContable.tGruposDeTiposDeAsiento.Grupo select g).FirstOrDefault(); if (MyGrupoTipoAsiento == null || MyGrupoTipoAsiento.NumeroInicial == null) { errorMessage = "Error: aparentemente, no se ha definido el Grupo que corresponde al " + "tipo de asientos que Ud. ha indicado para el asiento contable.<br /><br />" + "Como la numeración de los asientos contables es separada de acuerdo a su tipo " + "(según está ahora definido en el sistema Contab), cada tipo debe " + "corresponder a un grupo.<br /><br />" + "Por favor abra la tabla Tipos de Asiento en Contab y " + "defina un valor para este item;<br /><br />" + "o, abra la tabla Grupos de Tipos de Asiento y defina un grupo y un " + "número de inicio para este grupo."; return(false); } numeroAsientoContab = (short)MyGrupoTipoAsiento.NumeroInicial; // nótese como usamos un nuevo context, para no interferir con la operación que llama este // método (ie: Inserting) AsientosIdPorGrupo MyAsientosIdPorGrupo_Nuevo = new AsientosIdPorGrupo(); MyAsientosIdPorGrupo_Nuevo.Mes = Convert.ToInt16(nMesCalendario); MyAsientosIdPorGrupo_Nuevo.Ano = Convert.ToInt16(nAnoCalendario); MyAsientosIdPorGrupo_Nuevo.Grupo = tipoAsientoContable.tGruposDeTiposDeAsiento.Grupo; MyAsientosIdPorGrupo_Nuevo.Cia = ciaContab; MyAsientosIdPorGrupo_Nuevo.Numero = MyGrupoTipoAsiento.NumeroInicial + 1; context.AsientosIdPorGrupoes.AddObject(MyAsientosIdPorGrupo); } else { numeroAsientoContab = (short)MyAsientosIdPorGrupo.Numero.Value; MyAsientosIdPorGrupo.Numero += 1; } } try { context.SaveChanges(); } catch (Exception ex) { errorMessage = "Error: hemos obtenido un error al intentar efectuar una operación en la " + "base de datos.<br /><br />" + "El mensaje específico de error es: <br /><br />" + ex.Message; if (ex.InnerException != null) { errorMessage += ex.InnerException.Message; } context = null; return(false); } context = null; return(true); }