nes/gpt-4o-copilot/completions] took 540.9497800003737 ms 2025-05-08 17:42:46.690 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:42:46.690 [info] [streamChoices] request done: headerRequestId: [5ba84038-bdae-421c-8346-15b4e2c65ec1] model deployment ID: [] 2025-05-08 17:43:33.233 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 510.5271230000071 ms 2025-05-08 17:43:33.235 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:33.239 [info] [streamChoices] request done: headerRequestId: [977960eb-5a42-473d-a460-4990c74a8cd8] model deployment ID: [] 2025-05-08 17:43:33.905 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 418.57897200016305 ms 2025-05-08 17:43:33.907 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:33.909 [info] [streamChoices] request done: headerRequestId: [634c011b-e9f8-4af6-a48d-4a9354e9981f] model deployment ID: [] 2025-05-08 17:43:35.277 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 608.5587290003896 ms 2025-05-08 17:43:35.280 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:35.284 [info] [streamChoices] request done: headerRequestId: [6741c5b0-4d70-46e6-bd32-c9b3629948d8] model deployment ID: [] 2025-05-08 17:43:35.286 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 431.02239099983126 ms 2025-05-08 17:43:35.303 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:35.304 [info] [streamChoices] request done: headerRequestId: [ee62ad00-b0fe-4fe3-900b-a1d3b904d8cf] model deployment ID: [] 2025-05-08 17:43:35.574 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 371.70352700026706 ms 2025-05-08 17:43:35.577 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:35.577 [info] [streamChoices] request done: headerRequestId: [fc38f048-634c-445a-af81-aaa85bfeee68] model deployment ID: [] 2025-05-08 17:43:37.316 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 377.87556300032884 ms 2025-05-08 17:43:37.318 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:43:37.319 [info] [streamChoices] request done: headerRequestId: [ec877919-335c-4bad-8381-ee3f0208236d] model deployment ID: [] 2025-05-08 17:45:05.113 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 479.33753499994054 ms 2025-05-08 17:45:05.115 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:45:05.119 [info] [streamChoices] request done: headerRequestId: [bfb94af8-b115-4b72-a5cb-2e7cc5271c73] model deployment ID: [] 2025-05-08 17:49:29.988 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 533.1840059999377 ms 2025-05-08 17:49:29.991 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:49:29.992 [info] [streamChoices] request done: headerRequestId: [12bdf263-d23c-4938-b402-d774eb939c08] model deployment ID: [] 2025-05-08 17:49:48.291 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 432.09137400006875 ms 2025-05-08 17:49:48.294 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-05-08 17:49:48.295 [info] [streamChoices] request done: headerRequestId: [7dab3faf-5f1e-4c01-b23a-b1ea128df019] model deployment ID: [] 2025-05-08 17:50:59.870 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o "300", "message" => "ERROR - [wsInvoiceSF] Parametros incompletos para el Servicio Web, faltan el Propoietario de la Aplicación"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bRecId == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsComPagoSF_VP_v33] Parametros incompletos para el Servicio Web, faltan el ID del CFDI a actualizar"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatPAC == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsComPagoSF_VP_v33] Parametros incompletos para el Servicio Web, faltan los Datos del PAC"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatGen == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsInvoiceSF] Parametros incompletos para el Servicio Web, faltan los Datos Generales"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatEmi == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsComPagoSF_VP_v33] Parametros incompletos para el Servicio Web, faltan los Datos del Emisor"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatRec == "" or $bDatArt == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsComPagoSF_VP_v33] Parametros incompletos para el Servicio Web, faltan los Datos del Receptor"); $Resultado = json_encode($j_array); echo $Resultado; return; } if($bDatArt == "") { $j_array = array('code' => "300", "message" => "ERROR - [wsComPagoSF_VP_v33] Parametros incompletos para el Servicio Web, faltan los Datos de los Articulos"); $Resultado = json_encode($j_array); echo $Resultado; return; } ### 0. EXTRACCION DE PARAMETROS PARA EL CFDI ###################################################### #== Primero, extraemos el JSON del string en base 64 $bdDatPAC = base64_decode($bDatPAC); $bdDatGen = base64_decode($bDatGen); $bdDatEmi = base64_decode($bDatEmi); $bdDatRec = base64_decode($bDatRec); $bdDatArt = base64_decode($bDatArt); if($bDatRel <> "") { $bdDatRel = base64_decode($bDatRel); } if ($tipoTest == 1){ #== Desplegado de los parametros en formato JSON echo $bdDatPAC; echo '
'; echo '
'; echo $bdDatGen; echo '
'; echo '
'; echo $bdDatEmi; echo '
'; echo '
'; echo $bdDatRec; echo '
'; echo '
'; echo $bdDatArt; echo '
'; echo '
'; echo $bdDatDoc; echo '
'; echo '
'; } #== Segundo, decodificamos el JSON a un arreglo $abdDatPAC = json_decode($bdDatPAC,true); $abdDatGen = json_decode($bdDatGen,true); $abdDatEmi = json_decode($bdDatEmi,true); $abdDatRec = json_decode($bdDatRec,true); $abdDatArt = json_decode($bdDatArt,true); $abdDatDoc = json_decode($bdDatDoc,true); if($bDatRel <> "") { $abdDatRel = json_decode($bdDatRel,true); } #== Datos y Variables para OAuth Token $coa_ClientId = $abdDatGen["C_OAuth_client_id"]; $coa_ClientSecret = $abdDatGen["C_OAuth_client_secret"]; $coa_RefreshToken = $abdDatGen["C_OAuth_refresh_token"]; $coa_GrantType = $abdDatGen["C_OAuth_grant_type"]; $coa_RedirectUri = $abdDatGen["C_OAuth_redirect_uri"]; $coa_AuthUrl = "https://accounts.zoho.com/oauth/v2/token"; #---------------------------------------------------------------- # JFA: 2021-06-12 # Obtenemos el access_token #---------------------------------------------------------------- $access_token = oauth($appOwner, 'ZCreator', $coa_RefreshToken, $coa_ClientId, $coa_ClientSecret, $coa_RedirectUri, $coa_GrantType, $coa_AuthUrl); #== Conexión a Zoho Creator para el detalle del CFDI // Added by FFR para el manejo de Complementos de Pago con 1 o multiples documentos relacionados $request_url = 'https://creator.zoho.com/api/v2/'.$appOwner.'/'.$applnkname.'/report/cfdi_cp_query/'.$bRecId; $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 ' . $access_token)); $r = curl_exec($ch); $array = json_decode($r); $bdDatDoc = $array->data->jsonDoctosRel; $abdDatDoc = json_decode($bdDatDoc,true); $dirBase = realpath("../"); ### CÓDIGO FUENTE, FACTURACIÓN ELECTRÓNICA CFDI VERSIÓN 3.2 ACORDE A LOS REQUIRIMIENTOS DEL SAT, ANEXO 20. ### 1. CONFIGURACIÓN INICIAL ###################################################### # 1.1 Configuración de zona horaria date_default_timezone_set('America/Mexico_City'); // if($tipoTest > 0){ # 1.2 Muestra la zona horaria predeterminada del servidor (opcional a mostrar) echo '
'; echo 'ZONA HORARIA PREDETERMINADA'; echo '
'; echo '
'; echo date_default_timezone_get(); echo '

