- Express + EJS server-rendered app - Supabase PostgreSQL database - Auth: username/password with bcrypt - Dashboard with business stats - Load CRUD with filters - WhatsApp message parser - Payment tracking - Shipper & vehicle management - Reports (monthly, top shippers, routes) - Government-app aesthetic (tricolor theme) - Dark mode support - Docker + Coolify deployment ready - Seed data from existing business ledger (88 loads, 41 shippers, 70 vehicles)
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const supabase = require('../services/supabase');
|
|
const { requireAuth } = require('../middleware/auth');
|
|
const { asyncHandler } = require('../middleware/security');
|
|
const { PAYMENT_METHODS } = require('../config/constants');
|
|
|
|
// GET /payments — Payment ledger
|
|
router.get('/', requireAuth, asyncHandler(async (req, res) => {
|
|
const { data: payments } = await supabase
|
|
.from('payments')
|
|
.select('*, load:loads(from_city, to_city, shipper:shippers(name))')
|
|
.order('payment_date', { ascending: false, nullsFirst: false })
|
|
.limit(50);
|
|
|
|
res.render('pages/payments/list', {
|
|
payments: payments || [],
|
|
PAYMENT_METHODS,
|
|
});
|
|
}));
|
|
|
|
// POST /payments — Record a payment
|
|
router.post('/', requireAuth, asyncHandler(async (req, res) => {
|
|
const { load_id, type, direction, amount, method, payment_date, notes } = req.body;
|
|
|
|
await supabase.from('payments').insert({
|
|
load_id, type, direction,
|
|
amount: parseFloat(amount) || 0,
|
|
method: method || 'bank_transfer',
|
|
payment_date: payment_date || null,
|
|
notes: notes || null,
|
|
});
|
|
|
|
res.redirect(req.get('Referer') || '/payments');
|
|
}));
|
|
|
|
module.exports = router;
|