{"id":33650,"date":"2025-03-22T12:09:12","date_gmt":"2025-03-22T11:09:12","guid":{"rendered":"https:\/\/softastrd.com\/?page_id=33650"},"modified":"2026-06-02T12:49:44","modified_gmt":"2026-06-02T10:49:44","slug":"get-cid","status":"publish","type":"page","link":"https:\/\/softastrd.com\/pt\/get-cid\/","title":{"rendered":"Obter CID"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"33650\" class=\"elementor elementor-33650\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"wd-negative-gap elementor-element elementor-element-b28f14f e-flex e-con-boxed e-con e-parent\" data-id=\"b28f14f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-3125303 e-con-full e-flex e-con e-child\" data-id=\"3125303\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-07f5882 elementor-widget elementor-widget-image\" data-id=\"07f5882\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"303\" height=\"300\" src=\"https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone--303x300.png\" class=\"attachment-medium size-medium wp-image-35385\" alt=\"\" srcset=\"https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone--303x300.png 303w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone--600x594.png 600w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone--150x150.png 150w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone--12x12.png 12w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/04\/activate-by-phone-.png 608w\" sizes=\"auto, (max-width: 303px) 100vw, 303px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2b3fd55 e-con-full e-flex e-con e-child\" data-id=\"2b3fd55\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-86c8281 elementor-widget elementor-widget-image\" data-id=\"86c8281\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"378\" height=\"300\" src=\"https:\/\/softastrd.com\/wp-content\/uploads\/2025\/03\/getcid-378x300.png\" class=\"attachment-medium size-medium wp-image-33708\" alt=\"\" srcset=\"https:\/\/softastrd.com\/wp-content\/uploads\/2025\/03\/getcid-378x300.png 378w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/03\/getcid-150x119.png 150w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/03\/getcid-15x12.png 15w, https:\/\/softastrd.com\/wp-content\/uploads\/2025\/03\/getcid.png 598w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"wd-negative-gap elementor-element elementor-element-caed08c e-flex e-con-boxed e-con e-parent\" data-id=\"caed08c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"wd-negative-gap elementor-element elementor-element-e964e82 e-grid e-con-boxed e-con e-parent\" data-id=\"e964e82\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6007d70 elementor-widget elementor-widget-html\" data-id=\"6007d70\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"it\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Ottieni il tuo ID di conferma<\/title>\n    <style>\n        .get-cid-container {\n            max-width: 600px;\n            margin: 20px auto;\n            padding: 20px;\n            background-color: #fff;\n            border-radius: 8px;\n            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n        }\n        .get-cid-container h2 {\n            color: #1a73e8;\n            font-size: 22px;\n            margin-bottom: 20px;\n            text-align: center;\n        }\n        .form-group {\n            margin-bottom: 15px;\n        }\n        .form-group label {\n            display: block;\n            font-weight: bold;\n            margin-bottom: 5px;\n            color: #555;\n            font-size: 14px;\n        }\n        .form-group input {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 5px;\n            font-size: 14px;\n            box-sizing: border-box;\n        }\n        .form-group input:focus {\n            outline: none;\n            border-color: #1a73e8;\n            box-shadow: 0 0 5px rgba(26, 115, 232, 0.3);\n        }\n        .form-group .help-text {\n            font-size: 12px;\n            color: #777;\n            margin-top: 5px;\n        }\n        .get-cid-container button[type=\"submit\"] {\n            display: block;\n            width: 150px;\n            margin: 20px auto;\n            padding: 10px;\n            background-color: #1a73e8;\n            color: #fff;\n            border: none;\n            border-radius: 5px;\n            font-size: 14px;\n            cursor: pointer;\n            transition: background-color 0.3s;\n            text-align: center;\n        }\n        .get-cid-container button[type=\"submit\"]:hover {\n            background-color: #1557b0;\n        }\n        .get-cid-container button[type=\"submit\"][disabled] {\n            cursor: not-allowed;\n            opacity: 0.7;\n        }\n        .get-cid-container .message {\n            color: #d00;\n            margin: 10px 0;\n            text-align: center;\n            font-size: 14px;\n        }\n        .get-cid-container .success {\n            color: #090;\n        }\n        .get-cid-container .cid-output {\n            margin-top: 20px;\n            padding: 15px;\n            background-color: #f9f9f9;\n            border: 1px solid #ddd;\n            border-radius: 5px;\n            text-align: center;\n            font-size: 14px;\n        }\n        .get-cid-container .cid-output strong {\n            display: block;\n            margin-bottom: 5px;\n            color: #1a73e8;\n        }\n        .cid-output .cid-full {\n            margin-bottom: 10px;\n            font-weight: bold;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 10px;\n        }\n        .cid-output .cid-full .copy-btn {\n            padding: 5px 10px;\n            background-color: #ccc;\n            border: none;\n            border-radius: 5px;\n            cursor: pointer;\n            font-size: 12px;\n            transition: background-color 0.3s;\n        }\n        .cid-output .cid-full .copy-btn:hover {\n            background-color: #bbb;\n        }\n        .cid-output .cid-segments {\n            display: flex;\n            flex-wrap: wrap;\n            justify-content: center;\n            gap: 10px;\n        }\n        .cid-output .cid-segments div {\n            background-color: #fff;\n            border: 1px solid #ddd;\n            padding: 5px 10px;\n            border-radius: 5px;\n            font-size: 12px;\n        }\n        .cid-output .cid-segments span {\n            font-weight: bold;\n            margin-right: 5px;\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"get-cid-container\">\n        <h2>Ottieni il tuo ID di conferma<\/h2>\n\n        <form id=\"cidForm\" onsubmit=\"return false;\">\n            <div class=\"form-group\">\n                <label for=\"iid\">ID di installazione:<\/label>\n                <input type=\"text\" id=\"iid\" name=\"iid\" required>\n            <\/div>\n\n            <div class=\"form-group\">\n                <label for=\"ocr_upload\">Oppure, carica uno screenshot per rilevarlo automaticamente:<\/label>\n                <input type=\"file\" id=\"ocr_upload\" accept=\"image\/*\">\n                <small id=\"ocr-status\" style=\"display:none; color: #555; margin-top: 5px;\"><\/small>\n            <\/div>\n\n            <div class=\"form-group\">\n                <label for=\"order_number\">Numero d'ordine:<\/label>\n                <input type=\"text\" id=\"order_number\" name=\"order_number\" required>\n                <p class=\"help-text\">Inserisci il numero d'ordine nel formato AS[Numero] (es. AS16572). Puoi trovare il tuo numero d'ordine nella tua email di conferma dell'ordine o nella sezione \"Ordini\" del tuo account.<\/p>\n            <\/div>\n\n            <button type=\"submit\" id=\"submitBtn\">Ottieni CID<\/button>\n        <input\n                    class=\"apbct_special_field apbct_email_id__elementor_form\"\n                    name=\"apbct__email_id__elementor_form\"\n                    aria-label=\"apbct__label_id__elementor_form\"\n                    type=\"text\" size=\"30\" maxlength=\"200\" autocomplete=\"off\"\n                    value=\"\"\n                \/><\/form>\n\n        <p id=\"message\" aria-live=\"polite\"><\/p>\n\n        <div class=\"cid-output\">\n            <strong>ID di conferma<\/strong>\n            <div id=\"cidDisplay\">Non ancora generato<\/div>\n            <div id=\"cidSegments\" style=\"display: none;\">\n                <div class=\"cid-full\">\n                    <span id=\"fullCid\"><\/span>\n                    <button class=\"copy-btn\" type=\"button\" onclick=\"copyCid()\">Copy<\/button>\n                <\/div>\n                <div class=\"cid-segments\">\n                    <div><span>A:<\/span> <span class=\"segment-a\"><\/span><\/div>\n                    <div><span>B:<\/span> <span class=\"segment-b\"><\/span><\/div>\n                    <div><span>C:<\/span> <span class=\"segment-c\"><\/span><\/div>\n                    <div><span>D:<\/span> <span class=\"segment-d\"><\/span><\/div>\n                    <div><span>E:<\/span> <span class=\"segment-e\"><\/span><\/div>\n                    <div><span>F:<\/span> <span class=\"segment-f\"><\/span><\/div>\n                    <div><span>G:<\/span> <span class=\"segment-g\"><\/span><\/div>\n                    <div><span>H:<\/span> <span class=\"segment-h\"><\/span><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script src='https:\/\/cdn.jsdelivr.net\/npm\/tesseract.js@5\/dist\/tesseract.min.js'><\/script>\n\n    <script>\n        \/\/ --- Element Selectors ---\n        const form = document.getElementById('cidForm');\n        const message = document.getElementById('message');\n        const iidInput = document.getElementById('iid');\n        const submitButton = document.getElementById('submitBtn');\n\n        const cidDisplay = document.getElementById('cidDisplay');\n        const cidSegments = document.getElementById('cidSegments');\n        const fullCid = document.getElementById('fullCid');\n        const segmentA = cidSegments.querySelector('.segment-a');\n        const segmentB = cidSegments.querySelector('.segment-b');\n        const segmentC = cidSegments.querySelector('.segment-c');\n        const segmentD = cidSegments.querySelector('.segment-d');\n        const segmentE = cidSegments.querySelector('.segment-e');\n        const segmentF = cidSegments.querySelector('.segment-f');\n        const segmentG = cidSegments.querySelector('.segment-g');\n        const segmentH = cidSegments.querySelector('.segment-h');\n\n        const ocrUploadInput = document.getElementById('ocr_upload');\n        const ocrStatus = document.getElementById('ocr-status');\n\n        \/\/ --- OCR FUNCTIONALITY ---\n        ocrUploadInput.addEventListener('change', async (e) => {\n            const file = e.target.files[0];\n            if (!file) return;\n\n            ocrStatus.textContent = 'Processing image... (this may take a moment)';\n            ocrStatus.style.display = 'block';\n            ocrStatus.style.color = '#555';\n            iidInput.value = '';\n\n            try {\n                const worker = await Tesseract.createWorker('eng', 1, {\n                    logger: m => {\n                        console.log(m);\n                        if (m.status === 'recognizing text') {\n                            ocrStatus.textContent = `Processing... (${Math.round(m.progress * 100)}%)`;\n                        }\n                    }\n                });\n\n                const { data: { text } } = await worker.recognize(file);\n                const iidRegex = \/(\\d[\\s-]*){40,}\/;\n                const match = text.match(iidRegex);\n\n                if (match) {\n                    const foundId = match[0].replace(\/[\\s-]\/g, '');\n                    iidInput.value = foundId;\n                    ocrStatus.textContent = 'Installation ID found!';\n                    ocrStatus.style.color = '#090';\n                } else {\n                    ocrStatus.textContent = 'Could not find an Installation ID in the image. Please type it manually.';\n                    ocrStatus.style.color = '#d00';\n                }\n\n                await worker.terminate();\n            } catch (error) {\n                console.error(error);\n                ocrStatus.textContent = 'An error occurred during image processing.';\n                ocrStatus.style.color = '#d00';\n            }\n        });\n\n        \/\/ --- Helper: safely parse JSON from fetch response ---\n        \/\/ Strips any HTML warnings (e.g. WP DB notices) that appear before the JSON\n        async function safeJsonParse(response) {\n            const responseText = await response.text();\n\n            \/\/ Find the first '{' to skip any leading HTML (e.g. WordPress DB warnings)\n            const jsonStart = responseText.indexOf('{');\n            if (jsonStart === -1) {\n                console.error('No JSON found in response:', responseText.substring(0, 200));\n                throw new Error('Il server non ha risposto correttamente. L\\'endpoint API potrebbe non essere disponibile. Contatta il supporto.');\n            }\n\n            const cleanText = responseText.substring(jsonStart);\n\n            try {\n                return JSON.parse(cleanText);\n            } catch (e) {\n                console.error('JSON parse error. Raw response:', responseText.substring(0, 200));\n                throw new Error('Risposta non valida dal server. Riprova pi\u00f9 tardi.');\n            }\n        }\n\n        \/\/ --- FORM SUBMISSION LOGIC (browser-side polling) ---\n        let timerInterval;\n        let startTime;\n\n        form.addEventListener('submit', async (e) => {\n            e.preventDefault();\n\n            showMessage('', true);\n            cidDisplay.style.display = 'block';\n            cidSegments.style.display = 'none';\n            cidDisplay.textContent = 'Non ancora generato';\n\n            let iid = iidInput.value.trim();\n            const orderNumber = document.getElementById('order_number').value.trim();\n\n            if (!orderNumber.match(\/^AS\/i)) {\n                showMessage(\"Il numero d'ordine deve iniziare con 'AS' (es. AS16572).\", false);\n                return;\n            }\n\n            iid = iid.replace(\/[\\s-]\/g, '');\n\n            if (!iid || !orderNumber) {\n                showMessage('Per favore, compila tutti i campi.', false);\n                return;\n            }\n\n            submitButton.disabled = true;\n            submitButton.textContent = 'In attesa... (0s)';\n            startTime = Date.now();\n            timerInterval = setInterval(updateTimer, 1000);\n\n            const maxAttempts = 15;\n            const delay = 3000;\n            let attempt = 0;\n            let lastError = '';\n\n            try {\n                while (attempt < maxAttempts) {\n                    attempt++;\n\n                    let response;\n                    try {\n                        response = await fetch('\/wp-json\/softastrd\/v1\/get-cid', {\n                            method: 'POST',\n                            headers: { 'Content-Type': 'application\/json' },\n                            body: JSON.stringify({ iid, order_number: orderNumber })\n                        });\n                    } catch (networkError) {\n                        console.error('Network error:', networkError);\n                        throw new Error('Errore di rete. Controlla la tua connessione e riprova.');\n                    }\n\n                    const result = await safeJsonParse(response);\n\n                    \/\/ CID found\n                    if (result.status === 'complete' && result.cid) {\n                        let cid = result.cid;\n                        let formattedCid = cid.replace(\/[\\s-]\/g, '');\n                        if (formattedCid.length === 48) {\n                            formattedCid = formattedCid.match(\/.{1,6}\/g).join('-');\n                        }\n\n                        fullCid.textContent = formattedCid;\n                        const segments = formattedCid.split('-');\n                        segmentA.textContent = segments[0] || '';\n                        segmentB.textContent = segments[1] || '';\n                        segmentC.textContent = segments[2] || '';\n                        segmentD.textContent = segments[3] || '';\n                        segmentE.textContent = segments[4] || '';\n                        segmentF.textContent = segments[5] || '';\n                        segmentG.textContent = segments[6] || '';\n                        segmentH.textContent = segments[7] || '';\n\n                        cidDisplay.style.display = 'none';\n                        cidSegments.style.display = 'block';\n                        showMessage('Successo! Il tuo ID di conferma \u00e8 mostrato qui sotto.', true);\n                        return;\n                    }\n\n                    \/\/ Still pending - wait and retry\n                    if (result.status === 'pending') {\n                        showMessage(`Elaborazione in corso... tentativo ${attempt}\/${maxAttempts}`, true);\n                        await new Promise(resolve => setTimeout(resolve, delay));\n                        continue;\n                    }\n\n                    \/\/ Error from API\n                    lastError = result.message || 'Errore sconosciuto';\n                    break;\n                }\n\n                if (attempt >= maxAttempts) {\n                    throw new Error('Timeout: impossibile ottenere il CID. Riprova tra qualche minuto.');\n                } else {\n                    throw new Error(lastError);\n                }\n\n            } catch (error) {\n                console.error('Fetch error:', error);\n                let errorMessage = error.message || 'Si \u00e8 verificato un errore durante la generazione del CID.';\n\n                if (errorMessage === 'Cannot generate CID for this order' ||\n                    errorMessage === 'Maximum limit of 10 CIDs has been reached for this order') {\n                    errorMessage = 'Impossibile generare CID per questo ordine.';\n                } else if (errorMessage === 'A CID has already been generated for this order') {\n                    errorMessage = 'Un CID \u00e8 gi\u00e0 stato generato per questo ordine.';\n                } else if (errorMessage === 'Installation ID and order number are required') {\n                    errorMessage = 'ID di installazione e numero d\\'ordine sono obbligatori.';\n                }\n\n                showMessage(errorMessage, false);\n            } finally {\n                clearInterval(timerInterval);\n                submitButton.disabled = false;\n                submitButton.textContent = 'Ottieni CID';\n            }\n        });\n\n        function updateTimer() {\n            const elapsed = Math.floor((Date.now() - startTime) \/ 1000);\n            submitButton.textContent = `In attesa... (${elapsed}s)`;\n        }\n\n        function showMessage(text, isSuccess) {\n            message.textContent = text;\n            message.className = isSuccess ? 'success' : 'message';\n        }\n\n        function copyCid() {\n            const cidText = document.getElementById('fullCid').textContent;\n            navigator.clipboard.writeText(cidText).then(() => {\n                alert('CID copiato negli appunti!');\n            }).catch(err => {\n                console.error('Errore durante la copia del CID:', err);\n            });\n        }\n    <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"wd-negative-gap elementor-element elementor-element-b002da1 e-flex e-con-boxed e-con e-parent\" data-id=\"b002da1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"wd-negative-gap elementor-element elementor-element-6e0e8f3 e-flex e-con-boxed e-con e-parent\" data-id=\"6e0e8f3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Ottieni il tuo ID di conferma Ottieni il tuo ID di conferma ID di installazione: Oppure, carica uno screenshot per<\/p>","protected":false},"author":9,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-33650","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/pages\/33650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/comments?post=33650"}],"version-history":[{"count":3,"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/pages\/33650\/revisions"}],"predecessor-version":[{"id":87378,"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/pages\/33650\/revisions\/87378"}],"wp:attachment":[{"href":"https:\/\/softastrd.com\/pt\/wp-json\/wp\/v2\/media?parent=33650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}