12 lines
No EOL
52 KiB
JavaScript
12 lines
No EOL
52 KiB
JavaScript
import{d as e,f as t,h as n,i as r,l as i,r as a,s as o,t as s,u as c}from"./useToast-CS8pZhce.js";import{t as l}from"./DynamicFormRenderer-u2RREFCE.js";import{t as u}from"./building-BdUpGLM5.js";import{t as d}from"./file-text-DR21jZDS.js";import{B as f,H as p,I as ee,V as te,W as m,X as ne,Z as h,dt as re,et as g,g as ie,n as _,nt as ae,p as v,r as y,rt as b,st as oe,t as x,tt as S,w as C,x as se,y as w}from"./index-CNnq9VO5.js";import{t as T}from"./useOrders-Dp-LV7vp.js";import{t as E}from"./currency-DdDs82F5.js";var D={name:`cloud-upload`,size:24,node:[[`path`,{d:`M12 13v8`,key:`1l5pq0`}],[`path`,{d:`M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242`,key:`1pljnt`}],[`path`,{d:`m8 17 4-4 4 4`,key:`1quai1`}]],aliases:[`upload-cloud`]};D.node;var ce=i(D),O=n(t(),1);function k(){let[e,t]=(0,O.useState)([]),[n,r]=(0,O.useState)([]),[i,a]=(0,O.useState)([]),[o,s]=(0,O.useState)([]),[c,l]=(0,O.useState)(!0),[u,d]=(0,O.useState)(null),f=(0,O.useCallback)(async()=>{try{l(!0),d(null);let[e,n,i,o]=await Promise.all([b.contacts.list({pageSize:100}),b.companies.list({pageSize:100}),b.leads.list({pageSize:100}),b.deals.list({pageSize:100})]);t(e.items),r(n.items),a(i.items),s(o.items)}catch(e){d(e instanceof Error?e:Error(String(e)))}finally{l(!1)}},[]);return(0,O.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&f()}),()=>{e=!1}},[f]),S(`records:changed`,e=>{(e.entityType===`contact`||e.entityType===`company`||e.entityType===`lead`||e.entityType===`deal`)&&f()}),S(`storage:reset`,f),S(`snapshot:imported`,f),{contacts:e,companies:n,leads:i,deals:o,loading:c,error:u,refetch:f,createContact:(0,O.useCallback)(async e=>b.contacts.create(e),[]),updateContact:(0,O.useCallback)(async(e,t)=>b.contacts.update(e,t),[]),deleteContact:(0,O.useCallback)(async e=>b.contacts.delete(e),[]),createCompany:(0,O.useCallback)(async e=>b.companies.create(e),[]),updateCompany:(0,O.useCallback)(async(e,t)=>b.companies.update(e,t),[]),deleteCompany:(0,O.useCallback)(async e=>b.companies.delete(e),[]),createDeal:(0,O.useCallback)(async e=>b.deals.create(e),[]),updateDeal:(0,O.useCallback)(async(e,t)=>b.deals.update(e,t),[]),deleteDeal:(0,O.useCallback)(async e=>b.deals.delete(e),[]),createLead:(0,O.useCallback)(async e=>b.leads.create(e),[]),updateLead:(0,O.useCallback)(async(e,t)=>b.leads.update(e,t),[]),deleteLead:(0,O.useCallback)(async e=>b.leads.delete(e),[]),convertLead:(0,O.useCallback)(async(e,t)=>b.convertLeadToDeal(e,t),[]),getTimeline:(0,O.useCallback)(async(e,t)=>b.getTimeline(e,t),[]),createActivity:(0,O.useCallback)(async e=>b.activities.create(e),[]),createNote:(0,O.useCallback)(async e=>b.notes.create(e),[])}}var A=o(),le=`Имя,Фамилия,Телефон,Email,Компания,Должность
|
||
Владимир,Ковалев,+7 (916) 123-45-67,kovalev@partner.ru,ООО «СеверТорг»,Коммерческий директор
|
||
Елена,Васильева,+7 (903) 987-65-43,elena.v@iceberg.ru,ГК «Айсберг Логистик»,Руководитель закупок
|
||
Дмитрий,Смирнов,,dmitry@corp.ru,,Менеджер
|
||
Иван,,+7 (999) 888-77-66,invalid-email-address,ИП «Михайлов»,Инженер
|
||
Анна,Кузнецова,+7 (926) 111-22-33,anna.k@beautyshop.ru,ООО «Бьюти Групп»,Директор по маркетингу`,j=`Артикул,Наименование,Категория,Цена (коп),Единица
|
||
COF-ETH-01,Кофе зерновой Эфиопия Иргачефф 1кг,Кофе,185000,уп
|
||
COF-BRZ-02,Кофе зерновой Бразилия Сантос 1кг,Кофе,145000,уп
|
||
SYR-VAN-01,Сироп Ваниль 1000мл,Сиропы,65000,бут
|
||
,,Расходники,25000,уп
|
||
CUP-PAP-300,Стакан бумажный 300мл 50шт,Упаковка,-5000,уп
|
||
TEA-SEN-01,Чай зеленый Сенча 500г,Чай,95000,уп`,M=[{key:`firstName`,label:`Имя`,required:!0},{key:`lastName`,label:`Фамилия`,required:!0},{key:`phone`,label:`Телефон`,required:!1},{key:`email`,label:`Email`,required:!1},{key:`companyName`,label:`Компания`,required:!1},{key:`jobTitle`,label:`Должность`,required:!1}],N=[{key:`sku`,label:`Артикул (SKU)`,required:!0},{key:`name`,label:`Наименование`,required:!0},{key:`category`,label:`Категория`,required:!1},{key:`price`,label:`Цена (копейки)`,required:!0},{key:`unit`,label:`Единица измерения`,required:!1}],ue=({initialEntityType:e=`contact`,onComplete:t,onClose:n})=>{let{showToast:i}=s(),[o,l]=(0,O.useState)(1),[u,p]=(0,O.useState)(e),[re,g]=(0,O.useState)(``),[ie,_]=(0,O.useState)(``),[y,oe]=(0,O.useState)([]),[x,S]=(0,O.useState)([]),[C,w]=(0,O.useState)({}),[T,E]=(0,O.useState)(!0),[D,k]=(0,O.useState)(!1),[ue,P]=(0,O.useState)(0),F=e=>{let t=e.trim().split(/\r?\n/).filter(Boolean);if(t.length<2)return;let n=e=>{let t=[],n=``,r=!1;for(let i=0;i<e.length;i++){let a=e[i];a===`"`?r=!r:a===`,`&&!r?(t.push(n.trim()),n=``):n+=a}return t.push(n.trim()),t},r=n(t[0]),i=[];for(let e=1;e<t.length;e++){let a=n(t[e]),o={};r.forEach((e,t)=>{o[e]=a[t]||``}),i.push(o)}oe(r),S(i);let a={},o=u===`contact`?M:N;r.forEach(e=>{let t=e.toLowerCase(),n=o.find(e=>{let n=e.label.toLowerCase();return t===e.key.toLowerCase()||t===n||t.includes(n)||n.includes(t)});n?a[e]=n.key:a[e]=``}),w(a)},I=e=>{p(e);let t=e===`contact`?le:j;g(t),_(`образец_${e===`contact`?`контактов`:`товаров`}.csv`),F(t),l(2)},L=e=>{let t=e.target.files?.[0];if(!t)return;_(t.name);let n=new FileReader;n.onload=e=>{let t=e.target?.result;g(t),F(t),l(2)},n.readAsText(t)},R=x.map((e,t)=>{let n={};Object.entries(C).forEach(([t,r])=>{r&&(n[r]=e[t]||``)});let r=[];if(u===`contact`)n.firstName?.trim()||r.push(`Имя обязательно`),n.lastName?.trim()||r.push(`Фамилия обязательна`),n.email&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n.email)&&r.push(`Некорректный email: "${n.email}"`);else if(n.sku?.trim()||r.push(`Артикул (SKU) обязателен`),n.name?.trim()||r.push(`Наименование обязательно`),n.price){let e=Number(n.price);(isNaN(e)||e<=0)&&r.push(`Цена должна быть положительным числом: "${n.price}"`)}else r.push(`Цена обязательна`);return{rowIndex:t+1,raw:e,mapped:n,isValid:r.length===0,errors:r}}),z=R.filter(e=>e.isValid).length,de=R.filter(e=>!e.isValid).length,B=async()=>{k(!0);try{let e=T?R.filter(e=>e.isValid):R,n=0;if(u===`contact`)for(let t of e)await b.contacts.create({firstName:t.mapped.firstName||`Контакт`,lastName:t.mapped.lastName||``,phone:t.mapped.phone||``,email:t.mapped.email||``,roles:[`client`],status:`active`}),n++;else for(let t of e){let e=Math.round(Number(t.mapped.price)||1e4);await ae.products.create({sku:t.mapped.sku||`SKU-${c()}`,name:t.mapped.name||`Товар`,categoryId:`cat_default`,isService:!1,trackInventory:!0,status:`active`,price:{minor:e,currency:`RUB`},costPrice:{minor:Math.round(e*.6),currency:`RUB`},unit:t.mapped.unit||`шт`}),n++}P(n),l(4),i(`Успешно импортировано ${n} записей в IndexedDB!`,`success`),t&&t(n)}catch(e){i(`Ошибка импорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{k(!1)}},V=u===`contact`?M:N;return(0,A.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-6`,children:[(0,A.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-4 border-b border-krona-border pb-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`h2`,{className:`text-base font-bold text-krona-primary`,children:`Мастер импорта данных из CSV`}),(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:u===`contact`?`Контакты CRM`:`Товары`})]}),(0,A.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Пакетная загрузка записей с проверкой форматов, сопоставлением колонок и отчетом валидации`})]}),(0,A.jsx)(`div`,{className:`flex items-center gap-2 text-xs`,children:[{num:1,label:`Файл`},{num:2,label:`Сопоставление`},{num:3,label:`Валидация`},{num:4,label:`Готово`}].map(e=>(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,A.jsx)(`span`,{className:`w-6 h-6 rounded-full flex items-center justify-center font-bold text-xs ${o===e.num?`bg-krona-green text-white shadow-sm`:o>e.num?`bg-[#2F684C]/20 text-krona-green`:`bg-krona-workspace text-krona-secondary border border-krona-border`}`,children:o>e.num?(0,A.jsx)(m,{className:`w-3.5 h-3.5`}):e.num}),(0,A.jsx)(`span`,{className:`hidden sm:inline font-medium ${o===e.num?`text-krona-primary`:`text-krona-secondary`}`,children:e.label}),e.num<4&&(0,A.jsx)(`div`,{className:`w-4 h-0.5 bg-krona-border`})]},e.num))})]}),o===1&&(0,A.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-4`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Целевая сущность`}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsxs)(`button`,{type:`button`,onClick:()=>p(`contact`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`contact`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Контакты`}),(0,A.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Физлица, клиенты, сотрудники контрагентов`})]}),(0,A.jsxs)(`button`,{type:`button`,onClick:()=>p(`product`),className:`flex-1 p-3 rounded-lg border text-left text-xs transition-all ${u===`product`?`border-krona-green bg-krona-green/10 text-krona-primary font-semibold`:`border-krona-border bg-krona-workspace text-krona-secondary hover:border-krona-border/80`}`,children:[(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Товары`}),(0,A.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Номенклатура, артикулы, цены и остатки`})]})]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Быстрый старт с образцами данных`}),(0,A.jsxs)(`div`,{className:`space-y-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>I(`contact`),children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 text-amber-500 mr-2`}),`Загрузить образец контактов (с корректными и ошибочными строками)`]}),(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>I(`product`),children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 text-emerald-500 mr-2`}),`Загрузить образец товаров (с корректными и ошибочными строками)`]})]})]})]}),(0,A.jsxs)(`div`,{className:`border-2 border-dashed border-krona-border hover:border-krona-green rounded-xl p-8 text-center transition-colors bg-krona-workspace/40`,children:[(0,A.jsx)(ce,{className:`w-10 h-10 text-krona-secondary mx-auto mb-2`}),(0,A.jsx)(`div`,{className:`text-xs font-medium text-krona-primary`,children:`Перетащите сюда файл .csv или выберите на диске`}),(0,A.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Поддерживается разделитель запятая (,), кодировка UTF-8`}),(0,A.jsxs)(`label`,{className:`mt-3 inline-block cursor-pointer`,children:[(0,A.jsxs)(`span`,{className:`px-3.5 py-1.5 rounded-lg bg-krona-green text-white text-xs font-medium hover:bg-krona-green/90 transition-colors shadow-sm inline-flex items-center gap-1.5`,children:[(0,A.jsx)(d,{className:`w-3.5 h-3.5`}),` Выбрать файл на компьютере`]}),(0,A.jsx)(`input`,{type:`file`,accept:`.csv,text/csv`,onChange:L,className:`hidden`})]})]})]}),o===2&&(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Файл: `}),(0,A.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:ie}),(0,A.jsx)(`span`,{className:`text-krona-secondary ml-3`,children:`Строк: `}),(0,A.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:x.length})]}),(0,A.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>l(1),children:`Выбрать другой файл`})]}),(0,A.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Колонка в CSV-файле`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Пример значения (первая строка)`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поле в системе Krona`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:y.map(e=>(0,A.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50`,children:[(0,A.jsx)(`td`,{className:`p-3 font-semibold text-krona-primary`,children:e}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary truncate max-w-xs`,children:x[0]?.[e]||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsxs)(`select`,{value:C[e]||``,onChange:t=>w({...C,[e]:t.target.value}),className:`w-64 px-2.5 py-1 text-xs bg-krona-workspace border border-krona-border rounded-md text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,A.jsx)(`option`,{value:``,children:`-- Не импортировать --`}),V.map(e=>(0,A.jsxs)(`option`,{value:e.key,children:[e.label,` `,e.required?`*`:``]},e.key))]})})]},e))})]})}),(0,A.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(1),children:[(0,A.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>l(3),children:[`Перейти к валидации `,(0,A.jsx)(ne,{className:`w-3.5 h-3.5 ml-1`})]})]})]}),o===3&&(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace/60`,children:[(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary uppercase font-semibold`,children:`Всего строк в файле`}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-1`,children:R.length})]}),(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-emerald-500/30 bg-emerald-500/10`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-emerald-700 dark:text-emerald-300 uppercase font-semibold flex items-center gap-1`,children:[(0,A.jsx)(f,{className:`w-3.5 h-3.5`}),` Корректные строки`]}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-emerald-600 dark:text-emerald-400 mt-1`,children:z})]}),(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-rose-500/30 bg-rose-500/10`,children:[(0,A.jsxs)(`div`,{className:`text-[11px] text-rose-700 dark:text-rose-300 uppercase font-semibold flex items-center gap-1`,children:[(0,A.jsx)(te,{className:`w-3.5 h-3.5`}),` Строки с ошибками`]}),(0,A.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-1`,children:de})]})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-2 text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,A.jsx)(`input`,{type:`checkbox`,id:`skipErrors`,checked:T,onChange:e=>E(e.target.checked),className:`rounded border-krona-border text-krona-green focus:ring-krona-green`}),(0,A.jsxs)(`label`,{htmlFor:`skipErrors`,className:`text-krona-primary font-medium cursor-pointer`,children:[`Импортировать только корректные строки (`,z,` из `,R.length,`), пропуская ошибочные`]})]}),(0,A.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-x-auto max-h-80`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border sticky top-0`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-2.5 font-semibold w-12`,children:`№`}),(0,A.jsx)(`th`,{className:`p-2.5 font-semibold w-24`,children:`Статус`}),V.map(e=>(0,A.jsx)(`th`,{className:`p-2.5 font-semibold`,children:e.label},e.key)),(0,A.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Ошибки / Замечания`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:R.map(e=>(0,A.jsxs)(`tr`,{className:`transition-colors ${e.isValid?`hover:bg-krona-workspace/40`:`bg-rose-500/5 hover:bg-rose-500/10`}`,children:[(0,A.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.rowIndex}),(0,A.jsx)(`td`,{className:`p-2.5`,children:e.isValid?(0,A.jsx)(a,{variant:`green`,size:`sm`,children:`Корректно`}):(0,A.jsx)(a,{variant:`danger`,size:`sm`,children:`Ошибка`})}),V.map(t=>(0,A.jsx)(`td`,{className:`p-2.5 text-krona-primary font-medium`,children:e.mapped[t.key]||(0,A.jsx)(`span`,{className:`text-krona-secondary italic`,children:`—`})},t.key)),(0,A.jsx)(`td`,{className:`p-2.5 text-xs text-rose-600 dark:text-rose-400`,children:e.errors.length>0?(0,A.jsx)(`ul`,{className:`list-disc pl-4 space-y-0.5`,children:e.errors.map((e,t)=>(0,A.jsx)(`li`,{children:e},t))}):(0,A.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 flex items-center gap-1`,children:[(0,A.jsx)(m,{className:`w-3 h-3`}),` Проверка пройдена`]})})]},e.rowIndex))})]})}),(0,A.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,A.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(2),children:[(0,A.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,disabled:D||T&&z===0,onClick:B,children:D?(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(se,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}),` Выполняется импорт...`]}):(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(ee,{className:`w-3.5 h-3.5 mr-1.5`}),` Импортировать `,T?z:R.length,` записей в базу`]})})]})]}),o===4&&(0,A.jsxs)(`div`,{className:`text-center py-8 space-y-4 animate-fade-in`,children:[(0,A.jsx)(`div`,{className:`w-14 h-14 rounded-full bg-emerald-500/20 text-emerald-600 dark:text-emerald-400 flex items-center justify-center mx-auto`,children:(0,A.jsx)(f,{className:`w-8 h-8`})}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`h3`,{className:`text-lg font-bold text-krona-primary`,children:`Импорт успешно завершен!`}),(0,A.jsxs)(`p`,{className:`text-xs text-krona-secondary max-w-md mx-auto mt-1`,children:[`В локальную базу данных IndexedDB успешно добавлено`,` `,(0,A.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:ue}),` записей`,` `,`(`,u===`contact`?`контактов`:`товаров`,`). Данные мгновенно доступны для использования во всех модулях платформы.`]})]}),(0,A.jsxs)(`div`,{className:`flex justify-center gap-2 pt-3`,children:[n&&(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Закрыть мастер`}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,onClick:()=>{l(1),g(``),_(``),S([])},children:`Импортировать еще файл`})]})]})]})},P=[{key:`prospecting`,label:`Первичный контакт`,color:`border-sky-500/40`},{key:`discovery`,label:`Квалификация`,color:`border-indigo-500/40`},{key:`proposal`,label:`Предложение`,color:`border-amber-500/40`},{key:`negotiation`,label:`Переговоры`,color:`border-orange-500/40`},{key:`contract`,label:`Согласование`,color:`border-purple-500/40`},{key:`won`,label:`Выиграна`,color:`border-emerald-500/60 bg-emerald-500/5`},{key:`lost`,label:`Проиграна`,color:`border-rose-500/40 bg-rose-500/5`}],F=()=>{let t=re(),{showToast:n}=s(),{contacts:i,companies:o,leads:c,deals:d,createContact:f,createCompany:ee,createDeal:te,createLead:h,updateDeal:ae,convertLead:b,getTimeline:S,createActivity:se}=k(),{orders:D,createOrder:le}=T(),j=g(`contact`),M=g(`company`),N=g(`deal`),F=g(`lead`),[I,L]=(0,O.useState)(()=>{let e=t.pathname;return e.includes(`/crm/deals`)?`deals`:e.includes(`/crm/leads`)?`leads`:e.includes(`/crm/companies`)?`companies`:e.includes(`/crm/import`)?`import`:e.includes(`/crm/contacts`)||e===`/crm`?`contacts`:`deals`}),[R,z]=(0,O.useState)(``),[de,B]=(0,O.useState)(!1),[V,H]=(0,O.useState)(!1),[fe,U]=(0,O.useState)(!1),[pe,W]=(0,O.useState)(!1),[me,G]=(0,O.useState)(!1),[he,ge]=(0,O.useState)(null),[_e,ve]=(0,O.useState)(``),[ye,K]=(0,O.useState)(!1),[q,be]=(0,O.useState)(null),[xe,Se]=(0,O.useState)(``),[Ce,we]=(0,O.useState)(`wh_main`),[J,Y]=(0,O.useState)(null),[X,Te]=(0,O.useState)(null),[Z,Ee]=(0,O.useState)(`overview`),[De,Q]=(0,O.useState)([]),[Oe,ke]=(0,O.useState)(``),[Ae,je]=(0,O.useState)(`call`),[Me,Ne]=(0,O.useState)(null),[Pe,Fe]=(0,O.useState)(t.pathname);if(Pe!==t.pathname){Fe(t.pathname);let e=t.pathname;e.includes(`/crm/deals`)?L(`deals`):e.includes(`/crm/leads`)?L(`leads`):e.includes(`/crm/companies`)?L(`companies`):e.includes(`/crm/import`)?L(`import`):(e.includes(`/crm/contacts`)||e===`/crm`)&&L(`contacts`)}O.useEffect(()=>{let e=!0;return J?S(`contact`,J.id).then(t=>{e&&Q(t)}).catch(()=>{}):X&&S(`company`,X.id).then(t=>{e&&Q(t)}).catch(()=>{}),()=>{e=!1}},[J,X,S]);let Ie=async(e,t)=>{let r=d.find(t=>t.id===e);r&&(await ae(e,{stage:t}),n(`Сделка «${r.title}» переведена на этап: ${P.find(e=>e.key===t)?.label}`,`info`),t===`won`&&(be(r),Se(`Заказ по сделке: ${r.title}`),K(!0)))},Le=(e,t)=>{e.dataTransfer.setData(`text/plain`,t),Ne(t)},Re=e=>{e.preventDefault()},ze=async(e,t)=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`)||Me;n&&await Ie(n,t),Ne(null)},Be=async()=>{if(q)try{let t=i.find(e=>e.id===q.contactId),r=o.find(e=>e.id===q.companyId),a=t?`${t.firstName} ${t.lastName}`:r?.name||`Клиент`,s=q.contactId||q.companyId||`cnt_default`,c=`ORD-${e().slice(-6)}`;await le({orderNumber:c,customerType:q.contactId?`contact`:`company`,customerId:s,customerName:a,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${e()}`,productId:`prd_coffee_beans`,sku:`COF-100`,name:q.title,quantity:1,unitPrice:q.amount,discountMinor:0,totalPrice:q.amount}],subtotal:q.amount,discountMinor:0,taxMinor:Math.round(q.amount.minor*.2),shippingMinor:0,total:q.amount,channel:`b2b`}),n(`Связанный Заказ ${c} успешно создан в Коммерции!`,`success`),K(!1),be(null)}catch(e){n(`Ошибка создания заказа: ${e instanceof Error?e.message:String(e)}`,`error`)}},Ve=async()=>{if(he)try{let e=await b(he.id,_e);n(`Лид конвертирован! Создана сделка «${e.deal.title}»`,`success`),G(!1),ge(null)}catch(e){n(`Ошибка конвертации: ${e instanceof Error?e.message:String(e)}`,`error`)}},He=async e=>{if(e.preventDefault(),!Oe)return;let t=J?`contact`:`company`,r=J?.id||X?.id||``;await se({targetEntityType:t,targetEntityId:r,type:Ae,title:Oe,completed:!1,dueDate:new Date(Date.now()+864e5).toISOString()}),ke(``),n(`Активность запланирована`,`success`),S(t,r).then(Q).catch(()=>{})},$=J?.id||X?.id||``,Ue=(0,O.useMemo)(()=>d.filter(e=>e.contactId===$||e.companyId===$),[d,$]),We=(0,O.useMemo)(()=>D.filter(e=>e.customerId===$),[D,$]);return(0,A.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,A.jsxs)(`div`,{className:`flex flex-col sm:flex-row sm:items-center justify-between gap-3 bg-krona-surface p-3.5 rounded-xl border border-krona-border shadow-krona-soft`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`CRM: Клиенты, Воронка продаж & Сделки`}),(0,A.jsx)(x,{level:`pilot1`,size:`sm`})]}),(0,A.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной процесс: Лид → Контакт/Компания → Сделка (Kanban) → Выиграна → Заказ в Коммерции`})]}),(0,A.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[(0,A.jsxs)(`button`,{onClick:()=>L(`deals`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`deals`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Воронка сделок (`,d.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`contacts`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`contacts`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Контакты (`,i.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`companies`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`companies`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Компании (`,o.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`leads`),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${I===`leads`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[`Лиды (`,c.length,`)`]}),(0,A.jsxs)(`button`,{onClick:()=>L(`import`),className:`px-3 py-1.5 rounded-lg font-medium transition-all flex items-center gap-1 ${I===`import`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[(0,A.jsx)(ce,{className:`w-3.5 h-3.5`}),` Импорт CSV`]})]})]}),I===`deals`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по сделкам...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>U(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новая сделка`]})]}),(0,A.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 lg:grid-cols-7 gap-2.5 overflow-x-auto pb-4`,children:P.map(e=>{let t=d.filter(t=>t.stage===e.key&&(t.title.toLowerCase().includes(R.toLowerCase())||!R)),n=t.reduce((e,t)=>e+t.amount.minor,0);return(0,A.jsxs)(`div`,{"data-testid":`kanban-column-${e.key}`,onDragOver:Re,onDrop:t=>ze(t,e.key),className:`bg-krona-surface/70 border rounded-xl p-2.5 flex flex-col min-w-[200px] max-h-[750px] shadow-krona-soft transition-all ${e.color}`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between border-b border-krona-border/60 pb-2 mb-2`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:e.label}),(0,A.jsx)(`div`,{className:`text-[11px] font-medium text-krona-green mt-0.5`,children:E(n)})]}),(0,A.jsx)(`span`,{className:`text-[11px] px-1.5 py-0.5 rounded-full bg-krona-workspace text-krona-secondary font-bold`,children:t.length})]}),(0,A.jsxs)(`div`,{className:`space-y-2 overflow-y-auto flex-1 pr-0.5`,children:[t.map(e=>{let t=i.find(t=>t.id===e.contactId),n=o.find(t=>t.id===e.companyId),r=P.findIndex(t=>t.key===e.stage)+1,a=P[r]?.key;return(0,A.jsxs)(`div`,{"data-testid":`deal-card-${e.id}`,"data-deal-id":e.id,"data-deal-stage":e.stage,draggable:!0,onDragStart:t=>Le(t,e.id),className:`bg-krona-workspace border border-krona-border hover:border-krona-green/60 p-2.5 rounded-lg text-xs space-y-2 shadow-xs cursor-grab active:cursor-grabbing transition-all`,children:[(0,A.jsx)(`div`,{className:`font-semibold text-krona-primary line-clamp-2`,children:e.title}),(0,A.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,A.jsx)(`span`,{className:`font-bold text-krona-primary`,children:E(e.amount.minor)}),(0,A.jsxs)(`span`,{className:`px-1.5 py-0.2 bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 rounded font-medium`,children:[e.probability,`% вер.`]})]}),(t||n)&&(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary truncate flex items-center gap-1`,children:[(0,A.jsx)(u,{className:`w-3 h-3`}),n?.name||`${t?.firstName} ${t?.lastName}`]}),a&&e.stage!==`won`&&e.stage!==`lost`&&(0,A.jsxs)(`button`,{type:`button`,onClick:()=>Ie(e.id,a),className:`w-full mt-1 py-1 text-[11px] bg-krona-surface hover:bg-krona-green/10 text-krona-secondary hover:text-krona-green border border-krona-border rounded flex items-center justify-center gap-1 transition-colors`,children:[`Далее: `,P[r]?.label,` `,(0,A.jsx)(ne,{className:`w-3 h-3`})]})]},e.id)}),t.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-[11px] text-krona-secondary italic`,children:`Пусто`})]})]},e.key)})})]}),I===`contacts`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по имени, телефону, email...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>B(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новый контакт`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`ФИО / Контакт`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Компания`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Email`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:i.filter(e=>`${e.firstName} ${e.lastName}`.toLowerCase().includes(R.toLowerCase())||e.phone?.includes(R)||e.email?.toLowerCase().includes(R.toLowerCase())).map(e=>{let t=o.find(t=>t.id===e.companyId);return(0,A.jsxs)(`tr`,{onClick:()=>{Y(e),Te(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsxs)(`div`,{className:`w-7 h-7 rounded-full bg-krona-green/10 text-krona-green flex items-center justify-center font-bold text-xs`,children:[e.firstName[0],e.lastName?.[0]]}),(0,A.jsxs)(`div`,{children:[(0,A.jsxs)(`div`,{children:[e.firstName,` `,e.lastName]}),e.jobTitle&&(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.jobTitle})]})]})}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:t?.name||`—`}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.email||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:(0,A.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,A.jsx)(p,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)})})]})})]}),I===`companies`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск по названию, ИНН...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>H(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новая компания`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название компании`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`ИНН`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Город`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:o.filter(e=>e.name.toLowerCase().includes(R.toLowerCase())||e.inn?.includes(R)||e.address?.toLowerCase().includes(R.toLowerCase())).map(e=>(0,A.jsxs)(`tr`,{onClick:()=>{Te(e),Y(null)},className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,A.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,A.jsx)(u,{className:`w-4 h-4 text-krona-secondary`}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold`,children:e.name}),e.legalName&&(0,A.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.legalName})]})]})}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.inn||`—`}),(0,A.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.address||`—`}),(0,A.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,A.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:(0,A.jsxs)(r,{variant:`ghost`,size:`sm`,children:[`Карточка 360 `,(0,A.jsx)(p,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id))})]})})]}),I===`leads`&&(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsxs)(`div`,{className:`relative w-64`,children:[(0,A.jsx)(w,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,A.jsx)(`input`,{type:`text`,value:R,onChange:e=>z(e.target.value),placeholder:`Поиск лидов...`,className:`w-full pl-8 pr-3 py-1.5 text-xs bg-krona-surface border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`new-lead-btn`,onClick:()=>W(!0),children:[(0,A.jsx)(C,{className:`w-3.5 h-3.5 mr-1`}),` Новый лид`]})]}),(0,A.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,A.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,A.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,A.jsxs)(`tr`,{children:[(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название лида`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контактное лицо`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контакты`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оценка бюджета`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`}),(0,A.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Конвертация`})]})}),(0,A.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:c.map(e=>(0,A.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,A.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.title}),(0,A.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.contactName}),(0,A.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[(0,A.jsx)(`div`,{children:e.phone}),(0,A.jsx)(`div`,{className:`text-[11px]`,children:e.email})]}),(0,A.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:e.estimatedValue?E(e.estimatedValue.minor):`—`}),(0,A.jsx)(`td`,{className:`p-3`,children:(0,A.jsx)(a,{variant:e.status===`converted`?`green`:e.status===`disqualified`?`danger`:`warning`,size:`sm`,children:e.status===`converted`?`Конвертирован`:e.status===`new`?`Новый`:e.status})}),(0,A.jsx)(`td`,{className:`p-3 text-right`,children:e.status===`converted`?(0,A.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 text-xs font-semibold flex items-center justify-end gap-1`,children:[(0,A.jsx)(m,{className:`w-3.5 h-3.5`}),` Сделка создана`]}):(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`convert-lead-btn`,onClick:()=>{ge(e),ve(`Сделка: ${e.title}`),G(!0)},children:[(0,A.jsx)(v,{className:`w-3.5 h-3.5 mr-1`}),` Конвертировать в сделку`]})})]},e.id))})]})})]}),I===`import`&&(0,A.jsx)(ue,{initialEntityType:`contact`}),(0,A.jsx)(_,{isOpen:!!(J||X),onClose:()=>{Y(null),Te(null),Q([])},title:J?`${J.firstName} ${J.lastName} (Customer 360)`:`${X?.name} (Company 360)`,size:`lg`,children:(0,A.jsxs)(`div`,{className:`space-y-4`,children:[(0,A.jsx)(`div`,{className:`flex border-b border-krona-border text-xs`,children:[`overview`,`deals`,`orders`,`activities`,`timeline`].map(e=>(0,A.jsxs)(`button`,{onClick:()=>Ee(e),className:`px-3.5 py-2 font-semibold capitalize transition-colors border-b-2 ${Z===e?`border-krona-green text-krona-green`:`border-transparent text-krona-secondary hover:text-krona-primary`}`,children:[e===`overview`&&`Обзор`,e===`deals`&&`Сделки (${Ue.length})`,e===`orders`&&`Заказы (${We.length})`,e===`activities`&&`Задачи & Звонки`,e===`timeline`&&`Таймлайн (${De.length})`]},e))}),Z===`overview`&&(0,A.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,A.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 bg-krona-workspace p-3.5 rounded-lg border border-krona-border`,children:[J&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`ФИО:`}),` `,(0,A.jsxs)(`strong`,{className:`text-krona-primary`,children:[J.firstName,` `,J.lastName]})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.phone||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Email:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.email||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Должность:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:J.jobTitle||`—`})]})]}),X&&(0,A.jsxs)(A.Fragment,{children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Название:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.name})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`ИНН:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.inn||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Адрес:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.address||`—`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:X.phone||`—`})]})]})]}),(0,A.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border`,children:[(0,A.jsx)(`div`,{className:`font-semibold text-krona-primary mb-1`,children:`Кастомные атрибуты (Схема Krona Studio):`}),J?.customFields&&Object.keys(J.customFields).length>0||X?.customFields&&Object.keys(X.customFields).length>0?(0,A.jsx)(`div`,{className:`grid grid-cols-2 gap-2 mt-2`,children:Object.entries(J?.customFields||X?.customFields).map(([e,t])=>(0,A.jsxs)(`div`,{className:`text-xs`,children:[(0,A.jsxs)(`span`,{className:`text-krona-secondary`,children:[e,`:`]}),` `,(0,A.jsx)(`strong`,{className:`text-krona-primary`,children:String(t)})]},e))}):(0,A.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Дополнительные поля из Конструктора полей отображаются здесь в реальном времени.`})]})]}),Z===`deals`&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[Ue.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-primary`,children:e.title}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[`Этап:`,` `,(0,A.jsx)(`span`,{className:`font-semibold`,children:P.find(t=>t.key===e.stage)?.label})]})]}),(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-green`,children:E(e.amount.minor)}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.probability,`% вер.`]})]})]},e.id)),Ue.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных сделок`})]}),Z===`orders`&&(0,A.jsxs)(`div`,{className:`space-y-2`,children:[We.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`div`,{className:`font-bold font-mono text-krona-primary`,children:e.orderNumber}),(0,A.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.items.length,` поз. • Статус: `,e.status]})]}),(0,A.jsxs)(`div`,{className:`text-right`,children:[(0,A.jsx)(`div`,{className:`font-bold text-krona-green`,children:E(e.total.minor)}),(0,A.jsx)(a,{variant:e.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:e.paymentStatus})]})]},e.id)),We.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных заказов`})]}),Z===`activities`&&(0,A.jsx)(`div`,{className:`space-y-3`,children:(0,A.jsxs)(`form`,{onSubmit:He,className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,A.jsx)(`div`,{className:`text-xs font-semibold text-krona-primary`,children:`Запланировать активность:`}),(0,A.jsxs)(`div`,{className:`flex gap-2`,children:[(0,A.jsxs)(`select`,{value:Ae,onChange:e=>je(e.target.value),className:`px-2.5 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`,children:[(0,A.jsx)(`option`,{value:`call`,children:`Звонок`}),(0,A.jsx)(`option`,{value:`meeting`,children:`Встреча`}),(0,A.jsx)(`option`,{value:`task`,children:`Задача`}),(0,A.jsx)(`option`,{value:`email`,children:`Email`})]}),(0,A.jsx)(`input`,{type:`text`,value:Oe,onChange:e=>ke(e.target.value),placeholder:`Например: Обсудить коммерческое предложение...`,className:`flex-1 px-3 py-1 text-xs bg-krona-surface border border-krona-border rounded-md text-krona-primary`}),(0,A.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,children:`Добавить`})]})]})}),Z===`timeline`&&(0,A.jsxs)(`div`,{className:`space-y-2.5 max-h-96 overflow-y-auto pr-1`,children:[De.map(e=>(0,A.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace text-xs space-y-1`,children:[(0,A.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,A.jsx)(`span`,{className:`font-bold text-krona-primary`,children:e.title}),(0,A.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:oe(e.timestamp)})]}),e.description&&(0,A.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:e.description}),(0,A.jsxs)(`div`,{className:`text-[10px] text-krona-green font-medium`,children:[`Автор: `,e.actor]})]},e.id)),De.length===0&&(0,A.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Таймлайн пуст`})]})]})}),(0,A.jsx)(y,{isOpen:ye,onClose:()=>K(!1),title:`Сделка выиграна! Создать заказ в Коммерции?`,size:`md`,children:(0,A.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,A.jsxs)(`div`,{className:`p-3 bg-emerald-500/10 border border-emerald-500/30 rounded-lg text-emerald-800 dark:text-emerald-300`,children:[(0,A.jsx)(`strong`,{children:`Поздравляем с успехом!`}),` Сделка «`,q?.title,`» переведена в статус «Выиграна». Система предлагает автоматически сформировать коммерческий Заказ.`]}),(0,A.jsxs)(`div`,{className:`space-y-3`,children:[(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Наименование заказа:`}),(0,A.jsx)(`input`,{type:`text`,value:xe,onChange:e=>Se(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма заказа (RUB):`}),(0,A.jsx)(`div`,{className:`font-bold text-sm text-krona-green py-1`,children:q?E(q.amount.minor):`0 ₽`})]}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад отгрузки:`}),(0,A.jsxs)(`select`,{value:Ce,onChange:e=>we(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`,children:[(0,A.jsx)(`option`,{value:`wh_main`,children:`Основной распределительный склад (Москва)`}),(0,A.jsx)(`option`,{value:`wh_spb`,children:`Склад Санкт-Петербург`})]})]})]}),(0,A.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>K(!1),children:`Не создавать сейчас`}),(0,A.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`create-order-confirm-btn`,onClick:Be,children:[(0,A.jsx)(ie,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ в Коммерции`]})]})]})}),(0,A.jsx)(y,{isOpen:me,onClose:()=>G(!1),title:`Конвертация лида в сделку и контакт`,size:`md`,children:(0,A.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,A.jsx)(`p`,{className:`text-krona-secondary`,children:`При конвертации будет автоматически создан Контакт клиента и новая Сделка на этапе «Предложение».`}),(0,A.jsxs)(`div`,{children:[(0,A.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Название новой сделки:`}),(0,A.jsx)(`input`,{type:`text`,value:_e,onChange:e=>ve(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary`})]}),(0,A.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,A.jsx)(r,{variant:`secondary`,size:`sm`,onClick:()=>G(!1),children:`Отмена`}),(0,A.jsx)(r,{variant:`primary`,size:`sm`,"data-testid":`confirm-convert-lead-btn`,onClick:Ve,children:`Подтвердить конвертацию`})]})]})}),(0,A.jsx)(y,{isOpen:pe,onClose:()=>W(!1),title:`Создание нового лида`,size:`lg`,children:F.currentEntity?(0,A.jsx)(l,{entity:F.currentEntity,layout:F.layouts?.[0]||null,mode:`create`,onSave:async e=>{await h({title:String(e.title||`Новый лид`),contactName:String(e.contactName||e.title||`Контактное лицо`),phone:String(e.phone||`+7 (999) 000-00-00`),email:String(e.email||`lead@example.com`),companyName:String(e.companyName||``),status:`new`,source:`website`,estimatedValue:e.estimatedValue?{minor:Number(e.estimatedValue)||1e6,currency:`RUB`}:{minor:15e5,currency:`RUB`},customFields:e}),W(!1),n(`Лид успешно создан!`,`success`)},onCancel:()=>W(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:de,onClose:()=>B(!1),title:`Создание нового контакта`,size:`lg`,children:j.currentEntity?(0,A.jsx)(l,{entity:j.currentEntity,layout:j.layouts?.[0]||null,mode:`create`,onSave:async e=>{await f({firstName:String(e.firstName||`Новый`),lastName:String(e.lastName||`Контакт`),phone:String(e.phone||``),email:String(e.email||``),jobTitle:String(e.jobTitle||``),roles:[`client`],status:`active`,customFields:e}),B(!1),n(`Контакт успешно создан!`,`success`)},onCancel:()=>B(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:V,onClose:()=>H(!1),title:`Создание новой компании`,size:`lg`,children:M.currentEntity?(0,A.jsx)(l,{entity:M.currentEntity,layout:M.layouts?.[0]||null,mode:`create`,onSave:async e=>{await ee({name:String(e.name||`Новая компания`),inn:String(e.inn||``),address:String(e.city||e.address||`г. Москва`),phone:String(e.phone||``),roles:[`client`],status:`active`,customFields:e}),H(!1),n(`Компания успешно создана!`,`success`)},onCancel:()=>H(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,A.jsx)(y,{isOpen:fe,onClose:()=>U(!1),title:`Создание новой сделки`,size:`lg`,children:N.currentEntity?(0,A.jsx)(l,{entity:N.currentEntity,layout:N.layouts?.[0]||null,mode:`create`,onSave:async e=>{let t=typeof e.amount==`number`?e.amount:5e6;await te({title:String(e.title||`Новая сделка`),pipelineId:`pipe_default`,stage:`prospecting`,amount:{minor:t,currency:`RUB`},probability:20,contactId:i[0]?.id,companyId:o[0]?.id,customFields:e}),U(!1),n(`Сделка успешно создана в воронке!`,`success`)},onCancel:()=>U(!1)}):(0,A.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})})]})};export{F as CrmModule}; |