/** Shopify CDN: Minification failed

Line 12:0 Unexpected "("
Line 54:2 Comments in CSS use "/* ... */" instead of "//"
Line 94:37 Expected ")" to end URL token
Line 99:2 Comments in CSS use "/* ... */" instead of "//"
Line 216:6 Comments in CSS use "/* ... */" instead of "//"
Line 274:4 Comments in CSS use "/* ... */" instead of "//"

**/
/* V2 TEST: nessuna evasione o richiesta di trasferimento parziale. */
(() => {
  'use strict';
  const TYPE = 'evasione_ordini_pv';
  const STORE_CODES = {
    'PV:FROSINONE':'01001','PV:FERENTINO':'01002','PV:FONDI':'02001',
    'PV:LATINA_PLASMON':'02002','PV:LATINA_FRONTE_PLASMON':'02002','PV:SABAUDIA':'02003',
    'PV:TERRACINA':'03001','PV:TERRACINA_BADINO':'03001','PV:TERRACINA_VIA_BADINO':'03001',
    'PV:LATINA_ISONZO':'03002','PV:LATINA_VIA_ISONZO':'03002','PV:LATINA_PICCARELLO':'04001',
    'PV:CERVETERI':'04002','PV:PRIVERNO':'05001','PV:PONTINIA':'05002','PV:GUIDONIA':'05003',
    'PV:ROMA_PRENESTINA':'0F001','PV:ROMA_COLLATINA':'0F002','PV:ANZIO':'0G002',
    'PV:ACILIA':'0H001','PV:DRAGONA':'0H002','PV:TERRACINA_PONTINA':'0I001',
    'PV:SEZZE':'0L001','PV:SEZZE_SCALO':'0L001','PV:CASSINO':'0M001','PV:CISTERNA':'0N001'
  };
  const LOCAL_STATES = new Set(['da_preparare','in_preparazione','in_attesa_di_trasferimento','in_attesa_trasferimento','attesa_trasferimento']);
  const TRANSFER_STATES = new Set(['trasferimento_richiesto','trasferito','in_viaggio_verso_store']);
  const DONE_STATES = new Set(['arrivato_in_store','ritirato','archiviato','annullato']);
  const e=(tag,className,text)=>{const node=document.createElement(tag);if(className)node.className=className;if(text!==undefined)node.textContent=String(text);return node;};
  const integer=value=>Number.isSafeInteger(value)&&value>=0;
  const normalizedCode=value=>String(value||'').trim();
  function validateData(data) {
    if(!data || ![2,3].includes(data.schema_version) || !integer(data.version) || !/^DPV_[0-9A-Z]+$/.test(data.store_code||'') || !Array.isArray(data.lines) || !data.lines.length) throw new Error('Righe preparazione non valide: usare JSON versione 2 o 3.');
    if(data.schema_version===3 && data.lines.some(l=>!l.title||!Array.isArray(l.product_tags)))throw new Error('Collega il servizio Portale: il formato 3 contiene riferimenti e richiede la lettura delle schede prodotto.');
    const ids=new Set();
    data.lines.forEach(line=>{
      if(!line || typeof line.line_id!=='string' || !line.line_id || ids.has(line.line_id) || typeof line.title!=='string' || !line.title.trim() || !integer(line.quantity) || line.quantity<1 || !Array.isArray(line.product_tags) || !line.product_tags.every(t=>typeof t==='string') || ![null,true,false].includes(line.available_full) || (line.ean!=null&&typeof line.ean!=='string') || (line.codice_orizzonte!=null&&typeof line.codice_orizzonte!=='string')) throw new Error('Riga prodotto non valida: servono quantità intera, tag prodotto e available_full (null, true o false).');
      ids.add(line.line_id);
    });return data;
  }
  function classify(data,storeTag,status,route) {
    const suffix=STORE_CODES[storeTag];
    if(!suffix) throw new Error('Codice sede non associato al tag operatore: '+storeTag+'. Aggiornare la mappa sedi.');
    if(data.store_code!=='DPV_'+suffix)throw new Error('La sede del JSON non coincide con quella del tracking.');
    if(route && !['evasione_pv','trasferimento_magazzino'].includes(route))throw new Error('Percorso ordine non riconosciuto.');
    if(DONE_STATES.has(status))return 'done';
    if(!LOCAL_STATES.has(status)&&!TRANSFER_STATES.has(status))throw new Error('Stato ordine non riconosciuto: '+status);
    if(route==='trasferimento_magazzino'||TRANSFER_STATES.has(status))return 'transfer';
    return data.lines.every(line=>line.product_tags.includes(data.store_code))?'local':'transfer';
  }
  function eligibility(data,choices) {
    const values=data.lines.map(line=>choices.get(line.line_id));
    return {ready:values.every(v=>v===true),missing:values.some(v=>v===false),checked:values.filter(v=>v===true||v===false).length};
  }
  // EAN-13 con cifra di controllo. UPC-A è rappresentato come EAN-13 con zero iniziale.
  function ean13Bits(value) {
    let code = normalizedCode(value);
    if (/^\d{12}$/.test(code)) code = '0' + code;
    if (!/^\d{13}$/.test(code)) return null;
    const digits = [...code].map(Number);
    const checksum = (10 - digits.slice(0, 12).reduce((sum, n, i) => sum + n * (i % 2 ? 3 : 1), 0) % 10) % 10;
    if (checksum !== digits[12]) return null;
    const L = ['0001101','0011001','0010011','0111101','0100011','0110001','0101111','0111011','0110111','0001011'];
    const G = ['0100111','0110011','0011011','0100001','0011101','0111001','0000101','0010001','0001001','0010111'];
    const P = ['LLLLLL','LLGLGG','LLGGLG','LLGGGL','LGLLGG','LGGLLG','LGGGLL','LGLGLG','LGLGGL','LGGLGL'];
    const right = digits.slice(7).map(n => [...L[n]].map(bit => bit === '1' ? '0' : '1').join('')).join('');
    const left = digits.slice(1, 7).map((n, i) => (P[digits[0]][i] === 'L' ? L : G)[n]).join('');
    return { code, bits: '101' + left + '01010' + right + '101' };
  }
  function barcode(value) {
    const box = e('div', 'prep__barcode');
    const result = ean13Bits(value);
    if (!result) { box.append(e('small', '', value ? 'Barcode grafico non disponibile: verifica il codice numerico.' : 'EAN non disponibile')); return box; }
    const ns = 'http://www.w3.org/2000/svg';
    const svg = document.createElementNS(ns, 'svg');
    svg.setAttribute('viewBox', '0 0 117 40'); svg.setAttribute('role', 'img');
    svg.setAttribute('aria-label', 'Barcode ' + result.code); svg.setAttribute('shape-rendering', 'crispEdges');
    const background = document.createElementNS(ns, 'rect');
    for (const [key, val] of Object.entries({width:117,height:40,fill:'white'})) background.setAttribute(key,val);
    svg.append(background);
    [...result.bits].forEach((bit, i) => {
      if (bit !== '1') return;
      const bar = document.createElementNS(ns, 'rect');
      const guard = i < 3 || (i >= 45 && i < 50) || i >= 92;
      for (const [key, val] of Object.entries({x:i+11,y:2,width:1,height:guard?28:25,fill:'#000'})) bar.setAttribute(key,val);
      svg.append(bar);
    });
    const text = document.createElementNS(ns, 'text');
    text.setAttribute('x', '58.5'); text.setAttribute('y', '38'); text.setAttribute('text-anchor', 'middle');
    text.setAttribute('font-size', '8'); text.setAttribute('font-family', 'monospace'); text.textContent = result.code;
    svg.append(text); box.append(svg); return box;
  }
  function safeImage(value) {
    if (typeof value !== 'string' || !value) return '';
    try { const url = new URL(value, location.origin); return url.protocol === 'https:' || (url.origin === location.origin && url.protocol === location.protocol) ? url.href : ''; } catch { return ''; }
  }
  function safeProductLink(value){
    try{const u=new URL(value,location.origin);return value&&u.origin===location.origin&&/^\/(?:[a-z]{2}(?:-[a-z]{2})?\/)?products\//i.test(u.pathname)?u.href:'';}catch{return '';}
  }
  // Riconoscimento esatto EAN/UPC: la scansione conferma tutta la quantità richiesta.
  const barcodeKey=value=>{const code=normalizedCode(value);return /^\d{12}$/.test(code)?'0'+code:code;};
  function findScannedLines(lines,code,source='camera'){
    const key=barcodeKey(code);if(!key)return [];
    return lines.filter(line=>barcodeKey(line.ean)===key||(source!=='camera'&&normalizedCode(line.codice_orizzonte)===normalizedCode(code)));
  }
  let decoderPromise=null,activeCameraClose=null;
  function loadCameraDecoder(root){
    if(window.ZXingBrowser?.BrowserMultiFormatOneDReader)return Promise.resolve(window.ZXingBrowser);
    if(decoderPromise)return decoderPromise;
    const src=root.dataset.scannerSrc;
    decoderPromise=new Promise((resolve,reject)=>{
      if(!src){reject(new Error('Decoder fotocamera non configurato nella section.'));return;}
      const script=document.createElement('script');script.src=src;script.async=true;
      const timer=setTimeout(()=>{script.remove();reject(new Error('Caricamento del lettore non riuscito. Riprova oppure usa la selezione manuale.'));},15000);
      script.addEventListener('load',()=>{clearTimeout(timer);if(window.ZXingBrowser?.BrowserMultiFormatOneDReader)resolve(window.ZXingBrowser);else reject(new Error('Decoder barcode non disponibile.'));},{once:true});
      script.addEventListener('error',()=>{clearTimeout(timer);script.remove();reject(new Error('File del lettore mancante: verifica gli asset del tema.'));},{once:true});
      document.head.append(script);
    }).catch(error=>{decoderPromise=null;throw error;});return decoderPromise;
  }
  function cameraError(error){
    if(['NotAllowedError','SecurityError','PermissionDeniedError'].includes(error.name))return 'Consenti l’accesso alla fotocamera nelle impostazioni del browser e riprova.';
    if(['NotFoundError','DevicesNotFoundError'].includes(error.name))return 'Nessuna fotocamera disponibile su questo dispositivo.';
    if(['NotReadableError','TrackStartError'].includes(error.name))return 'Fotocamera occupata da un’altra app. Chiudila e riprova.';
    return error.message||'Fotocamera non disponibile. Puoi confermare i prodotti manualmente.';
  }
  async function openProductCamera(root,onCode){
    if(activeCameraClose)activeCameraClose();
    const trigger=document.activeElement,dialog=e('dialog','prep__camera'),heading=e('h2','','Scansiona prodotto'),hint=e('p','','Inquadra il barcode del prodotto. La lettura corretta seleziona “Disponibile per l’evasione” per tutta la quantità richiesta.'),video=e('video','prep__camera-video'),status=e('p','prep__camera-status','Preparazione fotocamera…'),closeButton=e('button','prep__button','Chiudi fotocamera');
    dialog.setAttribute('aria-label','Scansiona prodotto');status.setAttribute('role','status');status.setAttribute('aria-live','polite');video.setAttribute('playsinline','');video.setAttribute('autoplay','');video.muted=true;video.playsInline=true;closeButton.type='button';
    dialog.append(heading,hint,video,status,closeButton);root.append(dialog);
    let closed=false,stream=null,controls=null,timer=null,scanTimer=null,lastRejected='',lastRejectedAt=0;
    function cleanup(){
      if(closed)return;closed=true;clearTimeout(timer);clearTimeout(scanTimer);
      try{controls?.stop();}catch{}if(stream)stream.getTracks().forEach(track=>track.stop());
      video.srcObject=null;document.removeEventListener('visibilitychange',visibility);window.removeEventListener('pagehide',cleanup);document.removeEventListener('keydown',keyboard);document.removeEventListener('shopify:section:unload',unload);
      try{if(dialog.open&&dialog.close)dialog.close();}catch{}dialog.remove();if(activeCameraClose===cleanup)activeCameraClose=null;if(trigger?.isConnected)trigger.focus();
    }
    function visibility(){if(document.hidden)cleanup();}
    function unload(event){if(event.target.contains(root)||event.target===root)cleanup();}
    function keyboard(event){if(event.key==='Escape'){event.preventDefault();cleanup();}else if(event.key==='Tab'){event.preventDefault();closeButton.focus();}}
    closeButton.addEventListener('click',cleanup);dialog.addEventListener('cancel',event=>{event.preventDefault();cleanup();});dialog.addEventListener('close',cleanup);
    document.addEventListener('visibilitychange',visibility);window.addEventListener('pagehide',cleanup);document.addEventListener('keydown',keyboard);document.addEventListener('shopify:section:unload',unload);activeCameraClose=cleanup;
    if(typeof dialog.showModal==='function')dialog.showModal();else{dialog.setAttribute('open','');dialog.classList.add('prep__camera--fallback');dialog.setAttribute('aria-modal','true');dialog.setAttribute('role','dialog');}
    closeButton.focus();
    function decoded(code){
      if(closed)return;
      const result=onCode(String(code));
      if(result.ok){cleanup();return;}
      const now=Date.now();if(code!==lastRejected||now-lastRejectedAt>1800){status.textContent=result.message;status.classList.add('is-error');lastRejected=code;lastRejectedAt=now;}
    }
    try{
      if(!window.isSecureContext||!navigator.mediaDevices?.getUserMedia)throw new Error('Apri la pagina del negozio in HTTPS e consenti la fotocamera.');
      const desired=['ean_13','ean_8','upc_a','upc_e','code_128','code_39','itf'];let detector=null;
      if(window.BarcodeDetector){try{const formats=await window.BarcodeDetector.getSupportedFormats();if(['ean_13','ean_8','upc_a'].every(f=>formats.includes(f)))detector=new window.BarcodeDetector({formats:desired.filter(f=>formats.includes(f))});}catch{}}
      const decoder=detector?null:await loadCameraDecoder(root);if(closed)return;
      const acquired=await navigator.mediaDevices.getUserMedia({audio:false,video:{facingMode:{ideal:'environment'},width:{ideal:1280},height:{ideal:720}}});
      if(closed){acquired.getTracks().forEach(track=>track.stop());return;}stream=acquired;video.srcObject=stream;await video.play();if(closed)return;
      status.textContent='Inquadra un solo barcode, con buona luce. Mantieni il telefono fermo.';
      timer=setTimeout(()=>{if(closed)return;status.textContent='Nessun codice confermato. Avvicina il barcode o chiudi e usa la selezione manuale.';},20000);
      if(detector){
        const detect=async()=>{if(closed)return;try{const results=await detector.detect(video);if(!closed){const codes=[...new Set(results.map(r=>r.rawValue).filter(Boolean))];if(codes.length===1)decoded(codes[0]);else if(codes.length>1)status.textContent='Più barcode inquadrati: lascia visibile un solo prodotto.';}}catch(error){if(!closed&&error.name!=='InvalidStateError'){status.textContent='Lettura interrotta. Chiudi la fotocamera e riprova.';if(stream)stream.getTracks().forEach(t=>t.stop());return;}}if(!closed)scanTimer=setTimeout(detect,180);};detect();
      }else{
        const reader=new decoder.BrowserMultiFormatOneDReader(undefined,{delayBetweenScanAttempts:200,delayBetweenScanSuccess:1000});
        const acquiredControls=await reader.decodeFromStream(stream,video,(result,error,liveControls)=>{if(closed){liveControls?.stop();return;}if(result)decoded(result.getText());});
        if(closed)acquiredControls.stop();else controls=acquiredControls;
      }
    }catch(error){if(!closed){clearTimeout(timer);try{controls?.stop();}catch{}if(stream)stream.getTracks().forEach(t=>t.stop());video.srcObject=null;status.textContent=cameraError(error);status.classList.add('is-error');}}
  }

  const STATUS={da_preparare:'Da preparare',in_preparazione:'Da preparare',trasferimento_richiesto:'Trasferimento richiesto',trasferito:'In viaggio',in_viaggio_verso_store:'In viaggio',arrivato_in_store:'Pronto per il ritiro',ritirato:'Consegnato',ricevuto_al_pv:'Ricevuto al PV',inviato_a_magazzino:'Inviato al magazzino',ricevuto_in_magazzino:'Ricevuto in magazzino',approvato_rimborso:'Rimborso approvato',rimborsato:'Rimborsato',respinto:'Respinto',chiuso:'Chiuso'};
  const TRANSFERS=new Set(['trasferimento_richiesto','trasferito','in_viaggio_verso_store']);
  const CLOSED_RETURNS=new Set(['rimborsato','respinto','chiuso']);
  function parseInitial(node){let data=JSON.parse(node.dataset.lines);if(typeof data==='string')data=JSON.parse(data);return{handle:node.dataset.handle,number:node.dataset.number,customer:node.dataset.customer,status:node.dataset.status,store_tag:node.dataset.store,route:node.dataset.route||'',date:node.dataset.date,preparation:data};}
  function initHub(root){
    if(root.dataset.hubInitialized)return;root.dataset.hubInitialized='true';if(!root.querySelector('[data-hub-list]'))return;
    const stages=['evasione','consegne','resi'],states={},drafts=new Map();let current='evasione',session=null,endpoint=null,uid=0;
    for(const stage of stages)states[stage]={items:[],cursor:null,more:false,busy:false,loaded:false,controller:null,timer:null,generation:0};
    const conn=root.querySelector('[data-hub-connection]');
    try{const path=root.dataset.endpoint||'';if(path.startsWith('/')&&!path.startsWith('//')){const url=new URL(path,location.origin);if(url.origin===location.origin&&!url.search&&!url.hash)endpoint=url;}}catch{}
    const allowed=action=>!!session&&session.actions.includes(action);
    const query=stage=>(root.querySelector('[data-hub-search="'+stage+'"]').value||'').trim();
    const view=stage=>stage==='consegne'?root.querySelector('[data-delivery-filter]').value:stage==='resi'?root.querySelector('[data-returns-filter]').value:'active';
    function readOnly(){conn.textContent='Anteprima TEST · collega il servizio Portale per ricerca completa e registrazioni.';}
    const initial=[];root.querySelectorAll('[data-initial-order]').forEach(n=>{try{initial.push(parseInitial(n));}catch{}});
    function localItems(stage){
      const q=query(stage).toLocaleLowerCase('it'),v=view(stage);
      return initial.filter(o=>{
        let route;try{validateData(o.preparation);route=classify(o.preparation,o.store_tag,o.status,o.route);}catch{return stage==='evasione';}
        const done=o.status==='ritirato',delivery=o.status==='arrivato_in_store'||TRANSFERS.has(o.status)||route==='transfer';
        const relevant=stage==='evasione'?route==='local':stage==='consegne'?(q||v==='all'?done||delivery:v==='delivered'?done:delivery):false;
        return relevant&&(!q||[o.number,o.customer,...o.preparation.lines.flatMap(l=>[l.title,l.ean,l.codice_orizzonte])].join(' ').toLocaleLowerCase('it').includes(q));
      });
    }
    async function get(resource,params={},signal){
      const url=new URL(endpoint);url.searchParams.set('resource',resource);Object.entries(params).forEach(([k,v])=>{if(v!==null&&v!==undefined&&v!=='')url.searchParams.set(k,String(v));});
      const response=await fetch(url,{credentials:'same-origin',cache:'no-store',headers:{Accept:'application/json'},signal});
      if(!response.headers.get('content-type')?.includes('application/json'))throw Error('Risposta del servizio non valida.');
      const body=await response.json();if(!response.ok||body.ok!==true)throw Error(body.message||'Servizio non disponibile.');return body;
    }
    function statusMessage(stage,text){root.querySelector('[data-search-state="'+stage+'"]').textContent=text;}
    async function load(stage,reset=true){
      const state=states[stage];if(!session){state.items=localItems(stage);render(stage);statusMessage(stage,'Anteprima dei dati caricati nella pagina. Ricerca completa disponibile dopo il collegamento del servizio.');return;}
      if(!reset&&(!state.more||state.busy))return;
      if(reset){state.controller?.abort();state.cursor=null;state.more=false;state.items=[];state.generation++;}
      const generation=state.generation,controller=new AbortController();state.controller=controller;state.busy=true;state.loaded=true;statusMessage(stage,'Ricerca negli ordini autorizzati…');
      const timer=setTimeout(()=>controller.abort(),20000);
      try{
        const data=await get(stage==='resi'?'returns':'orders',{stage,q:query(stage),view:view(stage),cursor:state.cursor},controller.signal);
        if(generation!==state.generation)return;
        if(!Array.isArray(data.items)||typeof data.has_more!=='boolean')throw Error('Servizio non aggiornato per il portale.');
        const existing=new Set(state.items.map(o=>o.handle));for(const item of data.items)if(!existing.has(item.handle)){state.items.push(item);existing.add(item.handle);}
        state.cursor=data.next_cursor||null;state.more=data.has_more;
        if(state.more&&!state.cursor)throw Error('Paginazione non valida.');
        render(stage);statusMessage(stage,state.more?'Ricerca in corso: altri dati disponibili.':'Ricerca completata · '+state.items.length+' risultati.');
      }catch(error){if(generation===state.generation&&error.name!=='AbortError'){render(stage);statusMessage(stage,error.message+' · Risultati incompleti: riprova.');}else if(generation===state.generation){render(stage);statusMessage(stage,'Ricerca interrotta: riprova per completarla.');}}
      finally{clearTimeout(timer);if(generation===state.generation){state.busy=false;root.querySelector('[data-hub-more="'+stage+'"]').disabled=false;}}
      // Percorre anche pagine senza corrispondenze. Nessun limite totale agli ordini ricercabili.
      if(generation===state.generation&&state.more&&query(stage)&&state.items.length<20&&current===stage)setTimeout(()=>load(stage,false),0);
    }
    function switchTab(stage,focus=false){
      if(activeCameraClose)activeCameraClose();current=stage;
      root.querySelectorAll('[data-hub-tab]').forEach(button=>{const yes=button.dataset.hubTab===stage;button.setAttribute('aria-selected',String(yes));button.tabIndex=yes?0:-1;if(yes&&focus)button.focus();});
      root.querySelectorAll('[data-hub-panel]').forEach(panel=>panel.hidden=panel.dataset.hubPanel!==stage);
      if(!states[stage].loaded||!session)load(stage);
    }
    function makeCard(item,stage){
      const card=e('article','prep__order'),head=e('header','prep__order-head'),preview=e('div','prep__order-preview'),controls=e('div','prep__order-controls'),panel=e('div'),feedback=e('p','prep__feedback'),toggle=e('button','prep__button prep__button--open','Apri ordine');
      preview.append(e('p','prep__eyebrow',stage==='resi'?'PRATICA RESO':'ORDINE'),e('h2','',item.number||item.handle),e('p','',[item.customer,formatDate(item.date)].filter(Boolean).join(' · ')));
      if(stage==='resi')preview.append(e('p','prep__order-summary','Ordine '+item.order_number));
      const badge=e('span','prep__badge',STATUS[item.status]||item.status||'Da verificare');controls.append(badge,toggle);head.append(preview,controls);card.append(head,panel);panel.hidden=true;panel.id=root.id+'-panel-'+(++uid);toggle.type='button';toggle.setAttribute('aria-controls',panel.id);toggle.setAttribute('aria-expanded','false');feedback.setAttribute('role','status');feedback.setAttribute('aria-live','polite');
      const info={card,panel,preview,badge,feedback,toggle,busy:false,uncertain:false,controls:[]};
      toggle.addEventListener('click',async()=>{if(activeCameraClose)activeCameraClose();const open=panel.hidden;
        if(open&&session&&stage!=='resi'&&item.preparation?.schema_version===3){
          toggle.disabled=true;toggle.textContent='Aggiornamento prodotti…';
          try{
            const detailController=new AbortController(),detailTimer=setTimeout(()=>detailController.abort(),20000);let response;try{response=await get('order_detail',{handle:item.handle},detailController.signal);}finally{clearTimeout(detailTimer);}const fresh=response.item;
            if(!fresh||fresh.handle!==item.handle)throw Error('Risposta dettaglio non valida.');validateData(fresh.preparation);
            if(fresh.status!==item.status||stage==='evasione'&&classify(fresh.preparation,fresh.store_tag,fresh.status,fresh.route)!=='local'){
              states.evasione.loaded=false;states.consegne.loaded=false;await load(stage,true);statusMessage(stage,'Disponibilità o stato aggiornati: controlla anche Consegne.');return;
            }
            root.querySelectorAll('.pvhub__detail').forEach(other=>{other.hidden=true;const button=other.parentNode.querySelector('[aria-controls]');if(button){button.setAttribute('aria-expanded','false');button.textContent='Apri ordine';}other.parentNode.classList.remove('is-open');});
            const index=states[stage].items.findIndex(o=>o.handle===item.handle);if(index>=0)states[stage].items[index]=fresh;
            const replacement=stage==='evasione'?renderPreparation(fresh):renderDelivery(fresh);
            const detail=replacement.querySelector('.pvhub__detail'),button=replacement.querySelector('[aria-controls]');detail.hidden=false;replacement.classList.add('is-open');button.setAttribute('aria-expanded','true');button.textContent='Chiudi ordine';card.replaceWith(replacement);return;
          }catch(error){statusMessage(stage,'Aggiornamento prodotto non riuscito: '+error.message);return;}
          finally{toggle.disabled=false;toggle.textContent='Apri ordine';}
        }
root.querySelectorAll('.pvhub__detail').forEach(other=>{other.hidden=true;const b=other.parentNode.querySelector('[aria-controls]');b?.setAttribute('aria-expanded','false');if(b)b.textContent='Apri ordine';other.parentNode.classList.remove('is-open');});panel.hidden=!open;toggle.setAttribute('aria-expanded',String(open));toggle.textContent=open?'Chiudi ordine':'Apri ordine';card.classList.toggle('is-open',open);});panel.className='pvhub__detail';
      return info;
    }
    function formatDate(value){if(!value)return '';const date=new Date(value);return Number.isNaN(date.getTime())?'':date.toLocaleString('it-IT',{day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'});}
    function notify(info,text,error=false){info.feedback.textContent=text;info.feedback.classList.toggle('is-error',error);}
    function actionButton(info,text,action,item,extra={},style=''){
      const button=e('button','prep__button '+style,text);button.type='button';button.disabled=!allowed(action);info.controls.push(button);button.addEventListener('click',()=>write(info,action,item,typeof extra==='function'?extra():extra));return button;
    }
    async function write(info,action,item,extra){
      if(!allowed(action)||info.busy||info.uncertain||extra===null)return;
      const prompts={mark_ready:'Confermi che tutto l’ordine è pronto per il ritiro?',request_transfer:'Richiedere il trasferimento di TUTTO l’ordine?',confirm_arrival:'Confermi di aver ricevuto e preparato tutto l’ordine?',confirm_pickup:'Confermi la consegna di tutti i prodotti al cliente?',create_return:'Confermi la ricezione fisica dei prodotti e delle quantità selezionati? Non autorizza un rimborso.',send_return:'Confermi l’invio fisico del reso al magazzino?',receive_return:'Confermi l’arrivo fisico del reso in magazzino?',close_return:'Confermi questo esito della pratica?'};
      if(!window.confirm(prompts[action]||'Confermi?'))return;
      if(activeCameraClose)activeCameraClose();info.busy=true;info.controls.forEach(b=>b.disabled=true);info.panel.querySelectorAll('input, select, textarea').forEach(n=>n.disabled=true);notify(info,'Registrazione in corso…');
      const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),25000);
      try{
        const body={environment:'test',metaobject_type:TYPE,csrf_token:session.csrf_token,action,scope:action==='create_return'?'return_lines':'entire_order',tracking_handle:item.handle,expected_version:item.preparation?.version??item.data?.version,idempotency_key:crypto.randomUUID(),...extra};
        const response=await fetch(endpoint.href,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application/json',Accept:'application/json','X-CSRF-Token':session.csrf_token},body:JSON.stringify(body),signal:controller.signal});
        if(!response.headers.get('content-type')?.includes('application/json'))throw Error('Risposta non valida.');const data=await response.json();
        if(!response.ok||data.ok!==true){if(data.ok===false&&data.committed===false&&[400,401,403,404,422].includes(data.http_status||response.status)){notify(info,data.message||'Operazione rifiutata.',true);return;}throw Error(data.message||'Esito da verificare.');}
        if(data.environment!=='test'||data.metaobject_type!==TYPE)throw Error('Conferma non coerente.');
        if(['mark_ready','request_transfer'].includes(action)){if(data.order?.tracking_handle!==item.handle||data.order.status!==(action==='mark_ready'?'arrivato_in_store':'trasferimento_richiesto')||!integer(data.order.version)||data.order.version<=item.preparation.version)throw Error('Conferma ordine non coerente.');}
        else if(data.action!==action||data.tracking_handle!==item.handle||!integer(data.version)||action==='create_return'&&(!data.return_handle||data.status!=='ricevuto_al_pv'))throw Error('Conferma operazione non coerente.');
        notify(info,'Operazione registrata.');drafts.delete(item.handle);for(const stage of stages)states[stage].loaded=false;
        if(action==='create_return'){switchTab('resi');}else await load(current,true);
      }catch(error){info.uncertain=true;notify(info,'Esito da verificare. Ricarica e controlla il tracking prima di riprovare. '+(error.name==='AbortError'?'Tempo scaduto.':error.message),true);}
      finally{clearTimeout(timer);info.busy=false;if(!info.uncertain){info.panel.querySelectorAll('input, select, textarea').forEach(n=>n.disabled=false);info.controls.forEach(b=>b.disabled=!allowed(b.dataset.action||action));info.update?.();}}
    }
    // Prezzi in unità monetarie (es. "12.90"), mai conversioni implicite da centesimi.
    function displayUnitPrice(raw, currency = 'EUR') {
      const text = typeof raw === 'string' ? raw.trim() : raw;
      if (!['number', 'string'].includes(typeof text) || text === '' ||
          typeof text === 'string' && !/^\d+(?:[.,]\d{1,2})?$/.test(text)) return 'Non disponibile';
      const amount = Number(typeof text === 'string' ? text.replace(',', '.') : text);
      if (!Number.isFinite(amount) || amount < 0 || !/^[A-Z]{3}$/.test(currency)) return 'Non disponibile';
      try { return new Intl.NumberFormat('it-IT', { style: 'currency', currency }).format(amount); }
      catch (_) { return 'Non disponibile'; }
    }
    function productCard(line){
      const row=e('div','prep__line'),product=e('div','prep__product'),photo=e('div','prep__photo'),url=safeImage(line.image_url),details=e('div');
      const productUrl=safeProductLink(line.product_url);
      if(url){const image=e('img');image.src=url;image.alt=line.title;image.loading='lazy';image.addEventListener('error',()=>photo.replaceChildren(e('span','','Foto non disponibile')),{once:true});const link=e('a');link.href=productUrl||url;link.target='_blank';link.rel='noopener noreferrer';link.append(image);photo.append(link);}else photo.textContent='Foto non disponibile';
      const heading=e('h3');if(productUrl){const titleLink=e('a','prep__product-link',line.title);titleLink.href=productUrl;titleLink.target='_blank';titleLink.rel='noopener noreferrer';heading.append(titleLink);}else heading.textContent=line.title;details.append(heading);if(line.variant)details.append(e('p','prep__variant',line.variant));const codes=e('dl','prep__codes');for(const[title,value]of[['Codice Orizzonte',line.codice_orizzonte],['EAN',line.ean]]){const d=e('div');d.append(e('dt','',title),e('dd','',value||'—'));codes.append(d);}details.append(codes);const prices=e('div','prep__prices');
      const orderPrice=e('p','prep__price prep__price--order');
      orderPrice.append(e('span','','Prezzo nell’ordine · cad.'),e('strong','',displayUnitPrice(line.order_unit_price ?? line.unit_price ?? line.price,line.order_currency || line.currency || 'EUR')));
      const catalogPrice=e('p','prep__price prep__price--catalog');
      catalogPrice.append(e('span','','Prezzo scheda prodotto · cad.'),e('strong','',displayUnitPrice(line.catalog_unit_price,line.catalog_currency || line.currency || 'EUR')));
      prices.append(orderPrice,catalogPrice);
      if(line.catalog_price_checked_at){const checked=new Date(line.catalog_price_checked_at);if(Number.isFinite(checked.getTime()))prices.append(e('small','prep__price-checked','Catalogo verificato: '+checked.toLocaleString('it-IT')));}
      details.append(prices);if(productUrl){const more=e('a','prep__product-more','Apri scheda prodotto ↗');more.href=productUrl;more.target='_blank';more.rel='noopener noreferrer';details.append(more);}if(line.catalog_status==='missing')details.append(e('p','prep__catalog-warning','Variante non trovata nel catalogo: verifica con la sede centrale.'));if(line.catalog_warning)details.append(e('p','prep__catalog-warning',line.catalog_warning));product.append(photo,details);const quantity=e('div','prep__required');quantity.append(e('strong','',line.quantity),document.createTextNode(' pezzi'));row.append(product,barcode(line.ean),quantity);return row;
    }
    function renderPreparation(item){
      const info=makeCard(item,'evasione');let data;try{data=validateData(item.preparation);if(classify(data,item.store_tag,item.status,item.route)!=='local')throw Error('Ordine destinato al tracking.');}catch(error){info.panel.append(e('p','prep__notice',error.message));return info.card;}
      let draft=drafts.get(item.handle);if(!draft||draft.version!==data.version){draft={version:data.version,choices:new Map(data.lines.map(l=>[l.line_id,null]))};drafts.set(item.handle,draft);}
      const choices=draft.choices,rows=new Map(),summary=e('p','prep__order-summary'),grid=e('div','prep__lines'),hint=e('p','prep__decision-hint'),footer=e('div','prep__footer'),actions=e('div','prep__actions');info.preview.append(summary);
      function scanCode(code,source){if(info.busy||info.uncertain)return{ok:false,message:'Ordine occupato.'};const matches=findScannedLines(data.lines,code,source);if(matches.length!==1)return{ok:false,message:matches.length?'Codice su più righe: conferma manualmente.':'Codice non presente nell’ordine.'};const l=matches[0],row=rows.get(l.line_id);choices.set(l.line_id,true);row.querySelectorAll('input').forEach(r=>r.checked=r.value==='true');refresh();row.scrollIntoView({behavior:'smooth',block:'center'});notify(info,'Disponibile per l’evasione: '+l.title+' · '+l.quantity+' pezzi.');return{ok:true};}
      const scan=e('form','prep__scan'),input=e('input'),label=e('label','','Lettore barcode'),reader=e('button','prep__button prep__button--reader','Conferma codice'),camera=e('button','prep__button prep__button--camera','Scansiona prodotto');input.id=root.id+'-scan-'+(++uid);label.htmlFor=input.id;input.placeholder='EAN o Codice Orizzonte + Invio';reader.type='submit';camera.type='button';camera.addEventListener('click',()=>openProductCamera(root,code=>scanCode(code,'camera')));scan.addEventListener('submit',event=>{event.preventDefault();const r=scanCode(input.value,'reader');if(r.ok)input.value='';else notify(info,r.message,true);});scan.append(label,input,reader,camera,e('small','','La scansione conferma tutta la quantità richiesta.'));
      data.lines.forEach((line,index)=>{const row=productCard(line),fieldset=e('fieldset','prep__choices');fieldset.append(e('legend','','Disponibilità per tutti i '+line.quantity+' pezzi'));for(const[value,text]of[[true,'Disponibile per l’evasione'],[false,'Non disponibile']]){const label=e('label','prep__choice'),radio=e('input');radio.type='radio';radio.name=root.id+'-check-'+uid+'-'+index;radio.value=String(value);radio.checked=choices.get(line.line_id)===value;radio.addEventListener('change',()=>{choices.set(line.line_id,value);refresh();});label.append(radio,e('span','',text));fieldset.append(label);}row.append(fieldset);rows.set(line.line_id,row);grid.append(row);});
      const payload=()=>({lines:data.lines.map(l=>({line_id:l.line_id,quantity:l.quantity,available_full:choices.get(l.line_id)}))});
      const transfer=actionButton(info,'Richiedi trasferimento intero ordine','request_transfer',item,payload,'prep__button--transfer'),ready=actionButton(info,'Conferma pronto per il ritiro','mark_ready',item,payload,'prep__button--primary');transfer.dataset.action='request_transfer';ready.dataset.action='mark_ready';
      function refresh(){const state=eligibility(data,choices);summary.textContent=data.lines.length+' prodotti · '+data.lines.reduce((n,l)=>n+l.quantity,0)+' pezzi · '+state.checked+'/'+data.lines.length+' verificati';rows.forEach((row,id)=>{row.classList.toggle('is-picked',choices.get(id)===true);row.classList.toggle('is-missing',choices.get(id)===false);});hint.textContent=state.missing?'Trasferire l’intero ordine dal magazzino centrale.':state.ready?'Ordine completamente disponibile.':'Verifica tutti i prodotti e tutte le quantità.';hint.classList.toggle('is-missing',state.missing);transfer.disabled=!allowed('request_transfer')||!state.missing||info.busy||info.uncertain;ready.disabled=!allowed('mark_ready')||!state.ready||info.busy||info.uncertain;camera.disabled=reader.disabled=info.busy||info.uncertain;}
      info.update=refresh;actions.append(transfer,ready);footer.append(hint,actions);info.panel.append(scan,grid,footer,info.feedback);refresh();return info.card;
    }
    function renderDelivery(item){
      const info=makeCard(item,'consegne'),grid=e('div','prep__lines'),footer=e('div','prep__footer'),actions=e('div','prep__actions');
      const lines=item.preparation?.lines||[];lines.forEach(l=>grid.append(productCard(l)));info.preview.append(e('p','prep__order-summary',lines.length+' prodotti · '+lines.reduce((n,l)=>n+l.quantity,0)+' pezzi'));
      if(['trasferito','in_viaggio_verso_store'].includes(item.status))actions.append(actionButton(info,'Conferma arrivo completo al PV','confirm_arrival',item,{},'prep__button--primary'));
      if(session?.central&&(item.status==='trasferimento_richiesto'||LOCAL_STATES.has(item.status)&&item.route==='trasferimento_magazzino'))actions.append(actionButton(info,'Conferma partenza dal magazzino','dispatch_order',item,{},'prep__button--primary'));
      if(item.status==='arrivato_in_store')actions.append(actionButton(info,'Conferma ritiro cliente','confirm_pickup',item,{},'prep__button--primary'));
      if(item.status==='ritirato'){const manage=e('button','prep__button prep__button--reader','Gestisci reso');manage.type='button';manage.disabled=!allowed('create_return');manage.addEventListener('click',()=>openReturnForm(info,item));actions.append(manage);}
      footer.append(actions);info.panel.append(grid,footer,info.feedback);return info.card;
    }
    async function openReturnForm(info,item){
      if(!allowed('create_return')||info.busy)return;
      const old=info.panel.querySelector('[data-return-form]');if(old){old.hidden=false;return;}
      notify(info,'Verifica quantità ancora restituibili…');
      try{
        const result=await get('return_balance',{handle:item.handle});if(!Array.isArray(result.lines)||result.order_version!==item.preparation.version)throw Error('Ordine aggiornato: ricarica prima di aprire il reso.');
        const form=e('form','pvhub__return-form'),rows=[];form.dataset.returnForm='';form.append(e('h3','','Accettazione reso'),e('p','','Seleziona prodotti e quantità fisicamente ricevuti. La presa in carico non autorizza un rimborso.'));
        for(const line of result.lines){const block=e('fieldset','pvhub__return-row');block.append(e('legend','',line.title),e('p','prep__muted','Consegnati: '+line.quantity+' · Già impegnati nei resi: '+line.returned+' · Restituibili: '+line.remaining));const qty=e('input');qty.type='number';qty.min='0';qty.max=String(line.remaining);qty.step='1';qty.value='0';qty.disabled=line.remaining===0;
          const reason=e('select');for(const[value,text]of[['','Seleziona motivo'],['difettoso','Difettoso'],['danneggiato','Danneggiato'],['errato','Articolo errato'],['ripensamento','Ripensamento'],['altro','Altro']]){const option=e('option','',text);option.value=value;reason.append(option);}
          const condition=e('select');for(const[value,text]of[['integro','Integro'],['aperto','Aperto'],['danneggiato','Danneggiato'],['difettoso','Difettoso']]){const option=e('option','',text);option.value=value;condition.append(option);}
          for(const[text,field]of[['Quantità resa',qty],['Motivo',reason],['Condizioni',condition]]){const label=e('label','',text);label.append(field);block.append(label);}rows.push({line,qty,reason,condition});form.append(block);
        }
        const notes=e('textarea');notes.rows=3;notes.maxLength=2000;const notesLabel=e('label','','Note');notesLabel.append(notes);form.append(notesLabel);
        const accept=actionButton(info,'Accetta reso','create_return',item,()=>{const selected=[];for(const r of rows){const n=r.qty.valueAsNumber;if(!integer(n)||n>r.line.remaining){notify(info,'Quantità resa non valida.',true);return null;}if(n){if(!r.reason.value){notify(info,'Seleziona il motivo per ogni prodotto reso.',true);return null;}selected.push({line_id:r.line.line_id,quantity:n,reason:r.reason.value,condition:r.condition.value});}}if(!selected.length){notify(info,'Indica almeno un prodotto e una quantità.',true);return null;}return{lines:selected,notes:notes.value};},'prep__button--primary');accept.dataset.action='create_return';
        const cancel=e('button','prep__button','Annulla');cancel.type='button';cancel.addEventListener('click',()=>form.remove());const bar=e('div','prep__actions');bar.append(cancel,accept);form.append(bar);form.addEventListener('submit',event=>event.preventDefault());info.panel.insertBefore(form,info.feedback);notify(info,'');form.scrollIntoView({behavior:'smooth',block:'start'});
      }catch(error){notify(info,error.message,true);}
    }
    function renderReturn(item){
      const info=makeCard(item,'resi'),body=e('div','pvhub__return-detail'),grid=e('div','prep__lines'),data=item.data||{},history=e('ol','pvhub__timeline');
      for(const line of data.lines||[]){const row=productCard(line);row.append(e('p','pvhub__reason','Motivo: '+line.reason+' · Condizioni: '+line.condition));grid.append(row);}body.append(grid);
      for(const event of data.history||[])history.append(e('li','',formatDate(event.at)+' · '+(STATUS[event.status]||event.status)));body.append(history);if(data.outcome_notes)body.append(e('p','pvhub__notes','Valutazione: '+data.outcome_notes));if(data.notes)body.append(e('p','pvhub__notes',data.notes));
      const footer=e('div','prep__footer'),actions=e('div','prep__actions');
      if(item.status==='ricevuto_al_pv')actions.append(actionButton(info,'Conferma invio a magazzino','send_return',item,{},'prep__button--primary'));
      if(item.status==='inviato_a_magazzino'&&session?.central)actions.append(actionButton(info,'Conferma arrivo in magazzino','receive_return',item,{},'prep__button--primary'));
      if(item.status==='ricevuto_in_magazzino'&&session?.central){const outcome=e('select');for(const[v,t]of[['','Seleziona esito'],['approvato_rimborso','Approvato per rimborso'],['respinto','Respinto']]){const option=e('option','',t);option.value=v;outcome.append(option);}const explanation=e('input');explanation.placeholder='Motivo / note della valutazione';explanation.maxLength=1000;actions.append(outcome,explanation,actionButton(info,'Registra esito','close_return',item,()=>{if(!outcome.value||!explanation.value.trim()){notify(info,'Seleziona esito e inserisci le note.',true);return null;}return{outcome:outcome.value,notes:explanation.value.trim()};},'prep__button--primary'));}
      if(item.status==='approvato_rimborso')footer.append(e('p','prep__muted','In attesa del rimborso effettivo: nessun pagamento viene eseguito da questa pagina TEST.'));
      footer.append(actions);info.panel.append(body,footer,info.feedback);return info.card;
    }
    function render(stage){
      if(activeCameraClose)activeCameraClose();const list=root.querySelector('[data-hub-list="'+stage+'"]');list.replaceChildren();
      for(const item of states[stage].items){try{list.append(stage==='evasione'?renderPreparation(item):stage==='consegne'?renderDelivery(item):renderReturn(item));}catch{list.append(e('p','prep__notice','Dati non compatibili per '+(item.number||item.handle||'questa voce')));}}
      root.querySelector('[data-tab-count="'+stage+'"]').textContent=String(states[stage].items.length)+(states[stage].more?'+':'');
      root.querySelector('[data-hub-empty="'+stage+'"]').hidden=states[stage].items.length>0||states[stage].more;
      const more=root.querySelector('[data-hub-more="'+stage+'"]');more.hidden=!states[stage].more;more.disabled=states[stage].busy;more.textContent=query(stage)&&states[stage].items.length===0?'Continua ricerca':'Carica altri';
    }
    root.querySelectorAll('[data-hub-tab]').forEach(button=>{button.addEventListener('click',()=>switchTab(button.dataset.hubTab));button.addEventListener('keydown',event=>{if(['ArrowLeft','ArrowRight','Home','End'].includes(event.key)){event.preventDefault();const i=stages.indexOf(current),n=event.key==='Home'?0:event.key==='End'?2:(i+(event.key==='ArrowRight'?1:2))%3;switchTab(stages[n],true);}});});
    root.querySelectorAll('[data-hub-search]').forEach(input=>input.addEventListener('input',()=>{const stage=input.dataset.hubSearch;clearTimeout(states[stage].timer);states[stage].controller?.abort();states[stage].timer=setTimeout(()=>load(stage,true),300);}));
    root.querySelectorAll('[data-hub-reload]').forEach(button=>button.addEventListener('click',()=>load(button.dataset.hubReload,true)));root.querySelectorAll('[data-hub-more]').forEach(button=>button.addEventListener('click',()=>load(button.dataset.hubMore,false)));
    root.querySelector('[data-delivery-filter]').addEventListener('change',()=>load('consegne',true));root.querySelector('[data-returns-filter]').addEventListener('change',()=>load('resi',true));
    document.addEventListener('visibilitychange',()=>{if(document.hidden&&activeCameraClose)activeCameraClose();});
    window.addEventListener('beforeunload',event=>{if([...drafts.values()].some(d=>[...d.choices.values()].some(v=>v!==null))){event.preventDefault();event.returnValue='';}});
    load('evasione');
    async function connect(){if(!endpoint){readOnly();return;}const controller=new AbortController(),timer=setTimeout(()=>controller.abort(),12000);try{const response=await fetch(endpoint.href,{credentials:'same-origin',cache:'no-store',headers:{Accept:'application/json'},signal:controller.signal});const data=await response.json();if(!response.ok||data.ok!==true||data.environment!=='test'||data.metaobject_type!==TYPE||data.hub_version!==1||!data.csrf_token||!Array.isArray(data.actions))throw Error();session=data;conn.textContent='Servizio Portale TEST collegato · Nessuna modifica a ordini o rimborsi Shopify.';conn.classList.add('is-connected');for(const stage of stages)states[stage].loaded=false;load(current,true);}catch{readOnly();conn.textContent='Servizio Portale non collegato o da aggiornare. Anteprima disponibile; registrazioni e ricerca completa disabilitate.';}finally{clearTimeout(timer);}}connect();
  }
  function boot(scope=document){scope.querySelectorAll('[data-pv-hub]').forEach(initHub);}
  if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',()=>boot());else boot();document.addEventListener('shopify:section:load',event=>boot(event.target));
})();
