Sin descripción

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

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