Nincs leírás

Benjamin Harris 98b259d50e Add missing RewriteEngine On to .htaccess 2 hete
classes 2057150c2a initial 2 hete
council_forms 2057150c2a initial 2 hete
css 2057150c2a initial 2 hete
dompdf 2057150c2a initial 2 hete
fonts 2057150c2a initial 2 hete
geoJSON 2057150c2a initial 2 hete
images 2057150c2a initial 2 hete
js 2057150c2a initial 2 hete
phpmailer 2057150c2a initial 2 hete
planner 2057150c2a initial 2 hete
.gitignore 07eb73b7ae Readme and gitignore changes 2 hete
.htaccess 98b259d50e Add missing RewriteEngine On to .htaccess 2 hete
Parsedown.php 2057150c2a initial 2 hete
README.md 07eb73b7ae Readme and gitignore changes 2 hete
base.php 2057150c2a initial 2 hete
client-brief.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
composer.json 2057150c2a initial 2 hete
composer.lock 2057150c2a initial 2 hete
connection.php 2057150c2a initial 2 hete
contact_us.php 2057150c2a initial 2 hete
create_enquiry.php 2057150c2a initial 2 hete
crmadd.log 2057150c2a initial 2 hete
crmupdate.log 2057150c2a initial 2 hete
dashboard.php d5962e437f Fix DRG cast from floatval to int in dashboard.php 2 hete
database.php e8c5e4e202 Block web access to log files and stop logging sensitive field values 2 hete
draft_page.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
error.log 2057150c2a initial 2 hete
form.php 2057150c2a initial 2 hete
g_letter.php 2057150c2a initial 2 hete
google.php 2057150c2a initial 2 hete
manifest.json 2057150c2a initial 2 hete
manilla_folder.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
oauth-credentials.json 2057150c2a initial 2 hete
old_g_letter.php e659d3a857 Fix PDF export in old_g_letter.php using correct Drive API method 2 hete
payment_request.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
plan-view.html 2057150c2a initial 2 hete
planbuild.php 2057150c2a initial 2 hete
process_form.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
progress.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
proxy.php cdc5409bb9 Fix SSRF vulnerability in proxy.php 2 hete
sec1.zip 2057150c2a initial 2 hete
sec2.zip 2057150c2a initial 2 hete
simple-file-upload.php 58dd420dca Google Cloud Fix 2 hete
table.php 282004ba92 Fix SQL injection in table.php 2 hete
thelist.php 0eaa5ab7cd Disable display_errors in production across all PHP files 2 hete
upload_debug.log 2057150c2a initial 2 hete

README.md

Modulos Design — Internal Management System

An internal project management dashboard for Modulos Design, an architectural and building design firm based in Scottsdale, Tasmania, Australia.

The system manages the full lifecycle of architectural jobs — from initial client enquiry through planning compliance, documentation, and delivery.


Features

Project Management

  • Auto-incrementing drawing number (DRG) generation per new project
  • Comprehensive client and project brief (40+ tracked fields)
  • Multi-stage progress tracking: site visit, documents received, council approvals, report stages
  • Physical job folder label generation (PDF export for manila folders)

Planning & Compliance

  • Tasmanian council lookup by town or postcode (all 29 TAS councils)
  • Planning zone and code identification via the The LIST ArcGIS API
  • Property ID (PID), Title ID, and site coordinate caching (14-day TTL)
  • Planning report generation with zone/code assessment matrices
  • Support for council-specific form templates (Form 2, 20, 39, 60, 71a, 71b, 80)

Document Management

  • Tracks receipt and status of: title copies, original plans, concept styles, 3D models, fire reports, energy assessments, DA/BA applications, tender sets, renders, VR concepts
  • File uploads stored locally with a debug log
  • PDF generation via DOMPDF (reports, labels, form exports)
  • Google Drive integration for document storage and retrieval

Design Tools

  • Integrated JavaScript floor plan editor (homeRoughEditor v0.95)
  • Digital signature capture
  • ZIP file bundling for document packages

Communication

  • SMTP email via PHPMailer (contact forms, client notifications)
  • Client-facing payment/onboarding forms
  • CSRF-protected session forms

Tech Stack

Layer Technology
Backend PHP 8.0+
Database MySQL / MariaDB (MySQLi)
PDF Generation DOMPDF
Email PHPMailer (SMTP/TLS)
Frontend Bootstrap 5.3, jQuery 3.3, vanilla JS
Phone Validation giggsey/libphonenumber-for-php
Google Integration google/apiclient v2.15+
Planning Data Tasmanian LIST ArcGIS REST API
Floor Plan Editor homeRoughEditor (Canvas/SVG)
Dependency Manager Composer
Web Server Apache (with mod_rewrite)

Prerequisites

  • PHP 8.0 or higher (with mysqli, curl, zip, mbstring extensions)
  • MySQL 5.7+ or MariaDB 10.4+
  • Apache with mod_rewrite enabled
  • Composer
  • An SMTP mail account (currently configured for mail.tazz.com.au)
  • (Optional) Google Cloud project with Drive API credentials
  • (Optional) Square developer account for payment processing

Installation

1. Clone the repository

git clone <repo-url>
cd internal

2. Install PHP dependencies

composer install

3. Configure the database connection

Copy and edit the connection file:

cp connection.php connection.php.local  # keep local config out of version control

Edit connection.php with your credentials:

$servername = "localhost";
$username   = "your_db_user";
$password   = "your_db_password";
$dbname     = "client_jobs";

4. Import the database schema

The database uses two primary tables: details and addresses. Run the initialisation script:

php database.php

Or import an existing dump if migrating from another server.

