FloCafe
FloCafe is the free, local-first restaurant POS in the FloPOS ecosystem. Run orders, tables, kitchen display, and local data without a software subscription.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
K2Biznes — SaaS do ofert handlowych dla klientów dotacyjnych
翻訳待ち
Loading the full README.
Read the full README ↗SaaS do ofert handlowych dla klientów dotacyjnych (FENG / FEPW / KPO / FELU).
Stan: Produkcja https://oferta.k2biznes.pl (PR #1–#80 zmergowane). 3 rundy code review, 4 admin userzy, RODO/GDPR v2 + privacy policy live. Etap 2 (edytowalność) wdrożony: biblioteka alt-programów, szablony oferty, globalne statystyki firmowe (
/admin/ustawienia), edytowalne treści per-oferta, fix rozwijania komponentów w PDF. Etap 3 (pilotaż UX) wdrożony — patrz Model oferty i katalogów. Stack: Next.js 14 + Supabase Cloud + Vercel + Resend + Sentry + UptimeRobot.
~/Code/k2biznes-oferta/ (lokalny dysk) + https://github.com/tkalla79/k2biznes-oferta (single source of truth)CLAUDE_CODE/OFERTA/ jest kopią roboczą do edycji zespołowej — repo wygrywa.Zacznij od docs/TECH_ADMIN_MANUAL.md — masterdoc spinający wszystko.
Dla osób tworzących oferty: docs/K2Biznes_Oferta_-_instrukcja_i_architektura.docx — instrukcja obsługi panelu (Część I) + opis architektury (Część II), w standardzie dokumentów K2.
[email protected], DKIM/SPF verified)/api/health co 5 min)OFERTA_APP/
├── apps/web/ # Next.js
│ ├── app/ # App Router
│ │ ├── api/
│ │ │ ├── health/ # GET /api/health
│ │ │ └── offers/ # CRUD (PR #3)
│ │ │ ├── route.ts # GET (list+filters) + POST (create)
│ │ │ └── [id]/
│ │ │ ├── route.ts # GET + PATCH + DELETE (soft)
│ │ │ └── recalculate/route.ts # POST — force recalc snapshot
│ │ ├── (app)/ # zalogowana część (puste)
│ │ ├── (marketing)/ # marketing (puste)
│ │ └── o/ # widok klienta po tokenie (puste)
│ ├── lib/
│ │ ├── api/error.ts # ApiError, errorResponse, toApiError(ZodError)
│ │ ├── auth/session.ts # requireSession / requireAdmin / requireSuperAdmin
│ │ ├── audit.ts # logAudit() — sekcja 3.2.9
│ │ ├── offers/mapper.ts # snake_case ↔ camelCase DTO
│ │ ├── supabase/ # server.ts / client.ts / admin.ts
│ │ ├── validation/
│ │ │ ├── offers.ts # Zod: Create/Update/List + sort whitelist
│ │ │ └── offers.test.ts # 24 testy walidacji
│ │ ├── pricing/ # calcPricing engine (sekcja 6 + Appendix C.4)
│ │ │ ├── index.ts # pure function, 26 testów Vitest
│ │ │ ├── types.ts # PricingSegment, PricingConfig, PricingResult, ...
│ │ │ ├── load.ts # loader z Supabase + 5-min memory cache
│ │ │ └── index.test.ts # testy z sekcji 6.1 + edge cases
│ │ ├── pdf-bypass.ts # HMAC dla Edge → /o/ render (sekcja 9.1.1)
│ │ └── rate-limit.ts # Upstash (sekcja 5.1.1)
│ ├── vitest.config.ts
│ └── middleware.ts # auth + rate-limit + PDF bypass
├── packages/
│ ├── database/types.ts # supabase gen types (stub do pierwszego db:types)
│ └── email-templates/ # React Email (puste)
├── supabase/
│ ├── config.toml # Supabase CLI config
│ ├── migrations/
│ │ ├── 20260425000001_init.sql # schema (sekcja 3)
│ │ └── 20260425000002_rls.sql # RLS policies (sekcja 4)
│ ├── seed.sql # seed danych (sekcja 3.4 + Appendix C)
│ └── functions/ # Edge Functions (puste)
└── docs/
Aktualna struktura treści oferty (po pilotażu UX, PR #75–#80). Widok klienta ma 8 sekcji; formularz administratora układa pola w tej samej kolejności co sekcje oferty.
Sekcja 01 — Wprowadzenie: jeden blok zdiagnozowanych potrzeb i podstawy rekomendacji
(pole recommendationBasis), edytowany edytorem tekstu — akapity, pogrubienia, listy.
Renderuje się w jednej kolumnie o czytelnej mierze, z czerwoną belką z lewej, tak samo jak
blok programu w sekcji 02. Do sierpnia 2026 było to pole tekstowe bez wyróżnień rzucane
w columns: 2, co łamało dłuższy opis w połowie zdania. Starsze oferty z czystym tekstem
renderują się dalej poprawnie (sanitizeProse). Usunięto dawny wstęp (intro) i 4 stałe
punkty potrzeb.
Sekcja 02 — Proponowane rozwiązanie: program rekomendowany renderuje się jako wyróżniony kafelek (badge „Rekomendowany”), pod nim jego opis, a niżej pozostałe programy wsparcia.
This is the beginning of the README. Read the rest at the original. Read the full README ↗