<?php

/*
 * Servicio que genera los movimientos para inversiones
 * segun el archivo de lectura
 */

/*
 * definir variables globales
 */
$id_cia = 1;
$id_cen_op = 16;

//variables por defecto control CAD 
$id_cad = 0;
$id_tipo_comprobante = 0;
$vigencia = 0;
$id_periodo_contable = 0;

//variables por defecto documentos
$id_td = 0;
$id_mae_ter = 'null';
$descr_mto = 'null';
$doc_soporte = 'null';


/*
 * obtener id tipo de comprobante para el codigo 69
 */

//sentencia sql
$sql = <<<EOD
select * from CN_TIPO_COMPROBANTE
where NOM_CORTO = 69
and ID_CIA = $id_cia
EOD;

//ejecutar sql
//$records = CN_TABLE::executeSQL($sql);
$records = executeList_SQL($sql);

//validar id tipo comprobante
if (count($records) > 0) {
    $id_tipo_comprobante = $records[0]['ID_TIPO_COMPROBANTE'];
//    echo "Id comprobante: " . $id_tipo_comprobante . "<br>";
} else {
    echo "No se encontro id comprobante.<br>";
    exit;
}


/*
 * obtener id tipo de documento para el codigo ???
 */
//sentencia sql
$sql = <<<EOD
select * from CN_TD
where COD_TD = 1
EOD;

//ejecutar sql
//$records = CN_TABLE::executeSQL($sql);
$records = executeList_SQL($sql);

//validar id tipo comprobante
if (count($records) > 0) {
    $id_td = $records[0]['ID_TD'];
//    echo "Id TD: " . $id_td . "<br>";
} else {
    echo "No se encontro id tipo documento.<br>";
    exit;
}

//echo "*****<br>";

/*
 * leer archivo y obtener array de las filas
 */
//falta modificar el nombre y ruta del archivo para que tome la fecha anterior, del cual se genero el archivo desde inversiones
/*
 * fecha de ayer
 * date("d-m-Y",time()-86400);
 */
$nombre_fichero = "/home/lavila/Escritorio/ejemplo20110831.csv";
$datos_archivo = leer_archivo($nombre_fichero);
//echo var_dump($datos_archivo);

/*
 * recorrer las filas del archivo y generar movimientos
 */

foreach ($datos_archivo as $fila) {

    /*
     * valores de la fila
     */
    $fecha_cad = $fecha = $fila[0];
    $portafolio = $fila[1];
    $valor = $fila[2];

//    echo "<br>" . $fecha . "<br>";
    //prevenir si ocurre un error
    try {

        //identificar vigencia y periodo por la fecha
        //parte el parametro por espacios
        $datos_fecha = preg_split('/-/', $fecha);
        if (!is_null($datos_fecha)) {

            //obtener datos de la fecha
            $vigencia = $anyo = $datos_fecha[0];
            $id_periodo_contable = $mes = $datos_fecha[1];
            $dia = $datos_fecha[2];
            echo "fecha: " . $anyo . "-" . $mes . "-" . $dia . "<br>";
        } else {
            die();
        }

        /*
         * validar año y crear
         */

        //consultar vigencia si existe
        $sql = <<<EOD
    select * from CN_VIGENCIA
    where ID_VIGENCIA = $vigencia
EOD;

        //ejecutar sql
//                  $records = CN_TABLE::executeSQL($sql);
        $records = executeList_SQL($sql);

        //validar si existe vigencia
        if (count($records) == 0) {

            //insertar vigencia nueva
            $sql = <<<EOD
     INSERT INTO CN_VIGENCIA VALUES ( $vigencia )
EOD;
            //ejecuta sql
            $exito = executeAdd_SQL($sql);
        } else {
//            echo "existe la vigencia: " . $vigencia . "<br>";
        }
//        echo "*****<br>";


        /*
         * validar si existe este tipo de cad, si ya esta pasar a documento
         */
        //llamar metodo existe cad, retorna  0 si no se creo
        $id_cad = existe_cad($vigencia, $id_cen_op, $id_cia, $id_periodo_contable, $id_tipo_comprobante, $fecha_cad);
        if ($id_cad != 0) {

            //llamar al metodo de crear documento
            crear_documento($id_cad, $vigencia, $id_cen_op, $id_cia, $id_td, $id_mae_ter, $descr_mto, $doc_soporte, $fecha_cad, $portafolio, $valor);
        } else {

            //crea el cad y obtiene el id del cad creado
            $id_cad = crear_cad($vigencia, $id_cen_op, $id_cia, $id_periodo_contable, $id_tipo_comprobante, $fecha_cad);

            //validar si fue creado el CAD
            if ($id_cad != 0) {

                //llamar al metodo de crear documento
                crear_documento($id_cad, $vigencia, $id_cen_op, $id_cia, $id_td, $id_mae_ter, $descr_mto, $doc_soporte, $fecha_cad, $portafolio, $valor);
            } else {
                echo "No pudo ser creado el CAD.<br>";
                exit;
            }
        }
    } catch (Exception $e) {
        //salida del error
        echo "Exception: " . $e;
    }
}



