Files
Norbert Maciaszek 56c90fb567 add for-me
2025-12-29 15:13:22 +01:00

16 KiB
Raw Permalink Blame History

Gift Planning App MVP Specification

Project Name: Gift Planner
Created: December 26, 2025
Status: Pre-development / Discovery Phase


1. Project Vision & Goals

Business Goal

Aplikacja wspomaga planowanie i śledzenie prezentów na dowolne okazje (święta, urodziny, rocznice), automatyzując zarządzanie budżetem, listami osób i śledzeniem cen.

Success Metrics (do doprecyzowania)

  • Liczba zarejestrowanych userów
  • % userów, którzy ukończy workflow od okazji do budżetu
  • Engagement z AI recommendations
  • Średni czas planowania okazji

Ograniczenia na start

  • Budżet: TBD
  • Deadline MVP: TBD
  • Zespół: TBD
  • Geograficznie: Polska (Market integration)

2. Core Domain MVP Scope

User, Authentication & Tokens

  • Rejestracja / logowanie (email + hasło)
  • Profil usera (opcjonalnie: foto, preferencje powiadomień)
  • Tokeny: Miesięczny odnawialny limit tokenów + możliwość dokupienia pakietów.
  • Bez social logins na MVP
  • Brak współdzielenia list (single-user na MVP)

Globalna Lista Osób (User Resource)

Przypisana do usera, reużywalna między okazjami.

Pola:

  • id, userId
  • name (imię/pseudonim)
  • relation (np. matka, przyjaciel, partner dla kontekstu AI)
  • age (opcjonalnie, dla AI recommendations)
  • interests (notatki/tagi: sport, gaming, moda itp.)
  • notes (profilowanie AI: styl życia, ulubione kolory, unikanie konkretnych rzeczy)
  • createdAt, updatedAt

Pola (Rozszerzone UI):

  • birthDate (Data urodzin)
  • nameDay (Data imienin - format MM-DD)
  • clothingSizes (JSON: { top: "M", bottom: "38", shoe: "39" })
  • avoidances (Alergie, rzeczy nielubiane - kluczowe dla AI)
  • links (Wishlista, profil social media)

Uwaga: Specyficzne daty (jak urodziny osoby) są traktowane jako standardowe obiekty Occasion, co pozwala na przypisanie wielu prezentów do jednego wydarzenia osobistego.

Operacje:

  • CRUD na osobach
  • Lista osób dla danego usera
  • Search/filter po nazwie

Okazja (Occasion)

Kontener dla prezentów i budżetu w konkretnym kontekście czasowym.

Pola:

  • id, userId
  • title (np. "Święta 2025", "Urodziny Anny")
  • description (opcjonalnie)
  • date (przybliżona data okazji)
  • totalBudget (opcjonalnie, całkowity budżet na okazję)
  • status (draft, planning, shopping, done)
  • createdAt, updatedAt

Operacje:

  • CRUD na okazjach
  • Lista okazji dla danego usera
  • Filtry: aktywne, przeszłe, po dacie

Powiązanie Osoba ↔ Okazja

Tablica łączy osoby z okazjami (wiele-do-wielu).

Pola:

  • id, occasionId, personId
  • budgetPerPerson (opcjonalnie, Budget przydzielony dla tej osoby na tę okazję)
  • notes (opcjonalnie, specyficzne notatki dla tej osoby w ramach tej okazji)
  • createdAt

Operacje:

  • Dodaj osoby do okazji (można masowo)
  • Usuń osobę z okazji
  • Edytuj budżet per osoba

Produkt (Product Master)

Baza rzeczywistych przedmiotów, które mogą być prezentami.

Pola:

  • id
  • title (nazwa modelu/produktu)
  • description (pełny opis techniczny)
  • ean / sku
  • imageUrl
  • tags (kategorie: kuchnia, gaming, itp.)
  • productUrl (link do produktu / porównywarki)
  • globalMinPrice, globalMaxPrice (z historii śledzenia)

Prezent - Instancja (Gift / Planning Instance)

Konkretny plan podarowania produktu danej osobie na wybraną okazję.

Pola:

  • id, productId (FK), occasionId (FK), personId (FK)
  • status (idea, selected, bought, wrapped, given)
  • purchasePrice (cena, za którą faktycznie kupiliśmy)
  • purchaseStore (sklep, w którym dokonano zakupu)
  • orderNumber (opcjonalnie)
  • personalNotes (notatki specyficzne dla tego obdarowanego)
  • rating (0-5 stars - ocena trafności prezentu)
  • feedbackNote (notka po wręczeniu, np. "kolor za jasny")
  • createdAt, updatedAt

Operacje:

  • CRUD na instancjach prezentów
  • Śledzenie statusu zakupu per osoba
  • Powiązanie z globalną kartą produktu

