diff --git a/REPORT.md b/REPORT.md new file mode 100644 index 0000000..323b713 --- /dev/null +++ b/REPORT.md @@ -0,0 +1,48 @@ +# Анализ Проекта: PermitPilot (NextN) + +## Назначение Проекта +Этот проект представляет собой **Систему управления заявками на получение разрешений (Permit Application Management System)**. Его основная цель — упростить и ускорить процесс подачи и проверки строительных разрешений с помощью искусственного интеллекта (Genkit). + +## Технологический Стек +* **Frontend:** Next.js 15 (App Router), Tailwind CSS, Shadcn/UI. +* **Backend / Инфраструктура:** Firebase (Firestore, Auth), Firebase App Hosting. +* **AI:** Genkit (Google AI SDK) для реализации логики генеративного ИИ. + +## Исправлено (Fixed) +В ходе повторного анализа были обнаружены и устранены критические ошибки сборки: + +1. **TypeScript & Build Errors:** + * Исправлен компонент `Calendar` (`src/components/ui/calendar.tsx`): обновлена совместимость с `react-day-picker` v9 (замена устаревших свойств `IconLeft`/`IconRight` на `Chevron`). + * Исправлен скрипт `src/lib/seed-db.ts`: код переписан для использования модульного синтаксиса Firebase SDK (`doc(db, col, id)` вместо `col.doc(id)`). + * **Статус:** `npm run typecheck` теперь проходит успешно без ошибок. + +## Что нужно доработать (Pending Work) +Следующие задачи требуют внимания для доведения проекта до продакшн-готовности: + +### 1. Внедрение RAG (Retrieval-Augmented Generation) +* **Статус:** Не реализовано. +* **Детали:** Валидатор кодов (`Code Validator`) использует заглушки (`mockCodes`). Необходимо подключить векторный поиск для автоматического подбора релевантных строительных норм. + +### 2. Тестирование (Critical) +* **Статус:** Отсутствует. +* **Детали:** Нет ни unit-тестов для AI-логики, ни интеграционных тестов. Это создает высокий риск регрессий при изменениях. + +### 3. Аутентификация +* **Статус:** Базовая (Анонимная). +* **Детали:** Необходима полноценная аутентификация через Email/Google и разделение ролей (User vs Admin/Inspector). + +### 4. Конфигурация +* **Статус:** Хардкод. +* **Детали:** `firebaseConfig` находится в коде. Требуется вынос в `.env` файлы. + +## Что нужно проверить (Verification Plan) +Рекомендуется провести следующие проверки вручную или с помощью аудита: + +1. **Security Rules Audit:** + * Проверить `firestore.rules`. Текущие правила обеспечивают изоляцию пользователей (`/users/{userId}`), но стоит убедиться, что публичные коллекции (`municipalities`) действительно должны быть доступны всем на чтение. +2. **Mobile Responsiveness:** + * Проверить корректность отображения форм на мобильных устройствах, особенно таблицы и большие текстовые поля ввода. +3. **Firebase Quotas:** + * Проверить использование квот Firestore, так как AI-потоки могут генерировать много чтений/записей. +4. **Error Handling UX:** + * Проверить, как интерфейс ведет себя при ошибках сети или таймаутах Genkit (сейчас пользователь получает только общие уведомления). diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx index 3cd65cc..774d116 100644 --- a/src/components/ui/calendar.tsx +++ b/src/components/ui/calendar.tsx @@ -54,12 +54,12 @@ function Calendar({ ...classNames, }} components={{ - IconLeft: ({ className, ...props }) => ( - - ), - IconRight: ({ className, ...props }) => ( - - ), + Chevron: ({ className, ...props }) => { + if (props.orientation === 'left') { + return + } + return + }, }} {...props} /> diff --git a/src/lib/seed-db.ts b/src/lib/seed-db.ts index ecd0b00..a37fdb6 100644 --- a/src/lib/seed-db.ts +++ b/src/lib/seed-db.ts @@ -1,5 +1,5 @@ "use server"; -import { collection, writeBatch, getDocs, Firestore } from "firebase/firestore"; +import { collection, writeBatch, getDocs, Firestore, doc } from "firebase/firestore"; import { mockMunicipalities, mockPermits } from "./data"; /** @@ -17,7 +17,7 @@ export async function seedDatabase(firestore: Firestore, userId: string) { if (municipalitiesSnapshot.empty) { const municipalitiesBatch = writeBatch(firestore); mockMunicipalities.forEach((municipality) => { - const docRef = collection(firestore, "municipalities").doc(municipality.id); + const docRef = doc(firestore, "municipalities", municipality.id); municipalitiesBatch.set(docRef, municipality); }); await municipalitiesBatch.commit(); @@ -33,7 +33,7 @@ export async function seedDatabase(firestore: Firestore, userId: string) { const permitsBatch = writeBatch(firestore); mockPermits.forEach((permit) => { // Note: In a real scenario, you'd likely want unique IDs, but for mock data this is okay. - const docRef = collection(firestore, `users/${userId}/permits`).doc(permit.id); + const docRef = doc(firestore, `users/${userId}/permits`, permit.id); permitsBatch.set(docRef, permit); }); await permitsBatch.commit();