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');