<?php
    /**
     *  wsFileLedes1998BI_V2_ATE_RR.PHP
     * 
     *  Autor: Felipe Faccinetto
     *  Fecha: Septiembre/2021
     * 
     *  DESCRIPCIÓN:
     * 
     *  Lleva a cabo la creación del archivo LEDES correspondiente 
     * 
     *  PARAMETROS:
     * 
     *  pNomArc	      	Nombre del archivo LEDES resultante
     *  pDatLed	      	Cadena codificada en base64 que contiene un arreglo JSON con los datos para el archivo LEDES
	 *  pRecordId		Identidicador del registro a actualizar en Zoho Creator
	 *  pInvoiceId		Identidicador del registro a actualizar en Zoho Books
	 *  pOrganiIdZB		Organization ID para Zoho Books
	 *  pauthtokenZB	Authtoken para Zoho Books
	 *  pauthtokenZC	Authtoken para Zoho Creator
     *  pAppLnkNam      Identificador de la aplicación en Zoho Creator
     *  pFormName       Identifiador de la forma que contendra el archivo en Zohoi Creator
     *  pReportQry      Identifiador del reporte de consulta para los datos de LEDES
     *  pDatPac         Contiene los datos necesarios para autenticación por OAuth
     *  pAppOwner       Contiene al dueño de la aplicación
     * 
     * 
    */
	
    header('Content-Type: text/html; charset=UTF-8');
    include("qrlib/qrlib.php");
    require('oauth.php');

    $bDatLed  	  = "";
	$bRecId   	  = "";
	$bInvId   	  = "";
	$arcLedes     = "";
	$organi_id_ZB = "";
	$authtoken_ZB = "";
	$authtoken_ZC = "";
	$applnkname   = 'ledes'; 
    $formname     = 'LEDES';
    $reportQry    = 'Prebills_Query';
	$bDatPac		= "";
    $appOwner       = "";

    ## Cargamos los parametros enviados al WebService
    if (isset($_REQUEST['pNomArc']))
    {
        $arcLedes = $_REQUEST['pNomArc'];        			// Parametro con nombre del archivo LEDES
    }

    if (isset($_REQUEST['pRecordId']))
    {
        $bRecId = $_REQUEST['pRecordId'];        			// Identidicador del registro LEDES en Zoho Creator
    }

    if (isset($_REQUEST['pInvoiceId']))
    {
        $bInvId = $_REQUEST['pInvoiceId'];        			// Identidicador del invoice en Zoho Books
    }

    if (isset($_REQUEST['pOrganiIdZB']))
    {
        $organi_id_ZB = $_REQUEST['pOrganiIdZB'];    		// Parametro con Organization ID de Zoho Books
    }
	
    if (isset($_REQUEST['pauthtokenZB']))
    {
        $authtoken_ZB = $_REQUEST['pauthtokenZB'];        	// Parametro Authtoken para Zoho Books
    }
	
    if (isset($_REQUEST['pauthtokenZC']))
    {
        $authtoken_ZC = $_REQUEST['pauthtokenZC'];        	// Parametro Authtoken para Zoho Creator
    }

    if (isset($_REQUEST['pAppLnkNam']))
    {
        $applnkname = $_REQUEST['pAppLnkNam'];     	        // Identificador de la aplicación en Zoho Creator
    }

    if (isset($_REQUEST['pAppOwner']))
    {
        $appOwner = $_REQUEST['pAppOwner'];     	        // Identificador de la aplicación en Zoho Creator
    }
	 
    if (isset($_REQUEST['pFormName']))
    {
        $formname = $_REQUEST['pFormName'];     	        // Identifiador de la forma que contendra el archivo en Zohoi Creator
    }
    
    if (isset($_REQUEST['pReportQry']))
    {
        $reportQry = $_REQUEST['pReportQry'];     	        // Identifiador de la forma que contendra el archivo en Zohoi Creator
    }

    if (isset($_REQUEST['pDatPac']))
    {
        $bDatPac = $_REQUEST['pDatPac'];                    // Arreglo que contiene los datos de OAuth
    }

    ## Validamos que esten completos los parametros necesarios para el webservice
    if($arcLedes == "")
    {
		$j_array = array('code' => "300", "message" => "ERROR - [wsFileLedes1998B] Parametros incompletos para el Servicio Web, faltan el Nombre del Archivo LEDES");
		$Resultado = json_encode($j_array);
		echo $Resultado;
        return;
    }

    if($bRecId == "")
    {
		$j_array = array('code' => "300", "message" => "ERROR - [wsFileLedes1998B] Parametros incompletos para el Servicio Web, faltan el ID del LEDES a actualizar");
		$Resultado = json_encode($j_array);
		echo $Resultado;
        return;
    }

    if($bInvId == "")
    {
		$j_array = array('code' => "300", "message" => "ERROR - [wsFileLedes1998B] Parametros incompletos para el Servicio Web, faltan el ID del Invoice a actualizar");
		$Resultado = json_encode($j_array);
		echo $Resultado;
        return;
    }

    if($bDatPac == "")
    {
		$j_array = array('code' => "310", "message" => "ERROR - [wsPreBillZohoBooks] Faltan los parametros de conexión OAuth");
		$Resultado = json_encode($j_array);
		echo $Resultado;
        return;
    }

    # Obtenemos el access token de Zoho Creator
    $bDatPac = base64_decode($bDatPac);
	$aDatPac = json_decode($bDatPac, true);

    #== Datos y Variables para OAuth Token
    $coa_ClientId 		= $aDatPac["C_OAuth_client_id"];
	$coa_ClientSecret 	= $aDatPac["C_OAuth_client_secret"];
	$coa_RefreshToken 	= $aDatPac["C_OAuth_refresh_token"];
    $coa_GrantType      = $aDatPac["C_OAuth_grant_type"];
    $coa_RedirectUri    = $aDatPac["C_OAuth_redirect_uri"];
	$coa_AuthUrl 		= "https://accounts.zoho.com/oauth/v2/token";

    $coa_access_token = oauth($appOwner, 'ZCreator', $coa_RefreshToken, $coa_ClientId, $coa_ClientSecret, $coa_RedirectUri, $coa_GrantType, $coa_AuthUrl);

    ### 1. EXTRACCION DE PARAMETROS PARA EL CFDI ######################################################
    #== Primero, extraemos el JSON del string en base 64
    $request_url = 'https://creator.zoho.com/api/v2/' . $appOwner . '/' . $applnkname . '/report/' . $reportQry . '?criteria=(ID='.$bRecId.')';
