void PluginBc_CuentasAnuales2ODS::balanceSituacionODS ( CAnuales tipus )
{
    BL_FUNC_DEBUG
    /// Se genera el Balance de Situacion en formato ODS (Hoja de calculo OpenOffice.org).

    /// BUG: Se necesita usar .toQString('.') porque sino los decimales no
    /// aparecen bien en OpenOffice. Creo que es un bug del script de conversion de .py a .ods
    QString archivosalida;
    bool error = false;
    switch ( tipus ) {
    case CAAASL:
        archivosalida = cuentaAnualAsociancionSinLucro ();
        break;

    case CAPGC07:
        archivosalida = cuentaAnualCAPGC07();
        break;

    case CAPYMES08:
        archivosalida = cuentaAnualCAPYMES08();
        break;

    case CAAPGC08:
        archivosalida = cuentaAnualCAAPGC08();
        break;

    case CAPGC08:
        archivosalida = cuentaAnualCAPGC08();
        break;

    default:
        blMsgError ( _ ( "ERROR: Funcion no implementada todavia." ) );
        break;
    }

    QString archivod = g_confpr->value( CONF_DIR_USER ) + "canualesods.py";

    QString cadena = "rm " + g_confpr->value( CONF_DIR_USER ) + "canualesods.ods";
    system ( cadena.toLatin1() );
    cadena = "rm " + archivod;
    system ( cadena.toLatin1() );

    QFile file ( archivod );
    if ( file.open ( QIODevice::WriteOnly ) ) {
        QTextStream stream ( &file );
        stream.setCodec ( "UTF-8" );
        stream << archivosalida.toLatin1();
        file.close();
    } else
        blMsgError ( _ ( "ERROR: No se ha podido crear el archivo" ) );

    cadena = " cd " + g_confpr->value( CONF_DIR_USER ) + "; python " + archivod;
    system ( cadena.toLatin1() );
    cadena = g_confpr->value( CONF_ODS ) + " " + g_confpr->value( CONF_DIR_USER ) + "canualesods.ods &";
    system ( cadena.toLatin1() );
    
}
/**
\param valor
\return
**/
QString BcPlanContableArbol::hojaActual ( QString valor )
{
    BL_FUNC_DEBUG

    QString resultado;
    if ( valor == "saldoant" )
        resultado = hoja->saldoant.toQString ( '.' );
    else if ( valor == "debe" )
        resultado = hoja->debe.toQString ( '.' );
    else if ( valor == "haber" )
        resultado = hoja->haber.toQString ( '.' );
    else if ( valor == "saldo" )
        resultado = hoja->saldo.toQString ( '.' );
    else if ( valor == "debeej" )
        resultado = hoja->debeej.toQString ( '.' );
    else if ( valor == "haberej" )
        resultado = hoja->haberej.toQString ( '.' );
    else if ( valor == "saldoej" )
        resultado = hoja->saldoej.toQString ( '.' );
    else if ( valor == "codigo" )
        resultado = hoja->codigo;
    else if ( valor == "descripcion" )
        resultado = hoja->descripcion;
    else if ( valor == "idcuenta" )
        resultado.setNum ( hoja->idcuenta );
    else {
	blMsgError(QString(_("No se ha encontrado el campo '$1' en la hoja del arbol.")).arg(valor));
	BlDebug::blDebug ( Q_FUNC_INFO, 0, QString(_("No se ha encontrado el campo '%1' en la hoja del arbol.")).arg(valor) );
    } // end if

    
    return resultado;
}
/**
\return
**/
bool PluginBc_CuentasAnuales2ODS::formDatosBalance ( CAnuales tipus )
{
    BL_FUNC_DEBUG
    int resultado;

    datosView *dv = new datosView ( 0 );
    dv->exec();
    resultado = dv->result();

    /// Accepted = 1
    /// Rejected = 0

    if ( resultado != 0 ) {
        /// Asigna valores
        ejercicioActual_fechaBalance = dv->mui_ejercicioActual_fechaBalance->text();
        ejercicioAnterior_fechaBalance = dv->mui_ejercicioAnterior_fechaBalance->text();
    } // end if
    delete dv;

    if ( ejercicioActual_fechaBalance.isEmpty() ) {
        blMsgError ( _ ( "ERROR: Debe introducir una fecha en el balance actual." ) );
        resultado = 0;
    } else {
        if ( ejercicioAnterior_fechaBalance.isEmpty() ) {
            blMsgError ( _ ( "ERROR: Debe introducir una fecha en el balance anterior." ) );
            resultado = 0;
        }
    } // end if

    /// Se pulso el boton 'cancelar'
//     if ( resultado == 0 ) {
//         return;
//     } // end if

    

    return resultado;
}
void PluginBl_Report::elslot2( )
{
    BL_FUNC_DEBUG

    BlForm *ficha = new BlForm ( g_pluginbl_report_emp, 0 );
    if ( !ficha->generateRML ( sender()->objectName() ) ) return;
    
    if (!g_confpr->value( CONF_TICKET_PRINTER_FILE).isEmpty() && g_confpr->value( CONF_TICKET_PRINTER_FILE) != "/dev/null") {
	QString comando = "cat " + g_confpr->value(CONF_DIR_USER) + sender()->objectName() + "  > " + g_confpr->value( CONF_TICKET_PRINTER_FILE );
	system ( comando.toLatin1().data() );
    } else if (!g_confpr->value( CONF_CASHBOX_FILE).isEmpty() && g_confpr->value( CONF_CASHBOX_FILE) != "/dev/null") {
	QString comando = "cat " + g_confpr->value(CONF_DIR_USER) + sender()->objectName() + "  > " + g_confpr->value( CONF_CASHBOX_FILE );
	system ( comando.toLatin1().data() );
    } else if (!g_confpr->value(CONF_CUPS_TICKET_PRINTER).isEmpty() && g_confpr->value(CONF_CUPS_TICKET_PRINTER).toLower() != "none") {
		blRawPrint( sender()->objectName(), true, g_confpr->value( CONF_TICKET_PRINTER_FILE));
    } else if (g_confpr->value(CONF_CUPS_DEFAULT_PRINTER).isEmpty() || g_confpr->value(CONF_CUPS_DEFAULT_PRINTER).toLower() == "none") {
	blMsgError(_("Debe establecer el parametro 'CONF_CUPS_DEFAULT_PRINTER' o 'CONF_CASHBOX_FILE' para abrir el cajon."));
    } else {
		blRawPrint( sender()->objectName());
    } // end if  
}
void PluginBc_CuentasAnuales2ODS::mensajeAdvertenciaPGC ( CAnuales tipus )
{
//Cuentas Anuales Abreviadas Asociacion Sin Lucro CAAASL
//Cuentas Anuales Plan General Contable hasta 2007 CAPGC07
//Cuentas Anuales PYMES 2008 CAPYMES08
//Cuentas Anuales Plan General Contable 2008 CAPGC08
//Cuentas Anuales Abreviadas Plan General Contable 2008 CAAPGC08

    QString pgc;

    switch ( tipus ) {
    case CAAASL:
        pgc = _ ( "Cuentas Anuales Abreviadas para Asociacion Sin Lucro. " );
        break;

    case CAPGC07:
        pgc = _ ( "Cuentas Anuales del Plan General Contable hasta 2007. " );
        break;

    case CAPYMES08:
        pgc = _ ( "Cuentas Anuales para PYMES 2008. " ) ;
        break;

    case CAAPGC08:
        pgc = _ ( "Cuentas Anuales Abreviadas del Plan General Contable 2008. " );
        break;

    case CAPGC08:
        pgc = _ ( "Cuentas Anuales del Plan General Contable 2008. " );
        break;

    default:
        blMsgError ( _ ( "ERROR: Funcion no implementada todavia." ) );
        break;
    }

    blMsgWarning ( _ ( "Advertencia: ha escojido las " ) + pgc + _ ( "El resultado solo sera correcto si coincide con el plan contable de su empresa." ) );
}
/**
\param nombreprograma
**/
BlConfiguration::BlConfiguration ( QString nombreprograma )
{
    /// Definimos los directorios donde buscar primero.
    m_dirGlobalConf = CONFIG_DIR_CONFIG;

    QString mensaje;
    QFile genericGlobalConfFile;
    QFile programGlobalConfFile;
    QFile genericLocalConfFile;
    QFile programLocalConfFile;
    QDir dirGlobalConf ( m_dirGlobalConf );

#ifndef Q_OS_WIN32
    QString userdir = getenv ( "HOME" );
#else
    QString userdir = getenv ( "UserProfile" );
    userdir.replace('\\', '/'); // Para no tener barras de los dos tipos mezclados en la misma ruta, usaremos las normales siempre
#endif

    m_dirLocalConf = userdir + "/.bulmages/";
    m_genericGlobalConfFile = "bulmages.conf";
    m_programGlobalConfFile = nombreprograma + ".conf";
    m_genericLocalConfFile = m_genericGlobalConfFile;
    m_programLocalConfFile = m_programGlobalConfFile;

	/// Establecemos los valores por defecto, que luego la propia configuracion puede sobreescribir.
    setValue ( CONF_DIR_USER, m_dirLocalConf );
    setValue ( CONF_PRIVILEGIOS_USUARIO, "1" );
    setValue ( CONF_LOGIN_USER, "" );
    setValue ( CONF_PASSWORD_USER, "" );
	
	
    /// Comprobamos la existencia de los directorios y archivos de configuracion.
    /// Directorios y archivos obligatorios (sale si no existe):
    if ( !dirGlobalConf.exists() ) {
        blMsgError("El directorio '" + m_dirGlobalConf + "' no existe. Debe crearlo");
        exit ( -1 );
    } else {
        if ( !genericGlobalConfFile.exists ( m_dirGlobalConf + m_genericGlobalConfFile ) ) {
	    blMsgError("El archivo '" + m_dirGlobalConf + m_genericGlobalConfFile + "' no existe. Debe crearlo.");
            exit ( -1 );
        } else {
            /// 1) Leemos la configuracion del archivo generico global.
#ifdef CONFIG_DEBUG
            mensaje = "--> Leyendo el archivo '" + m_dirGlobalConf + m_genericGlobalConfFile + "'<--\n";
            fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
            readConfig ( m_dirGlobalConf + m_genericGlobalConfFile );
        }// end if
    } // end if

    /// Directorios y archivos opcionales:
    if ( !programGlobalConfFile.exists ( m_dirGlobalConf + m_programGlobalConfFile ) ) {
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirGlobalConf + m_programGlobalConfFile + "' no existe. <--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
    } else {
        /// 2) Leemos la configuracion del archivo especifico global.
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirGlobalConf + m_programGlobalConfFile + "' existe. Se va a leer.<--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
        readConfig ( m_dirGlobalConf + m_programGlobalConfFile );
    }// end if

    /// Comprobamos si el usuario tiene creado el directorio de configuracion en su carpeta de usuario directorio
    /// de configuracion.
    if ( !dirGlobalConf.exists ( m_dirLocalConf ) ) {
        if ( dirGlobalConf.mkdir ( m_dirLocalConf ) == true ) {
#ifdef CONFIG_DEBUG
            mensaje = "--> Se ha creado el directorio '" + m_dirLocalConf + "'. <--\n";
            fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
        } else {
	    blMsgError( "No se ha podido crear el directorio '" + m_dirLocalConf + "'.");
            exit ( -1 );
        }// end if
    } // end if

    if ( !genericLocalConfFile.exists ( m_dirLocalConf + m_genericLocalConfFile ) ) {
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirLocalConf + m_genericLocalConfFile + "' no existe. <--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
    } else {
        /// 3) Leemos la configuracion del archivo generico local.
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirLocalConf + m_genericLocalConfFile + "' existe. Se va a leer.<--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
        readConfig ( m_dirLocalConf + m_genericLocalConfFile );
    }// end if

    if ( !programLocalConfFile.exists ( m_dirLocalConf + m_programLocalConfFile ) ) {
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirLocalConf + m_programLocalConfFile + "' no existe. <--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
    } else {
        /// 4) Leemos la configuracion del archivo especifico local.
#ifdef CONFIG_DEBUG
        mensaje = "--> El archivo '" + m_dirLocalConf + m_programLocalConfFile + "' existe. Se va a leer.<--\n";
        fprintf ( stderr, "%s", mensaje.toLatin1().constData() );
#endif
        readConfig ( m_dirLocalConf + m_programLocalConfFile );
    }// end if
}