{"id":272,"date":"2026-02-25T09:24:05","date_gmt":"2026-02-25T09:24:05","guid":{"rendered":"https:\/\/macmonir.net\/test\/?page_id=272"},"modified":"2026-02-25T09:39:26","modified_gmt":"2026-02-25T09:39:26","slug":"scanner","status":"publish","type":"page","link":"https:\/\/macmonir.net\/test\/scanner\/","title":{"rendered":"scanner"},"content":{"rendered":"        <div class=\"wrap les-checkin-wrap\">\n            <h1><span class=\"dashicons dashicons-camera\"><\/span> Ticket Scanner &amp; Manual Check-in<\/h1>\n            \n            <!-- === NEW: Manual Entry Section === -->\n            <div id=\"les-manual-entry-container\">\n                <h3>Manual Ticket Entry<\/h3>\n                <p>If you cannot scan the QR code, enter the Master Ticket Code below.<\/p>\n                <div class=\"manual-entry-form\">\n                    <input type=\"text\" id=\"manual_ticket_code_input\" placeholder=\"e.g., LESO-123-45678\">\n                    <button class=\"button button-primary\" id=\"verify_manual_code_btn\">Verify Code<\/button>\n                <\/div>\n            <\/div>\n            <!-- =============================== -->\n\n            <div id=\"les-scanner-container\">\n                <h3>QR Code Scanner<\/h3>\n                <p>Use your device&#039;s camera to scan the QR code on a customer&#039;s ticket.<\/p>\n                <div id=\"les-qr-reader\" style=\"width: 500px; max-width: 90vw;\"><\/div>\n            <\/div>\n            \n            <div id=\"les-scan-result-container\">\n                <h2>Check-in Result<\/h2>\n                <div id=\"les-scan-result\" class=\"notice\">\n                    <p>Waiting for scan or manual entry...<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Include the QR Code Scanner Library -->\n        <script src=\"https:\/\/unpkg.com\/html5-qrcode\" type=\"text\/javascript\"><\/script>\n\n                <script>\n            const les_checkin_i18n = {\"pleaseEnterCode\":\"Please enter a ticket code.\",\"invalidFormat\":\"Invalid Master Ticket Code format.\",\"verifying\":\"Verifying ticket...\",\"serverError\":\"Error connecting to server.\",\"scanNext\":\"Scan Next Ticket\",\"invalidQR\":\"Invalid QR Code. This is not a valid event ticket.\",\"scanAgain\":\"Scan Again\",\"waiting\":\"Waiting for scan or manual entry...\"};\n        <\/script>\n\n        <script>\n            jQuery(document).ready(function($) {\n                \n                \/\/ === NEW: Central AJAX function to handle verification ===\n                function verifyTicketCode(code) {\n                    if (!code) {\n                        $('#les-scan-result').html('<p>' + les_checkin_i18n.pleaseEnterCode + '<\/p>').removeClass('notice-info').addClass('notice-warning is-dismissible');\n                        return;\n                    }\n\n                    \/\/ Extract Order ID from the code (e.g., LESO-123-45678)\n                    const parts = code.split('-');\n                    if (parts.length < 3 || parts[0] !== 'LESO') {\n                        $('#les-scan-result').html('<p>' + les_checkin_i18n.invalidFormat + '<\/p>').removeClass('notice-info').addClass('notice-error is-dismissible');\n                        return;\n                    }\n                    const orderId = parts[1];\n\n                    $('#les-scan-result').html('<p>' + les_checkin_i18n.verifying + '<\/p>').removeClass('notice-error notice-success notice-warning').addClass('notice-info is-dismissible');\n                    \n                    \/\/ Disable button during AJAX\n                    $('#verify_manual_code_btn').prop('disabled', true);\n\n                    $.ajax({\n                        url: 'https:\/\/macmonir.net\/test\/wp-admin\/admin-ajax.php',\n                        type: 'POST',\n                        data: {\n                            action: 'les_verify_master_ticket',\n                            nonce: '4e50eb7d08',\n                            master_ticket_code: code,\n                            order_id: orderId\n                        },\n                        success: function(response) {\n                            if (response.success) {\n                                $('#les-scan-result').html('<p>' + response.data.message + '<\/p>').removeClass('notice-info').addClass('notice-success is-dismissible');\n                            } else {\n                                $('#les-scan-result').html('<p>' + response.data.message + '<\/p>').removeClass('notice-info').addClass('notice-error is-dismissible');\n                            }\n                        },\n                        error: function() {\n                            $('#les-scan-result').html('<p>' + les_checkin_i18n.serverError + '<\/p>').removeClass('notice-info').addClass('notice-error is-dismissible');\n                        },\n                        complete: function() {\n                            \/\/ Re-enable button\n                            $('#verify_manual_code_btn').prop('disabled', false);\n                            \/\/ Clear the input field for the next entry\n                            $('#manual_ticket_code_input').val('');\n                            $('#les-scan-result').append('<p><button class=\"button button-primary\" id=\"restart-scanner-btn\">' + les_checkin_i18n.scanNext + '<\/button><\/p>');\n                        }\n                    });\n                }\n\n\n                \/\/ --- SCANNER LOGIC ---\n                function onScanSuccess(decodedText, decodedResult) {\n                    html5QrcodeScanner.clear(); \/\/ Stop the scanner\n                    try {\n                        const ticketData = JSON.parse(decodedText);\n                        if (!ticketData.master_ticket_code) {\n                            throw new Error(\"Invalid QR format.\"); \/\/ This is a developer-facing error, no need to translate.\n                        }\n                        \/\/ Use the central verification function\n                        verifyTicketCode(ticketData.master_ticket_code);\n                    } catch(e) {\n                        $('#les-scan-result').html('<p>' + les_checkin_i18n.invalidQR + '<\/p>').removeClass('notice-info').addClass('notice-error is-dismissible');\n                        $('#les-scan-result').append('<p><button class=\"button button-primary\" id=\"restart-scanner-btn\">' + les_checkin_i18n.scanAgain + '<\/button><\/p>');\n                    }\n                }\n\n                let html5QrcodeScanner = new Html5QrcodeScanner(\"les-qr-reader\", { fps: 10, qrbox: 250 });\n                \n                function startScanner() {\n                    $('#les-scan-result').html('<p>' + les_checkin_i18n.waiting + '<\/p>').removeClass('notice-error notice-success notice-warning notice-info');\n                    html5QrcodeScanner.render(onScanSuccess);\n                }\n\n                startScanner();\n\n                $(document).on('click', '#restart-scanner-btn', function() {\n                    startScanner();\n                });\n                \n                \/\/ --- MANUAL ENTRY LOGIC ---\n                $('#verify_manual_code_btn').on('click', function() {\n                    const manualCode = $('#manual_ticket_code_input').val().trim();\n                    html5QrcodeScanner.clear(); \/\/ Stop scanner if running\n                    verifyTicketCode(manualCode);\n                });\n\n                \/\/ Allow pressing Enter in the input field\n                $('#manual_ticket_code_input').on('keypress', function(e) {\n                    if (e.which === 13) { \/\/ 13 is the Enter key\n                        $('#verify_manual_code_btn').click();\n                    }\n                });\n\n            });\n        <\/script>\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-272","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>scanner - My Plugins Demo<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/macmonir.net\/test\/scanner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"scanner - My Plugins Demo\" \/>\n<meta property=\"og:url\" content=\"https:\/\/macmonir.net\/test\/scanner\/\" \/>\n<meta property=\"og:site_name\" content=\"My Plugins Demo\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-25T09:39:26+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/scanner\\\/\",\"url\":\"https:\\\/\\\/macmonir.net\\\/test\\\/scanner\\\/\",\"name\":\"scanner - My Plugins Demo\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/#website\"},\"datePublished\":\"2026-02-25T09:24:05+00:00\",\"dateModified\":\"2026-02-25T09:39:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/scanner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/macmonir.net\\\/test\\\/scanner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/scanner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/macmonir.net\\\/test\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"scanner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/#website\",\"url\":\"https:\\\/\\\/macmonir.net\\\/test\\\/\",\"name\":\"My Blog\",\"description\":\"My Plugins Demo\",\"publisher\":{\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/#\\\/schema\\\/person\\\/ecff2bb70513f60141e7763107eb9ceb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/macmonir.net\\\/test\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/macmonir.net\\\/test\\\/#\\\/schema\\\/person\\\/ecff2bb70513f60141e7763107eb9ceb\",\"name\":\"ozasg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g\",\"caption\":\"ozasg\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g\"},\"sameAs\":[\"http:\\\/\\\/macmonir.net\\\/test\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"scanner - My Plugins Demo","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/macmonir.net\/test\/scanner\/","og_locale":"en_US","og_type":"article","og_title":"scanner - My Plugins Demo","og_url":"https:\/\/macmonir.net\/test\/scanner\/","og_site_name":"My Plugins Demo","article_modified_time":"2026-02-25T09:39:26+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/macmonir.net\/test\/scanner\/","url":"https:\/\/macmonir.net\/test\/scanner\/","name":"scanner - My Plugins Demo","isPartOf":{"@id":"https:\/\/macmonir.net\/test\/#website"},"datePublished":"2026-02-25T09:24:05+00:00","dateModified":"2026-02-25T09:39:26+00:00","breadcrumb":{"@id":"https:\/\/macmonir.net\/test\/scanner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/macmonir.net\/test\/scanner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/macmonir.net\/test\/scanner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/macmonir.net\/test\/"},{"@type":"ListItem","position":2,"name":"scanner"}]},{"@type":"WebSite","@id":"https:\/\/macmonir.net\/test\/#website","url":"https:\/\/macmonir.net\/test\/","name":"My Blog","description":"My Plugins Demo","publisher":{"@id":"https:\/\/macmonir.net\/test\/#\/schema\/person\/ecff2bb70513f60141e7763107eb9ceb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/macmonir.net\/test\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/macmonir.net\/test\/#\/schema\/person\/ecff2bb70513f60141e7763107eb9ceb","name":"ozasg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g","caption":"ozasg"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/abbe28d5cea5474d548af07c9445010cc691868aa22fa07b13d5ab610c89455b?s=96&d=mm&r=g"},"sameAs":["http:\/\/macmonir.net\/test"]}]}},"_links":{"self":[{"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/pages\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":3,"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/pages\/272\/revisions"}],"predecessor-version":[{"id":275,"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/pages\/272\/revisions\/275"}],"wp:attachment":[{"href":"https:\/\/macmonir.net\/test\/wp-json\/wp\/v2\/media?parent=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}