/*
 * Funciones del servicio
 */

/**
 * Metodo para leer un archivo linea por linea, y ssepara cada una por ;
 *
 * @param <type> $nombre_fichero 
 */
function leer_archivo($nombre_fichero) {

    //lee el archivo por la ruta de entrada
    $handle = fopen($nombre_fichero, "rw");


    //Leemos linea por linea el contenido del archivo
//    while ($linea = fgets($handle, 1024)) {
//
//        echo var_dump($linea);
//    }
//    die();
//    $linea = fread($handle, filesize($nombre_fichero));
//    print_r($linea);
//    die();
//    echo var_dump($linea);
//    die();

    $expression = array();
    while (( $data = fgetcsv($handle, 1000, ";")) !== FALSE) { // Mientras hay líneas que leer...
        $i = 0;
        $expression[] = $data; //guarda cada array de la fila en el array principal
        foreach ($data as $row) {

//            echo "Campo $i: $row<br>"; // Muestra todos los campos de la fila actual
            $i++;
        }

//        echo "*****<br>";
    }
    fclose($handle);

//    echo var_dump($expression) . "<br>";

    return $expression;
}

/**
 *
 * @param <type> $vigencia
 * @param <type> $id_cen_op
 * @param <type> $id_cia
 * @param <type> $id_periodo_contable
 * @return int
 */
function existe_cad($vigencia, $id_cen_op, $id_cia, $id_periodo_contable, $id_tipo_comprobante, $fecha_cad) {

    $id_cad = 0;

    //sentencia sql existe cad
    $sql = <<<EOD
select * from CN_CONTROL_CAD
where ID_VIGENCIA = $vigencia
and ID_CEN_OP = $id_cen_op
and ID_CIA = $id_cia
and ID_PERIODO_CONTABLE = $id_periodo_contable
and ID_TIPO_COMPROBANTE = $id_tipo_comprobante
and FECHA_CAD = to_date('$fecha_cad', 'yyyy/mm/dd')
EOD;

    //ejecutar sql
//    $records = CN_TABLE::executeSQL($sql);
    $records = executeList_SQL($sql);

    //validar id cad
    if (count($records) > 0) {
        $id_cad = $records[0]['ID_CAD'];
        echo "Id CAD: " . $id_cad . "<br>";
    } else {
        echo "No existe el CAD<br>";
    }

    echo "*****<br>";

    return $id_cad;
}

/**
 * Metodo para crear un nuevo cad
 * retorna el id del cad creado
 *
 * @param <type> $vigencia
 * @param <type> $id_cen_op
 * @param <type> $id_cia
 * @param <type> $id_periodo_contable
 * @return int 
 */
function crear_cad($vigencia, $id_cen_op, $id_cia, $id_periodo_contable, $id_tipo_comprobante, $fecha_cad) {

    $id_cad = 0;

    //optener el numero de secuencia
    $sql = <<<EOD
    select * from CN_TABLE_VIG_SEQ
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_CONTROL_CAD'
EOD;

    //ejecuta sql
    $seq = executeList_SQL($sql);

    //validar seq
    if (count($seq) > 0) {
        $secuencia = $seq[0]['SEQ'] + 1;
//        echo "secuencia: ant - " . $seq[0]['SEQ'] . " act - " . $secuencia . "<br>";
    } else {
        echo "No existe una secuencia<br>";
        //metodo que inserta una nueva secuencia
        $secuencia = nueva_seq('CN_CONTROL_CAD', $id_cia, $vigencia) + 1;
    }

    echo "Secuencia CAD: " . $secuencia . "<br>";

    //crear cad
    $sql = <<<EOD
    INSERT INTO CN_CONTROL_CAD VALUES 
    ( $secuencia, $vigencia,  $id_cen_op, $id_cia, $id_periodo_contable, $id_tipo_comprobante, to_date('$fecha_cad', 'yyyy/mm/dd')
        , 0 , 0 , null , null , null )
EOD;
    //ejecuta sql
    $exito = executeAdd_SQL($sql);

    //valida haber insertado el registro
    if ($exito) {

        //actualizar consecutivo en la tabla de secuencias
        $sql = <<<EOD
    UPDATE CN_TABLE_VIG_SEQ
    SET SEQ = $secuencia
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_CONTROL_CAD'
EOD;

        //ejecuta sql
        executeAdd_SQL($sql);

        $id_cad = $secuencia;
    }

    return $id_cad;
}

