The Last POS System You'll Ever Need
A single-page marketing site for a fictional Point-of-Sale SaaS product, built as a hands-on Software Project Management course project demonstrating a full CI/CD pipeline — from commit-message policy enforcement to automated testing and PHP syntax linting.
QuickPOS is a responsive, conversion-focused landing page for a retail Point-of-Sale product. It showcases a hero section, feature highlights, pricing tiers, and a contact form — all styled with Tailwind CSS and served through a lightweight PHP backend.
Beyond the front-end, the real focus of this repository is the DevOps workflow wrapped around it: every push and pull request is validated by a multi-stage GitHub Actions pipeline that enforces Jira ticket references, lints PHP code, runs automated tests, and archives test artifacts.
| Section | Description |
|---|---|
| 🏠 Hero | Bold call-to-action with "Get Started" and "View Demo" buttons |
| 📊 Real-time Analytics | Sales trends & employee performance reporting |
| 🛡️ Smart Inventory | Automated low-stock alerts |
| 📱 Cloud Sync | Cross-device access — phone, tablet, laptop |
| 💳 Pricing Tiers | Basic, Pro (highlighted), and Enterprise plans |
| ✉️ Contact Form | Name / email / message capture with server-side validation |
- Backend: PHP 8.2
- Styling: Tailwind CSS (via CDN, no build step required)
- Testing: Custom lightweight PHP test runner (no external framework)
- CI/CD: GitHub Actions
quickpos-landing/
├── index.php # Main landing page (markup + Tailwind classes)
├── tests/
│ └── ContactFormTest.php # Automated tests for contact form validation
├── .github/
│ └── workflows/
│ └── ci.yml # Multi-job CI/CD pipeline definition
└── README.md
- PHP 8.2+ installed locally
git clone https://github.com/Rana-Haseeb/quickpos-landing.git
cd quickpos-landing
php -S localhost:8000Then open http://localhost:8000 in your browser.
⚠️ Known issue: index.php currently contains a deliberate broken statement (<?php this_is_a_fatal_error; ?>) at the end of the file, left over from a CI pipeline-failure demonstration. Remove that line before running the page for real use.
The contact form's validation logic is covered by a self-contained PHP test suite (no PHPUnit dependency) that checks required fields and email format:
php tests/ContactFormTest.phpTest cases:
- Empty name → rejected
- Empty email → rejected
- Invalid email format → rejected
- Empty message → rejected
- Fully valid submission → accepted
A passing run writes a summary report to build/test-report.txt, which is uploaded as a
CI artifact.
Defined in .github/workflows/ci.yml, the pipeline runs on pushes
to feature/** / bugfix/** branches and on pull requests targeting main. Three jobs run
in parallel:
| Job | Purpose |
|---|---|
| Commit Validation | Fails the build unless the triggering commit message contains a Jira ticket reference in the format [SCRUM-###] |
| Code Quality & Syntax | Runs php -l for syntax errors and phpcs (PSR-12 standard) for style checks |
| Automated Testing & Artifacts | Executes the contact form test suite and uploads build/test-report.txt as a downloadable artifact |
This mirrors a real-world trunk-based development workflow with ticket traceability, static analysis, and automated regression testing gating every merge.
This is a course project, but the workflow follows standard practice:
- Branch from
mainusingfeature/<name>orbugfix/<name> - Commit with a Jira reference:
[SCRUM-XX] Your message - Open a pull request into
main— the CI pipeline must pass before merging
Built for educational purposes as part of a Software Project Management course.