เพิ่มระบบจัดการโครงการจัดซื้อจัดจ้างแบบครบวงจร สำหรับเทศบาลตำบลหัวทะเล จังหวัดภูเก็ต
- ✅ Authentication & Authorization (JWT-based, Role-based access)
- ✅ Project Management (สร้าง/แก้ไข/ลบโครงการ)
- ✅ Step Management (ติดตามความคืบหน้าแต่ละขั้นตอน)
- ✅ Dashboard & Reports (ภาพรวม + Export PDF/Excel/CSV)
- ✅ Excel Import (รองรับไฟล์ ผด.02)
- ✅ 3 วิธีจัดซื้อ: ประกาศเชิญชวน / คัดเลือก / เฉพาะเจาะจง
- ✅ iOS-style Design (Modern, Clean interface)
- ✅ Responsive Layout (Mobile-friendly)
- ✅ Icon System (Lucide Icons)
- ✅ Real-time Notifications
- ✅ Automated deployment scripts (deploy.sh, pull.sh)
- ✅ PM2 ecosystem configuration
- ✅ Nginx configuration
- ✅ Complete documentation
Frontend: React 19, Vite 7, Tailwind CSS 4, React Router 7 Backend: Node.js, Express, MySQL/PostgreSQL Auth: JWT, bcrypt Deploy: PM2, Nginx
procurement-system/
├── client/ # React frontend
├── server/ # Express backend
├── docs/ # Documentation
├── deploy.sh # Deployment script
├── install.sh # Installation script
└── pull.sh # Update script
- Authentication flow tested
- Project CRUD operations verified
- Step management functionality confirmed
- Report export (PDF/Excel/CSV) working
- Excel import (ผด.02 format) validated
- Deployment scripts tested
- Production server configuration verified
- 93 files changed
- 19,483 insertions(+)
Server: 49.231.27.66
Deploy command: cd /root/OpenGISData-Thailand/procurement-system && ./deploy.sh
ee3a7c9 feat: Add clear-storage.html utility page for fixing 401 errors
67a5b64 feat: Add deployment scripts and updated deployment guide
b8af0c9 fix: Configure server to serve static frontend files and install dependencies
c223230 fix: Replace emoji icons with Lucide Icons and improve button visibility
4e9dc87 feat: Redesign UI/UX with iOS style
54140de fix: Remove non-existent authorize import from report routes
73e3ba3 fix: Correct logger import path from config to utils
fc19a21 fix: Replace custom CSS with Tailwind CSS in ReportExportModal
e4a9ad5 feat: Add Excel import functionality for projects (ผด.02 format)
e1b7516 fix: Replace exports.getProjectById with getProjectById in ES6 module
Ready to merge ✅