Centrum Aktualizacji (Updates Center)

Spersonalizowany feed powiadomień.

Typy aktualizacji:

  • Okazja cenowa: Spadek ceny rynkowej produktu z karty produktu.
  • Zbliżająca się okazja: Countdown do wydarzeń (globalnych i mini-okazji).
  • Inspiracja AI: Nowe propozycje na podstawie profilu osoby.
  • Radar Prezentowy (Gift Radar): Monitoring cen, trendów i dostępności w czasie rzeczywistym z match-makingiem AI.
  • Raport budżetowy: Podsumowanie wydatków w danym miesiącu.

Budżet & Postęp (Occasion Analytics)

Obliczone automatycznie na podstawie prezentów i okazji.

Per Okazja:

  • Całkowity budżet (suma totalBudget lub suma budgetPerPerson dla wszystkich osób)
  • Wydane dotychczas (suma price prezentów ze statusem ≥ "selected")
  • Pozostały budżet
  • % wykorzystania budżetu
  • Liczba osób
  • Liczba prezentów (total, ready/wrapped, pending)

UI Representation:

  • Progress bar: wydane / budżet
  • Liczniki: "3 z 5 osób gotowych", "12 z 15 prezentów"
  • Alert, jeśli przekraczamy budżet

3. Secondary Features Phase 2 (Post-MVP)

Price Tracking & Market Analysis

Architecture:

  • User dodaje url do prezentu (dowolny link)
  • Backend: cron job (raz dziennie lub częściej) + manualne "refresh" przez UI
  • Pobieranie aktualnej ceny z API sklepów / scrapingiem (Apify)
  • Zapis snapshotu ceny do tabeli PriceSnapshot(giftId, price, timestamp, source)

Pola Gift (extended):

  • currentPrice (najniższa cena z ostatniego snapshotu)
  • priceHistory (relacja do PriceSnapshot)
  • priceAlert (boolean: czy śledzić zmiany cen?)
  • priceAlertThreshold (opcjonalnie: powiadom, gdy spadnie poniżej X)

UI Features:

  • Mini-sparkline / mini-wykres ostatnich 30 dni cen
  • Badge: "Najtaniej w 2 tygodniach" lub "Drożej o X%" od średniej
  • Alert: "Cena spadła poniżej progu dobry moment!"

Powiadomienia (Phase 2):

  • Email/push alert, gdy cena spadnie poniżej threshold
  • Reminder: "Zbliżają się święta ceny mogą wzrosnąć"
  • Scheduled reminder: "Sprawdzaj ceny tego prezentu co 3 dni"

AI Gift Recommendations & Greetings (Phase 2)

Use Case 1: Recommendations User przychodzi na okazję, widzi osobę w liście, kliknie "Suggest Gifts" → AI generuje 510 propozycji z uzasadnieniami.

Use Case 2: Greetings & Cards (New) AI generuje personalizowane życzenia na podstawie szerokiego kontekstu:

  • Widok Okazji (Grupowe): Generowanie życzeń dla wszystkich uczestników naraz (spójność stylistyczna, unikanie powtórzeń).
  • Widok Okazji (Indywidualne): Szybkie generowanie życzeń dla konkretnej osoby bezpośrednio z listy uczestników okazji (uwzględnia wybrany prezent).

Input Context (AI):

  • Profil osoby: wiek, zainteresowania, relacja, styl życia, rozmiary.
  • Okazja: typ, budżet per osoba, pozostały budżet na całą okazję.
  • Historia: jakie prezenty już kupił/planuje dla tej osoby w historii (unikaj duplikatów).
  • Wybrane prezenty: konkretne modele produktów, ich cechy i przeznaczenie.

Output:

  • Lista propozycji: [{ title, category, priceRange, reason, matchScore }]
  • Życzenia: [{ recipient, occasion, text, tone, cardTypeSuggestion }]

Implementacja:

  • LLM (OpenAI API / local Ollama / inne)
  • Prompt engineering: struktura context + constraints (budżet, unikalne przedmioty).
  • Koszt AI: Każda generacja sugestii lub pakietu życzeń kosztuje określoną liczbę tokenów (np. 1 token per życzenia / 5 sugestii).
  • User ręcznie decyduje, co dodać lub skopiować.

4. Architektura Techniczna (High Level)