/**
 * Metodo para crear un documento
 *
 * @param <type> $vigencia
 * @param <type> $id_cen_op
 * @param <type> $id_cia
 * @param <type> $id_periodo_contable
 */
function crear_documento($id_cad, $vigencia, $id_cen_op, $id_cia, $id_td, $id_mae_ter, $descr_mto, $doc_soporte, $fecha_cad, $portafolio, $valor) {


    //obtener el numero de secuencia
    $sql = <<<EOD
    select * from CN_TABLE_VIG_SEQ
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_DOCUMENTO'
EOD;

    //ejecuta sql
    $seq = executeList_SQL($sql);

    //validar seq
    if (count($seq) > 0) {
        $secuencia = $seq[0]['SEQ'] + 1;
//        echo "secuencia: ant - " . $seq[0]['SEQ'] . " act - " . $secuencia . "<br>";
    } else {
        echo "No existe una secuencia<br>";
        //metodo que inserta una nueva secuencia
        $secuencia = nueva_seq('CN_DOCUMENTO', $id_cia, $vigencia) + 1;
    }

    echo "Secuencia DOC: " . $secuencia . "<br>";

    //crear documento
    $sql = <<<EOD
    INSERT INTO CN_DOCUMENTO VALUES
    ( $secuencia, $id_cad, $vigencia, $id_cen_op, $id_cia, $id_td, $id_mae_ter, $descr_mto, $doc_soporte, to_date('$fecha_cad', 'yyyy/mm/dd') )
EOD;

    //ejecuta sql
    $exito = executeAdd_SQL($sql);

    //valida haber insertado el registro
    if ($exito) {

        //actualizar consecutivo en la tabla de secuencias
        $sql = <<<EOD
    UPDATE CN_TABLE_VIG_SEQ
    SET SEQ = $secuencia
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_DOCUMENTO'
EOD;

        //ejecuta sql
        executeAdd_SQL($sql);

        /*
         * llamado a crear movimientos para el documento
         */
        crear_movimiento($secuencia, $id_cad, $vigencia, $id_cen_op, $id_cia, $portafolio, $valor, $id_mae_ter);
    } else {
        echo "No pudo ser creado el documento.<br>";
        exit;
    }
}

/**
 * Metodo para crear un movimiento
 *
 * @param <type> $vigencia
 * @param <type> $id_cen_op
 * @param <type> $id_cia
 * @param <type> $id_periodo_contable
 */