'; } ### 2. DEFINICIÓN DE CONSTANTES ################################################### $SendaPEMS = "archs_pem/"; $SendaCFDI = "archs_cfdi/"; $SendaGRAFS = "archs_graf/"; $SendaXSD = "archs_xsd/"; // 2.1 Datos de acceso del usuario (proporcionados por el PAC). if($abdDatPAC["tipoTim"] == 1){ ## Timbrado en producción $urlPAC = "https://solucionfactible.com/ws/services/Timbrado?wsdl"; } else { ## Timbrado en pruebas $urlPAC = "https://testing.solucionfactible.com/ws/services/Timbrado?wsdl"; } $username = $abdDatPAC["username"]; $password = $abdDatPAC["password"]; if($tipoTest > 0){ $username = "testing@solucionfactible.com"; $password = "timbrado.SF.16672"; $urlPAC = "https://testing.solucionfactible.com/ws/services/Timbrado?wsdl"; } $valorNod = ''; $metodoDePago = ""; if ($tipoTest > 0){ ### MUESTRA LOS DATOS DEL USUARIO QUE ESTÁ TIMBRANDO (OPCIONAL A MOSTRAR) ###### echo '
'; echo 'DATOS DEL USUARIO QUE ESTÁ TIMBRANDO'; echo '
'; echo '
'; echo 'USUARIO: '.$username."
"; echo 'PASSWORD: '.$password."
"; echo 'URL: '.$urlPAC."
"; echo '

