<?php
@session_start();
require_once '../Conexion/conexion.php';
require_once '../Conexion/ConexionPDO.php';
setlocale(LC_ALL, "es_ES");
date_default_timezone_set("America/Bogota");
$id_factura = $_GET['id'];
$compania   = $_SESSION['compania'];
$con = new ConexionPDO();
$conexion = $_SESSION['conexion'];

$resul  = $con->Listar("SELECT numeroidentificacion FROM gf_tercero where id_unico = $compania ");
// $resul      = $mysqli->query($query);
// $roww       = $resul->fetch_assoc();
$roww       = $resul;
$companiaa  = $roww[0]['numeroidentificacion'];
$nit        = $companiaa;
$Mensaje    = '';

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//token
$resultTkn = $con->Listar("SELECT token_fe FROM gf_tercero where id_unico = $compania");
// $resultTkn = $mysqli->query($sqlTkn);
// $rowTkn = $resultTkn->fetch_assoc();
$rowTkn = $resultTkn;

$token = $rowTkn["token_fe"];
if ($token == null) {
    Token($compania);
}

// CONSULTAR PARÁMETRO PARA OBSERVACIONES
$resultP      = $con->Listar("SELECT id_unico, valor FROM gs_parametros_basicos where indicador = 'FE000002'");
// $resultP   = $mysqli->query($sqlp);
// $rowPr     = $resultP->fetch_assoc();
$rowPr     = $resultP;
$notaFE    = '';
if (!empty($rowPr['valor'])) {
    $notaFE = $rowPr['valor'];
}
//CONSULTAS valores de factura
switch ($conexion) {
    case 1:
        $resultFv = $con->Listar("SELECT gp_tipo_factura.prefijo,fecha_factura, fecha_vencimiento, gf_forma_pago.codigo_dian,gp_factura.descripcion as observaciones, 
        gp_factura.forma_pago,gf_tercero.razonsocial,gf_tipo_identificacion.codigo_fe,gf_tercero.numeroidentificacion,
        gf_direccion.direccion,gf_telefono.valor,gf_tercero.email,gf_tipo_regimen.codigo as regimenContable,gp_resolucion_factura.numero_resolucion,
        CONCAT(gf_departamento.rss, gf_ciudad.rss)as ciudad,
        gf_tercero.id_unico, IF(gf_tercero.razonsocial IS NULL OR gf_tercero.razonsocial ='', CONCAT_WS(' ', gf_tercero.nombreuno, gf_tercero.nombredos, gf_tercero.apellidouno, gf_tercero.apellidodos), gf_tercero.razonsocial) AS Nombre_R, 
        (SELECT round(SUM(df.valor_total_ajustado), 4) FROM gp_detalle_factura df WHERE gp_factura.id_unico = df.factura) as total, 
        gp_factura.numero_factura  as numero_factura
        FROM gp_factura 
        LEFT JOIN gp_tipo_factura on gp_tipo_factura.id_unico = gp_factura.tipofactura 
        LEFT JOIN gp_resolucion_factura on gp_resolucion_factura.tipo_factura = gp_tipo_factura.id_unico
        LEFT JOIN gf_forma_pago on gp_factura.metodo_pago = gf_forma_pago.id_unico 
        LEFT join gf_tercero on gp_factura.tercero = gf_tercero.id_unico 
        LEFT JOIN gf_tipo_identificacion on gf_tercero.tipoidentificacion = gf_tipo_identificacion.id_unico 
        LEFT JOIN gf_direccion on gf_tercero.id_unico=gf_direccion.tercero 
        LEFT JOIN gf_ciudad on gf_direccion.ciudad_direccion = gf_ciudad.id_unico 
        LEFT JOIN gf_departamento on gf_ciudad.departamento = gf_departamento.id_unico 
        LEFT JOIN gf_telefono on gf_tercero.id_unico = gf_telefono.tercero 
        left join gf_tipo_regimen on gf_tercero.tiporegimen = gf_tipo_regimen.id_unico
        WHERE gp_factura.id_unico = '" . $id_factura . "' LIMIT 1");
        break;
    case 2:
        $resultFv = $con->Listar("SELECT
        gp_tipo_factura.prefijo,
        fecha_factura,
        fecha_vencimiento,
        gf_forma_pago.codigo_dian,
        gp_factura.descripcion AS observaciones,
        gp_factura.forma_pago,
        gf_tercero.razonsocial,
        gf_tipo_identificacion.codigo_fe,
        gf_tercero.numeroidentificacion,
        gf_direccion.direccion,
        gf_telefono.valor,
        gf_tercero.email,
        gf_tipo_regimen.codigo AS regimenContable,
        gp_resolucion_factura.numero_resolucion,
        gf_departamento.rss || gf_ciudad.rss AS ciudad,
        gf_tercero.id_unico,
        CASE
            WHEN gf_tercero.razonsocial IS NULL OR gf_tercero.razonsocial = '' THEN
                gf_tercero.nombreuno || ' ' || gf_tercero.nombredos || ' ' || gf_tercero.apellidouno || ' ' || gf_tercero.apellidodos
            ELSE
                gf_tercero.razonsocial
        END AS Nombre_R,
        (SELECT ROUND(SUM(df.valor_total_ajustado), 4)
         FROM gp_detalle_factura df
         WHERE gp_factura.id_unico = df.factura) AS total,
        gp_factura.numero_factura AS numero_factura
    FROM gp_factura
    LEFT JOIN gp_tipo_factura ON gp_tipo_factura.id_unico = gp_factura.tipofactura
    LEFT JOIN gp_resolucion_factura ON gp_resolucion_factura.tipo_factura = gp_tipo_factura.id_unico
    LEFT JOIN gf_forma_pago ON gp_factura.metodo_pago = gf_forma_pago.id_unico
    LEFT JOIN gf_tercero ON gp_factura.tercero = gf_tercero.id_unico
    LEFT JOIN gf_tipo_identificacion ON gf_tercero.tipoidentificacion = gf_tipo_identificacion.id_unico
    LEFT JOIN gf_direccion ON gf_tercero.id_unico = gf_direccion.tercero
    LEFT JOIN gf_ciudad ON gf_direccion.ciudad_direccion = gf_ciudad.id_unico
    LEFT JOIN gf_departamento ON gf_ciudad.departamento = gf_departamento.id_unico
    LEFT JOIN gf_telefono ON gf_tercero.id_unico = gf_telefono.tercero
    LEFT JOIN gf_tipo_regimen ON gf_tercero.tiporegimen = gf_tipo_regimen.id_unico
    WHERE gp_factura.id_unico = $id_factura AND ROWNUM <= 1");
        break;
    default:
        # code...
        break;
}
// $rowFv      = $resultFv->fetch_assoc();
$rowFv      = $resultFv;
$obs =  str_replace("\r\n", " ", $rowFv[0]['observaciones']);

$numeroResolucion           = $rowFv[0]['numero_resolucion'];
$numeroDocumentoComercial   = $rowFv[0]['prefijo'] . $rowFv[0]['numero_factura'];
$fechaGeneracion            = $rowFv[0]['fecha_factura'];
$fechaVencimiento           = $rowFv[0]['fecha_vencimiento'];
$mediosPago                 = $rowFv[0]['codigo_dian'];
$observacion                = $obs . '  ' . $notaFE;
$formaPago                  = $rowFv[0]['forma_pago'];
$total                      = $rowFv[0]['total'];
$nombreRazonSocial          = $rowFv[0]['Nombre_R'];
$tipoIdentificacion         = $rowFv[0]['codigo_fe'];
$numIdentificacion          = $rowFv[0]['numeroidentificacion'];

if ($rowFv['codigo_fe'] == "NI") {
    $Naturaleza = "JURIDICAS";
} else {
    $Naturaleza = "NATURALES";
}

$direccion              = $rowFv[0]['direccion'];
$ciudad                 = $rowFv[0]['ciudad'];
$telefono               = $rowFv[0]['valor'];
$email                  = $rowFv[0]['email'];
$idTercero              = $rowFv[0]['id_unico'];
$regimenContable        = $rowFv[0]['regimenContable'];
$fechaGeneracio         = date('Y-m-d\TH:i:s', strtotime($fechaGeneracion));
$fechaVencimient        = date('Y-m-d\TH:i:s', strtotime($fechaVencimiento));
$id_Cliente              = $rowFv[0]['id_unico'];

switch ($conexion) {
    case 1:
        $resulFiscal     = $con->Listar("SELECT  GROUP_CONCAT(gf_responsabilidad_fiscal.codigo) FROM `gf_tercero_responsabilidad` 
        INNER join gf_responsabilidad_fiscal on gf_tercero_responsabilidad.responsabilidad = gf_responsabilidad_fiscal.id_unico 
        WHERE tercero = '" . $id_Cliente . "'");
        break;
    case 2:
        $resulFiscal     = $con->Listar("SELECT LISTAGG(gf_responsabilidad_fiscal.codigo, ', ') WITHIN GROUP (ORDER BY gf_responsabilidad_fiscal.codigo) 
        AS responsabilidades
        FROM gf_tercero_responsabilidad
        INNER JOIN gf_responsabilidad_fiscal ON gf_tercero_responsabilidad.responsabilidad = gf_responsabilidad_fiscal.id_unico
        WHERE tercero = $id_Cliente");
        break;
    default:
        # code...
        break;
}

// $resulFiscal      = $mysqli->query($sqlFiscal);
// while ($rowwFiscal = mysqli_fetch_row($resulFiscal)) {
for ($rowwFiscal = 0; $rowwFiscal < count($resulFiscal); $rowwFiscal++) {
    $responsabilidadesFiscales  = $responsabilidadesFiscals = $resulFiscal[$rowwFiscal][0];
}


//valores detallefactura

$resultDtf = $con->Listar(" SELECT gp_concepto.nombre,gp_detalle_factura.valor_origen,
        gp_detalle_factura.cantidad,gf_plan_inventario.codi,
        gp_detalle_factura.descripcion,gf_unidad_factor.codigo_fe,
        gp_detalle_factura.iva,gp_detalle_factura.impoconsumo,
        gp_detalle_factura.valor_descuento,
        gp_detalle_factura.valor_total_ajustado,gp_detalle_factura.valor,gp_detalle_factura.ajuste_peso, gp_detalle_factura.tipo_descuento , 
        gp_detalle_factura.descuento 
    FROM gp_detalle_factura LEFT JOIN gp_concepto ON gp_concepto.id_unico = gp_detalle_factura.concepto_tarifa 
    LEFT JOIN gf_plan_inventario ON gp_concepto.plan_inventario = gf_plan_inventario.id_unico
    LEFT JOIN gf_unidad_factor ON gp_detalle_factura.unidad_origen = gf_unidad_factor.id_unico
    WHERE gp_detalle_factura.factura = '" . $id_factura . "' and gp_detalle_factura.valor_total_ajustado > 0");

// $resultDtf = $mysqli->query($sqlDtf);
// while ($rowDtf = mysqli_fetch_row($resultDtf)) {
for ($rowDtf = 0; $rowDtf < count($resultDtf); $rowDtf++) {
    //calcular iva
    if ($resultDtf[$rowDtf][6] > 0) {
        $iv = round(($resultDtf[$rowDtf][6] * 100) / $resultDtf[$rowDtf][10], 0);
        $impuesto = "IVA_" . $iv . "";
    } else {
        //calcular impoconsumo
        if ($resultDtf[$rowDtf][7] > 0) {
            $impo = round(($resultDtf[$rowDtf][7] * 100) / $resultDtf[$rowDtf][10], 0);
            $impuesto = "IMPUESTO_CONSUMO_" . $impo . "";
        } else {
            $impuesto = "SIN_IMPUESTO";
        }
    }

    $Descuento = 0;
    if ($resultDtf[$rowDtf][8] > 0) {
        if ($resultDtf[$rowDtf][12] == 1) {
            $Descuento = $resultDtf[$rowDtf][13];
        } else {
            $pb = 0;
            if ($resultDtf[$rowDtf][6] > 0) {
                $pb = $iv;
            } elseif ($resultDtf[$rowDtf][7] > 0) {
                $pb = $impo;
            }

            #* Valor Base Real
            if ($pb != 0) {
                $vds = ($resultDtf[$rowDtf][1] * $resultDtf[$rowDtf][2]) / (1 + ($pb / 100));
            } else {
                $vds = ($resultDtf[$rowDtf][1] * $resultDtf[$rowDtf][2]);
            }
            $Descuento = ($resultDtf[$rowDtf][8] * 100) / $vds;
        }
    }
    //items
    $Detalle_Factura[] = [
        "nombreItemVenta"       => $resultDtf[$rowDtf][0],
        "precioVentaUnitario"   => $resultDtf[$rowDtf][1],
        "cantidad"              => $resultDtf[$rowDtf][2],
        "codigo"                => $resultDtf[$rowDtf][3],
        "descuentoPorcentaje"   => $Descuento,
        "observacion"           => $$resultDtf[$rowDtf][4],
        "unidad"                => $resultDtf[$rowDtf][5],
        "codigoDescuento"       => 11,
        "impuesto"              => $impuesto
    ];
}



//Estructura Json
$factura = [
    "nit"                           => $nit,
    "numeroResolucion"              => $numeroResolucion,
    "numeroDocumentoComercial"      => $numeroDocumentoComercial,
    "fechaGeneracion"               => $fechaGeneracio,
    "fechaVencimiento"              => $fechaVencimient,
    "mediosPago"                    => $mediosPago,
    "observacion"                   => $observacion,
    "formaPago"                     => $formaPago,
    "total"                         => $total,
    "cliente" => [
        "nombreRazonSocial"         => $nombreRazonSocial,
        "tipoIdentificacion"        => $tipoIdentificacion,
        "numIdentificacion"         => $numIdentificacion,
        "naturaleza"                => $Naturaleza,
        "direccion"                 => $direccion,
        "ciudad"                    => $ciudad,
        "telefono"                  => $telefono,
        "email"                     => $email,
        "responsabilidadesFiscales" => $responsabilidadesFiscales,
        "regimenContable"           => $regimenContable
    ],
    "codigoDescuento" => 11,
    "porcentajeDescuentoGeneral" => 0,
    "items" => $Detalle_Factura
];

$datosCodificados = json_encode($factura);
//var_dump($datosCodificados);



$Respuesta = factura($datosCodificados, $token, $id_factura);
$Mensaje = $Respuesta;


//_____________________________________________________________________________________________________________________________________________________
//FUNCIONES

function Token($compania)
{
    global $con;
    $resl      = $con->Listar("SELECT usuario_fe,contrasena_fe FROM gf_tercero where id_unico= $compania");
    // $resl      = $mysqli->query($qury);
    // $rowwu       = $resl->fetch_assoc();
    $rowwu       = $resl;
    $usu  = $rowwu[0]['usuario_fe'];
    $contra  = $rowwu[0]['contrasena_fe'];

    //LOGUIN - SACAR TOKEN
    //parametros :


    $usuario = $usu;
    $contrasenia = $contra;

    //API url:
    $url = 'https://csi.clarisa.co:8443/seguridad/rest/api/v1/login/';

    //JSON
    $data = array(
        'usuario' => $usuario,
        'contrasenia' => $contrasenia
    );

    //configuraciones del json
    $options = array(
        'http' => array(
            'header' => "Content-Type: application/json",
            'method' => 'POST',
            'content' => json_encode($data)
        )
    );

    //engine:
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    if ($result === FALSE) {
    }

    $resultData = json_decode($result, TRUE);
    $re = $resultData["data"];
    $token = $re["token"];

    // $sql_cons = "UPDATE gf_tercero set token_fe ='" . $token . "' where id_unico='" . $compania . "'";
    $sql_cons = "UPDATE gf_tercero set token_fe = :token_fe where id_unico=:id_unico";
    // $resultTkn = $mysqli->query($sqlEdiTknn);

    $sql_dato = array(
        array(":token_fe", $token),
        array(":id_unico", $compania),
    );
    $obj_resp = $con->InAcEl($sql_cons, $sql_dato);
    // if ($resultTkn == false) {
    if (empty($obj_resp)) {
        echo "ERROR";
    } else {
    }

    return $token;
}

function factura($datosCodificados, $token, $id_factura)
{
    global $con;

    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_PORT => "8443",
        CURLOPT_URL => "https://csi.clarisa.co:8443/facturacion/rest/api/v1/factura",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $datosCodificados,
        CURLOPT_COOKIE => "JSESSIONID=T-BnFgT-56AicuIZjUdJwv5k6ZwZBOi_UAu0olV7.ip-172-31-9-34",
        CURLOPT_HTTPHEADER => [
            "Authorization: '" . $token . "'",
            "Content-Type: application/json"
        ],
    ]);

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        //echo "cURL Error #:" . $err;
        $Mensaje = $err;
    } else {
        $solu = json_decode($response, true);

        if (is_null($solu)) {
            $Mensaje = '';
        } else {

            $soluc2 = $solu['textResponse'];

            if ($soluc2 == "Factura creada") {

                $soluc3 = $solu['data'];
                $solu4 = $soluc3['numeroFactura'];
                $solu5 = $soluc3['cufe'];

                $fecha = date("Y-m-d");
                $hora = date("H:i:s");
                // $sqledit = "Update gp_factura set cufe = '" . $solu5 . "', zip_id ='" . $soluc2 . "', issue_date ='" . $fecha . "',issue_time ='" . $hora . "'  where id_unico = '" . $id_factura . "'";
                $sql_cons = "UPDATE gp_factura SET cufe =:cufe, zip_id =:zip_id, issue_date =:issue_date,
                issue_time = :issue_time  WHERE id_unico = :id_unico";

                $sql_dato = array(
                    array(":cufe", $solu5),
                    array(":zip_id", $soluc2),
                    array(":issue_date", $fecha),
                    array(":issue_time", $hora),
                    array(":id_unico", $id_factura),

                );
                $obj_resp = $con->InAcEl($sql_cons, $sql_dato);

                // if ($mysqli->query($sqledit) != true) {
                if ($obj_resp != true) {
                    echo "Error";
                }
                $Mensaje = $soluc2 . " " . $solu4;
            } else {

                $error1 = $solu['errores'];
                $error2 = $error1['errores'];
                $error3 = $error2[0];
                $Error5 = $error3['codError'];
                $Error4 = $error3['errorMessage'];
                $Mensaje = $soluc2 . " " . $Error4 . " " . $Error5;
            }
        }
    }
    return $Mensaje;
}







if ($Mensaje == '') {
    $token = Token($compania);

    // $sqlEdiTknn = "UPDATE gf_tercero set token_fe ='" . $token . "' where id_unico='" . $compania . "'";
    $sql_cons = "UPDATE gf_tercero set token_fe = $token where id_unico=:id_unico";
    // $resultTkn = $mysqli->query($sqlEdiTknn);
    $sql_dato = array(
        array(":token_fe", $token),
        array(":id_unico", $compania),

    );
    $obj_resp = $con->InAcEl($sql_cons, $sql_dato);

    $Respuestaa = factura($datosCodificados, $token, $id_factura);
    $Mensaje = $Respuestaa;
}

if ($Mensaje == "Error en credenciales de Usuario Su sesión ha expirado, por favor vuelva a iniciar sesión US05") {
    $token = Token($compania, $mysqli);

    // $sqlEdiTknn = "UPDATE gf_tercero set token_fe ='" . $token . "' where id_unico='" . $compania . "'";
    $sql_cons = "UPDATE gf_tercero SET token_fe =:token_fe WHERE id_unico=:id_unico";
    // $resultTkn = $mysqli->query($sqlEdiTknn);
    $sql_dato = array(
        array(":token_fe", $token),
        array(":id_unico", $compania),

    );
    $obj_resp = $con->InAcEl($sql_cons, $sql_dato);

    $Respuestaa = factura($datosCodificados, $token, $id_factura);
    $Mensaje = $Respuestaa;
}

if ($Mensaje == "Error en credenciales de Usuario No se ha enviado correctamente el token de acceso US03") {
    $token = Token($compania);

    $sql_cons = "UPDATE gf_tercero set token_fe =:token_fe where id_unico=:id_unico";
    // $resultTkn = $mysqli->query($sqlEdiTknn);
    $sql_dato = array(
        array(":token_fe", $token),
        array(":id_unico", $compania),

    );
    $obj_resp = $con->InAcEl($sql_cons, $sql_dato);

    $Respuestaa = factura($datosCodificados, $token, $id_factura);
    $Mensaje = $Respuestaa;
}
?>



<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <link rel="stylesheet" href="../css/style.css">
    <script src="../js/md5.pack.js"></script>
    <script src="../js/jquery.min.js"></script>
    <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css" media="screen" title="default" />
    <script type="text/javascript" language="javascript" src="../js/jquery-1.10.2.js"></script>
</head>
<div class="modal fade" id="myModal1" role="dialog" align="center">
    <div class="modal-dialog">
        <div class="modal-content">
            <div id="forma-modal" class="modal-header">
                <h4 class="modal-title" style="font-size: 24; padding: 3px;">Información</h4>
            </div>
            <div class="modal-body" style="margin-top: 8px">
                <p> <?= $Mensaje; ?> </p>
            </div>
            <div id="forma-modal" class="modal-footer">
                <button type="button" id="ver1" class="btn" style="color: #000; margin-top: 2px" data-dismiss="modal">Aceptar</button>
            </div>
        </div>
    </div>
</div>

<link rel="stylesheet" href="../css/bootstrap-theme.min.css">
<script src="../js/bootstrap.min.js"></script>
<script type="text/javascript">
    $("#myModal1").modal('show');
    $("#ver1").click(function() {
        $("#myModal1").modal('hide');
        window.location = '../facturacionElectronica.php';
    });
</script>