5. Configure email

In connection.php, set your SMTP credentials:

$mail_host     = "your.smtp.host";
$mail_port     = 587;
$mail_username = "your@email.com";
$mail_password = "your_smtp_password";

6. Set up Apache

Ensure the .htaccess file is respected (AllowOverride All in your Apache vhost). The rules strip .php/.html extensions from URLs and block direct access to sensitive config files.

7. Set directory permissions

chmod 755 pdf/
chmod 755 classes/cache/
chmod 755 classes/cache-list/

8. (Optional) Google Drive integration

Place your Google OAuth credentials in oauth-credentials.json. Run phpmailer/get_oauth_token.php once to generate the initial token.


Configuration Files

File Purpose
connection.php DB credentials, SMTP settings, timezone, access token
database.php API token, LOA file paths, contract directory config, HMAC secrets
oauth-credentials.json Google Drive OAuth client credentials
manifest.json PWA configuration (name, icons, theme)
.htaccess URL rewriting, security rules, cache headers
classes/list_lookup.php ArcGIS endpoint, cache TTL (14 days)
classes/generate_planning_report.php CORS allowed origins, report schema

Important: connection.php and database.php contain secrets. They should never be committed to a public repository. Add them to .gitignore if not already excluded.


Project Structure

internal/
├── dashboard.php               # Main project list and search
├── client-brief.php            # Full project/client detail form (primary CRM record)
├── create_enquiry.php          # New project creation (generates DRG number)
├── payment_request.php         # Client onboarding / payment form
├── progress.php                # Project stage progress tracker
├── draft_page.php              # Site drafting and planning view
├── manilla_folder.php          # Physical folder label PDF generator
├── g_letter.php                # Google Drive letter integration
├── connection.php              # Database and SMTP configuration
├── database.php                # DB init, LOA utilities, API helpers
├── base.php                    # Shared utility functions
├── table.php                   # Shared DB query template
├── proxy.php                   # HTTP proxy for external API calls
│
├── classes/
│   ├── council_lookup.php          # Council → planning authority lookup
│   ├── list_lookup.php             # ArcGIS property/planning data + PID cache
│   ├── generate_planning_report.php # Planning report JSON API (MVP)
│   ├── generate_report.php         # Additional report utilities
│   ├── councils_tas.php            # All TAS council/postcode data (744 lines)
│   ├── tas_spp_index.json          # TAS planning scheme zones and codes
│   ├── tas_use_rules.json          # Planning use class rules
│   ├── tpso.schema.json            # Planning scheme object schema
│   ├── cache/                      # Coordinate → planning data cache (JSON, 14-day TTL)
│   └── cache-list/                 # Alternative cache directory
│
├── council_forms/
│   ├── form_2.php                  # Application to commence/complete work
│   ├── form_20.php                 # Building application
│   ├── form_39.php                 # Planning application
│   ├── form_60.php                 # Certificate of completion
│   ├── form_71a.php                # Adjoining owner notification
│   ├── form_71b.php                # Adjoining owner consent
│   └── form_80.php                 # Notification of building work
│
├── planner/                    # JavaScript floor plan editor
│   ├── index.html
│   ├── editor.js / engine.js / export.js
│   └── README.md               # homeRoughEditor documentation
│
├── css/                        # Stylesheets (Bootstrap, brand, print)
├── js/                         # JS utilities (ZIP, contour, signature, preview)
├── images/                     # Brand assets and logos
├── fonts/                      # Custom fonts
├── pdf/                        # Generated PDF output directory
├── geoJSON/                    # Tasmanian property parcel data
├── dompdf/                     # PDF generation library
├── phpmailer/                  # Email library
└── vendor/                     # Composer dependencies

Key Modules

Planning Report API (classes/generate_planning_report.php)

A JSON API endpoint that accepts a property's coordinates or PID and returns a structured planning assessment including zone, overlays, and applicable planning codes. Used by the client brief to auto-populate planning fields.

Example cURL test:

curl -X POST https://modulosdesign.com.au/internal/classes/generate_planning_report.php \
  -H "Content-Type: application/json" \
  -d '{"lat": -41.123, "lng": 147.456}'

Council Lookup (classes/council_lookup.php + councils_tas.php)

Maps any Tasmanian town or postcode to its local council authority and associated planning scheme. Covers all 29 local government areas.

Property Data Cache (classes/list_lookup.php)

Fetches property data (PID, title, zone, planning codes) from the Tasmanian LIST ArcGIS REST API and caches results as JSON files for 14 days to reduce API load.

Floor Plan Editor (planner/)

An embedded JavaScript floor plan editor (homeRoughEditor v0.95, open-source) allowing basic 2D plan sketching directly in the browser. Supports furniture placement, wall drawing, and SVG/PNG export.


Database

Database name: client_jobs

Primary tables:

Table Description
details Core project record — client info, DRG number, planning data, document status, progress flags
addresses Site and postal addresses linked to project records

The details table tracks 40+ fields per project including client names, contact details, budget, design style, build type, planning zone/codes, PID, document receipt dates, and stage progress booleans.


Security Notes

  • All forms use CSRF tokens (session-based, single-use)
  • MySQLi prepared statements are used for parameterised queries; some older queries use real_escape_string — prefer prepared statements for new code
  • .htaccess blocks direct access to .md files and config.php
  • API endpoints validate a bearer token (Authorization header) defined in database.php
  • CORS is restricted in the planning report API to known origins
  • Credentials in connection.php and database.php must be kept out of version control

Live Environment

  • URL: https://modulosdesign.com.au/internal/
  • Timezone: Australia/Hobart
  • Planning jurisdiction: Tasmania, Australia