'; } ### 3. DEFINICIÓN DE VARIABLES INICIALES ########################################## $noCertificado = $abdDatGen["Certificado_SAT"]; $file_cer = $abdDatGen["Archivo_CER"]; $file_key = $abdDatGen["Archivo_KEY"]; $organi_id_ZB = $abdDatGen["organization_id_ZB"]; $authtoken_ZB = $abdDatGen["authtoken_ZB"]; $authtoken_ZC = $abdDatGen["authtoken_ZC"]; //echo $access_token; ### 4. DESTINATARIOS DE E-MAILS, PERSONAS A QUIENES LES LLEGARÁ DE MANERA ADJUNTA LA FACTURA ELECTRÓNICA EN ARCHIVOS .XML Y .PDF $CadenaEmails = $abdDatGen["CadenaEmails"]; $CadenaEmails = "ffaccinetto@aptus-legal.com"; ### 5. DATOS GENERALES DE LA FACTURA ############################################## $fact_serie = $abdDatGen["comprobante_serie"]; $fact_folio = $abdDatGen["comprobante_folio"]; if ($bFolioN <> ""){ $fact_folio = $bFolioN; } $NoFac = $fact_serie.$fact_folio; $fact_tipcompr = $abdDatGen["comprobante_tipo"]; $fact_exportacion = $abdDatGen["comprobante_exportacion"]; $subTotal = $abdDatGen["subTotal"]; $total = $abdDatGen["Total"]; $fecha_fact = $abdDatGen["comprobante_fecha"]; $condicionesDePago = $abdDatGen["condicionesDePago"]; $LugarExpedicion = utf8_decode($abdDatGen["LugarExpedicion"]); $moneda = $abdDatGen["moneda"]; $invoiceNumber = utf8_decode($abdDatGen["invoiceNumber"]); $invoiceID = $abdDatGen["invoiceID"]; $paymentID = $abdDatGen["paymentID"]; $TipoRelacion = $abdDatGen["TipoRelacion"]; ### 5.1 DATOS GENERALES DEL PAGO ############################################## $FechaPago = $abdDatGen["FechaPago"]; $FormaDePagoP = $abdDatGen["FormaDePagoP"]; $MonedaP = $abdDatGen["MonedaP"]; $Monto = number_format($abdDatGen["Monto"],2,'.',''); $TipoCambioP = number_format($abdDatGen["TipoCambioP"],6,'.',''); $NumOperacion = utf8_decode($abdDatGen["NumOperacion"]); $RfcEmisorCtaOrd = utf8_decode($abdDatGen["RfcEmisorCtaOrd"]); $NomBancoOrdExt = utf8_decode($abdDatGen["NomBancoOrdExt"]); $CtaOrdenante = utf8_decode($abdDatGen["CtaOrdenante"]); $RfcEmisorCtaBen = utf8_decode($abdDatGen["RfcEmisorCtaBen"]); $CtaBeneficiario = utf8_decode($abdDatGen["CtaBeneficiario"]); $TipoCadPago = utf8_decode($abdDatGen["TipoCadPago"]); $CertPago = $abdDatGen["CertPago"]; $CadPago = $abdDatGen["CadPago"]; $SelloPago = $abdDatGen["SelloPago"]; if ($tipoTest > 0){ ### 6. MUESTRA LA ZONA HORARIA PREDETERMINADA DEL SERVIDOR (OPCIONAL A MOSTRAR) ###### echo '
'; echo 'FECHA Y HORA DE SOLICITUD DE TIMBRADO'; echo '
'; echo '
'; echo $fecha_fact; // 6.1 Se muestra solo para consultar y confirmar que sea la correcta. echo '

