{"id":1146,"date":"2026-02-24T22:17:51","date_gmt":"2026-02-24T22:17:51","guid":{"rendered":"https:\/\/www.decalcer.com\/?page_id=1146"},"modified":"2026-03-22T15:28:51","modified_gmt":"2026-03-22T15:28:51","slug":"orca","status":"publish","type":"page","link":"https:\/\/www.decalcer.com\/en\/orca\/","title":{"rendered":"orca"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"1146\" class=\"elementor elementor-1146\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e2f9b3a e-flex e-con-boxed e-con e-parent\" data-id=\"e2f9b3a\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6399a31 elementor-widget elementor-widget-html\" data-id=\"6399a31\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0b36d79 elementor-widget elementor-widget-html\" data-id=\"0b36d79\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n<!DOCTYPE html>\n<html lang=\"pt\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover\">\n    <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n    <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">\n    <meta name=\"theme-color\" content=\"#f2f2f7\">\n    <title>Or\u00e7amentos e Rendibilidade | Decalcer<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\">\n    <style>\n        body { margin: 0; padding: 0; background-color: #f2f2f7; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; color: #1c1c1e; padding-top: env(safe-area-inset-top); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); -webkit-font-smoothing: antialiased; }\n        ::-webkit-scrollbar { width: 6px; height: 6px; }\n        ::-webkit-scrollbar-track { background: transparent; }\n        ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 10px; }\n        ::-webkit-scrollbar-thumb:hover { background: #94a3b8; }\n        .tab-content { display: none; animation: fadeIn 0.3s ease-out forwards; }\n        .tab-content.active { display: block; }\n        @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }\n        .css-spinner { border: 3px solid #e2e8f0; border-top: 3px solid #10b981; border-radius: 50%; width: 40px; height: 40px; animation: spin 0.8s linear infinite; margin: 0 auto 20px auto; }\n        @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n        .toast-container { position: fixed; top: calc(20px + env(safe-area-inset-top)); right: 20px; left: 20px; z-index: 9999; display: flex; flex-direction: column; gap: 10px; pointer-events: none;}\n        @media (min-width: 640px) { .toast-container { left: auto; max-width: 400px; } }\n        .toast { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); padding: 16px 20px; border-radius: 16px; box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); display: flex; align-items: center; gap: 12px; font-size: 14px; font-weight: 600; animation: slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards; pointer-events: auto; border: 1px solid rgba(0,0,0,0.05);}\n        .toast.success { border-left: 5px solid #10b981; }\n        .toast.error { border-left: 5px solid #ef4444; }\n        .toast.info { border-left: 5px solid #3b82f6; }\n        @keyframes slideIn { from { transform: translateY(-30px) scale(0.95); opacity: 0; } to { transform: translateY(0) scale(1); opacity: 1; } }\n        .calc-input { background-color: #ffffff; border: 1px solid #e5e5ea; border-radius: 12px; padding: 0.75rem 1rem; width: 100%; font-size: 15px; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); min-height: 44px; color: #1c1c1e; box-sizing: border-box;}\n        .calc-input::placeholder { color: #8e8e93; }\n        .calc-input:focus { outline: none; border-color: #14b8a6; background-color: #ffffff; box-shadow: 0 0 0 4px rgba(20, 184, 166, 0.15); }\n        .bg-resumo { background: linear-gradient(135deg, #0f766e 0%, #115e59 100%); }\n        .mobile-footer-safe { padding-bottom: calc(1rem + env(safe-area-inset-bottom)); background: rgba(255, 255, 255, 0.85); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-top: 1px solid rgba(0, 0, 0, 0.1); }\n        .hide-scrollbar::-webkit-scrollbar { display: none; }\n        .hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }\n        button { transition: transform 0.1s ease, background-color 0.2s ease, opacity 0.2s ease; }\n        button:active { transform: scale(0.96); }\n        .ios-label { font-size: 11px; font-weight: 600; color: #8e8e93; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 6px; display: block; }\n        .status-emerald { background-color: #ecfdf5; color: #059669; }\n        .status-rose    { background-color: #fff1f2; color: #e11d48; }\n        .status-amber   { background-color: #fffbeb; color: #d97706; }\n        #iva-row { display: none; justify-content: space-between; align-items: center; font-size: 15px; font-weight: bold; color: #475569; background: #f8fafc; padding: 12px 16px; border-radius: 12px; margin-bottom: 16px; border: 1px solid #e2e8f0; }\n        #iva-row.visible { display: flex; }\n        #total-final-row { display: none; border-top: 1px solid #e2e8f0; padding-top: 16px; margin-bottom: 20px; }\n        #total-final-row.visible { display: block; }\n        .cost-bar-slice { height: 100%; transition: width 0.5s ease; }\n        .kanban-col { min-height: 500px; transition: background-color 0.2s ease; }\n        .kanban-col.drag-over { background-color: rgba(203, 213, 225, 0.4); border-color: #94a3b8; border-style: dashed; }\n        .kanban-card { transition: all 0.2s ease; cursor: grab; position: relative; }\n        .kanban-card:active { cursor: grabbing; }\n        .kanban-card:hover { transform: translateY(-2px); box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); }\n        .kanban-card.dragging { opacity: 0.5; transform: scale(0.95); }\n    <\/style>\n<\/head>\n<body>\n<div id=\"toast-area\" class=\"toast-container mt-2\"><\/div>\n<div id=\"loading-screen\" class=\"min-h-screen flex flex-col items-center justify-center bg-white z-[9999] fixed inset-0\">\n    <div class=\"css-spinner\"><\/div>\n    <span class=\"text-sm font-semibold text-slate-500 uppercase tracking-wide mt-4\">A preparar ERP...<\/span>\n<\/div>\n\n<div id=\"app-container\" class=\"hidden min-h-screen pb-36 lg:pb-12\">\n    <div class=\"bg-white\/80 backdrop-blur-xl supports-[backdrop-filter]:bg-white\/70 border-b border-slate-200 sticky top-0 z-40\">\n        <div class=\"max-w-7xl mx-auto px-4 sm:px-6 pt-2\">\n            <div class=\"flex items-center justify-between h-14\">\n                <div class=\"flex items-center gap-3\">\n                    <img decoding=\"async\" src=\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\" alt=\"Decalcer\" style=\"height: 24px; width: auto; max-width: 140px; object-fit: contain;\">\n                    <div class=\"hidden sm:block border-l border-slate-300 h-6 mx-2\"><\/div>\n                    <div>\n                        <h1 class=\"text-base font-bold text-slate-800 leading-none tracking-tight\">Decalcer ERP<\/h1>\n                        <span id=\"badge-role\" class=\"text-[10px] text-white bg-slate-800 px-2 py-0.5 rounded uppercase tracking-wider font-bold\">Admin<\/span>\n                    <\/div>\n                <\/div>\n                <div class=\"flex items-center gap-4\">\n                    <span id=\"user-email\" class=\"text-xs font-semibold text-slate-500 hidden sm:block\"><\/span>\n                    <button id=\"btn-login\" class=\"px-5 py-2.5 bg-slate-900 text-white text-xs font-bold rounded-full hover:bg-slate-800 cursor-pointer border-none shadow-sm min-h-[44px]\">Login<\/button>\n                <\/div>\n            <\/div>\n            <div class=\"flex space-x-6 overflow-x-auto hide-scrollbar mt-1 border-b border-transparent\">\n                <button class=\"tab-btn py-3 border-b-[3px] border-teal-500 text-teal-600 font-bold text-[13px] sm:text-sm whitespace-nowrap bg-transparent cursor-pointer transition-colors min-h-[44px]\" data-target=\"tab-pipeline\" id=\"nav-pipeline\">Pipeline (CRM)<\/button>\n                <button class=\"tab-btn py-3 border-b-[3px] border-transparent text-slate-500 hover:text-slate-800 font-semibold text-[13px] sm:text-sm whitespace-nowrap bg-transparent cursor-pointer transition-colors min-h-[44px]\" data-target=\"tab-orcamentos\">Lista Geral<\/button>\n                <button class=\"tab-btn py-3 border-b-[3px] border-transparent text-slate-500 hover:text-slate-800 font-semibold text-[13px] sm:text-sm whitespace-nowrap bg-transparent cursor-pointer transition-colors min-h-[44px]\" data-target=\"tab-novo\">Criar \/ Editar<\/button>\n                <button class=\"tab-btn py-3 border-b-[3px] border-transparent text-slate-500 hover:text-slate-800 font-semibold text-[13px] sm:text-sm whitespace-nowrap bg-transparent cursor-pointer transition-colors min-h-[44px]\" data-target=\"tab-analise\" id=\"nav-analise\">An\u00e1lise (BI)<\/button>\n                <button class=\"tab-btn py-3 border-b-[3px] border-transparent text-slate-500 hover:text-slate-800 font-semibold text-[13px] sm:text-sm whitespace-nowrap bg-transparent cursor-pointer transition-colors min-h-[44px]\" data-target=\"tab-configs\" id=\"nav-configs\">Configura\u00e7\u00f5es<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"max-w-7xl mx-auto px-4 sm:px-6 mt-6\">\n        <div id=\"tab-pipeline\" class=\"tab-content active\">\n            <div class=\"flex justify-between items-center mb-6\">\n                <div>\n                    <h2 class=\"text-lg font-bold text-slate-800\">Pipeline Comercial<\/h2>\n                    <p class=\"text-xs text-slate-500 font-medium mt-1\">Arraste os or\u00e7amentos para atualizar o estado.<\/p>\n                <\/div>\n                <button class=\"bg-teal-600 text-white px-5 rounded-2xl shadow-sm text-sm font-bold hover:bg-teal-700 min-h-[44px] flex items-center gap-2 btn-switch-novo\">\n                    <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M12 4v16m8-8H4\"\/><\/svg> Novo Or\u00e7amento\n                <\/button>\n            <\/div>\n            <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n                <div class=\"bg-slate-200\/50 rounded-3xl p-4 kanban-col border border-slate-200\" data-status=\"Pendente\">\n                    <div class=\"flex justify-between items-center mb-4 px-2\">\n                        <h3 class=\"font-bold text-slate-700 uppercase tracking-wider text-xs flex items-center gap-2\"><span class=\"w-2.5 h-2.5 rounded-full bg-amber-400\"><\/span> Em Negocia\u00e7\u00e3o<\/h3>\n                        <span id=\"kb-count-pendente\" class=\"bg-white text-slate-500 text-xs font-bold px-2 py-1 rounded-lg shadow-sm\">0<\/span>\n                    <\/div>\n                    <div id=\"kb-col-pendente\" class=\"space-y-4 pb-12 h-full\"><\/div>\n                <\/div>\n                <div class=\"bg-emerald-50\/50 rounded-3xl p-4 kanban-col border border-emerald-100\" data-status=\"Aprovado\">\n                    <div class=\"flex justify-between items-center mb-4 px-2\">\n                        <h3 class=\"font-bold text-emerald-700 uppercase tracking-wider text-xs flex items-center gap-2\"><span class=\"w-2.5 h-2.5 rounded-full bg-emerald-500\"><\/span> Ganhos (Produ\u00e7\u00e3o)<\/h3>\n                        <span id=\"kb-count-aprovado\" class=\"bg-white text-emerald-600 text-xs font-bold px-2 py-1 rounded-lg shadow-sm\">0<\/span>\n                    <\/div>\n                    <div id=\"kb-col-aprovado\" class=\"space-y-4 pb-12 h-full\"><\/div>\n                <\/div>\n                <div class=\"bg-rose-50\/50 rounded-3xl p-4 kanban-col border border-rose-100\" data-status=\"Rejeitado\">\n                    <div class=\"flex justify-between items-center mb-4 px-2\">\n                        <h3 class=\"font-bold text-rose-700 uppercase tracking-wider text-xs flex items-center gap-2\"><span class=\"w-2.5 h-2.5 rounded-full bg-rose-500\"><\/span> Perdidos<\/h3>\n                        <span id=\"kb-count-rejeitado\" class=\"bg-white text-rose-600 text-xs font-bold px-2 py-1 rounded-lg shadow-sm\">0<\/span>\n                    <\/div>\n                    <div id=\"kb-col-rejeitado\" class=\"space-y-4 pb-12 h-full\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"tab-orcamentos\" class=\"tab-content\">\n            <div class=\"flex flex-col sm:flex-row justify-between gap-4 mb-6\">\n                <div class=\"flex-1 relative\">\n                    <svg class=\"w-5 h-5 absolute left-3 top-1\/2 -translate-y-1\/2 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"\/><\/svg>\n                    <input type=\"text\" id=\"search-orc\" placeholder=\"Pesquisar (ID, Ref, Cliente, PO)...\" class=\"w-full pl-10 pr-4 py-3 bg-white border border-slate-200 rounded-2xl text-[15px] shadow-sm focus:border-teal-500 outline-none transition-colors min-h-[44px]\">\n                <\/div>\n                <div class=\"w-full sm:w-auto\">\n                    <select id=\"filter-orc-status\" class=\"w-full py-3 px-4 bg-white border border-slate-200 rounded-2xl text-[15px] shadow-sm focus:border-teal-500 outline-none transition-colors min-h-[44px] text-slate-700 font-medium\">\n                        <option value=\"Todos\">Todos os Estados<\/option>\n                        <option value=\"Pendente\">Pendente<\/option>\n                        <option value=\"Aprovado\">Aprovado<\/option>\n                        <option value=\"Rejeitado\">Rejeitado<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"flex gap-2 w-full sm:w-auto\">\n                    <button id=\"btn-search-orc\" class=\"flex-1 sm:flex-none bg-slate-900 text-white px-6 rounded-2xl shadow-sm text-sm font-bold hover:bg-slate-800 transition-colors min-h-[44px] cursor-pointer\">Pesquisar<\/button>\n                    <button class=\"bg-teal-600 text-white px-5 rounded-2xl shadow-sm text-sm font-bold sm:hidden hover:bg-teal-700 shrink-0 min-h-[44px] btn-switch-novo\">+ Novo<\/button>\n                <\/div>\n            <\/div>\n            <div id=\"orcamentos-grid\" class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5\"><\/div>\n            <div id=\"no-orcamentos\" class=\"hidden text-center py-20 bg-white rounded-3xl border border-dashed border-slate-300\">\n                <p class=\"text-slate-500 font-semibold\">Nenhum or\u00e7amento encontrado.<\/p>\n            <\/div>\n        <\/div>\n\n        <div id=\"tab-novo\" class=\"tab-content\">\n            <form id=\"form-orcamento\" action=\"\">\n                <div class=\"bg-white p-6 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100 mb-6 relative\">\n                    <div id=\"edit-badge\" class=\"hidden absolute -top-3 left-6 bg-amber-500 text-white text-[11px] font-bold uppercase tracking-wider px-4 py-1.5 rounded-full shadow-md\">Modo de Edi\u00e7\u00e3o<\/div>\n                    <div class=\"grid grid-cols-1 md:grid-cols-7 gap-5\">\n                        <div class=\"md:col-span-1\"><label class=\"ios-label\">Refer\u00eancia *<\/label><input type=\"text\" id=\"orc-ref\" required placeholder=\"Ex: REF-1020\" class=\"calc-input font-bold text-slate-900 bg-slate-50\/50\"><\/div>\n                        <div class=\"md:col-span-1\"><label class=\"ios-label\">Cliente *<\/label><input type=\"text\" id=\"orc-cliente\" required placeholder=\"Nome do Cliente\" list=\"clientes-datalist\" class=\"calc-input bg-slate-50\/50\"><\/div>\n                        <div class=\"md:col-span-1\"><label class=\"ios-label\">PO \/ Int. Ref<\/label><input type=\"text\" id=\"orc-po\" placeholder=\"Opcional\" class=\"calc-input bg-slate-50\/50\"><\/div>\n                        <div class=\"md:col-span-1\">\n                            <label class=\"ios-label\">ID Produ\u00e7\u00e3o<\/label>\n                            <div class=\"relative\">\n                                <input type=\"text\" id=\"orc-job-id\" placeholder=\"Ex: JOB-1234\" class=\"calc-input text-teal-800 bg-teal-50\/50 pr-10 border-teal-100 placeholder:font-normal\">\n                                <button type=\"button\" id=\"btn-sync-prod\" class=\"absolute right-2 top-1\/2 -translate-y-1\/2 text-teal-600 bg-teal-100\/50 hover:bg-teal-200 p-1.5 rounded-lg transition-colors cursor-pointer border-none flex items-center justify-center\" title=\"Sincronizar dados\"><svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\/><\/svg><\/button>\n                            <\/div>\n                        <\/div>\n                        <div class=\"md:col-span-1\">\n                            <label class=\"ios-label\">Categoria \/ Tipo<\/label>\n                            <select id=\"orc-categoria\" class=\"calc-input bg-slate-50\/50 font-semibold\">\n                                <option value=\"Sem Categoria\">Sem Categoria<\/option>\n                                <option value=\"Vitrifica\u00e7\u00e3o\">Vitrifica\u00e7\u00e3o<\/option>\n                                <option value=\"T\u00eaxtil\">T\u00eaxtil<\/option>\n                                <option value=\"Capacetes\">Capacetes<\/option>\n                                <option value=\"Ind\u00fastria\">Ind\u00fastria \/ Outro<\/option>\n                            <\/select>\n                        <\/div>\n                        <div class=\"md:col-span-2 grid grid-cols-2 gap-4\">\n                            <div><label class=\"ios-label\">Data de Emiss\u00e3o *<\/label><input type=\"date\" id=\"orc-data\" required class=\"calc-input bg-slate-50\/50 text-sm\"><\/div>\n                            <div>\n                                <label class=\"ios-label\">Estado<\/label>\n                                <select id=\"orc-estado\" class=\"calc-input font-bold bg-slate-50\/50\">\n                                    <option value=\"Pendente\">Pendente<\/option>\n                                    <option value=\"Aprovado\">Aprovado<\/option>\n                                    <option value=\"Rejeitado\">Rejeitado<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"flex flex-col lg:flex-row gap-6 relative\">\n                    <div class=\"lg:w-2\/3 space-y-6\">\n                        <div class=\"bg-white p-6 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100\">\n                            <div class=\"flex flex-col sm:flex-row sm:items-center justify-between gap-4 mb-6\">\n                                <h3 class=\"text-[17px] font-bold text-slate-800 flex items-center gap-3\"><span class=\"w-8 h-8 rounded-full bg-slate-100 text-slate-600 flex items-center justify-center shrink-0 text-sm\">1<\/span> Dados da Produ\u00e7\u00e3o<\/h3>\n                                <label class=\"flex items-center justify-center gap-3 text-[13px] font-bold text-slate-700 bg-[#f2f2f7] px-5 py-2.5 rounded-full cursor-pointer hover:bg-slate-200 transition-colors w-full sm:w-auto min-h-[44px]\"><input type=\"checkbox\" id=\"calc-iva\" class=\"trigger-calc w-5 h-5 accent-teal-500 rounded-md\"> Aplicar IVA (23%)<\/label>\n                            <\/div>\n                            <div class=\"grid grid-cols-2 md:grid-cols-6 gap-4\">\n                                <div><label class=\"ios-label\">N\u00ba Folhas *<\/label><input type=\"number\" id=\"calc-folhas\" value=\"0\" min=\"0\" class=\"calc-input text-center font-bold text-lg text-slate-900 trigger-calc\"><\/div>\n                                <div><label class=\"ios-label text-rose-600\">% Quebra<\/label><input type=\"number\" id=\"calc-quebra\" value=\"0\" min=\"0\" class=\"calc-input text-center text-lg font-bold text-rose-600 trigger-calc bg-rose-50\/50\" title=\"Aumenta as folhas a produzir nos custos, sem alterar a fatura\u00e7\u00e3o.\"><\/div>\n                                <div><label class=\"ios-label\">Motivos\/Flh<\/label><input type=\"number\" id=\"calc-motivos\" value=\"0\" min=\"0\" class=\"calc-input text-center text-lg trigger-calc\"><\/div>\n                                <div><label class=\"ios-label\">Margem (%)<\/label><input type=\"number\" id=\"calc-margem\" value=\"0\" min=\"0\" class=\"calc-input text-center text-lg font-bold text-teal-600 trigger-calc bg-teal-50\/30\"><\/div>\n                                <div><label class=\"ios-label\">Outros (\u20ac)<\/label><input type=\"number\" id=\"calc-outros\" value=\"0\" step=\"0.1\" class=\"calc-input text-center text-lg trigger-calc\" title=\"S\/ Margem\"><\/div>\n                                <div><label class=\"ios-label text-indigo-600\">Amostra (\u20ac)<\/label><input type=\"number\" id=\"calc-amostra\" value=\"0\" step=\"0.1\" class=\"calc-input text-center text-lg font-bold text-indigo-600 trigger-calc bg-indigo-50\/30\" title=\"Valor cobrado e faturado no momento da adjudica\u00e7\u00e3o\"><\/div>\n                            <\/div>\n                            <p class=\"text-[11px] text-slate-500 mt-3 font-medium\" id=\"lbl-info-quebra\"><\/p>\n                        <\/div>\n                        <div class=\"bg-white p-6 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100\">\n                            <h3 class=\"text-[17px] font-bold text-slate-800 mb-6 flex items-center gap-3\"><span class=\"w-8 h-8 rounded-full bg-slate-100 text-slate-600 flex items-center justify-center shrink-0 text-sm\">2<\/span> Materiais e M\u00e3o de Obra<\/h3>\n                            <div class=\"mb-8\">\n                                <p class=\"text-[11px] font-bold text-teal-600 uppercase tracking-wider mb-3 ml-2\">Materiais Base<\/p>\n                                <div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl flex gap-3 items-end\"><div class=\"flex-1\"><label class=\"ios-label\">Papel (\u20ac\/Flh)<\/label><input type=\"number\" id=\"calc-preco-papel\" value=\"0\" step=\"0.01\" class=\"calc-input trigger-calc bg-white\"><\/div><div class=\"flex-1 bg-white border border-slate-200 rounded-xl p-2 text-center h-full min-h-[44px] flex flex-col justify-center\"><p id=\"lbl-custo-papel\" class=\"font-bold text-slate-800 text-[14px]\">0,00 \u20ac<\/p><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl flex gap-3 items-end\"><div class=\"flex-1\"><label class=\"ios-label\">Paraf. (\u20ac\/Flh)<\/label><input type=\"number\" id=\"calc-preco-parafinado\" value=\"0.00\" step=\"0.01\" class=\"calc-input trigger-calc bg-white\"><\/div><div class=\"flex-1 bg-white border border-slate-200 rounded-xl p-2 text-center h-full min-h-[44px] flex flex-col justify-center\"><p id=\"lbl-custo-parafinado\" class=\"font-bold text-slate-800 text-[14px]\">0,00 \u20ac<\/p><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl flex gap-3\"><div class=\"w-1\/2\"><label class=\"ios-label\">Ecr\u00e3s (Qtd)<\/label><input type=\"number\" id=\"calc-qtd-ecras\" value=\"0\" class=\"calc-input trigger-calc bg-white\"><\/div><div class=\"w-1\/2\"><label class=\"ios-label\">Pre\u00e7o Un. (\u20ac)<\/label><input type=\"number\" id=\"calc-preco-ecra\" value=\"0\" step=\"0.1\" class=\"calc-input trigger-calc bg-white\"><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl flex gap-3\"><div class=\"w-1\/2\"><label class=\"ios-label\">Pel\u00edcula (M\/Qtd)<\/label><input type=\"number\" id=\"calc-qtd-pelicula\" value=\"0\" step=\"0.1\" class=\"calc-input trigger-calc bg-white\"><\/div><div class=\"w-1\/2\"><label class=\"ios-label\">Pre\u00e7o Un. (\u20ac)<\/label><input type=\"number\" id=\"calc-preco-pelicula\" value=\"0\" step=\"0.1\" class=\"calc-input trigger-calc bg-white\"><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl sm:col-span-2\"><label class=\"ios-label\">Consumos Diversos (Valor Total em \u20ac)<\/label><input type=\"number\" id=\"calc-consumos-diversos\" value=\"0\" step=\"0.1\" class=\"calc-input trigger-calc bg-white\" title=\"S\/ Margem\"><\/div>\n                                <\/div>\n                            <\/div>\n                            <div>\n                                <p class=\"text-[11px] font-bold text-teal-600 uppercase tracking-wider mb-3 ml-2\">M\u00e3o de Obra<\/p>\n                                <div class=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl\"><p class=\"text-[13px] font-bold text-slate-800 mb-2\">Design<\/p><div class=\"flex gap-2\"><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">Horas<\/label><input type=\"number\" id=\"calc-horas-design\" value=\"0\" step=\"0.5\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">\u20ac\/Hora<\/label><input type=\"number\" id=\"calc-preco-hora-design\" value=\"0\" step=\"0.1\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl\"><p class=\"text-[13px] font-bold text-slate-800 mb-2\">Ecr\u00e3s<\/p><div class=\"flex gap-2\"><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">Horas<\/label><input type=\"number\" id=\"calc-horas-ecras\" value=\"0\" step=\"0.5\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">\u20ac\/Hora<\/label><input type=\"number\" id=\"calc-preco-hora-ecras\" value=\"25\" step=\"0.1\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><\/div><\/div>\n                                    <div class=\"bg-[#f2f2f7]\/50 p-4 rounded-2xl\"><p class=\"text-[13px] font-bold text-slate-800 mb-2\">Impress\u00e3o<\/p><div class=\"flex gap-2\"><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">Horas<\/label><input type=\"number\" id=\"calc-horas-impressao\" value=\"10\" step=\"0.5\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><div class=\"w-1\/2\"><label class=\"text-[9px] font-bold text-slate-400 uppercase\">\u20ac\/Hora<\/label><input type=\"number\" id=\"calc-preco-hora-impressao\" value=\"53.8\" step=\"0.1\" class=\"calc-input trigger-calc bg-white px-2 text-center text-sm\"><\/div><\/div><\/div>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"bg-white p-6 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100\">\n                            <div class=\"flex justify-between items-center mb-6\"><h3 class=\"text-[17px] font-bold text-slate-800 flex items-center gap-3\"><span class=\"w-8 h-8 rounded-full bg-slate-100 text-slate-600 flex items-center justify-center shrink-0 text-sm\">3<\/span> Cores \/ Tintas<\/h3><button type=\"button\" id=\"btn-add-tinta\" class=\"px-4 py-2.5 text-[13px] font-bold bg-teal-50 text-teal-700 rounded-full hover:bg-teal-100 transition-colors border-none cursor-pointer min-h-[44px]\">+ Cor<\/button><\/div>\n                            <div class=\"hidden sm:grid grid-cols-12 gap-3 px-2 mb-3 ios-label\"><div class=\"col-span-5\">Cor \/ Refer\u00eancia<\/div><div class=\"col-span-3 text-center\">Pre\u00e7o\/Kg (\u20ac)<\/div><div class=\"col-span-3 text-center\">Grama p\/ Folha<\/div><div class=\"col-span-1\"><\/div><\/div>\n                            <div id=\"tintas-container\" class=\"space-y-4 sm:space-y-3\"><\/div>\n                            <div class=\"mt-6 pt-5 border-t border-slate-100 flex justify-between items-center bg-[#f2f2f7]\/50 p-4 rounded-2xl\">\n                                <div><p class=\"text-[11px] text-slate-500 uppercase font-bold mb-1\">Total Gramas (c\/ Quebra)<\/p><p id=\"lbl-total-gramas\" class=\"font-bold text-slate-800 text-lg\">0g<\/p><\/div>\n                                <div class=\"text-right\"><p class=\"text-[11px] text-teal-700 uppercase font-bold mb-1\">Custo Tintas<\/p><p id=\"lbl-custo-tintas\" class=\"text-teal-600 font-bold text-2xl leading-none\">0,00 \u20ac<\/p><\/div>\n                            <\/div>\n                        <\/div>\n                        <div class=\"bg-white p-6 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100\">\n                            <label class=\"text-[13px] font-bold text-slate-800 mb-3 block\">Notas de Produ\u00e7\u00e3o (F\u00e1brica)<\/label>\n                            <textarea id=\"orc-notas\" rows=\"3\" class=\"calc-input resize-none bg-slate-50\/50\" placeholder=\"Detalhes t\u00e9cnicos, refer\u00eancias de pantones...\"><\/textarea>\n                        <\/div>\n                    <\/div>\n                    <div class=\"lg:w-1\/3\">\n                        <div class=\"bg-resumo text-white p-6 rounded-3xl shadow-xl lg:sticky top-24 mb-6\">\n                            <h2 class=\"text-xl font-bold mb-6 text-teal-50 flex items-center gap-3\"><svg width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" stroke-width=\"2.5\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"4\" ry=\"4\"\/><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"\/><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"\/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"\/><\/svg> Resumo Financeiro<\/h2>\n                            <div class=\"space-y-2.5 text-[15px] font-medium\">\n                                <div class=\"flex justify-between items-center bg-white\/10 px-4 py-3 rounded-2xl\"><span class=\"text-teal-50\">Tintas<\/span><span id=\"res-custo-tintas\" class=\"font-bold\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center bg-white\/10 px-4 py-3 rounded-2xl\"><span class=\"text-teal-50\">Pap\u00e9is<\/span><span id=\"res-custo-papel\" class=\"font-bold\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center bg-white\/10 px-4 py-3 rounded-2xl\"><span class=\"text-teal-50\">M\u00e3o de Obra<\/span><span id=\"res-custo-mao-obra\" class=\"font-bold\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center bg-white\/10 px-4 py-3 rounded-2xl\"><span class=\"text-teal-50\">Ecr\u00e3s<\/span><span id=\"res-custo-ecras\" class=\"font-bold\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center bg-white\/10 px-4 py-3 rounded-2xl\"><span class=\"text-teal-50\">Pel\u00edcula<\/span><span id=\"res-custo-pelicula\" class=\"font-bold\">0,00 \u20ac<\/span><\/div>\n                            <\/div>\n                            <div class=\"my-6 border-t border-white\/20 pt-5 space-y-3\">\n                                <div class=\"flex justify-between items-center\"><span class=\"text-teal-100 text-[15px]\">Custo Produ\u00e7\u00e3o<\/span><span id=\"res-custos-producao\" class=\"font-bold text-lg text-white\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center\"><span class=\"text-teal-100 text-[15px]\">Lucro Previsto (<span id=\"res-margem-lbl\">50<\/span>%)<\/span><span id=\"res-lucro\" class=\"font-bold text-lg text-emerald-300\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center pt-3 border-t border-white\/10\"><span class=\"text-teal-100 text-[15px]\">Consumos & Outros<\/span><span id=\"res-custo-outros\" class=\"font-bold text-lg text-amber-300\">0,00 \u20ac<\/span><\/div>\n                                <div class=\"flex justify-between items-center mt-2\" id=\"row-res-amostra\" style=\"display:none;\"><span class=\"text-indigo-200 text-[15px]\">Adiantamento (Amostra)<\/span><span id=\"res-valor-amostra\" class=\"font-bold text-lg text-indigo-300\">0,00 \u20ac<\/span><\/div>\n                            <\/div>\n                            <div class=\"bg-white text-slate-900 p-5 rounded-2xl shadow-inner mt-4\">\n                                <p class=\"text-[11px] font-bold text-slate-500 uppercase mb-1\" id=\"lbl-subtotal\">Subtotal<\/p>\n                                <p id=\"res-total-venda\" class=\"text-[32px] font-extrabold text-slate-800 leading-none mb-4\">0,00 \u20ac<\/p>\n                                <div id=\"iva-row\"><span>IVA (23%)<\/span><span id=\"res-valor-iva\">0,00 \u20ac<\/span><\/div>\n                                <div id=\"total-final-row\"><p class=\"text-[11px] font-bold text-teal-600 uppercase mb-1\">Total a Pagar (c\/ IVA)<\/p><p id=\"res-total-final\" class=\"text-[32px] font-extrabold text-teal-600 leading-none\">0,00 \u20ac<\/p><\/div>\n                                <div class=\"grid grid-cols-2 gap-3 border-t border-slate-100 pt-4\">\n                                    <div class=\"bg-slate-50 p-3 rounded-xl text-center\"><p class=\"text-[10px] text-slate-500 uppercase font-bold mb-1\">Pre\u00e7o\/Folha<\/p><p id=\"res-preco-folha\" class=\"font-bold text-slate-800 text-[15px]\">0,00 \u20ac<\/p><\/div>\n                                    <div class=\"bg-slate-50 p-3 rounded-xl text-center\"><p class=\"text-[10px] text-slate-500 uppercase font-bold mb-1\">Pre\u00e7o Motivo<\/p><p id=\"res-preco-motivo\" class=\"font-bold text-slate-800 text-[15px]\">0,00 \u20ac<\/p><\/div>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mt-8\">\n                                <p class=\"text-[11px] uppercase font-bold text-teal-100 mb-3 tracking-wider\">Distribui\u00e7\u00e3o (Custos)<\/p>\n                                <div class=\"w-full h-3 flex rounded-full overflow-hidden bg-white\/10\" id=\"res-bar-chart\"><\/div>\n                                <div class=\"flex flex-wrap gap-x-4 gap-y-2 mt-4 text-[11px] text-teal-50 font-medium\" id=\"res-legend-chart\"><\/div>\n                            <\/div>\n                            <div class=\"hidden lg:flex gap-3 mt-8\">\n                                <button type=\"button\" id=\"btn-cancel-edit-desktop\" class=\"hidden flex-1 py-4 bg-white\/20 hover:bg-white\/30 text-white font-bold rounded-2xl transition-colors border-none cursor-pointer\">Cancelar<\/button>\n                                <button type=\"submit\" id=\"btn-submit-orc-desktop\" form=\"form-orcamento\" class=\"flex-[2] py-4 bg-slate-900 hover:bg-black text-white font-bold rounded-2xl shadow-xl transition-colors border-none cursor-pointer\">Gravar<\/button>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                <div class=\"fixed bottom-0 left-0 w-full z-40 lg:hidden mobile-footer-safe\" id=\"mobile-footer-bar\" style=\"display:none;\">\n                    <div class=\"px-5 py-3 flex justify-between items-center\">\n                        <div><p class=\"text-[11px] text-slate-500 uppercase font-bold tracking-wider\">Total<\/p><p id=\"mobile-res-total\" class=\"text-[22px] font-extrabold text-slate-900 leading-none mt-1\">0,00 \u20ac<\/p><\/div>\n                        <div class=\"flex gap-2\">\n                            <button type=\"button\" id=\"btn-cancel-edit-mobile\" class=\"hidden px-4 py-3 bg-slate-200 text-slate-700 font-bold rounded-full border-none cursor-pointer min-h-[44px]\">Cancelar<\/button>\n                            <button type=\"submit\" id=\"btn-submit-orc-mobile\" form=\"form-orcamento\" class=\"px-6 py-3 bg-teal-600 text-white font-bold rounded-full shadow-lg shadow-teal-600\/30 border-none cursor-pointer min-h-[44px]\">Gravar<\/button>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\n        <\/div>\n\n        <div id=\"tab-analise\" class=\"tab-content\">\n            <div class=\"flex flex-col lg:flex-row justify-between items-start lg:items-center gap-4 mb-6\">\n                <div>\n                    <h2 class=\"text-lg font-bold text-slate-800\">Business Intelligence (BI)<\/h2>\n                    <p class=\"text-xs text-slate-500 font-medium mt-1\">Dashboards, Rentabilidade e Abate de Stock.<\/p>\n                <\/div>\n            <\/div>\n            <div class=\"bg-indigo-900 text-white p-6 rounded-3xl shadow-lg mb-8 relative overflow-hidden\">\n                <div class=\"absolute top-0 right-0 p-6 opacity-10\"><svg width=\"100\" height=\"100\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\"\/><\/svg><\/div>\n                <h3 class=\"font-bold text-indigo-200 text-[15px] flex items-center gap-2 mb-4 relative z-10\"><svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M9 17v1a3 3 0 11-6 0v-1m6 0v-1a3 3 0 11-6 0v1m6 0h3m-3 0h-3m3 0V9m0 8h3m-3 0h-3M9 9a3 3 0 11-6 0V8a3 3 0 11-6 0v1m6 0V8a3 3 0 116 0v1m-6 0h3m-3 0h-3\"\/><\/svg> Previs\u00e3o de Necessidades (Baseado nos Aprovados)<\/h3>\n                <div class=\"grid grid-cols-2 lg:grid-cols-4 gap-6 relative z-10\">\n                    <div><p class=\"text-[11px] text-indigo-300 uppercase font-bold tracking-wider\">Total Folhas a Encomendar<\/p><p id=\"bi-stock-folhas\" class=\"text-3xl font-extrabold text-white mt-1\">0<\/p><\/div>\n                    <div><p class=\"text-[11px] text-indigo-300 uppercase font-bold tracking-wider\">Kg de Tinta a Preparar<\/p><p id=\"bi-stock-tintas\" class=\"text-3xl font-extrabold text-white mt-1\">0 Kg<\/p><\/div>\n                    <div class=\"col-span-2 text-indigo-200 text-xs font-medium bg-indigo-800\/50 p-3 rounded-xl flex items-center\"><p>O sistema cruza as quantidades dos or\u00e7amentos \"Aprovados\" n\u00e3o produzidos para lhe dizer exatamente quanto material precisa de comprar hoje.<\/p><\/div>\n                <\/div>\n            <\/div>\n            <div class=\"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8\">\n                <div class=\"bg-white p-6 rounded-3xl border border-slate-100 shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)]\"><h3 class=\"font-bold text-slate-800 text-[15px] mb-4\">Fatura\u00e7\u00e3o Mensal (\u20ac)<\/h3><div class=\"w-full h-64\"><canvas id=\"monthlyChart\"><\/canvas><\/div><\/div>\n                <div class=\"bg-white p-6 rounded-3xl border border-slate-100 shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)]\"><h3 class=\"font-bold text-slate-800 text-[15px] mb-4\">An\u00e1lise Win\/Loss (Motivos de Rejei\u00e7\u00e3o)<\/h3><div class=\"w-full h-64 flex justify-center\"><canvas id=\"lossChart\"><\/canvas><\/div><\/div>\n            <\/div>\n            <div class=\"bg-white rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100 overflow-hidden\">\n                <div class=\"p-6 bg-white border-b border-slate-100 flex justify-between items-center\"><div><h3 class=\"font-bold text-slate-900 text-[17px]\">Rentabilidade por Categoria<\/h3><p class=\"text-sm text-slate-500 mt-1\">Descubra que tipo de trabalho lhe d\u00e1 maior margem.<\/p><\/div><\/div>\n                <div class=\"overflow-x-auto hide-scrollbar\">\n                    <table class=\"w-full text-[15px] text-left\">\n                        <thead class=\"bg-[#f2f2f7] text-slate-500 font-bold uppercase text-[11px] tracking-wider border-b border-slate-200\"><tr><th class=\"px-6 py-4\">Categoria de Trabalho<\/th><th class=\"px-6 py-4 text-center\">N\u00ba Trabalhos<\/th><th class=\"px-6 py-4 text-right\">Faturado (\u20ac)<\/th><th class=\"px-6 py-4 text-right\">Margem Or\u00e7amentada<\/th><\/tr><\/thead>\n                        <tbody id=\"category-table-body\" class=\"divide-y divide-slate-100\"><\/tbody>\n                    <\/table>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div id=\"tab-configs\" class=\"tab-content\">\n            <div class=\"max-w-3xl mx-auto\">\n                <h2 class=\"text-xl font-bold text-slate-800 mb-6\">Custos Padr\u00e3o do Sistema<\/h2>\n                <div class=\"bg-white p-8 rounded-3xl shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] border border-slate-100\">\n                    <p class=\"text-sm text-slate-500 mb-6 border-b border-slate-100 pb-4\">Os valores definidos aqui servem como base para os novos or\u00e7amentos (e para o Smart Clone).<\/p>\n                    <div class=\"space-y-8\">\n                        <div>\n                            <h3 class=\"text-[13px] font-bold text-teal-600 uppercase tracking-wider mb-4\">Custo Base da M\u00e3o de Obra (\u20ac \/ Hora)<\/h3>\n                            <div class=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n                                <div><label class=\"ios-label\">Design<\/label><input type=\"number\" id=\"conf-hora-design\" step=\"0.1\" class=\"calc-input bg-slate-50 focus:bg-white text-center font-bold\"><\/div>\n                                <div><label class=\"ios-label\">Execu\u00e7\u00e3o de Ecr\u00e3s<\/label><input type=\"number\" id=\"conf-hora-ecras\" step=\"0.1\" class=\"calc-input bg-slate-50 focus:bg-white text-center font-bold\"><\/div>\n                                <div><label class=\"ios-label\">M\u00e1quina (Impress\u00e3o)<\/label><input type=\"number\" id=\"conf-hora-impressao\" step=\"0.1\" class=\"calc-input bg-slate-50 focus:bg-white text-center font-bold\"><\/div>\n                            <\/div>\n                        <\/div>\n                        <div>\n                            <h3 class=\"text-[13px] font-bold text-teal-600 uppercase tracking-wider mb-4\">Tempos Padr\u00e3o (Horas)<\/h3>\n                            <div class=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n                                <div><label class=\"ios-label\">Horas Design<\/label><input type=\"number\" id=\"conf-t-design\" step=\"0.5\" class=\"calc-input bg-slate-50 focus:bg-white text-center\"><\/div>\n                                <div><label class=\"ios-label\">Horas Ecr\u00e3s<\/label><input type=\"number\" id=\"conf-t-ecras\" step=\"0.5\" class=\"calc-input bg-slate-50 focus:bg-white text-center\"><\/div>\n                                <div><label class=\"ios-label\">Horas Impress\u00e3o<\/label><input type=\"number\" id=\"conf-t-impressao\" step=\"0.5\" class=\"calc-input bg-slate-50 focus:bg-white text-center\"><\/div>\n                            <\/div>\n                        <\/div>\n                        <div>\n                            <h3 class=\"text-[13px] font-bold text-teal-600 uppercase tracking-wider mb-4\">Margem de Lucro<\/h3>\n                            <div class=\"w-1\/3 min-w-[150px]\"><label class=\"ios-label\">Margem Padr\u00e3o (%)<\/label><input type=\"number\" id=\"conf-margem\" step=\"1\" class=\"calc-input bg-slate-50 focus:bg-white text-center font-extrabold text-emerald-600 text-lg\"><\/div>\n                        <\/div>\n                    <\/div>\n                    <div class=\"mt-8 pt-6 border-t border-slate-100 text-right\"><button id=\"btn-save-configs\" class=\"px-8 py-3.5 bg-slate-900 hover:bg-black text-white font-bold rounded-2xl shadow-lg transition-colors border-none cursor-pointer\">Guardar Defini\u00e7\u00f5es<\/button><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div id=\"login-modal\" class=\"hidden fixed inset-0 bg-slate-900\/60 backdrop-blur-md flex items-center justify-center p-4 z-50\">\n    <div class=\"bg-white p-8 rounded-[32px] shadow-2xl w-full max-w-sm border border-slate-100 transform transition-transform\">\n        <div class=\"text-center mb-8\"><img decoding=\"async\" src=\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\" alt=\"Decalcer\" style=\"height: 40px; width: auto; max-width: 200px; object-fit: contain; margin: 0 auto 24px auto;\"><h3 class=\"text-[22px] font-bold text-slate-900 m-0\">Acesso ao ERP<\/h3><p class=\"text-slate-500 mt-2 text-[15px]\">Administra\u00e7\u00e3o ou Equipa Comercial.<\/p><\/div>\n        <form id=\"login-form\" class=\"space-y-4\" action=\"\">\n            <div class=\"space-y-1.5\"><label class=\"ios-label ml-1\">Email<\/label><input type=\"email\" id=\"login-email\" required class=\"calc-input bg-slate-50 focus:bg-white text-[15px]\" autocapitalize=\"none\"><\/div>\n            <div class=\"space-y-1.5\"><label class=\"ios-label ml-1\">Password<\/label><input type=\"password\" id=\"login-password\" required class=\"calc-input bg-slate-50 focus:bg-white text-[15px]\"><\/div>\n            <p id=\"login-error\" class=\"text-rose-600 text-[13px] hidden bg-rose-50 p-3 rounded-xl text-center font-semibold\"><\/p>\n            <button type=\"submit\" id=\"btn-submit-login\" class=\"w-full py-4 mt-4 rounded-2xl shadow-lg shadow-teal-500\/20 text-[15px] font-bold text-white bg-teal-600 hover:bg-teal-700 min-h-[44px] transition-all\">Entrar<\/button>\n            <button type=\"button\" id=\"btn-cancel-login\" class=\"w-full py-3 mt-2 rounded-2xl text-[14px] font-bold text-slate-500 bg-transparent hover:bg-slate-50 min-h-[44px] transition-all cursor-pointer hidden\">Cancelar<\/button>\n        <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\n    <\/div>\n<\/div>\n<div id=\"winloss-modal\" class=\"hidden fixed inset-0 bg-slate-900\/60 backdrop-blur-md flex items-center justify-center p-4 z-50\">\n    <div class=\"bg-white p-6 rounded-[24px] shadow-2xl w-full max-w-sm transform transition-transform\">\n        <h3 class=\"text-[19px] font-bold text-slate-900 m-0 mb-2\">Motivo da Rejei\u00e7\u00e3o<\/h3><p class=\"text-slate-500 text-[14px] mb-6\">Para melhorar a nossa estrat\u00e9gia, por que raz\u00e3o perdemos este or\u00e7amento?<\/p>\n        <select id=\"winloss-reason\" class=\"calc-input mb-6 font-semibold bg-slate-50\/50\"><option value=\"Pre\u00e7o muito alto\">Pre\u00e7o muito alto<\/option><option value=\"Perdido para a Concorr\u00eancia\">Perdido para a Concorr\u00eancia<\/option><option value=\"Prazo de Entrega n\u00e3o serviu\">Prazo de Entrega n\u00e3o serviu<\/option><option value=\"Projeto cancelado pelo cliente\">Projeto cancelado pelo cliente<\/option><option value=\"Outro\">Outro<\/option><\/select>\n        <div class=\"flex gap-3\"><button id=\"btn-winloss-cancel\" class=\"flex-1 py-3 bg-slate-100 text-slate-700 font-bold rounded-xl border-none cursor-pointer\">Cancelar<\/button><button id=\"btn-winloss-ok\" class=\"flex-1 py-3 text-white bg-rose-600 font-bold rounded-xl shadow-lg shadow-rose-600\/30 border-none cursor-pointer\">Confirmar Perda<\/button><\/div>\n    <\/div>\n<\/div>\n<div id=\"smartclone-modal\" class=\"hidden fixed inset-0 bg-slate-900\/60 backdrop-blur-md flex items-center justify-center p-4 z-50\">\n    <div class=\"bg-white p-6 rounded-[24px] shadow-2xl w-full max-w-sm transform transition-transform\">\n        <h3 class=\"text-[19px] font-bold text-slate-900 m-0 mb-2\">Smart Clone<\/h3><p class=\"text-slate-500 text-[14px] mb-6\">Est\u00e1 a criar uma vers\u00e3o a partir de um or\u00e7amento antigo. Deseja atualizar o custo da m\u00e3o de obra para os valores tabelados atuais?<\/p>\n        <div class=\"flex gap-3\"><button id=\"btn-smartclone-keep\" class=\"flex-1 py-3 bg-slate-100 text-slate-700 font-bold rounded-xl border-none cursor-pointer\">Manter Antigos<\/button><button id=\"btn-smartclone-update\" class=\"flex-1 py-3 text-white bg-sky-600 font-bold rounded-xl shadow-lg shadow-sky-600\/30 border-none cursor-pointer\">Atualizar Custos<\/button><\/div>\n    <\/div>\n<\/div>\n<datalist id=\"clientes-datalist\"><\/datalist>\n\n<template id=\"tpl-kanban-card\">\n    <div class=\"kanban-card bg-white p-4 rounded-2xl shadow-sm border border-slate-100\" draggable=\"true\">\n        <button type=\"button\" class=\"btn-whatsapp absolute top-4 right-4 text-[#25D366] hover:bg-[#25D366]\/10 p-1.5 rounded-full transition-colors cursor-pointer border-none bg-transparent flex items-center justify-center\" title=\"Partilhar WhatsApp\">\n            <svg width=\"18\" height=\"18\" viewbox=\"0 0 24 24\" fill=\"currentColor\" style=\"pointer-events:none;\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z\"\/><\/svg>\n        <\/button>\n        <div class=\"flex justify-between items-start cursor-pointer btn-edit-kanban\">\n            <div class=\"pr-8 truncate w-full\">\n                <h4 class=\"font-bold text-slate-800 text-[14px] leading-tight truncate k-ref\"><\/h4>\n                <p class=\"text-xs text-slate-500 font-medium mt-1 truncate k-cli\"><\/p>\n            <\/div>\n        <\/div>\n        <div class=\"mt-3\">\n            <p class=\"font-bold text-slate-900 text-[16px] k-price\"><\/p>\n        <\/div>\n        <select class=\"kanban-status-select\" style=\"margin-top:10px;width:100%;font-size:11px;padding:6px;border-radius:8px;border:1px solid #e2e8f0;background:#f8fafc;outline:none;font-weight:600;color:#475569;\">\n            <option value=\"Pendente\">Pendente<\/option>\n            <option value=\"Aprovado\">Aprovado<\/option>\n            <option value=\"Rejeitado\">Rejeitado<\/option>\n        <\/select>\n    <\/div>\n<\/template>\n\n<template id=\"tpl-orcamento-card\">\n    <div class=\"bg-white p-6 rounded-3xl border border-slate-100 shadow-[0_2px_10px_-3px_rgba(6,81,237,0.1)] relative overflow-hidden flex flex-col active:bg-slate-50 transition-colors\">\n        <div style=\"position:absolute;top:20px;right:20px;display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;\">\n            <button class=\"action-btn o-btn-email\" data-action=\"email\" title=\"Enviar Email\" style=\"color:#fff;background:#0ea5e9;border:none;cursor:pointer;width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;\"><svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" style=\"pointer-events:none;\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\/><\/svg><\/button>\n            <button class=\"action-btn o-btn-ticket\" data-action=\"ticket\" title=\"Ficha de Produ\u00e7\u00e3o\" style=\"color:#fff;background:#14b8a6;border:none;cursor:pointer;width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;\"><svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" style=\"pointer-events:none;\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\"\/><\/svg><\/button>\n            <button class=\"action-btn o-btn-print\" data-action=\"print\" title=\"Or\u00e7amento Comercial\" style=\"color:#0f172a;background:#e2e8f0;border:none;cursor:pointer;width:34px;height:34px;border-radius:8px;display:flex;align-items:center;justify-content:center;\"><svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" style=\"pointer-events:none;\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z\"\/><\/svg><\/button>\n        <\/div>\n        <div class=\"action-area cursor-pointer flex-1\" data-action=\"edit\">\n            <div style=\"padding-right:120px;\">\n                <span class=\"o-status\" style=\"display:inline-block;padding:4px 12px;border-radius:999px;font-size:11px;font-weight:700;text-transform:uppercase;margin-bottom:8px;\"><\/span>\n                <h3 class=\"o-ref\" style=\"font-size:17px;font-weight:800;color:#0f172a;line-height:1.2;\"><\/h3>\n                <p class=\"o-cli\" style=\"font-size:13px;color:#64748b;font-weight:500;margin-top:4px;\"><\/p>\n            <\/div>\n            <div style=\"margin-top:16px;\">\n                <p class=\"o-price\" style=\"font-size:24px;font-weight:900;color:#0f172a;\"><\/p>\n            <\/div>\n        <\/div>\n        <div style=\"display:flex;gap:8px;margin-top:16px;\">\n            <button class=\"action-btn flex-1 py-2 text-xs font-bold text-slate-700 bg-slate-100 rounded-xl\" data-action=\"edit\">Editar<\/button>\n            <button class=\"action-btn flex-1 py-2 text-xs font-bold text-indigo-700 bg-indigo-50 rounded-xl flex items-center justify-center gap-1\" data-action=\"versao\"><svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" style=\"pointer-events:none;\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M8 7v8a2 2 0 002 2h6M8 7V5a2 2 0 012-2h4.586a1 1 0 01.707.293l4.414 4.414a1 1 0 01.293.707V15a2 2 0 01-2 2h-2M8 7H6a2 2 0 00-2 2v10a2 2 0 002 2h8a2 2 0 002-2v-2\"\/><\/svg> Nova Vers\u00e3o<\/button>\n            <button class=\"action-btn px-3 text-xs font-bold text-rose-600 bg-rose-50 rounded-xl o-btn-del\" data-action=\"delete\"><svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\" style=\"pointer-events:none;\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\/><\/svg><\/button>\n        <\/div>\n    <\/div>\n<\/template>\n\n<template id=\"tpl-tinta-row\">\n    <div class=\"tinta-row flex flex-wrap sm:grid sm:grid-cols-12 gap-3 bg-[#f2f2f7]\/50 p-4 sm:p-3 rounded-2xl items-center relative\">\n        <div class=\"w-full sm:col-span-5 mb-2 sm:mb-0\">\n            <label class=\"block sm:hidden ios-label\">Cor \/ Ref<\/label>\n            <input type=\"text\" placeholder=\"Ex: Pantone 021\" class=\"calc-input py-3 px-4 bg-white text-[15px] font-semibold tinta-nome trigger-calc\">\n        <\/div>\n        <div class=\"w-[45%] sm:col-span-3\">\n            <label class=\"block sm:hidden ios-label\">Pre\u00e7o\/Kg<\/label>\n            <input type=\"number\" min=\"0\" step=\"0.1\" class=\"tinta-preco calc-input py-3 px-4 bg-white text-[15px] text-center trigger-calc\">\n        <\/div>\n        <div class=\"w-[45%] sm:col-span-3\">\n            <label class=\"block sm:hidden ios-label\">Grama\/Flh<\/label>\n            <input type=\"number\" min=\"0\" step=\"0.1\" class=\"tinta-gramas calc-input py-3 px-4 bg-white text-[15px] text-center trigger-calc\">\n        <\/div>\n        <div class=\"absolute sm:relative top-3 sm:top-auto right-3 sm:right-auto sm:col-span-1 text-center flex-1 flex justify-end\">\n            <button type=\"button\" class=\"btn-remove-tinta text-rose-500 hover:text-rose-700 bg-white sm:bg-transparent shadow-sm sm:shadow-none p-2.5 rounded-full font-bold cursor-pointer border-none min-h-[44px] min-w-[44px] flex items-center justify-center\">\n                <svg width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" viewbox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M6 18L18 6M6 6l12 12\"\/><\/svg>\n            <\/button>\n        <\/div>\n    <\/div>\n<\/template>\n\n<script src=\"https:\/\/www.gstatic.com\/firebasejs\/10.12.2\/firebase-app-compat.js\"><\/script>\n<script src=\"https:\/\/www.gstatic.com\/firebasejs\/10.12.2\/firebase-auth-compat.js\"><\/script>\n<script src=\"https:\/\/www.gstatic.com\/firebasejs\/10.12.2\/firebase-firestore-compat.js\"><\/script>\n\n<script>\n\/* <![CDATA[ *\/\n(function(){\n\"use strict\";\n\nif(typeof firebase===\"undefined\"){\n    document.getElementById(\"loading-screen\").innerHTML=\"<div style='text-align:center;padding:40px;'>[!] Erro de Liga\u00e7\u00e3o. Recarregue.<\/div>\";\n    return;\n}\n\nconst APP_CONFIG={\n    FIREBASE:{apiKey:\"AIzaSyB85VxQ42UM4ImCT__Fo6miXxyS__z6-40\",authDomain:\"aplicacao-web-c082b.firebaseapp.com\",projectId:\"aplicacao-web-c082b\",storageBucket:\"aplicacao-web-c082b.firebasestorage.app\"},\n    SHARED_APP_ID:typeof __app_id!==\"undefined\"?__app_id:\"standalone-decalcer-job-manager\",\n    TAXA_IVA:0.23,\n    DEFAULT_COLORS:[{nome:\"Cyan\",preco:0,gramas:0},{nome:\"Amarelo\",preco:0,gramas:0}],\n    DEFAULT_LABOR:{designH:0,designPH:0,ecrasH:0,ecrasPH:25,impH:10,impPH:53.8},\n    DEFAULT_MARGIN:50,\n    CHART_COLORS:{tintas:\"#2dd4bf\",papeis:\"#fbbf24\",maoObra:\"#818cf8\",ecras:\"#f472b6\",pelicula:\"#34d399\",outros:\"#94a3b8\"}\n};\n\ntry{\n    let savedConfigs=JSON.parse(localStorage.getItem(\"__dec_backoffice\"));\n    if(savedConfigs){\n        APP_CONFIG.DEFAULT_LABOR.designH = savedConfigs.tDesign !== undefined ? savedConfigs.tDesign : 0;\n        APP_CONFIG.DEFAULT_LABOR.designPH = savedConfigs.pHoraDesign !== undefined ? savedConfigs.pHoraDesign : 0;\n        APP_CONFIG.DEFAULT_LABOR.ecrasH = savedConfigs.tEcras !== undefined ? savedConfigs.tEcras : 0;\n        APP_CONFIG.DEFAULT_LABOR.ecrasPH = savedConfigs.pHoraEcras !== undefined ? savedConfigs.pHoraEcras : 25;\n        APP_CONFIG.DEFAULT_LABOR.impH = savedConfigs.tImpressao !== undefined ? savedConfigs.tImpressao : 10;\n        APP_CONFIG.DEFAULT_LABOR.impPH = savedConfigs.pHoraImpressao !== undefined ? savedConfigs.pHoraImpressao : 53.8;\n        APP_CONFIG.DEFAULT_MARGIN = savedConfigs.margem !== undefined ? savedConfigs.margem : 50;\n    }\n}catch(e){}\n\nconst state={\n    db:null,auth:null,currentUser:null,role:\"admin\",orcamentos:[],trabalhosProducao:[],\n    final_totalVenda:0,final_totalCores:0,final_totalComIva:0,editingOrcId:null,unsubscribers:[],charts:{}\n};\n\nfunction escapeHTML(str){\n    if(str===null||str===undefined)return\"\";\n    const div=document.createElement(\"div\");\n    div.textContent=str;\n    return div.innerHTML;\n}\n\nfunction formatMoney(value){\n    return Number(value||0).toLocaleString(\"pt-PT\",{minimumFractionDigits:2,maximumFractionDigits:2})+\" \u20ac\";\n}\n\nfunction formatNumber(value){\n    return Number(value||0).toLocaleString(\"pt-PT\");\n}\n\nfunction setVal(id,val){\n    const el=document.getElementById(id);\n    if(el&&val!==undefined&&val!==null)el.value=val;\n}\n\nfunction getVal(id){\n    const el=document.getElementById(id);\n    return el?parseFloat(el.value)||0:0;\n}\n\nfunction showToast(msg,type){\n    type=type||\"success\";\n    const area=document.getElementById(\"toast-area\");\n    const t=document.createElement(\"div\");\n    t.className=\"toast \"+type;\n    t.innerHTML=\"<span class='text-slate-800'>\"+escapeHTML(msg)+\"<\/span>\";\n    area.appendChild(t);\n    setTimeout(function(){\n        t.style.opacity=\"0\";\n        t.style.transform=\"translateY(-20px) scale(0.9)\";\n        t.style.transition=\"all 0.3s ease\";\n        setTimeout(function(){t.remove();},300);\n    },3500);\n}\n\nfunction parseDateLocal(dateString){\n    if(!dateString)return null;\n    const parts=dateString.split(\"-\");\n    if(parts.length===3)return new Date(parts[0],parts[1]-1,parts[2]);\n    return null;\n}\n\nfunction initApp(){\n    try{\n        let conf=APP_CONFIG.FIREBASE;\n        if(typeof __firebase_config!==\"undefined\"&&__firebase_config){\n            try{conf=JSON.parse(__firebase_config);}catch(e){}\n        }\n        if(!firebase.apps.length)firebase.initializeApp(conf);\n        state.db=firebase.firestore();\n        state.auth=firebase.auth();\n    }catch(e){\n        document.getElementById(\"loading-screen\").innerHTML=\"Erro no Firebase\";\n        return;\n    }\n    const initAuth=async function(){\n        try{\n            if(typeof __initial_auth_token!==\"undefined\"&&__initial_auth_token){\n                await state.auth.signInWithCustomToken(__initial_auth_token);\n            }else{\n                await state.auth.signInAnonymously();\n            }\n        }catch(e){}\n    };\n    state.auth.onAuthStateChanged(function(user){\n        state.currentUser=user;\n        if(user){\n            document.getElementById(\"loading-screen\").classList.add(\"hidden\");\n            document.getElementById(\"app-container\").classList.remove(\"hidden\");\n            document.getElementById(\"login-modal\").classList.add(\"hidden\");\n            const isOfficialUser=user&&!user.isAnonymous&&user.email;\n            const btnLogin=document.getElementById(\"btn-login\");\n            const userEmail=document.getElementById(\"user-email\");\n            if(isOfficialUser){\n                btnLogin.textContent=\"Sair\";\n                btnLogin.className=\"px-5 py-2.5 bg-rose-50 text-rose-600 text-xs font-bold rounded-full hover:bg-rose-100 cursor-pointer border-none shadow-sm min-h-[44px]\";\n                userEmail.textContent=user.email;\n                userEmail.classList.remove(\"hidden\");\n                state.role=(user.email.toLowerCase()===\"design@decalcer.com\")?\"comercial\":\"admin\";\n            }else{\n                btnLogin.textContent=\"Login\";\n                btnLogin.className=\"px-5 py-2.5 bg-slate-900 text-white text-xs font-bold rounded-full hover:bg-slate-800 cursor-pointer border-none shadow-sm min-h-[44px]\";\n                userEmail.classList.add(\"hidden\");\n                state.role=\"guest\";\n            }\n            applyRoles();\n            loadData();\n            populateConfigForm();\n            if(!state.editingOrcId){\n                document.getElementById(\"orc-data\").valueAsDate=new Date();\n            }\n            if(document.getElementById(\"tintas-container\").children.length===0){\n                APP_CONFIG.DEFAULT_COLORS.forEach(function(c){addTintaRow(c.nome,c.preco,c.gramas);});\n                calculateBudget();\n            }\n        }else{\n            initAuth();\n            state.unsubscribers.forEach(function(unsub){unsub();});\n            state.unsubscribers=[];\n            state.orcamentos=[];\n            state.trabalhosProducao=[];\n        }\n    });\n}\n\nfunction applyRoles(){\n    const navAnalise=document.getElementById(\"nav-analise\");\n    const navConfigs=document.getElementById(\"nav-configs\");\n    const badgeRole=document.getElementById(\"badge-role\");\n    if(state.role===\"comercial\"){\n        navAnalise.style.display=\"none\";\n        navConfigs.style.display=\"none\";\n        badgeRole.textContent=\"Comercial\";\n        badgeRole.className=\"text-[10px] text-white bg-sky-600 px-2 py-0.5 rounded uppercase tracking-wider font-bold\";\n        switchTab(\"tab-pipeline\");\n    }else{\n        navAnalise.style.display=\"block\";\n        navConfigs.style.display=\"block\";\n        badgeRole.textContent=state.role===\"guest\"?\"Leitura\":\"Admin\";\n        badgeRole.className=\"text-[10px] text-white bg-slate-800 px-2 py-0.5 rounded uppercase tracking-wider font-bold\";\n    }\n}\n\nfunction populateConfigForm(){\n    setVal(\"conf-hora-design\",APP_CONFIG.DEFAULT_LABOR.designPH);\n    setVal(\"conf-hora-ecras\",APP_CONFIG.DEFAULT_LABOR.ecrasPH);\n    setVal(\"conf-hora-impressao\",APP_CONFIG.DEFAULT_LABOR.impPH);\n    setVal(\"conf-t-design\",APP_CONFIG.DEFAULT_LABOR.designH);\n    setVal(\"conf-t-ecras\",APP_CONFIG.DEFAULT_LABOR.ecrasH);\n    setVal(\"conf-t-impressao\",APP_CONFIG.DEFAULT_LABOR.impH);\n    setVal(\"conf-margem\",APP_CONFIG.DEFAULT_MARGIN);\n}\n\ndocument.getElementById(\"btn-save-configs\").addEventListener(\"click\",function(){\n    if(state.role!==\"admin\")return showToast(\"Sem permiss\u00f5es.\",\"error\");\n    const newConfigs={\n        pHoraDesign:getVal(\"conf-hora-design\"),\n        pHoraEcras:getVal(\"conf-hora-ecras\"),\n        pHoraImpressao:getVal(\"conf-hora-impressao\"),\n        tDesign:getVal(\"conf-t-design\"),\n        tEcras:getVal(\"conf-t-ecras\"),\n        tImpressao:getVal(\"conf-t-impressao\"),\n        margem:getVal(\"conf-margem\")\n    };\n    try{\n        localStorage.setItem(\"__dec_backoffice\",JSON.stringify(newConfigs));\n        APP_CONFIG.DEFAULT_LABOR.designPH=newConfigs.pHoraDesign;\n        APP_CONFIG.DEFAULT_LABOR.ecrasPH=newConfigs.pHoraEcras;\n        APP_CONFIG.DEFAULT_LABOR.impPH=newConfigs.pHoraImpressao;\n        APP_CONFIG.DEFAULT_LABOR.designH=newConfigs.tDesign;\n        APP_CONFIG.DEFAULT_LABOR.ecrasH=newConfigs.tEcras;\n        APP_CONFIG.DEFAULT_LABOR.impH=newConfigs.tImpressao;\n        APP_CONFIG.DEFAULT_MARGIN=newConfigs.margem;\n        showToast(\"Configura\u00e7\u00f5es atualizadas.\",\"success\");\n    }catch(e){}\n});\n\nfunction loadData(){\n    if(!state.currentUser)return;\n    state.unsubscribers.forEach(function(unsub){unsub();});\n    state.unsubscribers=[];\n    try{\n        const pathOrc=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/orcamentos\";\n        const subOrc=state.db.collection(pathOrc).onSnapshot(function(snap){\n            state.orcamentos=[];\n            snap.forEach(function(doc){\n                const d=doc.data();\n                if(state.role===\"comercial\"&&d.createdBy!==state.currentUser.email)return;\n                state.orcamentos.push(Object.assign({id:doc.id},d));\n            });\n            state.orcamentos.sort(function(a,b){return(b.timestamp||0)-(a.timestamp||0);});\n            renderKanban();\n            renderOrcamentos();\n            renderAnalysis();\n        });\n        state.unsubscribers.push(subOrc);\n        const pathTrab=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/trabalhos\";\n        const subTrab=state.db.collection(pathTrab).onSnapshot(function(snap){\n            state.trabalhosProducao=[];\n            snap.forEach(function(doc){\n                state.trabalhosProducao.push(Object.assign({id:doc.id},doc.data()));\n            });\n            renderAnalysis();\n        });\n        state.unsubscribers.push(subTrab);\n        const pathCli=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/clientes\";\n        const subCli=state.db.collection(pathCli).onSnapshot(function(snap){\n            const dl=document.getElementById(\"clientes-datalist\");\n            if(dl){\n                dl.innerHTML=\"\";\n                snap.forEach(function(doc){\n                    const opt=document.createElement(\"option\");\n                    opt.value=doc.data().name||\"\";\n                    dl.appendChild(opt);\n                });\n            }\n        });\n        state.unsubscribers.push(subCli);\n    }catch(err){}\n}\n\nconst pipelineTab=document.getElementById(\"tab-pipeline\");\npipelineTab.addEventListener(\"dragover\",function(ev){\n    const col=ev.target.closest(\".kanban-col\");\n    if(col){ev.preventDefault();col.classList.add(\"drag-over\");}\n});\npipelineTab.addEventListener(\"dragleave\",function(ev){\n    const col=ev.target.closest(\".kanban-col\");\n    if(col){col.classList.remove(\"drag-over\");}\n});\npipelineTab.addEventListener(\"drop\",function(ev){\n    const col=ev.target.closest(\".kanban-col\");\n    if(col){\n        ev.preventDefault();\n        col.classList.remove(\"drag-over\");\n        document.querySelectorAll(\".kanban-card.dragging\").forEach(function(el){el.classList.remove(\"dragging\");});\n        const id=ev.dataTransfer.getData(\"text\/plain\");\n        const novoStatus=col.getAttribute(\"data-status\");\n        if(id&&novoStatus){triggerStatusChange(id,novoStatus);}\n    }\n});\npipelineTab.addEventListener(\"dragstart\",function(ev){\n    const card=ev.target.closest(\".kanban-card\");\n    if(card){\n        ev.dataTransfer.setData(\"text\/plain\",card.dataset.id);\n        setTimeout(function(){card.classList.add(\"dragging\");},0);\n    }\n});\npipelineTab.addEventListener(\"dragend\",function(ev){\n    const card=ev.target.closest(\".kanban-card\");\n    if(card){card.classList.remove(\"dragging\");}\n});\npipelineTab.addEventListener(\"change\",function(ev){\n    if(ev.target.classList.contains(\"kanban-status-select\")){\n        triggerStatusChange(ev.target.dataset.id,ev.target.value);\n    }\n});\npipelineTab.addEventListener(\"click\",function(ev){\n    const btnWp=ev.target.closest(\".btn-whatsapp\");\n    if(btnWp){shareWhatsApp(btnWp.dataset.id);return;}\n    const btnEdit=ev.target.closest(\".btn-edit-kanban\");\n    if(btnEdit){loadOrcamentoIntoForm(btnEdit.parentElement.dataset.id);return;}\n});\n\nlet pendingWinLossId=null;\nfunction triggerStatusChange(id,novoStatus){\n    const orc=state.orcamentos.find(function(o){return o.id===id;});\n    if(!orc||orc.status===novoStatus)return;\n    if(novoStatus===\"Rejeitado\"){\n        pendingWinLossId=id;\n        document.getElementById(\"winloss-modal\").style.display=\"flex\";\n    }else{\n        updateDBStatus(id,novoStatus);\n    }\n}\ndocument.getElementById(\"btn-winloss-cancel\").onclick=function(){\n    document.getElementById(\"winloss-modal\").style.display=\"none\";\n    pendingWinLossId=null;\n    renderKanban();\n    renderOrcamentos();\n};\ndocument.getElementById(\"btn-winloss-ok\").onclick=function(){\n    if(!pendingWinLossId)return;\n    const reason=document.getElementById(\"winloss-reason\").value;\n    updateDBStatus(pendingWinLossId,\"Rejeitado\",reason);\n    document.getElementById(\"winloss-modal\").style.display=\"none\";\n    pendingWinLossId=null;\n};\nfunction updateDBStatus(id,status,lossReason){\n    lossReason=lossReason||null;\n    const orc=state.orcamentos.find(function(o){return o.id===id;});\n    if(!orc)return;\n    let updateData={status:status};\n    if(lossReason)updateData.lossReason=lossReason;\n    const path=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/orcamentos\";\n    state.db.collection(path).doc(id).update(updateData)\n    .then(function(){showToast(\"Estado atualizado!\");})\n    .catch(function(e){showToast(\"Erro a atualizar.\",\"error\");});\n}\n\nfunction renderKanban(){\n    const colPend=document.getElementById(\"kb-col-pendente\");\n    const colAprov=document.getElementById(\"kb-col-aprovado\");\n    const colRej=document.getElementById(\"kb-col-rejeitado\");\n    colPend.innerHTML=\"\";\n    colAprov.innerHTML=\"\";\n    colRej.innerHTML=\"\";\n    let cP=0,cA=0,cR=0;\n    \n    const tpl = document.getElementById(\"tpl-kanban-card\");\n    \n    state.orcamentos.forEach(function(o){\n        const total = (o.config && o.config.aplicaIva) ? o.priceWithIva : o.price;\n        const node = tpl.content.cloneNode(true);\n        \n        node.querySelector(\".kanban-card\").dataset.id = o.id;\n        node.querySelector(\".btn-whatsapp\").dataset.id = o.id;\n        node.querySelector(\".kanban-status-select\").dataset.id = o.id;\n        \n        node.querySelector(\".k-ref\").textContent = o.reference;\n        node.querySelector(\".k-cli\").textContent = o.client;\n        node.querySelector(\".k-price\").textContent = formatMoney(total);\n        node.querySelector(\".kanban-status-select\").value = o.status;\n        \n        if(o.status===\"Aprovado\"){\n            colAprov.appendChild(node);\n            cA++;\n        }else if(o.status===\"Rejeitado\"){\n            colRej.appendChild(node);\n            cR++;\n        }else{\n            colPend.appendChild(node);\n            cP++;\n        }\n    });\n    \n    document.getElementById(\"kb-count-pendente\").textContent=cP;\n    document.getElementById(\"kb-count-aprovado\").textContent=cA;\n    document.getElementById(\"kb-count-rejeitado\").textContent=cR;\n}\n\nfunction renderOrcamentos(){\n    const grid=document.getElementById(\"orcamentos-grid\");\n    grid.innerHTML=\"\";\n    const filterVal=document.getElementById(\"filter-orc-status\").value;\n    const searchVal=document.getElementById(\"search-orc\").value.toLowerCase().trim();\n    \n    const removeAccents=function(str){\n        if(!str)return\"\";\n        var range=String.fromCharCode(768)+\"-\"+String.fromCharCode(879);\n        var regex=new RegExp(\"[\"+range+\"]\",\"g\");\n        return str.normalize(\"NFD\").replace(regex,\"\");\n    };\n    \n    const searchValClean=removeAccents(searchVal);\n    const filtered=state.orcamentos.filter(function(o){\n        let matchDropdown=(filterVal===\"Todos\")?true:(o.status===filterVal);\n        const ref=removeAccents((o.reference||\"\").toLowerCase());\n        const cli=removeAccents((o.client||\"\").toLowerCase());\n        const matchText=searchValClean===\"\"||ref.includes(searchValClean)||cli.includes(searchValClean);\n        return matchDropdown&&matchText;\n    });\n    \n    if(filtered.length===0){\n        document.getElementById(\"no-orcamentos\").classList.remove(\"hidden\");\n        return;\n    }\n    \n    document.getElementById(\"no-orcamentos\").classList.add(\"hidden\");\n    const tpl = document.getElementById(\"tpl-orcamento-card\");\n    \n    filtered.forEach(function(o){\n        const node = tpl.content.cloneNode(true);\n        let statusClass=\"status-amber\";\n        if(o.status===\"Aprovado\")statusClass=\"status-emerald\";\n        else if(o.status===\"Rejeitado\")statusClass=\"status-rose\";\n        \n        const btnActions = node.querySelectorAll(\".action-btn, .action-area\");\n        btnActions.forEach(function(btn){\n            btn.dataset.id = o.id;\n        });\n        \n        const lblStatus = node.querySelector(\".o-status\");\n        lblStatus.textContent = o.status;\n        lblStatus.className = \"o-status \" + statusClass;\n        lblStatus.style.display=\"inline-block\";\n        lblStatus.style.padding=\"4px 12px\";\n        lblStatus.style.borderRadius=\"999px\";\n        lblStatus.style.fontSize=\"11px\";\n        lblStatus.style.fontWeight=\"700\";\n        lblStatus.style.textTransform=\"uppercase\";\n        lblStatus.style.marginBottom=\"8px\";\n        \n        node.querySelector(\".o-ref\").textContent = o.reference;\n        node.querySelector(\".o-cli\").textContent = o.client;\n        node.querySelector(\".o-price\").textContent = formatMoney(o.price);\n        \n        if(state.role === \"admin\"){\n            node.querySelector(\".o-btn-del\").style.display = \"block\";\n        }\n        \n        grid.appendChild(node);\n    });\n}\n\ndocument.getElementById(\"orcamentos-grid\").addEventListener(\"click\",function(e){\n    const target=e.target.closest(\".action-area, .action-btn\");\n    if(!target)return;\n    const action=target.dataset.action;\n    const id=target.dataset.id;\n    if(action===\"edit\")loadOrcamentoIntoForm(id,false);\n    else if(action===\"versao\")showSmartClonePrompt(id);\n    else if(action===\"delete\")deleteOrc(id);\n    else if(action===\"print\")printOrcamento(id,false);\n    else if(action===\"ticket\")printOrcamento(id,true);\n    else if(action===\"email\")shareEmail(id);\n});\n\nconst tabs=document.querySelectorAll(\".tab-btn\");\nconst contents=document.querySelectorAll(\".tab-content\");\nconst mobileFooterBar=document.getElementById(\"mobile-footer-bar\");\n\nwindow.switchTab=function(targetId){\n    tabs.forEach(function(t){\n        t.classList.remove(\"border-teal-500\",\"text-teal-600\");\n        t.classList.add(\"border-transparent\",\"text-slate-500\");\n    });\n    contents.forEach(function(c){\n        c.classList.remove(\"active\");\n    });\n    const activeTabBtn=document.querySelector(\"[data-target='\"+targetId+\"']\");\n    if(activeTabBtn){\n        activeTabBtn.classList.add(\"border-teal-500\",\"text-teal-600\");\n        activeTabBtn.classList.remove(\"border-transparent\",\"text-slate-500\");\n    }\n    const activeContent=document.getElementById(targetId);\n    if(activeContent)activeContent.classList.add(\"active\");\n    mobileFooterBar.style.display=(targetId===\"tab-novo\")?\"block\":\"none\";\n    window.scrollTo({top:0,behavior:\"smooth\"});\n};\n\ntabs.forEach(function(tab){\n    tab.addEventListener(\"click\",function(){\n        switchTab(tab.dataset.target);\n    });\n});\ndocument.querySelectorAll(\".btn-switch-novo\").forEach(function(btn){\n    btn.addEventListener(\"click\",function(){\n        switchTab(\"tab-novo\");\n    });\n});\n\nconst containerTintas=document.getElementById(\"tintas-container\");\ndocument.getElementById(\"btn-add-tinta\").addEventListener(\"click\",function(){\n    addTintaRow();\n});\n\nfunction addTintaRow(nome,preco,gramas){\n    nome=nome||\"\";\n    preco=preco||0;\n    gramas=gramas||0;\n    \n    const tpl = document.getElementById(\"tpl-tinta-row\");\n    const node = tpl.content.cloneNode(true);\n    \n    node.querySelector(\".tinta-nome\").value = nome;\n    node.querySelector(\".tinta-preco\").value = preco;\n    node.querySelector(\".tinta-gramas\").value = gramas;\n    \n    const containerRow = node.querySelector(\".tinta-row\");\n    \n    node.querySelector(\".btn-remove-tinta\").addEventListener(\"click\",function(){\n        containerRow.remove();\n        calculateBudget();\n    });\n    \n    node.querySelectorAll(\".trigger-calc\").forEach(function(input){\n        input.addEventListener(\"input\",calculateBudget);\n    });\n    \n    containerTintas.appendChild(node);\n    calculateBudget();\n}\n\nfunction calculateBudget(){\n    const folhas=getVal(\"calc-folhas\");\n    const quebraPerc=getVal(\"calc-quebra\")\/100;\n    const folhasComQuebra=folhas*(1+quebraPerc);\n    if(quebraPerc>0){\n        document.getElementById(\"lbl-info-quebra\").innerHTML=\"Material baseado em <b>\"+Math.ceil(folhasComQuebra)+\" folhas<\/b> (Quebra inclu\u00edda).\";\n    }else{\n        document.getElementById(\"lbl-info-quebra\").textContent=\"\";\n    }\n    const motivos=getVal(\"calc-motivos\");\n    const margem=getVal(\"calc-margem\");\n    const aplicaIva=document.getElementById(\"calc-iva\").checked;\n    \n    let custoTintas=0;\n    let totalGramas=0;\n    state.final_totalCores=0;\n    \n    document.querySelectorAll(\".tinta-row\").forEach(function(row){\n        const precoKg=parseFloat(row.querySelector(\".tinta-preco\").value)||0;\n        const gramasPorFolha=parseFloat(row.querySelector(\".tinta-gramas\").value)||0;\n        const gramasTotaisDestaCor=gramasPorFolha*folhasComQuebra;\n        totalGramas+=gramasTotaisDestaCor;\n        custoTintas+=(gramasTotaisDestaCor\/1000)*precoKg;\n        state.final_totalCores++;\n    });\n    \n    document.getElementById(\"lbl-total-gramas\").textContent=formatNumber(totalGramas)+\"g\";\n    document.getElementById(\"lbl-custo-tintas\").textContent=formatMoney(custoTintas);\n    const totalPapeis=(folhasComQuebra*getVal(\"calc-preco-papel\"))+(folhasComQuebra*getVal(\"calc-preco-parafinado\"));\n    document.getElementById(\"lbl-custo-papel\").textContent=formatMoney(totalPapeis);\n    const custoPelicula=getVal(\"calc-qtd-pelicula\")*getVal(\"calc-preco-pelicula\");\n    const custoEcras=getVal(\"calc-qtd-ecras\")*getVal(\"calc-preco-ecra\");\n    const custoMOTotal=(getVal(\"calc-horas-design\")*getVal(\"calc-preco-hora-design\"))+(getVal(\"calc-horas-ecras\")*getVal(\"calc-preco-hora-ecras\"))+(getVal(\"calc-horas-impressao\")*getVal(\"calc-preco-hora-impressao\"));\n    \n    const valorAmostra=getVal(\"calc-amostra\");\n    const totalOutrosEConsumos=getVal(\"calc-outros\")+getVal(\"calc-consumos-diversos\");\n    \n    const custosProducao=custoTintas+totalPapeis+custoMOTotal+custoEcras+custoPelicula;\n    const lucro=custosProducao*(margem\/100);\n    \n    state.final_totalVenda=custosProducao+lucro+totalOutrosEConsumos+valorAmostra;\n    const totalTodosOsCustos=custosProducao+totalOutrosEConsumos+valorAmostra;\n    state.final_totalComIva=state.final_totalVenda+(aplicaIva?(state.final_totalVenda*APP_CONFIG.TAXA_IVA):0);\n    \n    document.getElementById(\"res-custo-tintas\").textContent=formatMoney(custoTintas);\n    document.getElementById(\"res-custo-papel\").textContent=formatMoney(totalPapeis);\n    document.getElementById(\"res-custo-mao-obra\").textContent=formatMoney(custoMOTotal);\n    document.getElementById(\"res-custo-ecras\").textContent=formatMoney(custoEcras);\n    document.getElementById(\"res-custo-pelicula\").textContent=formatMoney(custoPelicula);\n    document.getElementById(\"res-custos-producao\").textContent=formatMoney(custosProducao);\n    document.getElementById(\"res-margem-lbl\").textContent=margem;\n    document.getElementById(\"res-lucro\").textContent=formatMoney(lucro);\n    document.getElementById(\"res-custo-outros\").textContent=formatMoney(totalOutrosEConsumos);\n    \n    if(valorAmostra>0){\n        document.getElementById(\"row-res-amostra\").style.display=\"flex\";\n        document.getElementById(\"res-valor-amostra\").textContent=formatMoney(valorAmostra);\n    }else{\n        document.getElementById(\"row-res-amostra\").style.display=\"none\";\n    }\n    \n    document.getElementById(\"res-total-venda\").textContent=formatMoney(state.final_totalVenda);\n    document.getElementById(\"res-total-final\").textContent=formatMoney(state.final_totalComIva);\n    document.getElementById(\"mobile-res-total\").textContent=formatMoney(aplicaIva?state.final_totalComIva:state.final_totalVenda);\n    \n    document.getElementById(\"iva-row\").classList.toggle(\"visible\",aplicaIva);\n    document.getElementById(\"total-final-row\").classList.toggle(\"visible\",aplicaIva);\n    document.getElementById(\"res-valor-iva\").textContent=formatMoney(state.final_totalVenda*APP_CONFIG.TAXA_IVA);\n    document.getElementById(\"res-preco-folha\").textContent=formatMoney(folhas>0?(state.final_totalVenda\/folhas):0);\n    document.getElementById(\"res-preco-motivo\").textContent=formatMoney(motivos>0?((state.final_totalVenda\/folhas)\/motivos):0);\n    \n    const b=document.getElementById(\"res-bar-chart\");\n    const l=document.getElementById(\"res-legend-chart\");\n    b.innerHTML=\"\";\n    l.innerHTML=\"\";\n    if(totalTodosOsCustos===0)return;\n    const chartData=[\n        {label:\"Tintas\",v:custoTintas,c:APP_CONFIG.CHART_COLORS.tintas},\n        {label:\"Pap\u00e9is\",v:totalPapeis,c:APP_CONFIG.CHART_COLORS.papeis},\n        {label:\"M.Obra\",v:custoMOTotal,c:APP_CONFIG.CHART_COLORS.maoObra},\n        {label:\"Ecr\u00e3s\",v:custoEcras,c:APP_CONFIG.CHART_COLORS.ecras},\n        {label:\"Pelicula\",v:custoPelicula,c:APP_CONFIG.CHART_COLORS.pelicula},\n        {label:\"Outros\",v:totalOutrosEConsumos,c:APP_CONFIG.CHART_COLORS.outros}\n    ];\n    \n    chartData.forEach(function(i){\n        if(i.v>0){\n            const pct=(i.v\/totalTodosOsCustos)*100;\n            const slice = document.createElement(\"div\");\n            slice.className = \"cost-bar-slice\";\n            slice.style.width = pct + \"%\";\n            slice.style.backgroundColor = i.c;\n            b.appendChild(slice);\n            \n            const leg = document.createElement(\"div\");\n            leg.className = \"flex items-center gap-1.5 bg-white\/10 px-2.5 py-1.5 rounded-lg whitespace-nowrap\";\n            leg.innerHTML = \"<span class='w-2 h-2 rounded-full' style='background-color:\"+i.c+\"'><\/span>\" + i.label + \" (\"+pct.toFixed(0)+\"%)\";\n            l.appendChild(leg);\n        }\n    });\n}\n\ndocument.querySelectorAll(\".trigger-calc\").forEach(function(input){\n    input.addEventListener(\"input\",calculateBudget);\n});\n\ndocument.getElementById(\"form-orcamento\").addEventListener(\"submit\",function(e){\n    e.preventDefault();\n    if(!state.currentUser)return showToast(\"Sem permiss\u00f5es.\",\"error\");\n    calculateBudget();\n    const ref=document.getElementById(\"orc-ref\").value.trim();\n    if(!ref)return;\n    const listTintas=[];\n    document.querySelectorAll(\".tinta-row\").forEach(function(row){\n        listTintas.push({\n            nome:row.querySelector(\".tinta-nome\").value,\n            preco:parseFloat(row.querySelector(\".tinta-preco\").value)||0,\n            gramas:parseFloat(row.querySelector(\".tinta-gramas\").value)||0\n        });\n    });\n    const data={\n        jobId:document.getElementById(\"orc-job-id\").value.trim(),\n        reference:ref,\n        client:document.getElementById(\"orc-cliente\").value.trim(),\n        po:document.getElementById(\"orc-po\").value.trim(),\n        date:document.getElementById(\"orc-data\").value,\n        status:document.getElementById(\"orc-estado\").value,\n        sheets:getVal(\"calc-folhas\"),\n        colors:state.final_totalCores,\n        price:state.final_totalVenda,\n        priceWithIva:state.final_totalComIva,\n        notes:document.getElementById(\"orc-notas\").value.trim(),\n        category:document.getElementById(\"orc-categoria\").value,\n        createdBy:state.currentUser.email,\n        config:{\n            aplicaIva:document.getElementById(\"calc-iva\").checked,\n            folhas:getVal(\"calc-folhas\"),\n            motivos:getVal(\"calc-motivos\"),\n            margem:getVal(\"calc-margem\"),\n            quebra:getVal(\"calc-quebra\"),\n            amostra:getVal(\"calc-amostra\"),\n            outros:getVal(\"calc-outros\"),\n            precoPapel:getVal(\"calc-preco-papel\"),\n            precoParafinado:getVal(\"calc-preco-parafinado\"),\n            horasDesign:getVal(\"calc-horas-design\"),\n            precoHoraDesign:getVal(\"calc-preco-hora-design\"),\n            horasEcras:getVal(\"calc-horas-ecras\"),\n            precoHoraEcras:getVal(\"calc-preco-hora-ecras\"),\n            horasImpressao:getVal(\"calc-horas-impressao\"),\n            precoHoraImpressao:getVal(\"calc-preco-hora-impressao\"),\n            qtdEcras:getVal(\"calc-qtd-ecras\"),\n            precoEcra:getVal(\"calc-preco-ecra\"),\n            qtdPelicula:getVal(\"calc-qtd-pelicula\"),\n            precoPelicula:getVal(\"calc-preco-pelicula\"),\n            consumosDiversos:getVal(\"calc-consumos-diversos\"),\n            tintas:listTintas\n        }\n    };\n    const colPath=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/orcamentos\";\n    const col=state.db.collection(colPath);\n    if(state.editingOrcId){\n        col.doc(state.editingOrcId).update(data)\n        .then(function(){showToast(\"Or\u00e7amento atualizado!\");})\n        .catch(function(e){showToast(\"Erro\",\"error\");});\n    }else{\n        data.timestamp=Date.now();\n        col.add(data)\n        .then(function(){\n            showToast(\"Or\u00e7amento criado!\");\n            resetForm();\n            switchTab(\"tab-pipeline\");\n        })\n        .catch(function(e){showToast(\"Erro\",\"error\");});\n    }\n});\n\nfunction resetForm(){\n    state.editingOrcId=null;\n    document.getElementById(\"edit-badge\").classList.add(\"hidden\");\n    document.getElementById(\"form-orcamento\").reset();\n    document.getElementById(\"orc-data\").valueAsDate=new Date();\n    document.getElementById(\"calc-iva\").checked=false;\n    document.getElementById(\"tintas-container\").innerHTML=\"\";\n    APP_CONFIG.DEFAULT_COLORS.forEach(function(c){\n        addTintaRow(c.nome,c.preco,c.gramas);\n    });\n    setVal(\"calc-horas-design\",APP_CONFIG.DEFAULT_LABOR.designH);\n    setVal(\"calc-preco-hora-design\",APP_CONFIG.DEFAULT_LABOR.designPH);\n    setVal(\"calc-horas-ecras\",APP_CONFIG.DEFAULT_LABOR.ecrasH);\n    setVal(\"calc-preco-hora-ecras\",APP_CONFIG.DEFAULT_LABOR.ecrasPH);\n    setVal(\"calc-horas-impressao\",APP_CONFIG.DEFAULT_LABOR.impH);\n    setVal(\"calc-preco-hora-impressao\",APP_CONFIG.DEFAULT_LABOR.impPH);\n    setVal(\"calc-amostra\",0);\n    document.getElementById(\"btn-submit-orc-desktop\").textContent=\"Gravar\";\n    document.getElementById(\"btn-submit-orc-mobile\").textContent=\"Gravar\";\n    document.getElementById(\"btn-cancel-edit-desktop\").classList.add(\"hidden\");\n    document.getElementById(\"btn-cancel-edit-mobile\").classList.add(\"hidden\");\n    calculateBudget();\n}\n\ndocument.getElementById(\"btn-cancel-edit-desktop\").addEventListener(\"click\",function(){\n    resetForm();\n    switchTab(\"tab-orcamentos\");\n});\ndocument.getElementById(\"btn-cancel-edit-mobile\").addEventListener(\"click\",function(){\n    resetForm();\n    switchTab(\"tab-orcamentos\");\n});\n\nlet tempSmartCloneId=null;\nwindow.showSmartClonePrompt=function(id){\n    tempSmartCloneId=id;\n    document.getElementById(\"smartclone-modal\").style.display=\"flex\";\n};\ndocument.getElementById(\"btn-smartclone-keep\").onclick=function(){\n    document.getElementById(\"smartclone-modal\").style.display=\"none\";\n    loadOrcamentoIntoForm(tempSmartCloneId,true,false);\n};\ndocument.getElementById(\"btn-smartclone-update\").onclick=function(){\n    document.getElementById(\"smartclone-modal\").style.display=\"none\";\n    loadOrcamentoIntoForm(tempSmartCloneId,true,true);\n};\n\nfunction loadOrcamentoIntoForm(id,isCopy,smartUpdate){\n    isCopy=isCopy||false;\n    smartUpdate=smartUpdate||false;\n    const orc=state.orcamentos.find(function(o){return o.id===id;});\n    if(!orc)return;\n    state.editingOrcId=isCopy?null:id;\n    const badge=document.getElementById(\"edit-badge\");\n    badge.classList.remove(\"hidden\");\n    badge.className=isCopy\n    ?\"absolute -top-3 left-6 bg-indigo-500 text-white text-[11px] font-bold uppercase tracking-wider px-4 py-1.5 rounded-full shadow-md\"\n    :\"absolute -top-3 left-6 bg-amber-500 text-white text-[11px] font-bold uppercase tracking-wider px-4 py-1.5 rounded-full shadow-md\";\n    badge.textContent=isCopy?\"Nova Vers\u00e3o\":\"Modo de Edi\u00e7\u00e3o\";\n    let newRef=orc.reference||\"\";\n    if(isCopy){\n        const vMatch=newRef.match(new RegExp(\"-v([0-9]+)$\",\"i\"));\n        if(vMatch){\n            newRef=newRef.substring(0,vMatch.index)+\"-v\"+(parseInt(vMatch[1])+1);\n        }else{\n            newRef+=\"-v2\";\n        }\n    }\n    document.getElementById(\"orc-job-id\").value=orc.jobId||\"\";\n    document.getElementById(\"orc-ref\").value=newRef;\n    document.getElementById(\"orc-cliente\").value=orc.client||\"\";\n    document.getElementById(\"orc-po\").value=orc.po||\"\";\n    document.getElementById(\"orc-categoria\").value=orc.category||\"Sem Categoria\";\n    if(isCopy){\n        document.getElementById(\"orc-data\").valueAsDate=new Date();\n        document.getElementById(\"orc-estado\").value=\"Pendente\";\n    }else{\n        document.getElementById(\"orc-data\").value=orc.date||\"\";\n        document.getElementById(\"orc-estado\").value=orc.status||\"Pendente\";\n    }\n    document.getElementById(\"orc-notas\").value=orc.notes||\"\";\n\n    if(orc.config){\n        document.getElementById(\"calc-iva\").checked=orc.config.aplicaIva||false;\n        setVal(\"calc-folhas\",orc.config.folhas);\n        setVal(\"calc-motivos\",orc.config.motivos);\n        setVal(\"calc-outros\",orc.config.outros);\n        setVal(\"calc-amostra\",orc.config.amostra!==undefined?orc.config.amostra:0);\n        setVal(\"calc-quebra\",orc.config.quebra||0);\n        setVal(\"calc-preco-papel\",orc.config.precoPapel);\n\n        setVal(\"calc-preco-parafinado\",orc.config.precoParafinado!==undefined?orc.config.precoParafinado:0);\n        setVal(\"calc-consumos-diversos\",orc.config.consumosDiversos!==undefined?orc.config.consumosDiversos:0);\n\n        setVal(\"calc-qtd-ecras\",orc.config.qtdEcras);\n        setVal(\"calc-preco-ecra\",orc.config.precoEcra);\n        setVal(\"calc-qtd-pelicula\",orc.config.qtdPelicula);\n        setVal(\"calc-preco-pelicula\",orc.config.precoPelicula);\n        setVal(\"calc-margem\",smartUpdate?APP_CONFIG.DEFAULT_MARGIN:orc.config.margem);\n\n        var hImp = APP_CONFIG.DEFAULT_LABOR.impH;\n        if (orc.config.horasImpressao !== undefined) hImp = orc.config.horasImpressao;\n        else if (orc.config.horas !== undefined) hImp = orc.config.horas;\n        setVal(\"calc-horas-impressao\", hImp);\n\n        var phImp = APP_CONFIG.DEFAULT_LABOR.impPH;\n        if (orc.config.precoHoraImpressao !== undefined) phImp = orc.config.precoHoraImpressao;\n        else if (orc.config.precoHora !== undefined) phImp = orc.config.precoHora;\n        setVal(\"calc-preco-hora-impressao\", smartUpdate ? APP_CONFIG.DEFAULT_LABOR.impPH : phImp);\n\n        setVal(\"calc-horas-design\", orc.config.horasDesign !== undefined ? orc.config.horasDesign : APP_CONFIG.DEFAULT_LABOR.designH);\n        setVal(\"calc-preco-hora-design\", smartUpdate ? APP_CONFIG.DEFAULT_LABOR.designPH : (orc.config.precoHoraDesign !== undefined ? orc.config.precoHoraDesign : APP_CONFIG.DEFAULT_LABOR.designPH));\n\n        setVal(\"calc-horas-ecras\", orc.config.horasEcras !== undefined ? orc.config.horasEcras : APP_CONFIG.DEFAULT_LABOR.ecrasH);\n        setVal(\"calc-preco-hora-ecras\", smartUpdate ? APP_CONFIG.DEFAULT_LABOR.ecrasPH : (orc.config.precoHoraEcras !== undefined ? orc.config.precoHoraEcras : APP_CONFIG.DEFAULT_LABOR.ecrasPH));\n\n        document.getElementById(\"tintas-container\").innerHTML=\"\";\n        if(orc.config.tintas&&orc.config.tintas.length>0){\n            orc.config.tintas.forEach(function(t){\n                addTintaRow(t.nome,t.preco,t.gramas);\n            });\n        }else{\n            APP_CONFIG.DEFAULT_COLORS.forEach(function(c){\n                addTintaRow(c.nome,c.preco,c.gramas);\n            });\n        }\n    }\n    document.getElementById(\"btn-submit-orc-desktop\").textContent=isCopy?\"Gravar Nova Vers\u00e3o\":\"Gravar\";\n    document.getElementById(\"btn-submit-orc-mobile\").textContent=isCopy?\"Gravar Vers\u00e3o\":\"Gravar\";\n    document.getElementById(\"btn-cancel-edit-desktop\").classList.remove(\"hidden\");\n    document.getElementById(\"btn-cancel-edit-mobile\").classList.remove(\"hidden\");\n    calculateBudget();\n    switchTab(\"tab-novo\");\n}\n\nfunction deleteOrc(id){\n    if(state.role!==\"admin\")return showToast(\"Sem permiss\u00e3o.\",\"error\");\n    if(!confirm(\"Eliminar este or\u00e7amento?\"))return;\n    const path=\"artifacts\/\"+APP_CONFIG.SHARED_APP_ID+\"\/public\/data\/orcamentos\";\n    state.db.collection(path).doc(id).delete()\n    .then(function(){showToast(\"Eliminado.\",\"success\");})\n    .catch(function(e){showToast(\"Erro\",\"error\");});\n}\n\nwindow.shareWhatsApp=function(id){\n    const o=state.orcamentos.find(function(x){return x.id===id;});\n    if(!o)return;\n    const total=(o.config&&o.config.aplicaIva)?o.priceWithIva:o.price;\n    const lf=String.fromCharCode(10);\n    const msg=\"Ol\u00e1!\"+lf+lf+\"Segue o resumo do or\u00e7amento:\"+lf+lf+\"*Refer\u00eancia:* \"+o.reference+lf+\"*Cliente:* \"+o.client+lf+\"*Valor:* \"+formatMoney(total)+((o.config&&o.config.aplicaIva)?\" (c\/ IVA)\":\" (s\/ IVA)\")+lf+lf+\"Qualquer d\u00favida, disponha!\";\n    window.open(\"https:\/\/wa.me\/?text=\"+encodeURIComponent(msg),\"_blank\");\n};\n\nwindow.shareEmail=function(id){\n    const o=state.orcamentos.find(function(x){return x.id===id;});\n    if(!o)return;\n    const total=(o.config&&o.config.aplicaIva)?o.priceWithIva:o.price;\n    const subj=\"Or\u00e7amento Decalcer - \"+o.reference;\n    const lf=String.fromCharCode(10);\n    const msg=\"Estimado Cliente,\"+lf+lf+\"Esperamos que se encontre bem.\"+lf+lf+\"Serve este email para enviar as condi\u00e7\u00f5es de fornecimento relativas \u00e0 refer\u00eancia \"+o.reference+\".\"+lf+lf+\"Valor Global: \"+formatMoney(total)+\" \"+((o.config&&o.config.aplicaIva)?\"(c\/ IVA)\":\"(s\/ IVA)\")+lf+\"Folhas Previstas: \"+formatNumber(o.sheets)+lf+lf+\"(Consulte o PDF em anexo para mais detalhes)\"+lf+lf+\"Com os melhores cumprimentos,\"+lf+\"Equipa Decalcer\";\n    window.open(\"mailto:?subject=\"+encodeURIComponent(subj)+\"&body=\"+encodeURIComponent(msg),\"_blank\");\n};\n\nwindow.printOrcamento=function(id,isFactoryTicket){\n    isFactoryTicket=isFactoryTicket||false;\n    const q=state.orcamentos.find(function(x){return x.id===id;});\n    if(!q)return;\n    const dateObj=parseDateLocal(q.date);\n    const dateStr=dateObj?dateObj.toLocaleDateString(\"pt-PT\"):\"-\";\n    const folhas=q.sheets||0;\n    const quebra=(q.config&&q.config.quebra)?q.config.quebra:0;\n    const folhasProduzir=Math.ceil(folhas*(1+(quebra\/100)));\n    const applyIva=q.config&&q.config.aplicaIva;\n    const subtotal=q.price||0;\n    const ivaValue=applyIva?subtotal*APP_CONFIG.TAXA_IVA:0;\n    const totalFinal=applyIva?(q.priceWithIva||(subtotal+ivaValue)):subtotal;\n    \n    let tintasDescStr=\"\";\n    if(q.config&&q.config.tintas&&q.config.tintas.length>0){\n        if(isFactoryTicket){\n            const linhasCores = q.config.tintas.map(function(t){\n                return \"\u2022 \" + escapeHTML(t.nome) + \" \u2014 <b>\" + formatNumber((t.gramas*folhasProduzir).toFixed(0)) + \"g<\/b>\";\n            }).filter(function(n){return n;});\n            const tc = [\n                '<br><div style=\"margin-top:12px;padding:12px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;\">',\n                '<strong style=\"font-size:12px;color:#0f172a;\">Prepara\u00e7\u00e3o de Tintas:<\/strong><br>',\n                '<small style=\"display:block;margin-top:8px;line-height:1.6;font-size:13px;\">',\n                linhasCores.join('<br>'),\n                '<\/small><\/div>'\n            ];\n            tintasDescStr = tc.join('');\n        } else {\n            const nomes = q.config.tintas.map(function(t){return t.nome;}).filter(function(n){return n;});\n            tintasDescStr = '<br><small style=\"color:#64748b;display:block;margin-top:6px;\">Cores: ' + escapeHTML(nomes.join(\", \")) + '<\/small>';\n        }\n    }\n\n    const amostraValue = (q.config && q.config.amostra) ? parseFloat(q.config.amostra) : 0;\n    let amostraHtml = '';\n    if(!isFactoryTicket && amostraValue > 0){\n        const ivaAmostra = applyIva ? (amostraValue * APP_CONFIG.TAXA_IVA) : 0;\n        const totalAmostra = amostraValue + ivaAmostra;\n        const remTotal = totalFinal - totalAmostra;\n        amostraHtml = `\n        <div style=\"margin-top:30px; padding:15px; background:#f0fdf4; border:1px solid #bbf7d0; border-radius:8px;\">\n            <h4 style=\"margin:0 0 10px 0; color:#166534; font-size:14px; text-transform:uppercase;\">Plano de Pagamento \/ Fatura\u00e7\u00e3o<\/h4>\n            <div style=\"display:flex; justify-content:space-between; margin-bottom:6px; color:#15803d; font-size:13px;\">\n                <span>1. Fatura de Adiantamento (Amostra \/ Desenvolvimento):<\/span>\n                <strong>${formatMoney(totalAmostra)} ${applyIva ? '(c\/ IVA)' : ''}<\/strong>\n            <\/div>\n            <div style=\"display:flex; justify-content:space-between; color:#15803d; font-size:13px;\">\n                <span>2. Valor a liquidar na Fatura Final de Produ\u00e7\u00e3o:<\/span>\n                <strong>${formatMoney(remTotal)} ${applyIva ? '(c\/ IVA)' : ''}<\/strong>\n            <\/div>\n        <\/div>`;\n    }\n    \n    const tituloDoc=isFactoryTicket?\"FICHA DE PRODU\u00c7\u00c3O\":\"OR\u00c7AMENTO\";\n    const themeColor=isFactoryTicket?\"#4f46e5\":\"#0f766e\";\n    \n    const printContentArr = [\n        '<!DOC' + 'TYPE html>',\n        '<ht' + 'ml lang=\"pt\">',\n        '<he' + 'ad>',\n        '<meta charset=\"utf-8\">',\n        '<title>', escapeHTML(q.reference), '<\/title>',\n        '<style>',\n        'body{font-family:Arial,sans-serif;color:#0f172a;margin:0;padding:40px;}',\n        'table{width:100%;border-collapse:collapse;margin-top:30px;}',\n        'th,td{padding:12px 8px;text-align:left;border-bottom:1px solid #e2e8f0;}',\n        'th{background:#f8fafc;font-size:12px;text-transform:uppercase;color:#64748b;}',\n        '<\/style>',\n        '<\/he' + 'ad>',\n        '<bo' + 'dy>',\n        '<div style=\"display:flex;justify-content:space-between;border-bottom:2px solid ', themeColor, ';padding-bottom:20px;margin-bottom:40px;\">',\n        '<div><h1 style=\"color:', themeColor, ';margin:0;font-size:28px;\">DECALCER<\/h1><p style=\"margin:5px 0 0 0;font-size:12px;color:#64748b;\">Impress\u00e3o T\u00e9cnica<\/p><\/div>',\n        '<div style=\"text-align:right;\"><h2 style=\"margin:0;font-size:24px;color:#64748b;\">', tituloDoc, '<\/h2><p style=\"margin:5px 0 0 0;font-weight:bold;\">', escapeHTML(q.reference), '<\/p><\/div>',\n        '<\/div>',\n        '<div style=\"display:flex;justify-content:space-between;margin-bottom:30px;\">',\n        '<div style=\"background:#f8fafc;padding:15px;border-radius:8px;width:45%;\">',\n        '<p style=\"margin:0 0 5px 0;font-size:11px;color:#64748b;text-transform:uppercase;font-weight:bold;\">Cliente<\/p>',\n        '<p style=\"margin:0;font-weight:bold;font-size:15px;\">', escapeHTML(q.client), '<\/p>',\n        (q.po ? '<p style=\"margin:10px 0 5px 0;font-size:11px;color:#64748b;text-transform:uppercase;font-weight:bold;\">PO \/ ID Interno<\/p><p style=\"margin:0;\">' + escapeHTML(q.po) + '<\/p>' : ''),\n        '<\/div>',\n        '<div style=\"background:#f8fafc;padding:15px;border-radius:8px;width:45%;text-align:right;\">',\n        '<p style=\"margin:0 0 5px 0;font-size:11px;color:#64748b;text-transform:uppercase;font-weight:bold;\">Data<\/p>',\n        '<p style=\"margin:0;font-weight:bold;font-size:15px;\">', dateStr, '<\/p>',\n        '<\/div>',\n        '<\/div>',\n        '<table>',\n        '<thead><tr><th>Descri\u00e7\u00e3o<\/th>',\n        (isFactoryTicket ? '<th style=\"text-align:center;\">Pedidas<\/th><th style=\"text-align:center;\">Produzir<\/th>' : '<th style=\"text-align:center;\">Qtd<\/th><th style=\"text-align:right;\">Pre\u00e7o Un.<\/th><th style=\"text-align:right;\">Total<\/th>'),\n        '<\/tr><\/thead>',\n        '<tbody>',\n        '<tr>',\n        '<td><b>Produ\u00e7\u00e3o de Decalques<\/b>',\n        (isFactoryTicket ? '<br><small style=\"color:#64748b;\">Motivos: ' + (q.config && q.config.motivos ? q.config.motivos : \"N\/A\") + '<\/small>' : ''),\n        tintasDescStr,\n        '<\/td>',\n        (isFactoryTicket \n            ? '<td style=\"text-align:center;\"><b>' + formatNumber(folhas) + '<\/b><\/td><td style=\"text-align:center;color:#e11d48;\"><b>' + formatNumber(folhasProduzir) + '<\/b><\/td>'\n            : '<td style=\"text-align:center;\">' + formatNumber(folhas) + '<\/td><td style=\"text-align:right;\">' + formatMoney(folhas > 0 ? subtotal \/ folhas : 0) + '<\/td><td style=\"text-align:right;\"><b>' + formatMoney(subtotal) + '<\/b><\/td>'\n        ),\n        '<\/tr>',\n        '<\/tbody>',\n        '<\/table>',\n        (isFactoryTicket ? '' : '<div style=\"float:right;width:300px;background:#f8fafc;padding:15px;border-radius:8px;border:1px solid #e2e8f0;\"><div style=\"display:flex;justify-content:space-between;margin-bottom:8px;color:#475569;font-size:14px;\"><span>Subtotal:<\/span><span>' + formatMoney(subtotal) + '<\/span><\/div><div style=\"display:flex;justify-content:space-between;margin-bottom:8px;color:#475569;font-size:14px;\"><span>IVA (' + (applyIva ? \"23%\" : \"Isento\") + '):<\/span><span>' + formatMoney(ivaValue) + '<\/span><\/div><div style=\"display:flex;justify-content:space-between;margin-top:10px;padding-top:10px;border-top:2px solid #e2e8f0;font-size:18px;font-weight:bold;color:#0f172a;\"><span style=\"color:' + themeColor + ';\">Total Global:<\/span><span>' + formatMoney(totalFinal) + '<\/span><\/div><\/div>'),\n        '<div style=\"clear:both;\"><\/div>',\n        amostraHtml,\n        (q.notes ? '<div style=\"margin-top:40px;padding-top:20px;border-top:1px dashed #cbd5e1;\"><p style=\"font-size:12px;font-weight:bold;color:' + themeColor + ';margin:0 0 10px 0;\">NOTAS T\u00c9CNICAS E CONDI\u00c7\u00d5ES:<\/p><p style=\"font-size:14px;color:#334155;white-space:pre-wrap;margin:0;\">' + escapeHTML(q.notes) + '<\/p><\/div>' : ''),\n        '<\/bo' + 'dy>',\n        '<\/ht' + 'ml>'\n    ];\n    \n    try{\n        const printWin=window.open(\"\",\"_blank\");\n        if(printWin){\n            printWin.document.open();\n            printWin.document.write(printContentArr.join(\"\"));\n            printWin.document.close();\n            setTimeout(function(){printWin.print();},500);\n        }else{\n            showToast(\"Bloqueador de pop-ups ativo.\",\"error\");\n        }\n    }catch(e){}\n};\n\nfunction renderAnalysis(){\n    if(state.role===\"comercial\")return;\n    const todosAprovados=state.orcamentos.filter(function(o){return o.status===\"Aprovado\";});\n    let targetFolhasStock=0;\n    let targetTintasStock=0;\n    todosAprovados.forEach(function(o){\n        const f=o.sheets||0;\n        const q=(o.config&&o.config.quebra)?o.config.quebra:0;\n        const fp=f*(1+(q\/100));\n        targetFolhasStock+=fp;\n        if(o.config&&o.config.tintas){\n            o.config.tintas.forEach(function(t){\n                targetTintasStock+=(t.gramas*fp);\n            });\n        }\n    });\n    document.getElementById(\"bi-stock-folhas\").textContent=formatNumber(Math.ceil(targetFolhasStock));\n    document.getElementById(\"bi-stock-tintas\").textContent=formatNumber((targetTintasStock\/1000).toFixed(1))+\" Kg\";\n    let faturacaoMes={};\n    let perdaMotivos={};\n    let statsCategoria={};\n    state.orcamentos.forEach(function(o){\n        const d=parseDateLocal(o.date);\n        if(!d)return;\n        const mesAno=d.toLocaleDateString(\"pt-PT\",{month:\"short\",year:\"numeric\"});\n        if(o.status===\"Aprovado\"){\n            if(!faturacaoMes[mesAno])faturacaoMes[mesAno]=0;\n            faturacaoMes[mesAno]+=(o.price||0);\n            let cat=o.category||\"Sem Categoria\";\n            if(!statsCategoria[cat])statsCategoria[cat]={faturado:0,count:0,margemPrev:0};\n            statsCategoria[cat].faturado+=(o.price||0);\n            statsCategoria[cat].count+=1;\n            const custo=o.baseCost||((o.price||0)*0.5);\n            statsCategoria[cat].margemPrev+=custo>0?(((o.price||0)-custo)\/custo)*100:0;\n        }\n        if(o.status===\"Rejeitado\"){\n            let m=o.lossReason||\"Sem justifica\u00e7\u00e3o\";\n            if(!perdaMotivos[m])perdaMotivos[m]=0;\n            perdaMotivos[m]++;\n        }\n    });\n    const tbodyCat=document.getElementById(\"category-table-body\");\n    tbodyCat.innerHTML=\"\";\n    Object.keys(statsCategoria).sort(function(a,b){\n        return statsCategoria[b].faturado-statsCategoria[a].faturado;\n    }).forEach(function(cat){\n        const row=statsCategoria[cat];\n        const tr = document.createElement(\"tr\");\n        tr.className = \"hover:bg-slate-50 transition-colors\";\n        tr.innerHTML = '<td class=\"px-6 py-4 font-bold text-slate-800\">' + escapeHTML(cat) + '<\/td><td class=\"px-6 py-4 text-center font-medium\">' + row.count + '<\/td><td class=\"px-6 py-4 text-right font-bold text-teal-600\">' + formatMoney(row.faturado) + '<\/td><td class=\"px-6 py-4 text-right font-bold text-slate-500 bg-slate-50\">' + (row.margemPrev\/row.count).toFixed(1) + '%<\/td>';\n        tbodyCat.appendChild(tr);\n    });\n    \n    const ctxMensal=document.getElementById(\"monthlyChart\");\n    if(state.charts.monthly)state.charts.monthly.destroy();\n    if(ctxMensal&&Object.keys(faturacaoMes).length>0){\n        const sortedMonths=Object.keys(faturacaoMes).sort(function(a,b){\n            const mapMes={\"jan\":1,\"fev\":2,\"mar\":3,\"abr\":4,\"mai\":5,\"jun\":6,\"jul\":7,\"ago\":8,\"set\":9,\"out\":10,\"nov\":11,\"dez\":12};\n            const aa=a.split(\" de \");\n            const bb=b.split(\" de \");\n            if(aa[1]!==bb[1])return parseInt(aa[1])-parseInt(bb[1]);\n            return mapMes[aa[0].toLowerCase()]-mapMes[bb[0].toLowerCase()];\n        });\n        const dataFaturacao=sortedMonths.map(function(m){return faturacaoMes[m];});\n        state.charts.monthly=new Chart(ctxMensal,{\n            type:\"bar\",\n            data:{\n                labels:sortedMonths,\n                datasets:[{label:\"Fatura\u00e7\u00e3o (\u20ac)\",data:dataFaturacao,backgroundColor:\"#14b8a6\",borderRadius:8}]\n            },\n            options:{\n                responsive:true,\n                maintainAspectRatio:false,\n                plugins:{legend:{display:false}},\n                scales:{\n                    y:{beginAtZero:true,grid:{borderDash:[4,4]}},\n                    x:{grid:{display:false}}\n                }\n            }\n        });\n    }\n    const ctxLoss=document.getElementById(\"lossChart\");\n    if(state.charts.loss)state.charts.loss.destroy();\n    if(ctxLoss&&Object.keys(perdaMotivos).length>0){\n        state.charts.loss=new Chart(ctxLoss,{\n            type:\"doughnut\",\n            data:{\n                labels:Object.keys(perdaMotivos),\n                datasets:[{data:Object.values(perdaMotivos),backgroundColor:[\"#e11d48\",\"#f59e0b\",\"#3b82f6\",\"#8b5cf6\",\"#94a3b8\"],borderWidth:0}]\n            },\n            options:{\n                responsive:true,\n                maintainAspectRatio:false,\n                cutout:\"65%\",\n                plugins:{legend:{position:\"right\",labels:{usePointStyle:true,boxWidth:8}}}\n            }\n        });\n    }\n}\n\ndocument.getElementById(\"btn-search-orc\").addEventListener(\"click\",renderOrcamentos);\ndocument.getElementById(\"search-orc\").addEventListener(\"keydown\",function(e){if(e.key===\"Enter\")renderOrcamentos();});\ndocument.getElementById(\"filter-orc-status\").addEventListener(\"change\",renderOrcamentos);\n\ndocument.getElementById(\"btn-login\").addEventListener(\"click\",function(){\n    if(state.currentUser&&!state.currentUser.isAnonymous){\n        state.auth.signOut();\n    }else{\n        document.getElementById(\"login-modal\").classList.remove(\"hidden\");\n        document.getElementById(\"btn-cancel-login\").classList.remove(\"hidden\");\n    }\n});\n\ndocument.getElementById(\"btn-cancel-login\").addEventListener(\"click\",function(){\n    document.getElementById(\"login-modal\").classList.add(\"hidden\");\n});\n\ndocument.getElementById(\"login-form\").addEventListener(\"submit\",async function(e){\n    e.preventDefault();\n    const email=document.getElementById(\"login-email\").value;\n    const pass=document.getElementById(\"login-password\").value;\n    const errEl=document.getElementById(\"login-error\");\n    errEl.classList.add(\"hidden\");\n    try{\n        await state.auth.signInWithEmailAndPassword(email,pass);\n        document.getElementById(\"login-modal\").classList.add(\"hidden\");\n        showToast(\"Bem-vindo!\",\"success\");\n    }catch(error){\n        errEl.textContent=\"Credenciais inv\u00e1lidas.\";\n        errEl.classList.remove(\"hidden\");\n    }\n});\n\ninitApp();\n\n})();\n\/* ]]> *\/\n<\/script>\n<\/body>\n<\/html>\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\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Or\u00e7amentos e Rendibilidade | Decalcer A preparar ERP&#8230; Decalcer ERP Admin Login Pipeline (CRM) Lista Geral Criar \/ Editar An\u00e1lise (BI) Configura\u00e7\u00f5es Pipeline Comercial Arraste os or\u00e7amentos para atualizar o estado. Novo Or\u00e7amento Em Negocia\u00e7\u00e3o 0 Ganhos (Produ\u00e7\u00e3o) 0 Perdidos 0 Todos os EstadosPendenteAprovadoRejeitado Pesquisar + Novo Nenhum or\u00e7amento encontrado. Modo de Edi\u00e7\u00e3o Refer\u00eancia * [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1146","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>orca - Decalcer<\/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:\/\/www.decalcer.com\/en\/orca\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"orca - Decalcer\" \/>\n<meta property=\"og:description\" content=\"Or\u00e7amentos e Rendibilidade | Decalcer A preparar ERP&#8230; Decalcer ERP Admin Login Pipeline (CRM) Lista Geral Criar \/ Editar An\u00e1lise (BI) Configura\u00e7\u00f5es Pipeline Comercial Arraste os or\u00e7amentos para atualizar o estado. Novo Or\u00e7amento Em Negocia\u00e7\u00e3o 0 Ganhos (Produ\u00e7\u00e3o) 0 Perdidos 0 Todos os EstadosPendenteAprovadoRejeitado Pesquisar + Novo Nenhum or\u00e7amento encontrado. Modo de Edi\u00e7\u00e3o Refer\u00eancia * [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.decalcer.com\/en\/orca\/\" \/>\n<meta property=\"og:site_name\" content=\"Decalcer\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/decalcer\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-22T15:28:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.decalcer.com\/orca\/\",\"url\":\"https:\/\/www.decalcer.com\/orca\/\",\"name\":\"orca - Decalcer\",\"isPartOf\":{\"@id\":\"https:\/\/www.decalcer.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.decalcer.com\/orca\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.decalcer.com\/orca\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\",\"datePublished\":\"2026-02-24T22:17:51+00:00\",\"dateModified\":\"2026-03-22T15:28:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.decalcer.com\/orca\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.decalcer.com\/orca\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/www.decalcer.com\/orca\/#primaryimage\",\"url\":\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\",\"contentUrl\":\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.decalcer.com\/orca\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/www.decalcer.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"orca\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.decalcer.com\/#website\",\"url\":\"https:\/\/www.decalcer.com\/\",\"name\":\"Decalcer\",\"description\":\"Decalques cer\u00e2micos\",\"publisher\":{\"@id\":\"https:\/\/www.decalcer.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.decalcer.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.decalcer.com\/#organization\",\"name\":\"Decalcer decalques vitro unipessoal, Lda\",\"url\":\"https:\/\/www.decalcer.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/www.decalcer.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer.png\",\"contentUrl\":\"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer.png\",\"width\":900,\"height\":300,\"caption\":\"Decalcer decalques vitro unipessoal, Lda\"},\"image\":{\"@id\":\"https:\/\/www.decalcer.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/decalcer\",\"https:\/\/www.linkedin.com\/company\/decalcer\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"orca - Decalcer","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:\/\/www.decalcer.com\/en\/orca\/","og_locale":"en_GB","og_type":"article","og_title":"orca - Decalcer","og_description":"Or\u00e7amentos e Rendibilidade | Decalcer A preparar ERP&#8230; Decalcer ERP Admin Login Pipeline (CRM) Lista Geral Criar \/ Editar An\u00e1lise (BI) Configura\u00e7\u00f5es Pipeline Comercial Arraste os or\u00e7amentos para atualizar o estado. Novo Or\u00e7amento Em Negocia\u00e7\u00e3o 0 Ganhos (Produ\u00e7\u00e3o) 0 Perdidos 0 Todos os EstadosPendenteAprovadoRejeitado Pesquisar + Novo Nenhum or\u00e7amento encontrado. Modo de Edi\u00e7\u00e3o Refer\u00eancia * [&hellip;]","og_url":"https:\/\/www.decalcer.com\/en\/orca\/","og_site_name":"Decalcer","article_publisher":"https:\/\/www.facebook.com\/decalcer","article_modified_time":"2026-03-22T15:28:51+00:00","og_image":[{"url":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.decalcer.com\/orca\/","url":"https:\/\/www.decalcer.com\/orca\/","name":"orca - Decalcer","isPartOf":{"@id":"https:\/\/www.decalcer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.decalcer.com\/orca\/#primaryimage"},"image":{"@id":"https:\/\/www.decalcer.com\/orca\/#primaryimage"},"thumbnailUrl":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png","datePublished":"2026-02-24T22:17:51+00:00","dateModified":"2026-03-22T15:28:51+00:00","breadcrumb":{"@id":"https:\/\/www.decalcer.com\/orca\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.decalcer.com\/orca\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.decalcer.com\/orca\/#primaryimage","url":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png","contentUrl":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer-768x256.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.decalcer.com\/orca\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.decalcer.com\/"},{"@type":"ListItem","position":2,"name":"orca"}]},{"@type":"WebSite","@id":"https:\/\/www.decalcer.com\/#website","url":"https:\/\/www.decalcer.com\/","name":"Decal","description":"Decalques cer\u00e2micos","publisher":{"@id":"https:\/\/www.decalcer.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.decalcer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/www.decalcer.com\/#organization","name":"Decalcer decalques vitro unipessoal, Lda","url":"https:\/\/www.decalcer.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.decalcer.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer.png","contentUrl":"https:\/\/www.decalcer.com\/wp-content\/uploads\/2023\/06\/logo-decalcer.png","width":900,"height":300,"caption":"Decalcer decalques vitro unipessoal, Lda"},"image":{"@id":"https:\/\/www.decalcer.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/decalcer","https:\/\/www.linkedin.com\/company\/decalcer"]}]}},"_links":{"self":[{"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/pages\/1146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/comments?post=1146"}],"version-history":[{"count":388,"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/pages\/1146\/revisions"}],"predecessor-version":[{"id":1740,"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/pages\/1146\/revisions\/1740"}],"wp:attachment":[{"href":"https:\/\/www.decalcer.com\/en\/wp-json\/wp\/v2\/media?parent=1146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}