Tech Stack (Proposed)

  • Frontend: React 19 + Next.js (App Router)

    • Server Components dla list/agregacji
    • Client Components dla interaktywnych formularzy
    • TanStack Query do synchronizacji danych
  • Backend: Node.js / Next.js API Routes lub oddzielny backend (Express/NestJS)

    • REST API lub GraphQL (tbd)
    • Autentykacja: JWT / session-based
  • Database: PostgreSQL (+ Prisma ORM)

    • Wersjonowanie: migrations
  • External Services:

    • Market APIs / Apify scraper (Phase 2)
    • OpenAI API lub self-hosted LLM (Phase 2)
    • Email service (e.g., SendGrid, Resend) dla alertów (Phase 2)
  • Deployment: TBD (Vercel, self-hosted, AWS, etc.)


Database Schema (Sketch)

User
├── id (PK)
├── email (UNIQUE)
├── password_hash
├── tokens_balance (INT, default 0)
├── last_token_reset (TIMESTAMP)
├── created_at
└── updated_at

Person
├── id (PK)
├── user_id (FK)
├── name
├── relation
├── age
├── interests (TEXT / JSON)
├── notes
├── created_at
├── updated_at

Occasion
├── id (PK)
├── user_id (FK)
├── title
├── description
├── date
├── total_budget
├── status (draft | planning | shopping | done)
├── created_at
├── updated_at

OccasionPerson (M2M)
├── id (PK)
├── occasion_id (FK)
├── person_id (FK)
├── budget_per_person
├── notes
├── created_at

Product
├── id (PK)
├── title
├── description
├── imageUrl
├── tags (JSON)
├── ean
├── product_url
├── created_at

Gift (Planning Instance)
├── id (PK)
├── product_id (FK)
├── occasion_id (FK)
├── person_id (FK)
├── status (idea | selected | bought | wrapped | given)
├── purchase_price (cena zakupu)
├── purchase_store
├── personal_notes
├── rating (INT, 1-5)
├── feedback_note (TEXT)
├── created_at

IndividualOccasion (Zrezygnowano - używamy tabeli Occasion)

---

### API Endpoints (MVP, Sketch)

#### Auth
- `POST /api/auth/register` → register user
- `POST /api/auth/login` → login user
- `POST /api/auth/logout` → logout

#### Persons
- `GET /api/persons` → list all persons for logged user
- `POST /api/persons` → create person
- `PUT /api/persons/:id` → update person
- `DELETE /api/persons/:id` → delete person

#### Occasions
- `GET /api/occasions` → list occasions for logged user
- `POST /api/occasions` → create occasion
- `PUT /api/occasions/:id` → update occasion
- `DELETE /api/occasions/:id` → delete occasion
- `GET /api/occasions/:id` → get occasion with full context

#### OccasionPerson (Managing persons in occasion)
- `POST /api/occasions/:id/persons` → add person(s) to occasion
- `DELETE /api/occasions/:id/persons/:personId` → remove person
- `PUT /api/occasions/:id/persons/:personId` → update budget_per_person

#### Gifts
- `GET /api/occasions/:id/gifts` → list gifts for occasion
- `POST /api/occasions/:id/gifts` → create gift for person
- `PUT /api/gifts/:id` → update gift (title, status, price, url, etc.)
- `DELETE /api/gifts/:id` → delete gift

#### Occasion Analytics (computed read-only)
- `GET /api/occasions/:id/analytics` → budget, postęp, countdowny

---

## 5. UI/UX Flow (MVP)

### Key Views

#### 1. Dashboard (Home)
- Recent Gifts: szybki podgląd ostatnio dodanych planów
- Active Occasions cards
- Quick AI Suggestions banner

#### 6. Kalendarz Okazji, Inspiracje i Poradniki (Templates & Blog)
*   **Global Holidays**: Biblioteka ogólnych świąt (Dzień Matki, Boże Narodzenie) z opcją „Użyj jako szablon”.
*   **Inspiracje (Global Products)**: Baza produktów sugerowanych przez AI, posortowana kategoriami (Elektronika, Wellness itp.).
*   **Blog i Poradniki**: Serce treści SEO aplikacji. Artykuły łączące poradnictwo (np. "Jak wybrać prezent") z bezpośrednimi linkami do produktów i okazji.
    - **Shoppable Content**: Możliwość dodawania produktów bezpośrednio z treści artykułu do planów użytkownika.
    - **Nienachalne Reklamy**: Sekcje promujące konkretne marki lub produkty w kontekście merytorycznych wpisów.
    - **Analiza Wektorowa AI**: Sugerowanie artykułów i produktów na podstawie zainteresowań wyłapanych z profili osób.
*   **One-Click Add**: Możliwość szybkiego przypisania produktu z bazy inspiracji do konkretnej osoby i okazji w aplikacji.
*   **Wyszukiwarka AI**: Interaktywne pole tekstowe pozwalające na dopytanie AI o konkretne pomysły spoza bazy.

#### 3. Centrum Aktualizacji (Updates)
- Feed powiadomień: price drops, countdowns, AI ideas, budget alerts

