⚠️ AMBIENTE DE TESTES — alterações aqui não afectam o kanban principal
📦 Printar MS
TESTE
Todos os tipos
Encomenda
Personalizado
Em Bruto
Stricker
Manual
Acompanhamento B2B
Só os meus
+ Novo cartão
📷
Pesquisar
● Sincronizado
↻ Sincronizar
⊞
☰
▦
📊
👤
🌙
⋯
Opções
✕
Pesquisa e filtros
Todos os tipos
Encomenda
Personalizado
Em Bruto
Stricker
Manual
Acompanhamento B2B
Só os meus
Ações
➕ Novo cartão
📷 Importar screenshot
Vista
⊞ Kanban
☰ Lista
▦ Calendário
📊 Dashboard
👤 Responsável
🌙 Alternar tema
↻ Sincronizar
Nova
0
A Preparar
0
Personalização
0
Pronto Enviar
0
Enviado
0
Problema
0
Nova
0
A Preparar
0
Em Personalização
0
Pronto a Enviar
0
Enviado
0
⚠ Problema
0
Encomenda
Cliente
Estado
Tipo
Artigos
Entrega
Resp.
Data
Total
✕
📷 Importar de screenshot
🖼️
Arrasta a imagem aqui, cola (Ctrl+V) ou clica para seleccionar
PNG, JPG, WEBP · máx 10 MB
Cancelar
Analisar →
A analisar a imagem com IA…
Cliente
Email
Artigos detectados
+ Adicionar artigo
Nota interna
← Novo upload
Criar cartão
✕
⚠ Descreve o problema
Cancelar
Confirmar
✕
✕
Novo cartão
Cliente *
Email
Artigos
+ Adicionar artigo
Personalizado
Coluna inicial
Nova
A Preparar
Em Personalização
Pronto a Enviar
Nota interna
Criar cartão
Cancelar
+ Novo cartão
📷
'; } const colLabels = { nova:'Nova', preparar:'A Preparar', personalizacao:'Em Personalização', enviar:'Pronto a Enviar', enviado:'Enviado', problema:'Problema' }; const colLabel = c => colLabels[c] || c; const fmtDate = (iso, full=false) => iso ? (full ? new Date(iso).toLocaleString('pt-PT') : new Date(iso).toLocaleDateString('pt-PT',{day:'2-digit',month:'2-digit'})) : '—'; const fmtMoney = v => v != null ? parseFloat(v).toLocaleString('pt-PT',{style:'currency',currency:'EUR'}) : '—'; const esc = s => String(s??'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); const setSync = s => { const el = document.getElementById('sync-status'); ({ok:()=>{el.textContent='● Sincronizado';el.className='sync-status';}, syncing:()=>{el.textContent='● A sincronizar…';el.className='sync-status syncing';}, error:()=>{el.textContent='● Erro de ligação';el.className='sync-status error';}})[s]?.(); };