'; } ### 7. ARRAYS QUE CONTIENEN LOS ARTICULOS QUE FORMAN PARTE DE LA VENTA ############ ### 8. DATOS GENERALES DEL EMISOR ################################################# $emisor_rs = utf8_decode($abdDatEmi["emisor_rs"]); $emisor_rfc = utf8_decode($abdDatEmi["emisor_rfc"]); $emisor_regfis = utf8_decode($abdDatEmi["emisor_regfis"]); ### 9. DATOS GENERALES DEL RECEPTOR (CLIENTE) ##################################### $RFC_Recep = utf8_decode($abdDatRec["RFC_Recep"]); if (strlen($RFC_Recep)==12){$RFC_Recep = " ".$RFC_Recep; }else{$RFC_Recep = $RFC_Recep;} $receptor_rfc = $RFC_Recep; $receptor_rs = utf8_decode($abdDatRec["receptor_rs"]); $receptor_uso = utf8_decode($abdDatGen["usoCFDI"]); $receptor_regfis = utf8_decode($abdDatRec["receptor_regfis"]); $receptor_cp = utf8_decode($abdDatRec["receptor_cp"]); if($TipPDFGen == 1) { $receptor_cal = utf8_decode($abdDatRec["receptor_cal"]); $receptor_ne = utf8_decode($abdDatRec["receptor_ne"]); $receptor_ni = utf8_decode($abdDatRec["receptor_ni"]); $receptor_col = utf8_decode($abdDatRec["receptor_col"]); $receptos_loc = utf8_decode($abdDatRec["receptor_loc"]); $receptor_del = utf8_decode($abdDatRec["receptor_del"]); $receptor_edo = utf8_decode($abdDatRec["receptor_edo"]); $receptor_pai = utf8_decode($abdDatRec["receptor_pai"]); $receptor_cp = utf8_decode($abdDatRec["receptor_cp"]); $sDomicilio = $receptor_cal; if($receptor_ne != "") { $sDomicilio = $sDomicilio." ".$receptor_ne; } if($receptor_ni != "") { $sDomicilio = $sDomicilio." ".$receptor_ni; } if($receptor_col != "") { $sDomicilio = $sDomicilio.", ".$receptor_col; } if($receptos_loc != "") { $sDomicilio = $sDomicilio.", ".$receptos_loc; } if($receptor_del != "") { $sDomicilio = $sDomicilio.", ".$receptor_del; } if($receptor_edo != "") { $sDomicilio = $sDomicilio.", ".$receptor_edo; } if($receptor_pai != "") { $sDomicilio = $sDomicilio.", ".$receptor_pai; } if($receptor_cp != "") { $sDomicilio = $sDomicilio." ".$receptor_cp; } $sDireRecep = base64_encode(utf8_encode($sDomicilio)); } // Calculamos el Monto Total de los Pagos relacionados $TotalRetencionesIVA = $TotalRetencionesISR = $TotalRetencionesIEPS = 0.00; $TotalTrasladosBaseIVA16 = $TotalTrasladosImpuestoIVA16 = 0.00; $TotalTrasladosBaseIVA8 = $TotalTrasladosImpuestoIVA8 = 0.00; $TotalTrasladosBaseIVA0 = $TotalTrasladosImpuestoIVA0 = 0.00; $TotalTrasladosBaseIVAExento = $MontoTotalPagos = 0.00; foreach ($abdDatDoc as $doc) { $MonedaDR = $doc["MonedaDR"]; $TipoCambioDR = $doc["TipoCambioDR"]; // Cálculo del importe de pago con precisión de 6 decimales if ($MonedaP == "MXN") { $importePago = round($MonedaDR != $MonedaP ? $doc["ImpPagado"] * $TipoCambioDR : $doc["ImpPagado"], 6); //echo $importePago; //exit; } else { $importePago = round($MonedaDR != $MonedaP ? $doc["ImpPagado"] * $TipoCambioP : $doc["ImpPagado"], 6); } $MontoTotalPagos += round($importePago, 6); // Verificación de impuestos if ($doc["ObjetoImpDR"] == "02") { // Retenciones if ($doc["RDR_ImpuestoDR"] == "001") $TotalRetencionesISR += $doc["RDR_ImporteDR"]; if ($doc["RDR_ImpuestoDR"] == "002") $TotalRetencionesIVA += $doc["RDR_ImporteDR"]; // Traslados if ($doc["TDR_ImpuestoDR"] == "002") { switch ($doc["TDR_TasaOCuotaDR"]) { case 0.16: $TotalTrasladosBaseIVA16 += $doc["TDR_BaseDR"]; $TotalTrasladosImpuestoIVA16 += $doc["TDR_ImporteDR"]; break; case 0.08: $TotalTrasladosBaseIVA8 += $doc["TDR_BaseDR"]; $TotalTrasladosImpuestoIVA8 += $doc["TDR_ImporteDR"]; break; case 0.00: $TotalTrasladosBaseIVA0 += $doc["TDR_BaseDR"]; $TotalTrasladosImpuestoIVA0 += $doc["TDR_ImporteDR"]; break; } } } } // Ajustes según la moneda de pago y el tipo de cambio if ($MonedaP != "MXN" && $TipoCambioP > 1.000000) { if ($MonedaDR != "MXN") { $factor = $TipoCambioP; } else { $factor = 1 / $TipoCambioP; } // Aplicamos redondeo con factor de conversión $TotalRetencionesISR = round($TotalRetencionesISR * $factor, 2); $TotalRetencionesIVA = round($TotalRetencionesIVA * $factor, 2); $TotalTrasladosBaseIVA16 = round($TotalTrasladosBaseIVA16 * $factor, 2); $TotalTrasladosImpuestoIVA16 = round($TotalTrasladosImpuestoIVA16 * $factor, 2); $TotalTrasladosBaseIVA8 = round($TotalTrasladosBaseIVA8 * $factor, 2); $TotalTrasladosImpuestoIVA8 = round($TotalTrasladosImpuestoIVA8 * $factor, 2); $TotalTrasladosBaseIVA0 = round($TotalTrasladosBaseIVA0 * $factor, 2); $TotalTrasladosImpuestoIVA0 = round($TotalTrasladosImpuestoIVA0 * $factor, 2); $MontoTotalPagos = round($MontoTotalPagos * $factor, 6); } // Ajuste final cuando MonedaP es MXN y MonedaDR no lo es if ($MonedaP == "MXN" && $MonedaDR != "MXN") { $factor = 1 / $TipoCambioDR; $TotalRetencionesISR = round($TotalRetencionesISR * $factor, 2); $TotalRetencionesIVA = round($TotalRetencionesIVA * $factor, 2); $TotalTrasladosBaseIVA16 = round($TotalTrasladosBaseIVA16 * $factor, 2); $TotalTrasladosImpuestoIVA16 = round($TotalTrasladosImpuestoIVA16 * $factor, 2); $TotalTrasladosBaseIVA8 = round($TotalTrasladosBaseIVA8 * $factor, 2); $TotalTrasladosImpuestoIVA8 = round($TotalTrasladosImpuestoIVA8 * $factor, 2); $TotalTrasladosBaseIVA0 = round($TotalTrasladosBaseIVA0 * $factor, 2); $TotalTrasladosImpuestoIVA0 = round($TotalTrasladosImpuestoIVA0 * $factor, 2); } //Corrección específica de decimales en los montos de pago para los complementos pagados en MXN y documentos originales de USD if($MonedaP == $MonedaDR){ // Corrección del calculo de monto de pago $MontoTotalPagos = $Monto; }else{ // Corrección del calculo de monto de pago $MontoTotalPagos = $Monto * $TipoCambioP; } ### 10. CREACIÓN Y ALMACENAMIENTO DEL ARCHIVO .XML (CFDI) ANTES DE SER TIMBRADO ################### #== 10.1 Creación de la variable de tipo DOM, aquí se conforma el XML a timbrar posteriormente. $xml = new DOMdocument('1.0', 'UTF-8');