krona-front/dist/assets/CrmModule-D0MX46qK.js

12 lines
No EOL
53 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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};