12 lines
No EOL
53 KiB
JavaScript
12 lines
No EOL
53 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-CeAKrqsO.js";import{t as u}from"./building-BdUpGLM5.js";import{t as d}from"./download-ByGeM7La.js";import{t as f}from"./file-text-DR21jZDS.js";import{$ as p,A as m,B as h,C as g,G as _,H as v,M as y,P as b,U as x,W as S,Y as C,g as w,j as T,n as E,p as D,r as O,t as k,x as A,y as j,z as M}from"./index-CyHCRa3Z.js";import{t as N}from"./useOrders-E7OnZAao.js";import{t as P}from"./currency-DdDs82F5.js";var F={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`]};F.node;var I=i(F),L=n(t(),1);function R(){let[e,t]=(0,L.useState)([]),[n,r]=(0,L.useState)([]),[i,a]=(0,L.useState)([]),[o,s]=(0,L.useState)([]),[c,l]=(0,L.useState)(!0),[u,d]=(0,L.useState)(null),f=(0,L.useCallback)(async()=>{try{l(!0),d(null);let[e,n,i,o]=await Promise.all([_.contacts.list({pageSize:100}),_.companies.list({pageSize:100}),_.leads.list({pageSize:100}),_.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,L.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>{e&&f()}),()=>{e=!1}},[f]),x(`records:changed`,e=>{(e.entityType===`contact`||e.entityType===`company`||e.entityType===`lead`||e.entityType===`deal`)&&f()}),x(`storage:reset`,f),x(`snapshot:imported`,f),{contacts:e,companies:n,leads:i,deals:o,loading:c,error:u,refetch:f,createContact:(0,L.useCallback)(async e=>_.contacts.create(e),[]),updateContact:(0,L.useCallback)(async(e,t)=>_.contacts.update(e,t),[]),deleteContact:(0,L.useCallback)(async e=>_.contacts.delete(e),[]),createCompany:(0,L.useCallback)(async e=>_.companies.create(e),[]),updateCompany:(0,L.useCallback)(async(e,t)=>_.companies.update(e,t),[]),deleteCompany:(0,L.useCallback)(async e=>_.companies.delete(e),[]),createDeal:(0,L.useCallback)(async e=>_.deals.create(e),[]),updateDeal:(0,L.useCallback)(async(e,t)=>_.deals.update(e,t),[]),deleteDeal:(0,L.useCallback)(async e=>_.deals.delete(e),[]),createLead:(0,L.useCallback)(async e=>_.leads.create(e),[]),updateLead:(0,L.useCallback)(async(e,t)=>_.leads.update(e,t),[]),deleteLead:(0,L.useCallback)(async e=>_.leads.delete(e),[]),convertLead:(0,L.useCallback)(async(e,t)=>_.convertLeadToDeal(e,t),[]),getTimeline:(0,L.useCallback)(async(e,t)=>_.getTimeline(e,t),[]),createActivity:(0,L.useCallback)(async e=>_.activities.create(e),[]),createNote:(0,L.useCallback)(async e=>_.notes.create(e),[])}}var z=o(),ee=`Имя,Фамилия,Телефон,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,ООО «Бьюти Групп»,Директор по маркетингу`,B=`Артикул,Наименование,Категория,Цена (коп),Единица
|
||
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,уп`,V=[{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}],H=[{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}],U=({initialEntityType:e=`contact`,onComplete:t,onClose:n})=>{let{showToast:i}=s(),[o,l]=(0,L.useState)(1),[u,p]=(0,L.useState)(e),[g,v]=(0,L.useState)(``),[y,x]=(0,L.useState)(``),[C,w]=(0,L.useState)([]),[E,O]=(0,L.useState)([]),[k,j]=(0,L.useState)({}),[N,P]=(0,L.useState)(!0),[F,R]=(0,L.useState)(!1),[U,W]=(0,L.useState)(0),G=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)}w(r),O(i);let a={},o=u===`contact`?V:H;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]=``}),j(a)},K=e=>{p(e);let t=e===`contact`?ee:B;v(t),x(`образец_${e===`contact`?`контактов`:`товаров`}.csv`),G(t),l(2)},te=e=>{let t=e.target.files?.[0];if(!t)return;x(t.name);let n=new FileReader;n.onload=e=>{let t=e.target?.result;v(t),G(t),l(2)},n.readAsText(t)},q=E.map((e,t)=>{let n={};Object.entries(k).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}}),J=q.filter(e=>e.isValid).length,ne=q.filter(e=>!e.isValid).length,Y=async()=>{R(!0);try{let e=N?q.filter(e=>e.isValid):q,n=0;if(u===`contact`)for(let t of e)await _.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 S.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++}W(n),l(4),i(`Успешно импортировано ${n} записей в IndexedDB!`,`success`),t&&t(n)}catch(e){i(`Ошибка импорта: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{R(!1)}},X=u===`contact`?V:H;return(0,z.jsxs)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft p-5 space-y-6`,children:[(0,z.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,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`h2`,{className:`text-base font-bold text-krona-primary`,children:`Мастер импорта данных из CSV`}),(0,z.jsx)(a,{variant:`gold`,size:`sm`,children:u===`contact`?`Контакты CRM`:`Товары`})]}),(0,z.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Пакетная загрузка записей с проверкой форматов, сопоставлением колонок и отчетом валидации`})]}),(0,z.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,z.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,z.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,z.jsx)(b,{className:`w-3.5 h-3.5`}):e.num}),(0,z.jsx)(`span`,{className:`hidden sm:inline font-medium ${o===e.num?`text-krona-primary`:`text-krona-secondary`}`,children:e.label}),e.num<4&&(0,z.jsx)(`div`,{className:`w-4 h-0.5 bg-krona-border`})]},e.num))})]}),o===1&&(0,z.jsxs)(`div`,{className:`space-y-5 animate-fade-in`,children:[(0,z.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-4`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Целевая сущность`}),(0,z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,z.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,z.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Контакты`}),(0,z.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Физлица, клиенты, сотрудники контрагентов`})]}),(0,z.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,z.jsx)(`div`,{className:`font-bold text-sm text-krona-primary`,children:`Товары`}),(0,z.jsx)(`div`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Номенклатура, артикулы, цены и остатки`})]})]})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block text-xs font-semibold text-krona-primary mb-1.5`,children:`Быстрый старт с образцами данных`}),(0,z.jsxs)(`div`,{className:`space-y-2`,children:[(0,z.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>K(`contact`),children:[(0,z.jsx)(D,{className:`w-3.5 h-3.5 text-amber-500 mr-2`}),`Загрузить образец контактов (с корректными и ошибочными строками)`]}),(0,z.jsxs)(r,{variant:`secondary`,size:`sm`,className:`w-full justify-start text-xs`,onClick:()=>K(`product`),children:[(0,z.jsx)(D,{className:`w-3.5 h-3.5 text-emerald-500 mr-2`}),`Загрузить образец товаров (с корректными и ошибочными строками)`]})]})]})]}),(0,z.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,z.jsx)(I,{className:`w-10 h-10 text-krona-secondary mx-auto mb-2`}),(0,z.jsx)(`div`,{className:`text-xs font-medium text-krona-primary`,children:`Перетащите сюда файл .csv или выберите на диске`}),(0,z.jsx)(`p`,{className:`text-[11px] text-krona-secondary mt-1`,children:`Поддерживается разделитель запятая (,), кодировка UTF-8`}),(0,z.jsxs)(`label`,{className:`mt-3 inline-block cursor-pointer`,children:[(0,z.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,z.jsx)(f,{className:`w-3.5 h-3.5`}),` Выбрать файл на компьютере`]}),(0,z.jsx)(`input`,{type:`file`,accept:`.csv,text/csv`,onChange:te,className:`hidden`})]})]})]}),o===2&&(0,z.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Файл: `}),(0,z.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:y}),(0,z.jsx)(`span`,{className:`text-krona-secondary ml-3`,children:`Строк: `}),(0,z.jsx)(`span`,{className:`font-semibold text-krona-primary`,children:E.length})]}),(0,z.jsx)(r,{variant:`ghost`,size:`sm`,onClick:()=>l(1),children:`Выбрать другой файл`})]}),(0,z.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-hidden`,children:(0,z.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,z.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,z.jsxs)(`tr`,{children:[(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Колонка в CSV-файле`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Пример значения (первая строка)`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Поле в системе Krona`})]})}),(0,z.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:C.map(e=>(0,z.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50`,children:[(0,z.jsx)(`td`,{className:`p-3 font-semibold text-krona-primary`,children:e}),(0,z.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary truncate max-w-xs`,children:E[0]?.[e]||`—`}),(0,z.jsx)(`td`,{className:`p-3`,children:(0,z.jsxs)(`select`,{value:k[e]||``,onChange:t=>j({...k,[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,z.jsx)(`option`,{value:``,children:`-- Не импортировать --`}),X.map(e=>(0,z.jsxs)(`option`,{value:e.key,children:[e.label,` `,e.required?`*`:``]},e.key))]})})]},e))})]})}),(0,z.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,z.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(1),children:[(0,z.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,z.jsxs)(r,{variant:`primary`,size:`sm`,onClick:()=>l(3),children:[`Перейти к валидации `,(0,z.jsx)(M,{className:`w-3.5 h-3.5 ml-1`})]})]})]}),o===3&&(0,z.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,z.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-3 gap-3`,children:[(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace/60`,children:[(0,z.jsx)(`div`,{className:`text-[11px] text-krona-secondary uppercase font-semibold`,children:`Всего строк в файле`}),(0,z.jsx)(`div`,{className:`text-xl font-bold text-krona-primary mt-1`,children:q.length})]}),(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-emerald-500/30 bg-emerald-500/10`,children:[(0,z.jsxs)(`div`,{className:`text-[11px] text-emerald-700 dark:text-emerald-300 uppercase font-semibold flex items-center gap-1`,children:[(0,z.jsx)(m,{className:`w-3.5 h-3.5`}),` Корректные строки`]}),(0,z.jsx)(`div`,{className:`text-xl font-bold text-emerald-600 dark:text-emerald-400 mt-1`,children:J})]}),(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-rose-500/30 bg-rose-500/10`,children:[(0,z.jsxs)(`div`,{className:`text-[11px] text-rose-700 dark:text-rose-300 uppercase font-semibold flex items-center gap-1`,children:[(0,z.jsx)(T,{className:`w-3.5 h-3.5`}),` Строки с ошибками`]}),(0,z.jsx)(`div`,{className:`text-xl font-bold text-rose-600 dark:text-rose-400 mt-1`,children:ne})]})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-2 text-xs bg-krona-workspace p-3 rounded-lg border border-krona-border`,children:[(0,z.jsx)(`input`,{type:`checkbox`,id:`skipErrors`,checked:N,onChange:e=>P(e.target.checked),className:`rounded border-krona-border text-krona-green focus:ring-krona-green`}),(0,z.jsxs)(`label`,{htmlFor:`skipErrors`,className:`text-krona-primary font-medium cursor-pointer`,children:[`Импортировать только корректные строки (`,J,` из `,q.length,`), пропуская ошибочные`]})]}),(0,z.jsx)(`div`,{className:`border border-krona-border rounded-lg overflow-x-auto max-h-80`,children:(0,z.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,z.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border sticky top-0`,children:(0,z.jsxs)(`tr`,{children:[(0,z.jsx)(`th`,{className:`p-2.5 font-semibold w-12`,children:`№`}),(0,z.jsx)(`th`,{className:`p-2.5 font-semibold w-24`,children:`Статус`}),X.map(e=>(0,z.jsx)(`th`,{className:`p-2.5 font-semibold`,children:e.label},e.key)),(0,z.jsx)(`th`,{className:`p-2.5 font-semibold`,children:`Ошибки / Замечания`})]})}),(0,z.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:q.map(e=>(0,z.jsxs)(`tr`,{className:`transition-colors ${e.isValid?`hover:bg-krona-workspace/40`:`bg-rose-500/5 hover:bg-rose-500/10`}`,children:[(0,z.jsx)(`td`,{className:`p-2.5 font-mono text-krona-secondary`,children:e.rowIndex}),(0,z.jsx)(`td`,{className:`p-2.5`,children:e.isValid?(0,z.jsx)(a,{variant:`green`,size:`sm`,children:`Корректно`}):(0,z.jsx)(a,{variant:`danger`,size:`sm`,children:`Ошибка`})}),X.map(t=>(0,z.jsx)(`td`,{className:`p-2.5 text-krona-primary font-medium`,children:e.mapped[t.key]||(0,z.jsx)(`span`,{className:`text-krona-secondary italic`,children:`—`})},t.key)),(0,z.jsx)(`td`,{className:`p-2.5 text-xs text-rose-600 dark:text-rose-400`,children:e.errors.length>0?(0,z.jsx)(`ul`,{className:`list-disc pl-4 space-y-0.5`,children:e.errors.map((e,t)=>(0,z.jsx)(`li`,{children:e},t))}):(0,z.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 flex items-center gap-1`,children:[(0,z.jsx)(b,{className:`w-3 h-3`}),` Проверка пройдена`]})})]},e.rowIndex))})]})}),(0,z.jsxs)(`div`,{className:`flex justify-between items-center pt-2`,children:[(0,z.jsxs)(r,{variant:`secondary`,size:`sm`,onClick:()=>l(2),children:[(0,z.jsx)(h,{className:`w-3.5 h-3.5 mr-1`}),` Назад`]}),(0,z.jsx)(r,{variant:`primary`,size:`sm`,disabled:F||N&&J===0,onClick:Y,children:F?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(A,{className:`w-3.5 h-3.5 mr-1.5 animate-spin`}),` Выполняется импорт...`]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(d,{className:`w-3.5 h-3.5 mr-1.5`}),` Импортировать `,N?J:q.length,` записей в базу`]})})]})]}),o===4&&(0,z.jsxs)(`div`,{className:`text-center py-8 space-y-4 animate-fade-in`,children:[(0,z.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,z.jsx)(m,{className:`w-8 h-8`})}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`h3`,{className:`text-lg font-bold text-krona-primary`,children:`Импорт успешно завершен!`}),(0,z.jsxs)(`p`,{className:`text-xs text-krona-secondary max-w-md mx-auto mt-1`,children:[`В локальную базу данных IndexedDB успешно добавлено`,` `,(0,z.jsx)(`strong`,{className:`text-krona-primary font-semibold`,children:U}),` записей`,` `,`(`,u===`contact`?`контактов`:`товаров`,`). Данные мгновенно доступны для использования во всех модулях платформы.`]})]}),(0,z.jsxs)(`div`,{className:`flex justify-center gap-2 pt-3`,children:[n&&(0,z.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Закрыть мастер`}),(0,z.jsx)(r,{variant:`primary`,size:`sm`,onClick:()=>{l(1),v(``),x(``),O([])},children:`Импортировать еще файл`})]})]})]})},W=[{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`}],G=({deals:e,contacts:t,companies:n,search:i,onSearchChange:a,onAddDeal:o,onStageChange:s})=>{let[c,l]=(0,L.useState)(null),d=(e,t)=>{e.dataTransfer.setData(`text/plain`,t),l(t)},f=e=>{e.preventDefault()},p=async(e,t)=>{e.preventDefault();let n=e.dataTransfer.getData(`text/plain`)||c;n&&await s(n,t),l(null)};return(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsxs)(`div`,{className:`relative w-64`,children:[(0,z.jsx)(j,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,z.jsx)(`input`,{type:`text`,value:i,onChange:e=>a(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,z.jsxs)(r,{variant:`primary`,size:`sm`,onClick:o,children:[(0,z.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),` Новая сделка`]})]}),(0,z.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 lg:grid-cols-7 gap-2.5 overflow-x-auto pb-4`,children:W.map(r=>{let a=e.filter(e=>e.stage===r.key&&(e.title.toLowerCase().includes(i.toLowerCase())||!i)),o=a.reduce((e,t)=>e+t.amount.minor,0);return(0,z.jsxs)(`div`,{"data-testid":`kanban-column-${r.key}`,onDragOver:f,onDrop:e=>p(e,r.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 ${r.color}`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between border-b border-krona-border/60 pb-2 mb-2`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`div`,{className:`text-xs font-bold text-krona-primary`,children:r.label}),(0,z.jsx)(`div`,{className:`text-[11px] font-medium text-krona-green mt-0.5`,children:P(o)})]}),(0,z.jsx)(`span`,{className:`text-[11px] px-1.5 py-0.5 rounded-full bg-krona-workspace text-krona-secondary font-bold`,children:a.length})]}),(0,z.jsxs)(`div`,{className:`space-y-2 overflow-y-auto flex-1 pr-0.5`,children:[a.map(e=>{let r=t.find(t=>t.id===e.contactId),i=n.find(t=>t.id===e.companyId),a=W.findIndex(t=>t.key===e.stage)+1,o=W[a]?.key;return(0,z.jsxs)(`div`,{"data-testid":`deal-card-${e.id}`,"data-deal-id":e.id,"data-deal-stage":e.stage,draggable:!0,onDragStart:t=>d(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,z.jsx)(`div`,{className:`font-semibold text-krona-primary line-clamp-2`,children:e.title}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between text-[11px]`,children:[(0,z.jsx)(`span`,{className:`font-bold text-krona-primary`,children:P(e.amount.minor)}),(0,z.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,`% вер.`]})]}),(r||i)&&(0,z.jsxs)(`div`,{className:`text-[11px] text-krona-secondary truncate flex items-center gap-1`,children:[(0,z.jsx)(u,{className:`w-3 h-3`}),i?.name||`${r?.firstName} ${r?.lastName}`]}),o&&e.stage!==`won`&&e.stage!==`lost`&&(0,z.jsxs)(`button`,{type:`button`,onClick:()=>s(e.id,o),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:[`Далее: `,W[a]?.label,` `,(0,z.jsx)(M,{className:`w-3 h-3`})]})]},e.id)}),a.length===0&&(0,z.jsx)(`div`,{className:`text-center py-6 text-[11px] text-krona-secondary italic`,children:`Пусто`})]})]},r.key)})})]})},K=({activeTab:e,search:t,onSearchChange:n,contacts:i,companies:o,leads:s,onSelectContact:c,onSelectCompany:l,onAddContact:d,onAddCompany:f,onAddLead:p,onConvertLead:m})=>e===`contacts`?(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsxs)(`div`,{className:`relative w-64`,children:[(0,z.jsx)(j,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,z.jsx)(`input`,{type:`text`,value:t,onChange:e=>n(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,z.jsxs)(r,{variant:`primary`,size:`sm`,onClick:d,children:[(0,z.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),` Новый контакт`]})]}),(0,z.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,z.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,z.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,z.jsxs)(`tr`,{children:[(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`ФИО / Контакт`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Компания`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Email`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,z.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:i.filter(e=>`${e.firstName} ${e.lastName}`.toLowerCase().includes(t.toLowerCase())||e.phone?.includes(t)||e.email?.toLowerCase().includes(t.toLowerCase())).map(e=>{let t=o.find(t=>t.id===e.companyId);return(0,z.jsxs)(`tr`,{onClick:()=>c(e),className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,z.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.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,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{children:[e.firstName,` `,e.lastName]}),e.jobTitle&&(0,z.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.jobTitle})]})]})}),(0,z.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:t?.name||`—`}),(0,z.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,z.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.email||`—`}),(0,z.jsx)(`td`,{className:`p-3`,children:(0,z.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,z.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,z.jsx)(`td`,{className:`p-3 text-right`,children:(0,z.jsxs)(r,{variant:`ghost`,size:`sm`,onClick:t=>{t.stopPropagation(),c(e)},children:[`Карточка 360 `,(0,z.jsx)(y,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id)})})]})})]}):e===`companies`?(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsxs)(`div`,{className:`relative w-64`,children:[(0,z.jsx)(j,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,z.jsx)(`input`,{type:`text`,value:t,onChange:e=>n(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,z.jsxs)(r,{variant:`primary`,size:`sm`,onClick:f,children:[(0,z.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),` Новая компания`]})]}),(0,z.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,z.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,z.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,z.jsxs)(`tr`,{children:[(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название компании`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`ИНН`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Город`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Телефон`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Роли`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Действие`})]})}),(0,z.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:o.filter(e=>e.name.toLowerCase().includes(t.toLowerCase())||e.inn?.includes(t)||e.address?.toLowerCase().includes(t.toLowerCase())).map(e=>(0,z.jsxs)(`tr`,{onClick:()=>l(e),className:`hover:bg-krona-workspace/50 cursor-pointer transition-colors`,children:[(0,z.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(u,{className:`w-4 h-4 text-krona-secondary`}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`div`,{className:`font-bold`,children:e.name}),e.legalName&&(0,z.jsx)(`div`,{className:`text-[11px] text-krona-secondary`,children:e.legalName})]})]})}),(0,z.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.inn||`—`}),(0,z.jsx)(`td`,{className:`p-3 text-krona-secondary`,children:e.address||`—`}),(0,z.jsx)(`td`,{className:`p-3 font-mono text-krona-secondary`,children:e.phone||`—`}),(0,z.jsx)(`td`,{className:`p-3`,children:(0,z.jsx)(`div`,{className:`flex gap-1`,children:e.roles?.map(e=>(0,z.jsx)(a,{variant:`gold`,size:`sm`,children:e},e))})}),(0,z.jsx)(`td`,{className:`p-3 text-right`,children:(0,z.jsxs)(r,{variant:`ghost`,size:`sm`,onClick:t=>{t.stopPropagation(),l(e)},children:[`Карточка 360 `,(0,z.jsx)(y,{className:`w-3.5 h-3.5 ml-1`})]})})]},e.id))})]})})]}):e===`leads`?(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsxs)(`div`,{className:`relative w-64`,children:[(0,z.jsx)(j,{className:`w-3.5 h-3.5 absolute left-2.5 top-2.5 text-krona-secondary`}),(0,z.jsx)(`input`,{type:`text`,value:t,onChange:e=>n(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,z.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`new-lead-btn`,onClick:p,children:[(0,z.jsx)(g,{className:`w-3.5 h-3.5 mr-1`}),` Новый лид`]})]}),(0,z.jsx)(`div`,{className:`bg-krona-surface border border-krona-border rounded-xl shadow-krona-soft overflow-hidden`,children:(0,z.jsxs)(`table`,{className:`w-full text-xs text-left`,children:[(0,z.jsx)(`thead`,{className:`bg-krona-workspace text-krona-secondary border-b border-krona-border`,children:(0,z.jsxs)(`tr`,{children:[(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Название лида`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контактное лицо`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Контакты`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Оценка бюджета`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold`,children:`Статус`}),(0,z.jsx)(`th`,{className:`p-3 font-semibold text-right`,children:`Конвертация`})]})}),(0,z.jsx)(`tbody`,{className:`divide-y divide-krona-border`,children:s.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.contactName?.toLowerCase().includes(t.toLowerCase())||e.phone?.includes(t)||e.email?.toLowerCase().includes(t.toLowerCase())).map(e=>(0,z.jsxs)(`tr`,{className:`hover:bg-krona-workspace/50 transition-colors`,children:[(0,z.jsx)(`td`,{className:`p-3 font-bold text-krona-primary`,children:e.title}),(0,z.jsx)(`td`,{className:`p-3 font-medium text-krona-primary`,children:e.contactName}),(0,z.jsxs)(`td`,{className:`p-3 text-krona-secondary`,children:[(0,z.jsx)(`div`,{children:e.phone}),(0,z.jsx)(`div`,{className:`text-[11px]`,children:e.email})]}),(0,z.jsx)(`td`,{className:`p-3 font-bold text-krona-green`,children:e.estimatedValue?P(e.estimatedValue.minor):`—`}),(0,z.jsx)(`td`,{className:`p-3`,children:(0,z.jsx)(a,{variant:e.status===`converted`?`green`:e.status===`disqualified`?`danger`:`warning`,size:`sm`,children:e.status===`converted`?`Конвертирован`:e.status===`new`?`Новый`:e.status})}),(0,z.jsx)(`td`,{className:`p-3 text-right`,children:e.status===`converted`?(0,z.jsxs)(`span`,{className:`text-emerald-600 dark:text-emerald-400 text-xs font-semibold flex items-center justify-end gap-1`,children:[(0,z.jsx)(b,{className:`w-3.5 h-3.5`}),` Сделка создана`]}):(0,z.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`convert-lead-btn`,onClick:()=>m(e),children:[(0,z.jsx)(D,{className:`w-3.5 h-3.5 mr-1`}),` Конвертировать в сделку`]})})]},e.id))})]})})]}):null,te=({isOpen:e,selectedContact:t,selectedCompany:n,onClose:i,deals:o,orders:c,getTimeline:l,createActivity:u})=>{let{showToast:d}=s(),[f,p]=(0,L.useState)(`overview`),[m,h]=(0,L.useState)([]),[g,_]=(0,L.useState)(``),[v,y]=(0,L.useState)(`call`);(0,L.useEffect)(()=>{let e=!0;return t?l(`contact`,t.id).then(t=>{e&&h(t)}).catch(()=>{}):n&&l(`company`,n.id).then(t=>{e&&h(t)}).catch(()=>{}),()=>{e=!1}},[t,n,l]);let b=t?.id||n?.id||``,x=(0,L.useMemo)(()=>o.filter(e=>e.contactId===b||e.companyId===b),[o,b]),S=(0,L.useMemo)(()=>c.filter(e=>e.customerId===b),[c,b]);return(0,z.jsx)(E,{isOpen:e,onClose:()=>{h([]),i()},title:t?`${t.firstName} ${t.lastName} (Customer 360)`:`${n?.name||``} (Company 360)`,size:`lg`,children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsx)(`div`,{className:`flex border-b border-krona-border text-xs`,children:[`overview`,`deals`,`orders`,`activities`,`timeline`].map(e=>(0,z.jsxs)(`button`,{onClick:()=>p(e),className:`px-3.5 py-2 font-semibold capitalize transition-colors border-b-2 ${f===e?`border-krona-green text-krona-green`:`border-transparent text-krona-secondary hover:text-krona-primary`}`,children:[e===`overview`&&`Обзор`,e===`deals`&&`Сделки (${x.length})`,e===`orders`&&`Заказы (${S.length})`,e===`activities`&&`Задачи & Звонки`,e===`timeline`&&`Таймлайн (${m.length})`]},e))}),f===`overview`&&(0,z.jsxs)(`div`,{className:`space-y-3 text-xs`,children:[(0,z.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 bg-krona-workspace p-3.5 rounded-lg border border-krona-border`,children:[t&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`ФИО:`}),` `,(0,z.jsxs)(`strong`,{className:`text-krona-primary`,children:[t.firstName,` `,t.lastName]})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:t.phone||`—`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Email:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:t.email||`—`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Должность:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:t.jobTitle||`—`})]})]}),n&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Название:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:n.name})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`ИНН:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:n.inn||`—`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Адрес:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:n.address||`—`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`span`,{className:`text-krona-secondary`,children:`Телефон:`}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:n.phone||`—`})]})]})]}),(0,z.jsxs)(`div`,{className:`p-3 bg-krona-workspace/40 rounded-lg border border-krona-border`,children:[(0,z.jsx)(`div`,{className:`font-semibold text-krona-primary mb-1`,children:`Кастомные атрибуты (Схема Krona Studio):`}),t?.customFields&&Object.keys(t.customFields).length>0||n?.customFields&&Object.keys(n.customFields).length>0?(0,z.jsx)(`div`,{className:`grid grid-cols-2 gap-2 mt-2`,children:Object.entries(t?.customFields||n?.customFields).map(([e,t])=>(0,z.jsxs)(`div`,{className:`text-xs`,children:[(0,z.jsxs)(`span`,{className:`text-krona-secondary`,children:[e,`:`]}),` `,(0,z.jsx)(`strong`,{className:`text-krona-primary`,children:String(t)})]},e))}):(0,z.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:`Дополнительные поля из Конструктора полей отображаются здесь в реальном времени.`})]})]}),f===`deals`&&(0,z.jsxs)(`div`,{className:`space-y-2`,children:[x.map(e=>(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`div`,{className:`font-bold text-krona-primary`,children:e.title}),(0,z.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[`Этап:`,` `,(0,z.jsx)(`span`,{className:`font-semibold`,children:W.find(t=>t.key===e.stage)?.label})]})]}),(0,z.jsxs)(`div`,{className:`text-right`,children:[(0,z.jsx)(`div`,{className:`font-bold text-krona-green`,children:P(e.amount.minor)}),(0,z.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.probability,`% вер.`]})]})]},e.id)),x.length===0&&(0,z.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных сделок`})]}),f===`orders`&&(0,z.jsxs)(`div`,{className:`space-y-2`,children:[S.map(e=>(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace flex items-center justify-between text-xs`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`div`,{className:`font-bold font-mono text-krona-primary`,children:e.orderNumber}),(0,z.jsxs)(`div`,{className:`text-[11px] text-krona-secondary`,children:[e.items.length,` поз. • Статус: `,e.status]})]}),(0,z.jsxs)(`div`,{className:`text-right`,children:[(0,z.jsx)(`div`,{className:`font-bold text-krona-green`,children:P(e.total.minor)}),(0,z.jsx)(a,{variant:e.paymentStatus===`paid`?`green`:`warning`,size:`sm`,children:e.paymentStatus})]})]},e.id)),S.length===0&&(0,z.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Нет связанных заказов`})]}),f===`activities`&&(0,z.jsx)(`div`,{className:`space-y-3`,children:(0,z.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!g)return;let r=t?`contact`:`company`,i=t?.id||n?.id||``;await u({targetEntityType:r,targetEntityId:i,type:v,title:g,completed:!1,dueDate:new Date(Date.now()+864e5).toISOString()}),_(``),d(`Активность запланирована`,`success`),l(r,i).then(h).catch(()=>{})},className:`p-3 bg-krona-workspace rounded-lg border border-krona-border space-y-2`,children:[(0,z.jsx)(`div`,{className:`text-xs font-semibold text-krona-primary`,children:`Запланировать активность:`}),(0,z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,z.jsxs)(`select`,{value:v,onChange:e=>y(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,z.jsx)(`option`,{value:`call`,children:`Звонок`}),(0,z.jsx)(`option`,{value:`meeting`,children:`Встреча`}),(0,z.jsx)(`option`,{value:`task`,children:`Задача`}),(0,z.jsx)(`option`,{value:`email`,children:`Email`})]}),(0,z.jsx)(`input`,{type:`text`,value:g,onChange:e=>_(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,z.jsx)(r,{type:`submit`,variant:`primary`,size:`sm`,children:`Добавить`})]})]})}),f===`timeline`&&(0,z.jsxs)(`div`,{className:`space-y-2.5 max-h-96 overflow-y-auto pr-1`,children:[m.map(e=>(0,z.jsxs)(`div`,{className:`p-3 rounded-lg border border-krona-border bg-krona-workspace text-xs space-y-1`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsx)(`span`,{className:`font-bold text-krona-primary`,children:e.title}),(0,z.jsx)(`span`,{className:`text-[10px] text-krona-secondary`,children:C(e.timestamp)})]}),e.description&&(0,z.jsx)(`p`,{className:`text-krona-secondary text-[11px]`,children:e.description}),(0,z.jsxs)(`div`,{className:`text-[10px] text-krona-green font-medium`,children:[`Автор: `,e.actor]})]},e.id)),m.length===0&&(0,z.jsx)(`div`,{className:`text-center py-6 text-krona-secondary text-xs italic`,children:`Таймлайн пуст`})]})]})})},q=({isOpen:e,lead:t,onClose:n,onConvert:i})=>{let[a,o]=(0,L.useState)(null),[s,c]=(0,L.useState)(``);return t!==a&&(o(t),c(t?`Сделка: ${t.title}`:``)),(0,z.jsx)(O,{isOpen:e,onClose:n,title:`Конвертация лида в сделку и контакт`,size:`md`,children:(0,z.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,z.jsx)(`p`,{className:`text-krona-secondary`,children:`При конвертации будет автоматически создан Контакт клиента и новая Сделка на этапе «Предложение».`}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Название новой сделки:`}),(0,z.jsx)(`input`,{type:`text`,value:s,onChange:e=>c(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,z.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,z.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Отмена`}),(0,z.jsx)(r,{variant:`primary`,size:`sm`,"data-testid":`confirm-convert-lead-btn`,onClick:async()=>{t&&await i(t.id,s||t.title)},children:`Подтвердить конвертацию`})]})]})})},J=({isOpen:e,wonDeal:t,onClose:n,onConfirmOrder:i})=>{let[a,o]=(0,L.useState)(null),[s,c]=(0,L.useState)(``),[l,u]=(0,L.useState)(`wh_main`);return t!==a&&(o(t),c(t?`Заказ по сделке: ${t.title}`:``),u(`wh_main`)),(0,z.jsx)(O,{isOpen:e,onClose:n,title:`Сделка выиграна! Создать заказ в Коммерции?`,size:`md`,children:(0,z.jsxs)(`div`,{className:`space-y-4 text-xs`,children:[(0,z.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,z.jsx)(`strong`,{children:`Поздравляем с успехом!`}),` Сделка «`,t?.title,`» переведена в статус «Выиграна». Система предлагает автоматически сформировать коммерческий Заказ.`]}),(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Наименование заказа:`}),(0,z.jsx)(`input`,{type:`text`,value:s,onChange:e=>c(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Сумма заказа (RUB):`}),(0,z.jsx)(`div`,{className:`font-bold text-sm text-krona-green py-1`,children:t?P(t.amount.minor):`0 ₽`})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`label`,{className:`block font-semibold text-krona-primary mb-1`,children:`Склад отгрузки:`}),(0,z.jsxs)(`select`,{value:l,onChange:e=>u(e.target.value),className:`w-full px-3 py-1.5 bg-krona-workspace border border-krona-border rounded-lg text-krona-primary focus:outline-none focus:border-krona-green`,children:[(0,z.jsx)(`option`,{value:`wh_main`,children:`Основной распределительный склад (Москва)`}),(0,z.jsx)(`option`,{value:`wh_spb`,children:`Склад Санкт-Петербург`})]})]})]}),(0,z.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2 border-t border-krona-border`,children:[(0,z.jsx)(r,{variant:`secondary`,size:`sm`,onClick:n,children:`Не создавать сейчас`}),(0,z.jsxs)(r,{variant:`primary`,size:`sm`,"data-testid":`create-order-confirm-btn`,onClick:async()=>{await i({orderTitle:s,orderWarehouse:l})},children:[(0,z.jsx)(w,{className:`w-3.5 h-3.5 mr-1`}),` Создать заказ в Коммерции`]})]})]})})},ne=({contactMeta:e,companyMeta:t,dealMeta:n,leadMeta:r,contacts:i,companies:a,isAddContactOpen:o,isAddCompanyOpen:s,isAddDealOpen:c,isAddLeadOpen:u,onCloseContact:d,onCloseCompany:f,onCloseDeal:p,onCloseLead:m,onCreateContact:h,onCreateCompany:g,onCreateDeal:_,onCreateLead:v,showToast:y})=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(O,{isOpen:u,onClose:m,title:`Создание нового лида`,size:`lg`,children:r.currentEntity?(0,z.jsx)(l,{entity:r.currentEntity,layout:r.layouts?.[0]||null,mode:`create`,onSave:async e=>{await v({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}),m(),y(`Лид успешно создан!`,`success`)},onCancel:m}):(0,z.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,z.jsx)(O,{isOpen:o,onClose:d,title:`Создание нового контакта`,size:`lg`,children:e.currentEntity?(0,z.jsx)(l,{entity:e.currentEntity,layout:e.layouts?.[0]||null,mode:`create`,onSave:async e=>{await h({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}),d(),y(`Контакт успешно создан!`,`success`)},onCancel:d}):(0,z.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,z.jsx)(O,{isOpen:s,onClose:f,title:`Создание новой компании`,size:`lg`,children:t.currentEntity?(0,z.jsx)(l,{entity:t.currentEntity,layout:t.layouts?.[0]||null,mode:`create`,onSave:async e=>{await g({name:String(e.name||`Новая компания`),inn:String(e.inn||``),address:String(e.city||e.address||`г. Москва`),phone:String(e.phone||``),roles:[`client`],status:`active`,customFields:e}),f(),y(`Компания успешно создана!`,`success`)},onCancel:f}):(0,z.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})}),(0,z.jsx)(O,{isOpen:c,onClose:p,title:`Создание новой сделки`,size:`lg`,children:n.currentEntity?(0,z.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 _({title:String(e.title||`Новая сделка`),pipelineId:`pipe_default`,stage:`prospecting`,amount:{minor:t,currency:`RUB`},probability:20,contactId:i[0]?.id,companyId:a[0]?.id,customFields:e}),p(),y(`Сделка успешно создана в воронке!`,`success`)},onCancel:p}):(0,z.jsx)(`div`,{className:`p-4 text-center text-krona-secondary`,children:`Загрузка схемы...`})})]}),Y=()=>{let t=p(),{showToast:n}=s(),{contacts:r,companies:i,leads:a,deals:o,createContact:c,createCompany:l,createDeal:u,createLead:d,updateDeal:f,convertLead:m,getTimeline:h,createActivity:g}=R(),{orders:_,createOrder:y}=N(),b=v(`contact`),x=v(`company`),S=v(`deal`),C=v(`lead`),[w,T]=(0,L.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`:`contacts`}),[E,D]=(0,L.useState)(``),[O,A]=(0,L.useState)(!1),[j,M]=(0,L.useState)(!1),[P,F]=(0,L.useState)(!1),[ee,B]=(0,L.useState)(!1),[V,H]=(0,L.useState)(!1),[Y,X]=(0,L.useState)(null),[re,Z]=(0,L.useState)(!1),[Q,$]=(0,L.useState)(null),[ie,ae]=(0,L.useState)(null),[oe,se]=(0,L.useState)(null),[ce,le]=(0,L.useState)(t.pathname);if(ce!==t.pathname){le(t.pathname);let e=t.pathname;e.includes(`/crm/deals`)?T(`deals`):e.includes(`/crm/leads`)?T(`leads`):e.includes(`/crm/companies`)?T(`companies`):e.includes(`/crm/import`)?T(`import`):(e.includes(`/crm/contacts`)||e===`/crm`)&&T(`contacts`)}let ue=async(e,t)=>{let r=o.find(t=>t.id===e);r&&(await f(e,{stage:t}),n(`Сделка «${r.title}» переведена на этап: ${W.find(e=>e.key===t)?.label}`,`info`),t===`won`&&($(r),Z(!0)))},de=async({orderTitle:t,orderWarehouse:a})=>{if(Q)try{let o=r.find(e=>e.id===Q.contactId),s=i.find(e=>e.id===Q.companyId),c=o?`${o.firstName} ${o.lastName}`:s?.name||`Клиент`,l=`ORD-${e().slice(-6)}`;await y({orderNumber:l,customerType:Q.contactId?`contact`:`company`,customerId:Q.contactId||Q.companyId||`cnt_default`,customerName:c,status:`draft`,paymentStatus:`pending`,fulfillmentStatus:`unfulfilled`,items:[{id:`item_${e()}`,productId:`prd_coffee_beans`,sku:`COF-100`,name:t||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(`Связанный Заказ ${l} успешно создан в Коммерции! (Склад: ${a})`,`success`),Z(!1),$(null)}catch(e){n(`Ошибка создания заказа: ${e instanceof Error?e.message:String(e)}`,`error`)}},fe=async(e,t)=>{try{let r=await m(e,t);n(`Лид конвертирован! Создана сделка «${r.deal.title}»`,`success`),H(!1),X(null)}catch(e){n(`Ошибка конвертации: ${e instanceof Error?e.message:String(e)}`,`error`)}},pe=[{id:`deals`,label:`Воронка сделок (${o.length})`},{id:`contacts`,label:`Контакты (${r.length})`},{id:`companies`,label:`Компании (${i.length})`},{id:`leads`,label:`Лиды (${a.length})`}];return(0,z.jsxs)(`div`,{className:`space-y-4 animate-fade-in`,children:[(0,z.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,z.jsxs)(`div`,{children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`h1`,{className:`text-sm font-bold text-krona-primary`,children:`CRM: Клиенты, Воронка продаж & Сделки`}),(0,z.jsx)(k,{level:`pilot1`,size:`sm`})]}),(0,z.jsx)(`p`,{className:`text-xs text-krona-secondary mt-0.5`,children:`Сквозной процесс: Лид → Контакт/Компания → Сделка (Kanban) → Выиграна → Заказ в Коммерции`})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-1.5 overflow-x-auto text-xs`,children:[pe.map(e=>(0,z.jsx)(`button`,{onClick:()=>T(e.id),className:`px-3 py-1.5 rounded-lg font-medium transition-all ${w===e.id?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:e.label},e.id)),(0,z.jsxs)(`button`,{onClick:()=>T(`import`),className:`px-3 py-1.5 rounded-lg font-medium transition-all flex items-center gap-1 ${w===`import`?`bg-krona-green text-white shadow-sm`:`bg-krona-workspace text-krona-secondary hover:text-krona-primary border border-krona-border`}`,children:[(0,z.jsx)(I,{className:`w-3.5 h-3.5`}),` Импорт CSV`]})]})]}),w===`deals`&&(0,z.jsx)(G,{deals:o,contacts:r,companies:i,search:E,onSearchChange:D,onAddDeal:()=>F(!0),onStageChange:ue}),(w===`contacts`||w===`companies`||w===`leads`)&&(0,z.jsx)(K,{activeTab:w,search:E,onSearchChange:D,contacts:r,companies:i,leads:a,onSelectContact:ae,onSelectCompany:se,onAddContact:()=>A(!0),onAddCompany:()=>M(!0),onAddLead:()=>B(!0),onConvertLead:e=>{X(e),H(!0)}}),w===`import`&&(0,z.jsx)(U,{initialEntityType:`contact`}),(0,z.jsx)(te,{isOpen:!!(ie||oe),selectedContact:ie,selectedCompany:oe,onClose:()=>{ae(null),se(null)},deals:o,orders:_,getTimeline:h,createActivity:g}),(0,z.jsx)(J,{isOpen:re,wonDeal:Q,onClose:()=>{Z(!1),$(null)},onConfirmOrder:de}),(0,z.jsx)(q,{isOpen:V,lead:Y,onClose:()=>{H(!1),X(null)},onConvert:fe}),(0,z.jsx)(ne,{contactMeta:b,companyMeta:x,dealMeta:S,leadMeta:C,contacts:r,companies:i,isAddContactOpen:O,isAddCompanyOpen:j,isAddDealOpen:P,isAddLeadOpen:ee,onCloseContact:()=>A(!1),onCloseCompany:()=>M(!1),onCloseDeal:()=>F(!1),onCloseLead:()=>B(!1),onCreateContact:c,onCreateCompany:l,onCreateDeal:u,onCreateLead:d,showToast:n})]})};export{Y as CrmModule}; |