function crear_movimiento($id_documento, $id_cad, $vigencia, $id_cen_op, $id_cia, $portafolio, $valor, $id_mae_ter) {

    /*
     * variable por defecto de cuentas
     */
    $cuenta1 = "120309";
    $cuenta2 = "480586";
    $cuenta3 = "580570";


    //optener el numero de secuencia
    $sql = <<<EOD
    select * from CN_TABLE_VIG_SEQ
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_MOVIMIENTO_CONTABLE'
EOD;

    //ejecuta sql
    $seq = executeList_SQL($sql);

    //validar seq
    if (count($seq) > 0) {
        $secuencia = $seq[0]['SEQ'] + 1;
//        echo "secuencia: ant - " . $seq[0]['SEQ'] . " act - " . $secuencia . "<br>";
    } else {
        echo "No existe una secuencia<br>";
        //metodo que inserta una nueva secuencia
        $secuencia = nueva_seq('CN_MOVIMIENTO_CONTABLE', $id_cia, $vigencia) + 1;
    }

    echo "Secuencia MOV: " . $secuencia . "<br>";

    /*
     * obtener datos de id de cuenta y auxiliar
     * valores debito y credito
     */
    $id_cuenta_aux = array();
    //valores debito y credito
    //si es positivo
    if ($valor >= 0) {

        $debito = $valor;
        $credito = 0;
    } else {

        $debito = 0;
        $credito = $valor;
    }

    //obtener id para la cuenta y el auxiliar
    $id_cuenta_aux = obtener_ids($cuenta1, $id_cia);
    $id_cuenta_aux[4] = obtener_aux($cuenta1, $portafolio, $id_cia);

    //crear movimiento contable
    $sql = <<<EOD
    INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES
    ( $secuencia, $id_documento , $id_cad ,  $vigencia , $id_cen_op , $id_cia ,
       $id_cuenta_aux[0] , $id_cuenta_aux[1] , $id_cuenta_aux[2] , $id_cuenta_aux[3] , $id_mae_ter ,
           $id_cuenta_aux[4] , null , null , null , $debito , $credito , null )
EOD;
    //ejecuta sql
    $exito1 = executeAdd_SQL($sql);

    //valida haber insertado el registro
    if ($exito1) {

        //actualizar consecutivo en la tabla de secuencias
        $sql = <<<EOD
    UPDATE CN_TABLE_VIG_SEQ
    SET SEQ = $secuencia
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_MOVIMIENTO_CONTABLE'
EOD;

        //ejecuta sql
        executeAdd_SQL($sql);

        //aumentar secuencia si ingreso movimiento
        $secuencia++;
    } else {
        echo "No pudo ser creado el primer movimiento<br>";
    }

    /*
     * obtener datos de id de cuenta y auxiliar
     * valores debito y credito
     */
    $id_cuenta_aux = array();
    //valores debito y credito
    //si es positivo
    if ($valor >= 0) {

        $debito = 0;
        $credito = $valor;


        //obtener id para la cuenta y el auxiliar
        $id_cuenta_aux = obtener_ids($cuenta2, $id_cia);
        $id_cuenta_aux[4] = obtener_aux($cuenta2, $portafolio, $id_cia);
    } else {

        $debito = $valor;
        $credito = 0;

        //obtener id para la cuenta y el auxiliar
        $id_cuenta_aux = obtener_ids($cuenta3, $id_cia);
        $id_cuenta_aux[4] = obtener_aux($cuenta3, $portafolio, $id_cia);
    }

    //crear movimiento contable
    $sql = <<<EOD
    INSERT INTO CN_MOVIMIENTO_CONTABLE VALUES
    ( $secuencia, $id_documento , $id_cad ,  $vigencia , $id_cen_op , $id_cia ,
       $id_cuenta_aux[0] , $id_cuenta_aux[1] , $id_cuenta_aux[2] , $id_cuenta_aux[3] , $id_mae_ter ,
           $id_cuenta_aux[4] , null , null , null , $debito , $credito , null )
EOD;
    //ejecuta sql
    $exito2 = executeAdd_SQL($sql);

    //valida haber insertado el registro
    if ($exito2) {

        //actualizar consecutivo en la tabla de secuencias
        $sql = <<<EOD
    UPDATE CN_TABLE_VIG_SEQ
    SET SEQ = $secuencia
    where ID_CIA = $id_cia
    and ID_VIGENCIA = $vigencia
    and NOM_ENTIDAD = 'CN_MOVIMIENTO_CONTABLE'
EOD;

        //ejecuta sql
        executeAdd_SQL($sql);
    } else {
        echo "No pudo ser creado el segundo movimiento<br>";
    }
}

/**
 * Metodo que ejecuta una sentencia sql y retorna la consulta en un array
 *
 * @param <type> $sql
 * @return <type>
 */
function executeList_SQL($sql) {

    /*
     * Conexion a la base de datos
     */
    //base de datos contabilidad websafi
    $conn = oci_connect("ws_contab", "Sistemas", "192.168.2.9/websafiERP");

    //validacion conexion
    if (!$conn) {
        $e = oci_error();
        print htmlentities($e['message']);
        exit;
    }

    $stid = oci_parse($conn, $sql);
    $exec = oci_execute($stid);

//    echo var_dump($stid);
//    print_r($stid);
//    die();

    $records = array();

    //validar ejecucion
    if ($exec && $stid) {
        while ($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) {
//        print_r($row);
//            echo "\n" . var_dump($row) . "\n";
            $records[] = $row;
        }
    } else {
        //mensajes de error
        echo "Se produjo un error";
        $e = oci_error($conconexion);
        echo $e['message'];
        exit;
    }

    //cerrar la conexion en la base de datos
    oci_close($conn);

    //returna array de consulta
    return $records;
}

