> git config --get commit.template [6ms] 2025-05-07 16:43:08.938 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:43:08.947 [info] > git status -z -uall [4ms] 2025-05-07 16:43:08.948 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [1ms] 2025-05-07 16:43:40.514 [info] > git config --get commit.template [3ms] 2025-05-07 16:43:40.521 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [2ms] 2025-05-07 16:43:40.531 [info] > git status -z -uall [6ms] 2025-05-07 16:43:40.531 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [1ms] 2025-05-07 16:45:45.165 [info] > git config --get commit.template [6ms] 2025-05-07 16:45:45.165 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:45:45.176 [info] > git status -z -uall [4ms] 2025-05-07 16:45:45.177 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [2ms] 2025-05-07 16:45:50.191 [info] > git config --get commit.template [5ms] 2025-05-07 16:45:50.192 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:45:50.206 [info] > git status -z -uall [7ms] 2025-05-07 16:45:50.206 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [3ms] 2025-05-07 16:45:55.219 [info] > git config --get commit.template [1ms] 2025-05-07 16:45:55.225 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [2ms] 2025-05-07 16:45:55.238 [info] > git status -z -uall [5ms] 2025-05-07 16:45:55.239 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [1ms] 2025-05-07 16:55:27.332 [info] > git config --get commit.template [5ms] 2025-05-07 16:55:27.333 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:55:27.342 [info] > git status -z -uall [5ms] 2025-05-07 16:55:27.342 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [1ms] 2025-05-07 16:55:28.770 [info] > git rev-parse --show-toplevel [1ms] 2025-05-07 16:55:28.770 [info] fatal: not a git repository (or any of the parent directories): .git 2025-05-07 16:55:37.947 [info] > git config --get commit.template [5ms] 2025-05-07 16:55:37.948 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:55:37.957 [info] > git status -z -uall [4ms] 2025-05-07 16:55:37.959 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [3ms] 2025-05-07 16:56:51.444 [info] > git config --get commit.template [5ms] 2025-05-07 16:56:51.444 [info] > git for-each-ref --format=%(refname)%00%(upstream:short)%00%(objectname)%00%(upstream:track)%00%(upstream:remotename)%00%(upstream:remoteref) refs/heads/master refs/remotes/master [1ms] 2025-05-07 16:56:51.451 [info] > git status -z -uall [3ms] 2025-05-07 16:56:51.452 [info] > git for-each-ref --sort -committerdate --format %(refname)%00%(objectname)%00%(*objectname) [1ms] 2025-05-07 16:56:56.463 [info] > git config --get commit.template [1ms] 2025-05-07 16:56:56.469 [info] > git name) && isset($attr->value)) { $formatted[$attr->name] = $attr->value; } } elseif (is_array($attr)) { if (isset($attr['name']) && isset($attr['value'])) { $formatted[$attr['name']] = $attr['value']; } } } return $formatted; } // decodificación de parámetros $crmData = getDecodedParam('pCRMData'); $netDocumentsAccessToken = getDecodedParam('pNDAccessToken'); $crmRecordId = getDecodedParam('pRecordId'); $netDocumentsProfile = json_decode(getDecodedParam('pNDProfile', false) ?? '[]'); $crmDataObj = json_decode($crmData); // obtención de access token de CRM $getAccessToken = OAuthV2::getToken($crmDataObj->crm_organization_id); // obtención de adjuntos de registro de CRM $response = makeCurlRequest( "https://www.zohoapis.com/crm/v2/{$crmDataObj->pModule}/{$crmRecordId}/Attachments", 'GET', ["Authorization: Zoho-oauthtoken $getAccessToken->token"] ); $data = json_decode($response); // se valida si la respuesta es correcta if (empty($data->data)) exit(json_encode(["error" => "El registro no cuenta con archivos adjuntos"])); $attachments = $data->data; $customAttrTest = []; // se iteran los datos de los archivos adjuntos al registro de crm foreach ($attachments as $file) { $id = $file->id; $fileName = $file->File_Name; $author = strstr($file->Owner->email, '@', true); // se descarga el archivo adjunto $downloadFile = makeCurlRequest( "https://www.zohoapis.com/crm/v2/{$crmDataObj->pModule}/{$crmRecordId}/Attachments/{$id}", 'GET', ["Authorization: Zoho-oauthtoken $getAccessToken->token"] ); file_put_contents($fileName, $downloadFile); $fileProfile = array_merge($netDocumentsProfile, [["id" => "1", "value" => $author]]); var_dump($fileProfile); $upload = makeCurlRequest( "https://api.vault.netvoyage.com/v1/Document/upload", 'POST', [ "Authorization: Bearer $netDocumentsAccessToken", "Content-Type: multipart/form-data", "Accept: application/json" ], [ 'file' => new CURLFile($fileName), 'destination' => $crmDataObj->pDestination, 'cabinet' => $crmDataObj->pCabinet, 'return' => 'full', 'customAttributes' => json_encode(formatCustomAttributes($fileProfile)) ] ); $uldata = json_decode($upload); $fileId = $uldata->standardAttributes->id ?? null; $envId = $uldata->standardAttributes->envId ?? null; $fileUrl = $uldata->standardAttributes->url ?? null; if (!$fileId) continue; $logMsg = "Archivo $fileName agregado a NetDocuments:\nEnvelope ID: $envId\nID: $fileId\nURL: https://vault.netvoyage.com/neWeb2/goId.aspx?id=$fileId&open=Y"; $recordObject = [ 'Usuario_Originador' => ['name' => $crmDataObj->pUsuarioOriginadorName, 'id' => $crmDataObj->pUsuarioOriginadorId], 'Interfase' => $crmDataObj->pInterfase, 'Modulo' => $crmDataObj->pModule, 'Log' => $logMsg, 'Registro' => $crmDataObj->pRegistroUrl ]; $body = ['data' => [$recordObject]]; makeCurlRequest( 'https://www.zohoapis.com/crm/v2/AptusLogs', 'POST', ["Authorization: Zoho-oauthtoken $getAccessToken->token"], json_encode($body) ); makeCurlRequest( "https://www.zohoapis.com/crm/v2/{$crmDataObj->pModule}/{$crmRecordId}/Attachments/{$id}", 'DELETE', ["Authorization: Zoho-oauthtoken $getAccessToken->token"] ); unlink($fileName); $customAttrTest[] = ["file_id" => $fileId, "attributes" => json_encode($fileProfile)]; } // Solo si se requiere debug if (isset($_REQUEST['debug']) && $_REQUEST['debug'] == '1') { makeCurlRequest( 'https://zohoapi-730085095.development.catalystserverless.com/server/Cliq/sendMessage', 'POST', ['Content-Type: application/json'], json_encode([ "client_key" => "704580140", "recipient" => "uploadattachmentstond", "bot_name" => "devbotq", "message" => json_encode($customAttrTest) ]) ); } echo json_encode([ "status" => "ok", "archivos_subidos" => count($customAttrTest), "detalle" => $customAttrTest ]); ?>