PageSourceSearch

https://portal.easymarine.com.br/assets/ImportCompaniesDialog_467e0e07.js

js easymarine.com.br collected 2026-09-24 13:46:40 UTC 14,278 bytes, 1 lines download raw bytes

1import{e3 as P,e4 as K,a6 as X,O as N,a0 as O,a5 as R,L as e,a3 as Q,c9 as G,Z as b,a$ as Y,a4 as Z,cY as W,b6 as ee,aI as se,aJ as ae,aK as A,aL as S,aM as re,aO as E,al as I,bW as oe,fS as te,aa as ne,ab as ie,ac as le,ad as ce,ae as de,cB as V,ai as ue,cC as U,a2 as me}from"./index_ec3ba43a.js";import{O as xe}from"./OrganizationMultiSelect_43436a39.js";import{E as B}from"./exceljs.min_ec36b72e.js";import pe from"./file_ae560556.js";import H from"./circle-x_7eac93d2.js";import"./useCompanyOrganizations_26757f65.js";import"./chevrons-up-down_e24378af.js";const $=s=>s==null||s===""?"":typeof s=="number"?String(s):typeof s=="string"?s:s instanceof Date?s.toISOString():String(s),C=(s,...t)=>{for(const r of t){const o=$(s[r]);if(o)return o}return""};async function fe(s,t){const r=new B.Workbook;try{if(s.name.match(/\.csv$/i))try{const o=new TextDecoder("utf-8",{fatal:!0}).decode(t);await r.csv.read(new Blob([o]).stream())}catch{try{const o=new TextDecoder("latin1").decode(t);await r.csv.read(new Blob([o]).stream())}catch{return{ok:!1,error:"Erro ao ler o arquivo CSV. Verifique se o encoding é UTF-8 ou Latin1 e se o arquivo não está corrompido."}}}else await r.xlsx.load(t)}catch(o){const a=o instanceof Error?o.message.toLowerCase():"";return a.includes("password")||a.includes("encrypt")?{ok:!1,error:"O arquivo parece estar protegido por senha. Remova a proteção e tente novamente."}:{ok:!1,error:"Erro ao ler o arquivo. Verifique se não está corrompido ou protegido por senha."}}return{workbook:r}}function he(s){const t=[];s.getRow(1).eachCell((a,n)=>{t[n-1]=String(a.value||"").trim()});const o=[];return s.eachRow((a,n)=>{if(n===1)return;const l={};a.eachCell((m,x)=>{const c=t[x-1];c&&(l[c]=m.value)}),Object.keys(l).length>0&&o.push(l)}),{headers:t,rows:o}}async function ge(s){try{const t=new B.Workbook;await t.xlsx.load(s);const r=t.worksheets[0];if(!r||r.rowCount===0)return{ok:!1,error:"Nenhuma planilha encontrada no arquivo."};const o=[];r.getRow(1).eachCell({includeEmpty:!0},(l,m)=>{o[m-1]=String(l.value||"").trim()});const n=[];for(let l=2;l<=r.rowCount;l++){const m=r.getRow(l),x={};let c=!1;m.eachCell({includeEmpty:!0},(u,v)=>{const g=o[v-1];g&&(x[g]=u.value,u.value!==null&&u.value!==void 0&&u.value!==""&&(c=!0))}),c&&n.push(x)}return{rows:n}}catch(t){const r=t instanceof Error?t.message.toLowerCase():"";return r.includes("password")||r.includes("encrypt")?{ok:!1,error:"O arquivo parece estar protegido por senha. Remova a proteção e tente novamente."}:{ok:!1,error:"Erro ao ler arquivo .xls. Tente salvar como .xlsx e importar novamente."}}}function je(s,t){const r=C(s,"Razão Social","razao_social","nome"),o=s.CNPJ??s.cnpj??"",a=typeof o=="number"?Math.round(o).toString():$(o),n=P(a).padStart(14,"0"),l=s["Telefone Celular"]??s.telefone_celular??s.celular??"",m=typeof l=="number"?Math.round(l).toString():$(l),x=C(s,"Email","email"),c=[];r||c.push("Razão Social"),P(a)||c.push("CNPJ"),x||c.push("Email"),P(a)&&n.length!==14?c.push(`CNPJ inválido: ${n.length} dígitos (valor lido: "${a}")`):P(a)&&!K(n)&&c.push("CNPJ inválido: dígitos verificadores incorretos");const u=s["Telefone Fixo"]??s.telefone_fixo??s.telefone??"",v=typeof u=="number"?Math.round(u).toString():$(u),g={rua:C(s,"Rua","rua","endereco"),bairro:C(s,"Bairro","bairro"),cidade:C(s,"Cidade","cidade"),estado:C(s,"Estado","estado","UF"),cep:C(s,"CEP","cep"),telefone_fixo:v,site:C(s,"Site","site","website"),observacoes:C(s,"Observações","observacoes","obs")};return c.length>0?{razao_social:r||`Linha ${t+2}`,cnpj:n||"-",telefone_celular:m||"-",email:x||"-",...g,status:"error",error:`Campos obrigatórios faltando: ${c.join(", ")}`}:{razao_social:r,cnpj:n,telefone_celular:m,email:x,...g,status:"pending"}}function we(s){const t=new Map;return s.forEach(r=>{r.cnpj&&r.cnpj!=="-"&&r.status!=="error"&&t.set(r.cnpj,(t.get(r.cnpj)||0)+1)}),s.map(r=>r.cnpj&&r.cnpj!=="-"&&(t.get(r.cnpj)||0)>1&&r.status!=="error"?{...r,status:"error",error:"CNPJ duplicado no arquivo"}:r)}async function ve(s){const t=await s.arrayBuffer();let r=[];if(s.name.match(/\.xls$/i)&&!s.name.match(/\.xlsx$/i)){const a=await ge(t);if("ok"in a)return a;r=a.rows}else{const a=await fe(s,t);if("ok"in a)return a;const n=a.workbook.worksheets[0];if(!n||n.rowCount===0)return{ok:!1,error:"Nenhuma planilha encontrada no arquivo."};r=he(n).rows}if(r.length===0)return{ok:!1,error:"A planilha não contém dados além do cabeçalho. Adicione ao menos uma linha de dados."};const o=r.map((a,n)=>je(a,n));return{ok:!0,companies:we(o)}}function Ce(s){const t=X(),[r,o]=N.useState(null),[a,n]=N.useState([]),[l,m]=N.useState(!1),[x,c]=N.useState(!1),[u,v]=N.useState([]),[g,z]=N.useState(!1),[F,f]=N.useState(null);return{file:r,companies:a,importing:l,importComplete:x,selectedOrganizations:u,setSelectedOrganizations:v,processingFile:g,fileError:F,validateAndSetFile:i=>{if(f(null),n([]),!i.name.match(/\.(csv|xlsx|xls)$/i)){const p=i.name.split(".").pop()||"desconhecido";return f(`Formato não suportado (.${p}). Use .csv, .xlsx ou .xls.`),!1}return i.size===0?(f("O arquivo está vazio (0 bytes)."),!1):i.size>10*1024*1024?(f("Arquivo muito grande. O limite é 10MB."),!1):(o(i),!0)},handleProcessFile:async()=>
1{if(r){z(!0),f(null),n([]);try{const i=await ve(r);if(i.ok===!1){f(i.error);return}n(i.companies);const p=i.companies.filter(d=>d.status!=="error").length,j=i.companies.filter(d=>d.status==="error").length;p===0?f(`Nenhuma empresa válida encontrada. Todas as ${j} linha(s) possuem erros. Verifique os detalhes na tabela abaixo.`):j>0?R.warning(`${p} empresa(s) válida(s), ${j} com erro(s)`):R.success(`${i.companies.length} empresa(s) válida(s) encontrada(s)`)}catch(i){const p=i instanceof Error?i.message:"erro desconhecido";f(`Erro inesperado ao processar o arquivo: ${p}.`)}finally{z(!1)}}},clearFile:()=>{o(null),n([]),f(null)},importCompanies:async()=>{m(!0);let i=0,p=0;for(let j=0;j<a.length;j++){const d=a[j];if(d.status==="error"){p++;continue}try{const{data:k}=await O.from("companies").select("id, razao_social").eq("cnpj",d.cnpj).maybeSingle();if(k){if(u.length>0){const w=u.map(y=>({company_id:k.id,organization_id:y})),{error:h}=await O.from("company_organizations").upsert(w,{onConflict:"company_id,organization_id",ignoreDuplicates:!0});if(h)throw h}n(w=>w.map((h,y)=>y===j?{...h,status:"success",error:`Já existente (${k.razao_social}), vinculada`}:h)),i++;continue}const{data:T,error:q}=await O.from("companies").insert({razao_social:d.razao_social,cnpj:d.cnpj,telefone_celular:d.telefone_celular||null,email:d.email,rua:d.rua||null,bairro:d.bairro||null,cidade:d.cidade||null,estado:d.estado||null,cep:d.cep||null,telefone_fixo:d.telefone_fixo||null,site:d.site||null,observacoes:d.observacoes||null,is_active:!0}).select("id").single();if(q)throw q;if(T&&u.length>0){const w=u.map(h=>({company_id:T.id,organization_id:h}));await O.from("company_organizations").insert(w)}n(w=>w.map((h,y)=>y===j?{...h,status:"success"}:h)),i++}catch(k){const T=k instanceof Error?k.message:"Erro ao importar";n(q=>q.map((w,h)=>h===j?{...w,status:"error",error:T}:w)),p++}}m(!1),c(!0),i>0&&(t.invalidateQueries({queryKey:["companies"]}),R.success(`${i} empresa(s) importada(s) com sucesso`)),p>0&&R.error(`${p} empresa(s) com erro`)},handleClose:()=>{o(null),n([]),m(!1),c(!1),v([]),f(null),z(!1),s()}}}async function be(){const s=new B.Workbook,t=s.addWorksheet("Empresas");t.addRow(["Razão Social","CNPJ","Telefone Celular","Email","Rua","Bairro","Cidade","Estado","CEP","Telefone Fixo","Site","Observações"]),t.addRow(["Exemplo Empresa Ltda","00.000.000/0000-00","(11) 90000-0000","[email protected]","Rua Exemplo","Centro","São Paulo","SP","00000-000","(11) 0000-0000","www.exemplo.com","Observações opcionais"]);const r=await s.xlsx.writeBuffer(),o=new Blob([r],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),a=URL.createObjectURL(o),n=document.createElement("a");n.href=a,n.download="template_empresas.xlsx",n.click(),URL.revokeObjectURL(a)}function Ne(s){if(s===0)return"0 B";const t=1024,r=["B","KB","MB","GB"],o=Math.floor(Math.log(s)/Math.log(t));return`${parseFloat((s/Math.pow(t,o)).toFixed(1))} ${r[o]}`}function ke({file:s,processingFile:t,showFileSelection:r,showFileInfo:o,onFileChange:a,onProcessFile:n,onClearFile:l}){return r?e.jsxs("label",{className:"border-2 border-dashed rounded-lg p-8 text-center cursor-pointer hover:border-primary transition-colors",children:[e.jsx(Q,{type:"file",accept:".csv,.xlsx,.xls",onChange:a,className:"hidden"}),e.jsx(G,{className:"mx-auto h-12 w-12 text-muted-foreground mb-4"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Clique para selecionar ou arraste o arquivo aqui"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"CSV ou Excel (máx. 10MB)"})]}):o||t?e.jsxs("div",{className:"border rounded-lg p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(pe,{className:"h-8 w-8 text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium",children:s==null?void 0:s.name}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s?Ne(s.size):""})]})]}),e.jsx(b,{variant:"ghost",size:"icon",onClick:l,disabled:t,children:e.jsx(Y,{className:"h-4 w-4"})})]}),e.jsx(b,{onClick:n,className:"w-full",disabled:t,children:t?e.jsxs(e.Fragment,{children:[e.jsx(Z,{className:"mr-2 h-4 w-4 animate-spin"}),"Processando..."]}):e.jsxs(e.Fragment,{children:[e.jsx(W,{className:"mr-2 h-4 w-4"}),"Processar Arquivo"]})})]}):null}function Se({companies:s,importing:t,importComplete:r,onClearFile:o}){return e.jsxs("div",{className:"flex-1 overflow-hidden flex flex-col",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:[s.length," empresa(s) para importar"]}),!t&&!r&&e.jsx(b,{onClick:o,variant:"ghost",size:"sm",children:"Selecionar outro arquivo"})]}),e.jsxs(ee,{className:"flex-1 border rounded-md",children:[e.jsxs(se,{className:"min-w-[900px]",children:[e.jsx(ae,{children:e.jsxs(A,{children:[e.jsx(S,{className:"min-w-[120px]",children:"Status"}),e.jsx(S,{className:"min-w-[200px]",children:"Razão Social"}),e.jsx(S,{className:"min-w-[160px]",children:"CNPJ"}),e.jsx(S,{className:"min-w-[180px]",children:"Email"}),e.jsx(S,{className:"min-w-[140px]",children:"Telefone"}),e.jsx(S,{className:"min-w-[140px]",children:"Cidade/Estado"})]})}),e.jsx(re,{children:s.map((a,n)=>e.jsxs(A,{className:a.status==="error"?"bg-destructive/10":"",children:[e.jsxs(E,{children:[a.status==="pending"&&e.jsx("div",{className:"h-4 w-4 roun
1ded-full bg-muted"}),a.status==="success"&&!a.error&&e.jsx(I,{className:"h-4 w-4 text-green-500"}),a.status==="success"&&a.error&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{className:"h-4 w-4 text-yellow-500"}),e.jsx("span",{className:"text-xs text-yellow-600 dark:text-yellow-400",children:a.error})]}),a.status==="error"&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(H,{className:"h-4 w-4 text-destructive"}),a.error&&e.jsx("span",{className:"text-xs text-destructive",children:a.error})]})]}),e.jsx(E,{className:"font-medium",children:a.razao_social}),e.jsx(E,{className:"text-sm text-muted-foreground",children:a.cnpj&&a.cnpj!=="-"?oe(a.cnpj):"-"}),e.jsx(E,{className:"text-sm text-muted-foreground",children:a.email||"-"}),e.jsx(E,{className:"text-sm text-muted-foreground",children:a.telefone_celular||a.telefone_fixo||"-"}),e.jsx(E,{className:"text-sm text-muted-foreground",children:a.cidade&&a.estado?`${a.cidade}/${a.estado}`:a.cidade||a.estado||"-"})]},n))})]}),e.jsx(te,{orientation:"horizontal"})]})]})}function qe({open:s,onOpenChange:t}){const{file:r,companies:o,importing:a,importComplete:n,selectedOrganizations:l,setSelectedOrganizations:m,processingFile:x,fileError:c,validateAndSetFile:u,handleProcessFile:v,clearFile:g,importCompanies:z,handleClose:F}=Ce(()=>t(!1)),f=_=>{var p;const i=(p=_.target.files)==null?void 0:p[0];i&&u(i)},D=async()=>{await be(),R.success("Template baixado")},L=!r&&o.length===0,J=!!r&&o.length===0&&!x&&!c,M=o.length>0&&o.every(_=>_.status==="error");return e.jsx(ne,{open:s,onOpenChange:F,children:e.jsxs(ie,{className:"max-w-4xl max-h-[90vh] flex flex-col",children:[e.jsxs(le,{children:[e.jsx(ce,{children:"Importar Empresas"}),e.jsx(de,{children:"Faça upload de um arquivo CSV ou Excel com os dados das empresas"})]}),e.jsxs("div",{className:"space-y-4 flex-1 overflow-hidden flex flex-col",children:[e.jsxs(b,{variant:"outline",onClick:D,className:"w-full",children:[e.jsx(W,{className:"mr-2 h-4 w-4"}),"Baixar Template"]}),e.jsxs(V,{children:[e.jsx(ue,{className:"h-4 w-4"}),e.jsxs(U,{children:[e.jsx("strong",{children:"Campos obrigatórios:"})," Razão Social, CNPJ, Email.",e.jsx("br",{}),e.jsx("strong",{children:"Campos opcionais:"})," Telefone Celular, Telefone Fixo, Rua, Bairro, Cidade, Estado, CEP, Site, Observações."]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(me,{children:"Organizações *"}),e.jsx(xe,{value:l,onChange:m,disabled:a}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Selecione ao menos uma organização. Todas as empresas importadas serão vinculadas a ela(s)."})]}),c&&e.jsxs(V,{variant:"destructive",children:[e.jsx(H,{className:"h-4 w-4"}),e.jsx(U,{className:"whitespace-pre-line",children:c})]}),e.jsx(ke,{file:r,processingFile:x,showFileSelection:L,showFileInfo:J,onFileChange:f,onProcessFile:v,onClearFile:g}),c&&r&&o.length===0&&!x&&e.jsxs("div",{className:"flex gap-2",children:[e.jsx(b,{variant:"outline",onClick:g,className:"flex-1",children:"Selecionar outro arquivo"}),e.jsx(b,{onClick:v,className:"flex-1",children:"Tentar novamente"})]}),o.length>0&&e.jsx(Se,{companies:o,importing:a,importComplete:n,onClearFile:g}),o.length>0&&!n&&e.jsxs("div",{className:"flex gap-2",children:[e.jsx(b,{onClick:F,variant:"outline",className:"flex-1",disabled:a,children:"Cancelar"}),e.jsx(b,{onClick:z,className:"flex-1",disabled:a||M||l.length===0,children:a?"Importando...":"Importar Empresas Válidas"})]}),n&&e.jsx(b,{onClick:F,className:"w-full",children:"Fechar"})]})]})})}export{qe as ImportCompaniesDialog};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.