/**
 * Metodo que ejecuta un insert de la sentencia sql
 *
 * @param <type> $sql
 * @return <type>
 */
function executeAdd_SQL($sql) {

    $exito = true;

    /*
     * Conexion a la base de datos
     */
    //base de datos contabilidad websafi
    $conn = oci_connect("ws_contab", "Sistemas", "192.168.2.9/websafiERP");

    //validacion conexion
    if (!$conn) {
        $exito = false;
        $e = oci_error();
        print htmlentities($e['message']);
        exit;
    }

    $stid = oci_parse($conn, $sql);
    //validar errores
    if (!$stid) {
        $exito = false;
        $e = oci_error($conn);
        echo $e['message'];
        exit;
    }

    $exec = oci_execute($stid);
    //validar errores
    if (!$exec) {
        $exito = false;
        $e = oci_error($stid);
        echo htmlentities($e['message']);
        echo "<pre>";
        echo htmlentities($e['sqltext']);
        printf("\n%" . ($e['offset'] + 1) . "s", "^");
        echo "</pre>";
        exit;
    } else {
        echo "Registro insertado correctamente: " . $sql . "<br>";
    }


    //cerrar la conexion en la base de datos
    oci_close($conn);

    //returna array de consulta
    return $exito;
}

/**
 * Metodo para insertar una nueva secuencia
 *
 * @param <type> $tabla
 * @param <type> $id_cia
 * @param <type> $vigencia
 * @return <type>
 */
function nueva_seq($tabla, $id_cia, $vigencia) {

    //insertar nueva vigencia pata la tabla CN_TABLE_VIG_SEQ
    $sql = <<<EOD
     INSERT INTO CN_TABLE_VIG_SEQ VALUES ( '$tabla' , $id_cia , $vigencia , 0 )
EOD;

    //ejecuta sql
    $records = executeAdd_SQL($sql);

    //returna 0 para no iniciar secuencia
    return 0;
}

/**
 * Metodo de consulta para obtener los ids de la cuenta por el digito de la misma
 *
 * @param <type> $cuenta
 * @param <type> $id_cia
 * @return array
 */
function obtener_ids($cuenta, $id_cia) {

    $id_array = array();

    //optener los ids por el digito de la cuenta
    $sql = <<<EOD
select * from CN_SUBC_DIGITOS
where DIGITOS = '$cuenta'
and ID_CIA = 1
EOD;

    //ejecuta sql
    $rec_ids = executeList_SQL($sql);

    //validar resultado de consulta ids
    if (count($rec_ids) > 0) {
        $id_array[0] = $rec_ids[0]['ID_CATALOGO'];
        $id_array[1] = $rec_ids[0]['ID_CUENTA_MAYOR'];
        $id_array[2] = $rec_ids[0]['ID_GRUPO_CUENTA'];
        $id_array[3] = $rec_ids[0]['ID_CLASE_CUENTA'];
    } else {
        echo "No existe la cuenta<br>";
        //crear un metodo que inserta una nueva cuenta
        exit;
    }

    return $id_array;
}

/**
 * Metodo de busqueda del id del auxiliar por la cuenta y el portafolio
 *
 * @param <type> $cuenta
 * @param <type> $portafolio
 * @param <type> $id_cia
 * @return <type>
 */
function obtener_aux($cuenta, $portafolio, $id_cia) {

    $id_aux = 0;

    //optener los ids por el digito de la cuenta
    $sql = <<<EOD
select * from CN_SUBC_DIGITOS_AUX
where DIGITOS = '$cuenta'
and COD_AUX = $portafolio
EOD;

    //ejecuta sql
    $rec_ids = executeList_SQL($sql);

    //validar resultado de consulta ids
    if (count($rec_ids) > 0) {
        $id_aux = $rec_ids[0]['ID_AUXILIAR'];
    } else {
        echo "No existe un auxiliar que corresponda al numero de portafolio.<br>";
        //crear un metodo que inserta un auxiliar para esta cuenta
        exit;
    }

    return $id_aux;
}

?>