- 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)
49 lines
1.7 KiB
JavaScript
49 lines
1.7 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');
|
|
|
|
// GET /vehicles — List all vehicles
|
|
router.get('/', requireAuth, asyncHandler(async (req, res) => {
|
|
const { data: vehicles } = await supabase
|
|
.from('vehicles')
|
|
.select('*')
|
|
.order('number');
|
|
|
|
res.render('pages/vehicles/list', { vehicles: vehicles || [] });
|
|
}));
|
|
|
|
// GET /vehicles/:id — Vehicle detail with loads
|
|
router.get('/:id', requireAuth, asyncHandler(async (req, res) => {
|
|
const { data: vehicle } = await supabase
|
|
.from('vehicles').select('*').eq('id', req.params.id).single();
|
|
if (!vehicle) return res.status(404).render('pages/404');
|
|
|
|
const { data: loads } = await supabase
|
|
.from('loads')
|
|
.select('*, shipper:shippers(name)')
|
|
.eq('vehicle_id', req.params.id)
|
|
.order('date', { ascending: false, nullsFirst: false });
|
|
|
|
res.render('pages/vehicles/detail', {
|
|
vehicle,
|
|
loads: loads || [],
|
|
});
|
|
}));
|
|
|
|
// POST /vehicles — Create/update vehicle
|
|
router.post('/', requireAuth, asyncHandler(async (req, res) => {
|
|
const { number, type, city, state, owner_name, owner_phone, is_active } = req.body;
|
|
const id = number.replace(/\s/g, '').toLowerCase();
|
|
|
|
await supabase.from('vehicles').upsert({
|
|
id, number: number.toUpperCase().replace(/\s/g, ''),
|
|
type: type || 'open', city: city || 'Thiruvananthapuram', state: state || 'Kerala',
|
|
owner_name: owner_name || null, owner_phone: owner_phone || null,
|
|
is_active: is_active === 'true' || is_active === 'on',
|
|
});
|
|
res.redirect('/vehicles/' + encodeURIComponent(id));
|
|
}));
|
|
|
|
module.exports = router;
|