echo $request_url;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Zoho-oauthtoken 1000.2e1ba3c65a35634389ab234a3dc83649.2eef8b7324b69db10484119adbfb9a7'));

    $r = curl_exec($ch);

	$array = json_decode($r);
    print_r($array);
	
    $bdDatLed =  $array->data[0]->jsonInvoiceDetail;
    $bdDatLed = str_replace("\t|\n", " ", $bdDatLed);
	$abdDatLed = json_decode($bdDatLed,true);
    curl_close ($ch);
    
    //print_r($bdDatLed);

    $dirBase = realpath("../");

    ### 2. DEFINICIÓN DE CONSTANTES ###################################################
    $SendaPEMS  = "archs_pem/";   
    $SendaCFDI  = "archs_cfdi/";  
    $SendaGRAFS = "archs_graf/";  
    $SendaXSD   = "archs_xsd/";   
    
	$fileLedes = fopen($SendaCFDI.$arcLedes, "w");
	fwrite($fileLedes, "LEDES98BI V2[]" . PHP_EOL);
	fwrite($fileLedes, "INVOICE_DATE|INVOICE_NUMBER|CLIENT_ID|LAW_FIRM_MATTER_ID|INVOICE_TOTAL|BILLING_START_DATE|BILLING_END_DATE|INVOICE_DESCRIPTION|LINE_ITEM_NUMBER|EXP/FEE/INV_ADJ_TYPE|LINE_ITEM_NUMBER_OF_UNITS|LINE_ITEM_ADJUSTMENT_AMOUNT|LINE_ITEM_TOTAL|LINE_ITEM_DATE|LINE_ITEM_TASK_CODE|LINE_ITEM_EXPENSE_CODE|LINE_ITEM_ACTIVITY_CODE|TIMEKEEPER_ID|LINE_ITEM_DESCRIPTION|LAW_FIRM_ID|LINE_ITEM_UNIT_COST|TIMEKEEPER_NAME|TIMEKEEPER_CLASSIFICATION|CLIENT_MATTER_ID|PO_NUMBER|CLIENT_TAX_ID|MATTER_NAME|INVOICE_TAX_TOTAL|INVOICE_NET_TOTAL|INVOICE_CURRENCY|TIMEKEEPER_LAST_NAME|TIMEKEEPER_FIRST_NAME|ACCOUNT_TYPE|LAW_FIRM_NAME|LAW_FIRM_ADDRESS_1|LAW_FIRM_ADDRESS_2|LAW_FIRM_CITY|LAW_FIRM_STATEorREGION|LAW_FIRM_POSTCODE|LAW_FIRM_COUNTRY|CLIENT_NAME|CLIENT_ADDRESS_1|CLIENT_ADDRESS_2|CLIENT_CITY|CLIENT_STATEorREGION|CLIENT_POSTCODE|CLIENT_COUNTRY|LINE_ITEM_TAX_RATE|LINE_ITEM_TAX_TOTAL|LINE_ITEM_TAX_TYPE|INVOICE_REPORTED_TAX_TOTAL|INVOICE_TAX_CURRENCY[]" . PHP_EOL);

    // Armando el detalle de lineas del archivo. 
    for ($i = 1; $i < count($abdDatLed); $i++){

        if($abdDatLed[$i]["INVOICE_DATE"] != "")
        {
            fwrite($fileLedes,
            $abdDatLed[$i]["INVOICE_DATE"] . "|" . 
            $abdDatLed[$i]["INVOICE_NUMBER"]."|" . 
            $abdDatLed[$i]["CLIENT_ID"]."|" . 
            $abdDatLed[$i]["LAW_FIRM_MATTER_ID"]."|" . 
            $abdDatLed[$i]["INVOICE_TOTAL"]. "|" . 
            $abdDatLed[$i]["BILLING_START_DATE"]. "|" . 
            $abdDatLed[$i]["BILLING_END_DATE"]. "|" . 
            $abdDatLed[$i]["INVOICE_DESCRIPTION"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_NUMBER"]. "|" . 
            $abdDatLed[$i]["EXP_FEE_INV_ADJ_TYPE"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_NUMBER_OF_UNITS"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_ADJUSTMENT_AMOUNT"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_TOTAL"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_DATE"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_TASK_CODE"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_EXPENSE_CODE"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_ACTIVITY_CODE"]. "|" . 
            $abdDatLed[$i]["TIMEKEEPER_ID"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_DESCRIPTION"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_ID"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_UNIT_COST"]. "|" . 
            $abdDatLed[$i]["TIMEKEEPER_NAME"]. "|" . 
            $abdDatLed[$i]["TIMEKEEPER_CLASSIFICATION"]. "|" . 
            $abdDatLed[$i]["CLIENT_MATTER_ID"]. "|" . 
            $abdDatLed[$i]["PO_NUMBER"]. "|" . 
            $abdDatLed[$i]["CLIENT_TAX_ID"]. "|" . 
            $abdDatLed[$i]["MATTER_NAME"]. "|" . 
            $abdDatLed[$i]["INVOICE_TAX_TOTAL"]. "|" . 
            $abdDatLed[$i]["INVOICE_NET_TOTAL"]. "|" . 
            $abdDatLed[$i]["INVOICE_CURRENCY"]. "|" . 
            $abdDatLed[$i]["TIMEKEEPER_LAST_NAME"]. "|" . 
            $abdDatLed[$i]["TIMEKEEPER_FIRST_NAME"]. "|" . 
            $abdDatLed[$i]["ACCOUNT_TYPE"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_NAME"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_ADDRESS_1"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_ADDRESS_2"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_CITY"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_STATEorREGION"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_POSTCODE"]. "|" . 
            $abdDatLed[$i]["LAW_FIRM_COUNTRY"]. "|" . 
            $abdDatLed[$i]["CLIENT_NAME"]. "|" . 
            $abdDatLed[$i]["CLIENT_ADDRESS_1"]. "|" . 
            $abdDatLed[$i]["CLIENT_ADDRESS_2"]. "|" . 
            $abdDatLed[$i]["CLIENT_CITY"]. "|" . 
            $abdDatLed[$i]["CLIENT_STATEorREGION"]. "|" . 
            $abdDatLed[$i]["CLIENT_POSTCODE"]. "|" . 
            $abdDatLed[$i]["CLIENT_COUNTRY"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_TAX_RATE"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_TAX_TOTAL"]. "|" . 
            $abdDatLed[$i]["LINE_ITEM_TAX_TYPE"]. "|" . 
            $abdDatLed[$i]["INVOICE_REPORTED_TAX_TOTAL"]. "|" . 
            $abdDatLed[$i]["INVOICE_TAX_CURRENCY"]. "[]" . PHP_EOL);
        }
    }
	
	fclose($fileLedes);

    chmod($SendaCFDI.$arcLedes, 0777); 

    # Obtenemos el access token de Zoho Books
    $boa_ClientId 		= $aDatPac["B_OAuth_client_id"];
	$boa_ClientSecret 	= $aDatPac["B_OAuth_client_secret"];
	$boa_RefreshToken 	= $aDatPac["B_OAuth_refresh_token"];
    $boa_GrantType      = $aDatPac["B_OAuth_grant_type"];
    $boa_RedirectUri    = $aDatPac["B_OAuth_redirect_uri"];
	$boa_AuthUrl 		= "https://accounts.zoho.com/oauth/v2/token";

    $boa_access_token = oauth($appOwner, 'ZBooks', $boa_RefreshToken, $boa_ClientId, $boa_ClientSecret, $boa_RedirectUri, $boa_GrantType, $boa_AuthUrl);


    # Envio del Archivos a Invoice de Zoho Books
    $file_name_with_full_path = '/var/www/html/aptusCFDIRF/archs_cfdi/'.$arcLedes;
    $request_url = 'https://www.zohoapis.com/books/v3/invoices/'.$bInvId.'/attachment?organization_id='.$organi_id_ZB;

    if (function_exists('curl_file_create')) { // php 5.6+
      $cFile = curl_file_create($file_name_with_full_path);
    } 
    else 
	{  
      $cFile = '@' . realpath($file_name_with_full_path);
    }

    $post = array(
    //'organization_id' => $organi_id_ZB,
    'attachment'=> $cFile);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Zoho-oauthtoken ' . $boa_access_token));


    $r = curl_exec($ch);
    /*echo $file_name_with_full_path;
    echo $request_url;
    echo $r;*/

    # Usamos la funcion curl_errno() para atrapar cualquier error relacionado con la llamada.
    if (curl_errno($ch))
    {
        $error_msg = curl_error($ch);
    }

    curl_close ($ch);

    if (isset($error_msg))
    {
        $j_array = array('code' => '666', 'message' => "Error en la llamada curl " . $error_msg);
        $Resultado = json_encode($j_array);
        echo $Resultado;
        return;
    }

    else
    {
        $ra = json_decode($r);
        $resultPDF = $ra->code.' - '.$ra->message;
        $code = (int)$ra->code;

        if ($code != 0)
        {
            $j_array = array('code' => $ra->code, 'message' => "No se pudo adjuntar el archivo a Books, contacte al administrador.  Mensaje Books => " . $ra->message);
            $Resultado = json_encode($j_array);
            echo $Resultado;
            return;
        }
    }

    //unlink($SendaCFDI.$arcLedes);

    $j_array = array('code' => "200", 'message' => "Proceso de creacion del archivo LEDES fue exitoso", 'archivo_ledes' => $fileLedes);
    $Resultado = json_encode($j_array);
	echo $Resultado;
	return;
