Complete web application voor het bestellen van belegde broodjes voor collega's. Gebouwd met Next.js 14, TypeScript, Prisma, en SQLite.
- Product Scraping: Automatisch broodjes inladen van brood-shop.nl
- Winkelmandje: Meerdere broodjes toevoegen met opmerkingen per item
- Bestelvenster: Automatische deadline op vrijdag 16:00 (Europe/Amsterdam)
- Countdown Timer: Live teller tot de deadline
- Mijn Bestellingen: Bekijk, wijzig of annuleer eigen bestellingen (voor deadline)
- Persoonsgegevens Onthouden: Naam en afdeling worden opgeslagen voor volgende keer
- Admin Dashboard: Overzicht van alle bestellingen met groepering
- Excel Export: Multi-tab .xlsx export (per persoon & totalen)
- Responsive Design: Werkt perfect op desktop en mobiel
- Modern UI: Premium design met animaties en glassmorphism effecten
- Node.js 18+ en npm
- Windows/Mac/Linux
-
Installeer dependencies
npm install
-
Database setup
npm run db:push
-
Start development server
npm run dev
-
Open in browser
http://localhost:3000
Brood/
βββ app/ # Next.js App Router
β βββ page.tsx # Assortiment pagina (home)
β βββ cart/page.tsx # Winkelmandje
β βββ my-orders/page.tsx # Gebruiker bestelhistorie & beheer
β βββ admin/page.tsx # Admin dashboard
β βββ api/ # API routes
β β βββ products/ # Producten endpoint
β β βββ orders/ # Bestellingen endpoint
β β βββ status/ # Order status endpoint
β β βββ admin/ # Admin endpoints
β βββ layout.tsx # Root layout
β βββ globals.css # Global styles
βββ components/ # React components
β βββ home/ # Home page specific components (Header, Filter, Grid)
β βββ CountdownTimer.tsx # Deadline countdown
β βββ ProductCard.tsx # Broodje card
β βββ CartItem.tsx # Winkelmandje item
βββ lib/ # Utility libraries
β βββ scraper.ts # Web scraper (Cheerio)
β βββ orderPeriod.ts # Periode management
β βββ auth.ts # Admin authenticatie
β βββ excel.ts # Excel export (ExcelJS)
βββ prisma/
β βββ seeds/ # Seed data & scripts
β βββ schema.prisma # Database schema
βββ package.json
βββ tsconfig.json
βββ next.config.js
βββ tailwind.config.ts
βββ .env.local # Environment variabelen
βββ _archive/ # Oude scripts en documentatie
# Database
DATABASE_URL="file:./dev.db"
# Admin authenticatie
ADMIN_CODE="admin123" # β οΈ Wijzig dit!
# Scraper
SCRAPER_URL="https://www.brood-shop.nl/assortiment/belegde-broodjes/"
# Timezone
TZ="Europe/Amsterdam"BELANGRIJK: Wijzig ADMIN_CODE naar een veilige waarde voor productie!
De scraper haalt broodjes op van brood-shop.nl en slaat ze op in de database:
# Handmatig scrapen (via admin dashboard)
# Klik op "Ververs Assortiment" knopDe scraper is robuust gebouwd met meerdere selector fallbacks en error handling.
- Bestellingen kunnen tot donderdag 14:00 (Europe/Amsterdam timezone)
- Na de deadline wordt bestellen automatisch geblokkeerd
- Nieuwe periode start automatisch na donderdag 14:00
- Elk periode krijgt een unieke ID:
YYYY-WW(ISO week nummer)
- Klant: Bladert door assortiment β voegt broodjes toe aan winkelmandje
- Klant: Vult naam in β plaatst bestelling
- Admin: Bekijkt overzicht β exporteert naar Excel
- Admin: Bestelt broodjes bij de winkel
Genereert een .xlsx bestand met 2 tabbladen:
- Tab 1 - Per Persoon: Naam, Afdeling, Broodje, Aantal, Opmerking, Besteld op
- Tab 2 - Totalen: Broodje, Totaal Aantal, Opmerkingen, Prijs, Totaal Bedrag
Product - Belegde broodjes (gescraped)
- name, price, description, imageUrl, sourceUrl
OrderPeriod - Wekelijkse bestelperiodes
- weekId (YYYY-WW), startDate, endDate, deadline
Order - Individuele bestellingen
- personName, department, orderPeriodId, createdAt
OrderItem - Broodjes in een bestelling
- quantity, comment, productId, orderId
ScraperLog - Scraping historie
- status, message, productsFound, createdAt
- Modern Design: Gradient backgrounds, glassmorphism, shadows
- Animations: Smooth hover effects, fade-in animations
- Responsive Grid: 1 kolom (mobiel) β 4 kolommen (desktop)
- Premium Styling: Inter font, custom color palette
- Real-time Updates: Countdown timer update elke seconde
- Loading States: Spinners en disabled buttons
- Validatie: Client-side en server-side validatie
- Ga naar
/admin - Voer admin code in (standaard:
admin123) - Code wordt opgeslagen in localStorage
Admin Functies:
- Bekijk alle bestellingen per periode
- Groepeer per persoon of per broodje
- Exporteer naar Excel
- Ververs product assortiment
- Wissel tussen periodes
# Install Vercel CLI
npm i -g vercel
# Deploy
vercel- Maak PostgreSQL database aan (bijv. Vercel Postgres, Neon, Supabase)
- Update
DATABASE_URLin environment variables - Wijzig
providerinschema.prismanaarpostgresql - Run
npx prisma migrate dev
# Installeer Node.js 18+
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Clone project
cd /var/www
git clone <repository-url> broodjes
cd broodjes
# Installeer en build
npm install
npm run build
# Start met PM2
npm install -g pm2
pm2 start npm --name "broodjes" -- start
pm2 save
pm2 startup
# Setup Nginx reverse proxy
# Nginx config voorbeeld:
# server {
# listen 80;
# server_name broodjes.example.com;
# location / {
# proxy_pass http://localhost:3000;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection 'upgrade';
# proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
# }
# }# Installeer Node.js van nodejs.org
# Clone en installeer
cd C:\inetpub\wwwroot
git clone <repository-url> broodjes
cd broodjes
npm install
npm run build
# Start met PM2
npm install -g pm2
pm2 start npm --name "broodjes" -- start
pm2 save
pm2-startup install- Website structuur kan zijn gewijzigd
- Check console logs:
npm run dev - Update selectors in
lib/scraper.ts - Test scraper handmatig via admin dashboard
# Reset database
rm prisma/dev.db
npm run db:push# Gebruik andere port
PORT=3001 npm run dev- Check of bestellingen correct worden geplaatst
- Exporteer Excel voor huidige week
- Optioneel: ververs product assortiment
# Backup SQLite database
cp prisma/dev.db prisma/dev.db.backup
# Voor PostgreSQL
pg_dump database_url > backup.sqlnpm run dev # Start development server
npm run build # Build for production
npm start # Start production server
npm run lint # Run ESLint
npm run db:push # Push schema to database
npm run db:seed # Seed database (optional)- New API endpoint: Add to
app/api/ - New page: Add to
app/ - New component: Add to
components/ - Database changes: Update
prisma/schema.prismaβ runnpm run db:push
Proprietary - VH Engineering
Voor vragen of problemen, contact VH Engineering IT afdeling.
Made with β€οΈ for VH Engineering