import { Building, District, EntranceSection, User, Employee, Candidate, Vacancy, PREvent, ResidentReport, DomaApplication, ResidentFeedback, StrategicGoal, Invoice, OfficeRequest, OfficeInventoryItem, OfficeDocument, OfficeAsset, LegalContract, LegalCourtCase, LegalCounterparty, PersonalAccount, AccountMeter, MeterReading } from './types'; import { LayoutDashboard, Map, Wrench, Banknote, Scale, Briefcase, UsersRound, Megaphone, Building2, Settings, } from 'lucide-react'; export const CURRENT_USER_MOCK: User = { id: 'u1', name: 'Алексей Петров', role: 'DIRECTOR', avatar: 'https://picsum.photos/id/1005/64/64' }; export const MOCK_DISTRICTS: District[] = []; export const EMPLOYEE_POSITIONS: string[] = [ 'Слесарь-сантехник', 'Электрик', 'Дворник', 'Мастер участка', 'Сантехник', 'Сварщик', 'Юрист по работе с дебиторской задолженностью', 'Слесарь-сантехник (4-5 разряд)', 'Другое' ]; export const MOCK_EMPLOYEES: Employee[] = [ { id: 'e1', name: 'Иванов Иван Иванович', position: 'Слесарь-сантехник', phone: '+7 900 123-45-67', status: 'active', salary: 45000, assignedDistrictId: 'd-1', birthDate: '1985-03-15', messengerLogins: [ { messenger: 'Telegram', login: '@ivanov_ii' }, { messenger: 'Max', login: '+7 900 123-45-67' } ], photoUrl: 'https://picsum.photos/id/64/200/200', registrationDate: '2020-01-15', hrData: { passportData: { series: '4510', number: '123456', issuedBy: 'ОУФМС России по г. Москве', issuedDate: '2010-05-20', registrationAddress: 'г. Москва, ул. Ленина, д. 10, кв. 25' }, laborBook: { number: 'ТК-123456', entries: [ { date: '2020-01-15', organization: 'ООО "УК Дружба"', position: 'Слесарь-сантехник' } ] }, certificates: [ { type: '2-НДФЛ', requestedDate: '2024-01-10', issuedDate: '2024-01-12', status: 'ready' }, { type: 'Справка с места работы', requestedDate: '2024-03-05', status: 'requested' } ], otherDocuments: [ { name: 'Договор трудового найма', type: 'Трудовой договор', date: '2020-01-15' }, { name: 'Медицинская книжка', type: 'Мед. документ', date: '2023-06-10' } ] } }, { id: 'e2', name: 'Петров Петр Петрович', position: 'Электрик', phone: '+7 900 123-45-68', status: 'vacation', salary: 50000, assignedDistrictId: 'd-1', birthDate: '1988-07-22', messengerLogins: [ { messenger: 'Telegram', login: '@petrov_pp' } ], registrationDate: '2019-05-10', hrData: { passportData: { series: '4512', number: '234567', issuedBy: 'ОУФМС России по г. Москве', issuedDate: '2012-08-15', registrationAddress: 'г. Москва, пр. Мира, д. 5, кв. 12' }, laborBook: { number: 'ТК-234567', entries: [ { date: '2019-05-10', organization: 'ООО "УК Дружба"', position: 'Электрик' } ] } } }, { id: 'e3', name: 'Сидорова Анна Александровна', position: 'Дворник', phone: '+7 900 123-45-69', status: 'active', salary: 25000, assignedDistrictId: 'd-2', birthDate: '1975-11-30', messengerLogins: [ { messenger: 'Max', login: '+7 900 123-45-69' } ], photoUrl: 'https://picsum.photos/id/65/200/200', registrationDate: '2021-03-01', hrData: { passportData: { series: '4508', number: '345678', issuedBy: 'ОУФМС России по г. Москве', issuedDate: '2008-12-10', registrationAddress: 'г. Москва, ул. Заречная, д. 20, кв. 8' }, laborBook: { number: 'ТК-345678', entries: [ { date: '2021-03-01', organization: 'ООО "УК Дружба"', position: 'Дворник' } ] }, certificates: [ { type: 'Справка о доходах', requestedDate: '2024-05-15', status: 'requested' } ] } }, { id: 'e4', name: 'Кузнецов Владимир Викторович', position: 'Мастер участка', phone: '+7 900 111-22-33', status: 'active', salary: 65000, assignedDistrictId: 'd-1', birthDate: '1980-02-14', messengerLogins: [ { messenger: 'Telegram', login: '@kuznetsov_vv' }, { messenger: 'Max', login: '+7 900 111-22-33' } ], photoUrl: 'https://picsum.photos/id/66/200/200', registrationDate: '2018-09-01', hrData: { passportData: { series: '4509', number: '456789', issuedBy: 'ОУФМС России по г. Москве', issuedDate: '2009-03-25', registrationAddress: 'г. Москва, ул. Центральная, д. 15, кв. 45' }, laborBook: { number: 'ТК-456789', entries: [ { date: '2018-09-01', organization: 'ООО "УК Дружба"', position: 'Мастер участка' }, { date: '2015-01-10', organization: 'ООО "СтройСервис"', position: 'Мастер' } ] }, certificates: [ { type: '2-НДФЛ', requestedDate: '2024-01-10', issuedDate: '2024-01-12', status: 'ready' } ] } }, { id: 'e5', name: 'Степанов Сергей Сергеевич', position: 'Сантехник', phone: '+7 900 444-55-66', status: 'active', salary: 42000, assignedDistrictId: 'd-2', birthDate: '1990-09-05', messengerLogins: [ { messenger: 'Telegram', login: '@stepanov_ss' } ], registrationDate: '2022-06-15', hrData: { passportData: { series: '4511', number: '567890', issuedBy: 'ОУФМС России по г. Москве', issuedDate: '2011-11-18', registrationAddress: 'г. Москва, ул. Новая, д. 8, кв. 15' }, laborBook: { number: 'ТК-567890', entries: [ { date: '2022-06-15', organization: 'ООО "УК Дружба"', position: 'Сантехник' } ] } } }, ]; export const MOCK_CANDIDATES: Candidate[] = [ { id: 'c1', name: 'Новиков Д.Д.', position: 'Мастер участка', stage: 'interview', phone: '+7 999 000-00-01' }, { id: 'c2', name: 'Козлов Е.Е.', position: 'Сварщик', stage: 'new', phone: '+7 999 000-00-02' }, ]; export const MOCK_VACANCIES: Vacancy[] = [ { id: 'v1', position: 'Слесарь-сантехник (4-5 разряд)', department: 'Тех. отдел', status: 'urgent', salary: '55 000 - 65 000 ₽', applicantsCount: 3, postedDate: '2024-05-10', description: 'Техническое обслуживание внутридомовых инженерных систем ГВС, ХВС, отопления и канализации.' }, { id: 'v2', position: 'Мастер участка', department: 'Эксплуатация', status: 'active', salary: '70 000 ₽', applicantsCount: 12, postedDate: '2024-05-15', description: 'Организация и контроль работы линейного персонала на вверенном участке (8-10 МКД).' }, { id: 'v3', position: 'Юрист по работе с дебиторской задолженностью', department: 'Юр. отдел', status: 'active', salary: '60 000 ₽', applicantsCount: 8, postedDate: '2024-05-20', description: 'Подготовка приказов, исковых заявлений, представление интересов УК в судах и ФССП.' }, ]; export const MOCK_PR_EVENTS: PREvent[] = [ { id: 'ev1', title: 'День Соседа (Гриль-вечеринка)', date: '2024-06-15', type: 'resident', category: 'holiday', status: 'planned', location: 'ул. Ленина, д.12 (двор)', attendeesCount: 0, budget: 15000 }, { id: 'ev2', title: 'Эко-субботник "Чистый Участок"', date: '2024-06-08', type: 'resident', category: 'eco', status: 'planned', location: 'пр. Мира, д.8', attendeesCount: 0, budget: 5000 }, { id: 'ev3', title: 'Квартальный Тимбилдинг (Квиз)', date: '2024-06-20', type: 'internal', category: 'training', status: 'planned', location: 'Офис УК', attendeesCount: 24, budget: 12000 }, ]; export const MOCK_RESIDENT_REPORTS: ResidentReport[] = [ { id: 'rep1', buildingId: 'b-1', address: 'Тестовый пер., д.55', month: 'Май 2024', status: 'published', stats: { appsDone: 42, budgetSpent: 125000, cleaningQuality: 4.8 } }, { id: 'rep2', buildingId: 'b-2', address: 'ул. Ленина, д.12', month: 'Май 2024', status: 'draft', stats: { appsDone: 15, budgetSpent: 45000, cleaningQuality: 3.2 } }, ]; export const MOCK_STRATEGIC_GOALS: StrategicGoal[] = [ { id: 'g1', department: 'production', title: 'Качество и Скорость', description: 'Снизить долю просроченных заявок', currentValue: 8, targetValue: 5, unit: '%', deadline: '30.09.2024' }, { id: 'g2', department: 'pr', title: 'Лояльность Жителей', description: 'Повысить общий NPS по компании', currentValue: 68, targetValue: 75, unit: '', deadline: '31.12.2024' }, { id: 'g3', department: 'finance', title: 'Финансовая Эффективность', description: 'Достичь чистой прибыли (мес)', currentValue: 1200000, targetValue: 1500000, unit: '₽', deadline: '31.07.2024' }, { id: 'g4', department: 'development', title: 'Рост Портфеля', description: 'Подключить новые дома в управление', currentValue: 3, targetValue: 5, unit: 'домов', deadline: '31.12.2024' }, { id: 'g5', department: 'legal', title: 'Юридическая Сила', description: 'Повысить процент выигранных дел', currentValue: 85, targetValue: 90, unit: '%', deadline: '30.09.2024' }, { id: 'g6', department: 'hr', title: 'Стабильность Команды', description: 'Снизить текучесть кадров (год)', currentValue: 12, targetValue: 10, unit: '%', deadline: '31.12.2024' }, ]; export const MOCK_FEEDBACK: ResidentFeedback[] = [ { id: 'f1', buildingId: 'b-1', address: 'Тестовый пер., д.55', date: '2024-05-28', text: 'Очень довольна работой дворника, всегда чисто во дворе. Спасибо!', source: 'Опрос', rating: 10 }, { id: 'f2', buildingId: 'b-2', address: 'ул. Ленина, д.12', date: '2024-05-27', text: 'Лифт постоянно ломается, уже неделю хожу пешком на 8 этаж. Это просто издевательство.', source: 'Приложение', rating: 1 }, ]; export const MOCK_APPLICATIONS: DomaApplication[] = [ { id: 12345, number: 'A-12345', status: 'new', description: 'Течь трубы в ванной комнате, сильный напор.', address: 'Тестовый пер., д.55', apartment: '15', clientName: 'Сергеева А.Н.', createdAt: '2024-05-30T10:00:00Z', deadlineAt: '2024-05-30T18:00:00Z' }, ]; export const MOCK_OFFICE_REQUESTS: OfficeRequest[] = [ { id: 'or1', requesterName: 'Иванова М. (HR)', category: 'stationery', itemName: 'Бумага А4 (5 коробок)', date: '2024-06-01', status: 'new', amount: 3500, priority: 'medium' }, ]; export const MOCK_OFFICE_INVENTORY: OfficeInventoryItem[] = [ { id: 'oi1', name: 'Бумага А4 (SvetoCopy)', quantity: 2, unit: 'кор.', minThreshold: 3, lastRestock: '2024-05-10' }, ]; export const MOCK_OFFICE_DOCUMENTS: OfficeDocument[] = [ // FIX: Added type property to mock data to match interface and resolve errors in components { id: 'doc1', regNumber: 'ВХ-1234', title: 'Требование об уплате налога', correspondent: 'ИФНС №5', date: '2024-06-01', status: 'registered', type: 'incoming', assignedTo: 'Гл. Бухгалтер' }, ]; export const MOCK_OFFICE_ASSETS: OfficeAsset[] = [ { id: 'as1', name: 'MacBook Air M1', type: 'laptop', assignedTo: 'Алексей Петров', purchaseDate: '2023-01-15', condition: 'good', serialNumber: 'C02XXXXX' }, ]; // LEGAL MOCK DATA export const MOCK_LEGAL_CONTRACTS: LegalContract[] = [ { id: 'lc1', number: '2024/05-12', type: 'Поставка', counterparty: 'ООО "СтройМаш"', amount: 1500000, status: 'active', startDate: '2024-01-01', endDate: '2024-12-31', autoProlongation: true, manager: 'Петров А.А.', hasDisagreements: false }, ]; export const MOCK_LEGAL_CASES: LegalCourtCase[] = [ { id: 'case1', caseNumber: 'А40-12345/2024', type: 'arbitration', role: 'plaintiff', subject: 'Взыскание задолженности с ООО "Ромашка"', amount: 450000, status: 'litigation', nextHearingDate: '2024-06-25', judge: 'Иванова М.С.' }, { id: 'case2', caseNumber: '2-1234/2024', type: 'debt_recovery', role: 'plaintiff', subject: 'Взыскание за ЖКУ', debtorName: 'Козлов Е.Е.', address: 'ул. Ленина, 12, кв. 45', amount: 85000, status: 'litigation', nextHearingDate: '2024-06-12', judge: 'Петров В.В.' }, { id: 'case3', caseNumber: '2-5566/2023', type: 'debt_recovery', role: 'plaintiff', subject: 'Взыскание за ЖКУ', debtorName: 'Сидорова А.М.', address: 'пр. Мира, 8, кв. 101', amount: 120000, recoveredAmount: 45000, amountAtBailiffs: 15000, status: 'enforcement', fsspStatus: 'Арест счетов', fsspLastActionDate: '2024-05-10', bailiffName: 'Успенский С.В.', judge: 'Михайлова Е.Н.' }, { id: 'case4', caseNumber: 'пр-778', type: 'debt_recovery', role: 'plaintiff', subject: 'Претензия по задолженности', debtorName: 'Иванов С.С.', address: 'Заречная, 44, кв. 12', amount: 35000, status: 'pre_trial' }, ]; export const MOCK_LEGAL_COUNTERPARTIES: LegalCounterparty[] = [ { id: 'cp1', name: 'ООО "СтройМаш"', inn: '7701234567', status: 'active', riskLevel: 'low', checkedDate: '2024-05-20' }, ]; // MOCK данные модуля развития удалены - теперь используются данные из БД через API // Данные загружаются через backendApi.getDevelopmentPipeline(), getDevelopmentOSS(), и т.д. // Helper to create elements const createElement = (id: string, name: string) => ({ id, name, generalStatus: 'NOT_SELECTED' as const, electroStatus: 'NOT_SELECTED' as const, weldingStatus: 'NOT_SELECTED' as const, }); const createEntranceSections = (prefix: string): EntranceSection[] => [ { id: `${prefix}-floors`, title: 'Этажи', elements: [ createElement(`${prefix}-fl-1`, 'Напольное покрытие'), createElement(`${prefix}-fl-2`, 'Освещение'), ] } ]; const createCommonSections = (prefix: string): EntranceSection[] => [ { id: `${prefix}-roof`, title: 'Кровля', elements: [ createElement(`${prefix}-roof-1`, 'Покрытие'), ] } ]; const createEntrance = (num: number, bId: string) => ({ id: `${bId}-ent-${num}`, number: num, floors: 10, liftsCount: 1, hasBasement: 'NOT_SELECTED' as const, hasTechFloor: 'NOT_SELECTED' as const, hasAttic: 'NOT_SELECTED' as const, hasParking: 'NOT_SELECTED' as const, hasMansard: 'NOT_SELECTED' as const, entranceGroupsCount: 1, sections: createEntranceSections(`${bId}-ent-${num}`) }); // Helper: Generate Readings History const generateReadingsHistory = (baseValue: number): MeterReading[] => { const readings: MeterReading[] = []; let currentValue = baseValue; const today = new Date(); for (let i = 0; i < 12; i++) { const date = new Date(today.getFullYear(), today.getMonth() - i, 20); const consumption = Math.floor(Math.random() * 20) + 5; readings.push({ date: date.toISOString().split('T')[0], value: currentValue, consumption: consumption, source: 'app' }); currentValue -= consumption; } return readings; }; // Helper to create mock personal accounts const createMockAccounts = (buildingId: string, aptCount: number): PersonalAccount[] => { const accounts: PersonalAccount[] = []; const types: Array<'apartment' | 'parking' | 'storage' | 'office'> = ['apartment', 'parking', 'storage', 'office']; const sentiments: Array<'negative' | 'toxic' | 'positive' | 'loyal' | 'neutral'> = ['negative', 'toxic', 'positive', 'loyal', 'neutral']; for (let i = 1; i <= aptCount; i++) { const areaTotal = Math.floor(40 + Math.random() * 60); const accountType = i <= aptCount * 0.8 ? 'apartment' : types[Math.floor(Math.random() * types.length)]; const hasProfile = Math.random() > 0.3; // 70% имеют профиль accounts.push({ id: `${buildingId}-acc-${i}`, accountNumber: `${buildingId.replace('b-', '')}00${i}`, apartmentNumber: i.toString(), type: accountType, floor: Math.ceil(i/4), owners: [{ fullName: 'Иванов И.И.', phone: '+7 900 000-00-00', residentProfile: i % 3 === 0 ? { sentiment: sentiments[Math.floor(Math.random() * sentiments.length)], birthday: `198${Math.floor(Math.random() * 10)}-${String(Math.floor(Math.random() * 12) + 1).padStart(2, '0')}-${String(Math.floor(Math.random() * 28) + 1).padStart(2, '0')}`, email: `owner${i}@example.com`, preferredContactMethod: 'phone' as any, } : undefined }], registered: i % 2 === 0 ? [ { id: `reg-${i}-1`, fullName: 'Петрова А.А.', phone: '+7 900 111-11-11', email: `registered${i}@example.com` }, { id: `reg-${i}-2`, fullName: 'Петров П.П.', phone: '+7 900 111-11-12' }, ] : [], areaTotal: areaTotal, areaLiving: accountType === 'apartment' ? Math.floor(areaTotal * 0.7) : 0, areaNonLiving: accountType === 'apartment' ? Math.floor(areaTotal * 0.3) : areaTotal, meters: accountType === 'apartment' ? [ { id: `m-${i}-1`, type: 'ХВС', make: 'Бетар', number: `BC-${i}321`, lastVerification: '2022-05-10', nextVerification: '2026-05-10', readings: generateReadingsHistory(150) }, ] : [], isMeterInstallationFeasible: accountType === 'apartment', premiseNotes: i % 7 === 0 ? 'Требуется косметический ремонт' : undefined }); } return accounts; }; const createBuilding = (id: string, districtId: string, address: string, img: string, npsScore: number): Building => ({ id, districtId, imageUrl: img, nps: npsScore, passport: { address, apartmentsCount: 160, general: { address: address, fiasCode: '8c5b2444-70a0-4932-980c-0e78548135f3', constructionYear: 1988, commissionYear: 1989, seriesType: '1-447С-37', floors: 10, undergroundFloors: 1, totalArea: 5400, livingArea: 4800, nonLivingArea: 200, commonArea: 400, cadastralNumberBuild: '77:01:0001001:1000', cadastralNumberLand: '77:01:0001001:25', }, construction: { foundationType: 'Ленточный', foundationMaterial: 'Железобетон', wallMaterial: 'Кирпич силикатный', floorMaterial: 'Железобетонные плиты', roofType: 'Плоская', roofMaterial: 'Мягкая рулонная кровля', roofArea: 850, facadeType: 'Оштукатуренный', facadeInsulation: false, windowType: 'ПВХ (частично)', }, engineering: { heatingType: 'Центральное', heatingWiring: 'Верхняя', hasITP: true, waterSupplyMaterial: 'Сталь оцинкованная', waterSupplyType: 'Циркуляционная', sewerMaterial: 'Чугун', electricityEntries: 2, hasVRU: true, gasType: 'Нет', ventilationType: 'Естественная', }, meters: [ { resource: 'Heat', hasMeter: true, model: 'ВКТ-7', number: '123456', lastVerification: '2023-09-01', nextVerification: '2027-09-01' }, { resource: 'Water', hasMeter: true, model: 'Взлет ТСР-М', number: '987654', lastVerification: '2022-05-15', nextVerification: '2026-05-15' }, { resource: 'Electricity', hasMeter: true, model: 'Меркурий 230', number: '555444', lastVerification: '2020-11-20', nextVerification: '2030-11-20' }, { resource: 'Gas', hasMeter: false }, ], lifts: [ { count: 1, type: 'Пассажирский', capacity: 400, speed: 1.0, installYear: 2015, factoryNumber: 'KMZ-1001' }, ], land: { area: 1200, hasPlayground: true, hasSportsGround: false, hasParking: true, hasFencing: true, hasContainerSite: true, }, management: { contractDate: '2020-01-01', contractNumber: 'У-55/2020', servicesList: ['Содержание жилья', 'Текущий ремонт', 'Управление', 'Вывоз ТБО'], tariffMaintenance: 35.50, serviceContracts: [ { id: 'sc1', serviceType: 'Водоснабжение (РСО)', providerName: 'АО Водоканал', contractNumber: 'В-100/22', contractDate: '2022-01-15' }, { id: 'sc2', serviceType: 'Тех. обслуживание лифтов', providerName: 'ООО ЛифтСервис', contractNumber: 'Л-55/23', contractDate: '2023-03-10', expiryDate: '2025-03-10' }, { id: 'sc3', serviceType: 'Видеонаблюдение', providerName: 'Безопасный Город', contractNumber: 'ВН-12', contractDate: '2024-01-01' }, { id: 'sc4', serviceType: 'Интернет (МОП)', providerName: 'Ростелеком', contractNumber: 'РТ-9988', contractDate: '2021-06-05' }, ] } }, staff: [{ id: 's1', role: 'Главный инженер', company: 'ООО «Дружба»', name: 'Иванов И.И.' }], entrances: [1, 2].map(n => createEntrance(n, id)), commonSections: createCommonSections(id), accounts: createMockAccounts(id, 10), financials: { balance: 450000, debt: 85000, collectionRate: 94, topDebtors: [ { apartment: '15', amount: 45000, months: 6, status: 'new' }, ], invoices: [ { id: 'inv1', buildingId: id, address: address, contractorName: 'ООО "ЛифтСервис"', serviceName: 'ТО Лифтов', amount: 25000, date: '2024-05-20', status: 'approved', priority: 'high', closingDocsReceived: false }, ] }, requests: { new: 2, inProgress: 4, overdue: 0 }, inspectionHistory: [ { id: 'act-1', number: '124-ОС', date: '2024-05-15', inspector: 'Иванов И.И.', type: 'scheduled_spring', status: 'completed', issuesCount: 2 }, ], tasks: [ { id: 't1', title: 'Замена лампочек', deadline: new Date('2024-05-20').toISOString(), status: 'new', priority: 'medium', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), buildingId: '' }, ], annualPlan: [ { id: 'p1', year: 2024, month: 'Май', workName: 'Промывка системы отопления', status: 'current', progress: 45, estimatedCost: 45000 }, ], inventory: [ { id: 'inv-1', name: 'Перфоратор Bosch', category: 'tool', quantity: 1, unit: 'шт.', lastCheck: '2024-05-01' }, ], writeOffHistory: [], residents: [ { id: 'r1', name: 'Марья Ивановна', role: 'chairman', apartment: '45', mood: 'angry', lastContact: 'Вчера' }, ], reports: [ { id: 'rep1', month: 'Ноябрь 2023', status: 'ready' }, ], isDirty: false }); export const MOCK_BUILDINGS: Building[] = []; export const NAV_ITEMS = [ { id: 'dashboard', label: 'Сводка', icon: LayoutDashboard }, { id: 'objects', label: 'Участки', icon: Map }, { id: 'requests', label: 'Заявки', icon: Wrench }, { id: 'office', label: 'Офис', icon: Building2 }, { id: 'pr', label: 'PR и NPS', icon: Megaphone }, { id: 'finance', label: 'Финансы', icon: Banknote }, { id: 'legal', label: 'Юр. отдел', icon: Scale }, { id: 'development', label: 'Развитие', icon: Briefcase }, { id: 'hr', label: 'Кадры', icon: UsersRound }, { id: 'admin', label: 'Панель управления', icon: Settings }, ];