Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions REPORT.md
Original file line number Diff line number Diff line change
@@ -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 (сейчас пользователь получает только общие уведомления).
12 changes: 6 additions & 6 deletions src/components/ui/calendar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ function Calendar({
...classNames,
}}
components={{
IconLeft: ({ className, ...props }) => (
<ChevronLeft className={cn("h-4 w-4", className)} {...props} />
),
IconRight: ({ className, ...props }) => (
<ChevronRight className={cn("h-4 w-4", className)} {...props} />
),
Chevron: ({ className, ...props }) => {
if (props.orientation === 'left') {
return <ChevronLeft className={cn("h-4 w-4", className)} {...props} />
}
return <ChevronRight className={cn("h-4 w-4", className)} {...props} />
},
}}
{...props}
/>
Expand Down
6 changes: 3 additions & 3 deletions src/lib/seed-db.ts
Original file line number Diff line number Diff line change
@@ -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";

/**
Expand All @@ -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();
Expand All @@ -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();
Expand Down