#### 3. Osoba Detail (Relationship Hub)
- Aktywne okazje osobiste i globalne (np. "Urodziny", "Święta")
- AI Profiler: zarządzanie preferencjami dla LLM
- Historia zakupowa ("Ostatnio kupione")

#### 4. Karta Produktu (Product Master)
- Globalna historia ceny (wykres 30 dni)
- Porównywarka cenowa (oferty sklepów)
- Lista planów, w których występuje ten produkt (re-use)

#### 5. Gift Planning (Instance View)
- Logistyka: status, notatki zakupowe, numer zamówienia
- Analiza ceny zakupu vs cena rynkowa
- **Feedback Loop**: Po zmianie statusu na "Otrzymany" (given), pojawia się sekcja oceny (gwiazdki + notatka efektu).
- *(Przeniesiono: Sekcja AI Greetings została przeniesiona do widoków Okazji i Osoby dla lepszego kontekstu).*

#### 6. Settings
- Profil usera i wylogowanie

#### 7. Globalny Budżet (Budget Hub)
- Wykres wydatków miesięcznych
- Podział na kategorie (Elektronika, Zabawki, Dom)
- Lista ostatnich transakcji
- Statystyki "Wydane w tym roku"

#### 8. Occasion Details (Tabs)
Widok okazji podzielony na zakładki:
1. **Lista Osób**: Karty osób z przypisanymi prezentami i budżetem per osoba.
2. **Wszystkie Prezenty**: Zbiorcza lista prezentów (Flat list) do łatwego zarządzania statusami (Kupione/Zapakowane).
3. **AI**: Sugestie, porady dotyczące optymalizacji oraz grupowe generowanie życzeń dla wszystkich uczestników.

---

## 6. MVP Definition & Phasing

### MVP = Everything in Section 2 (Core Domain)
- ✅ User auth
- ✅ Persons management (global reusable list)
- ✅ Occasions CRUD
- ✅ Connect persons to occasions
- ✅ Gifts CRUD + status tracking
- ✅ Budget & postęp calculations
- ✅ Aggregate gift list per occasion

**Timeline:** ~48 weeks (team-dependent)

- Price tracking + PriceSnapshot table
- Price alerts & notifications (email/push)
- AI gift recommendations (LLM integration)
- **Wyszukiwarka AI (AI Search)**: Globalna wyszukiwarka prezentów oparta na LLM z analizą dopasowania (match-making).

### Phase 3+ (Nice-to-have, Later)
- Collaborative lists (share occasion with family)
- Analytics: roczne porównania, trendy wydatków
- Export to PDF/calendar
- Mobile app (native or responsive PWA)
- Social: wishlist sharing, gift registry

---

## 7. Key Decisions & Assumptions (To Validate)

- [ ] Single-user MVP (no collaboration)  OK?
- [ ] Auth method: email/password or OAuth? (assuming email/pwd for MVP)
- [ ] Database: PostgreSQL assumption  confirm?
- [ ] Market integration: API lub web scraping? (Apify fallback)
- [ ] AI model: OpenAI API czy local/self-hosted? (cost/privacy trade-off)
- [ ] Monetization:
    - **Tokens**: Monthly allowance + top-ups for AI actions.
    - **Pakiet "Oszczędzanie"**: 14.99 PLN / msc. Odblokowuje historię cen (od momentu dodania produktu, do 30 dni wstecz) i alerty cenowe.
    - **Pakiet "Kontrola budżetu"**: 6.99 PLN / msc. Odblokowuje zaawansowane analizy budżetowe, wykresy wydatków i prognozy.
- [ ] Mobile-first design czy desktop-first? (assuming mobile-responsive on MVP)

---

## 8. Next Steps

1. **Validate domain model**  robi sens struktura User → Occasion → Person → Gift?
2. **Detailed API spec**  co dokładnie zwraca endpoint?
3. **UI wireframes**  sketche ekranów
4. **Phase 1 backlog**  rozbić MVP na user stories + tasking
5. **Tech setup**  inicjalizacja repo, struktura projektu, Prisma schema
6. **First feature cycle**  login/register → Person CRUD → Occasion CRUD

---

## 9. Assumptions & Open Questions

### Business
- Czy aplikacja ma być darmowa czy z opcjami premium?
- Target audience: Polska czy szerzej?
- Launch timeline?

### Technical
- Czy self-hosted czy cloud (Vercel, Railway)?
- Rate limits dla API sklepów czy backup plan?
- Jak long-term archivizować stare okazje?

### Product
- Czy dark mode na MVP?
- Czy offline support (PWA)?
- Czy mobile app native czy Web + PWA?

---

**Document Version:** 1.0  
**Last Updated:** December 26, 2025  
**Status:** Awaiting validation & feedback