# Database Schema Map — `hickeyplant`

Generated: 2026-07-03 from local XAMPP MariaDB (`localhost`).
Live equivalents: `hickeyhub_hickeyplant` (production), `hickeyhub_testhickeyplant` (test).

**166 tables.** Row counts are approximate (local dev data).

## Table of contents

| Table | ~Rows | Comment |
|---|---:|---|
| [accreditations](#accreditations) | 2 |  |
| [accreditation_sections](#accreditation_sections) | 42 |  |
| [adhoc_alerts](#adhoc_alerts) | 0 |  |
| [assessments](#assessments) | 0 |  |
| [assessment_documents](#assessment_documents) | 0 |  |
| [assessment_hazards](#assessment_hazards) | 0 |  |
| [assessment_history](#assessment_history) | 0 |  |
| [assessment_progress](#assessment_progress) | 0 |  |
| [assessment_questions](#assessment_questions) | 0 |  |
| [assessment_reviews](#assessment_reviews) | 0 |  |
| [assessment_templates](#assessment_templates) | 0 |  |
| [audit_runs](#audit_runs) | 0 |  |
| [audit_run_answers](#audit_run_answers) | 0 |  |
| [audit_run_answer_files](#audit_run_answer_files) | 0 |  |
| [audit_templates](#audit_templates) | 12 |  |
| [audit_template_questions](#audit_template_questions) | 236 |  |
| [complaints](#complaints) | 0 |  |
| [completed_assessments](#completed_assessments) | 0 |  |
| [compliance_task_completions](#compliance_task_completions) | 0 |  |
| [compliance_task_types](#compliance_task_types) | 11 |  |
| [contact_list](#contact_list) | 241 |  |
| [coshh_documents](#coshh_documents) | 22 |  |
| [coshh_hazard_statements](#coshh_hazard_statements) | 49 |  |
| [coshh_precautionary_statements](#coshh_precautionary_statements) | 119 |  |
| [coshh_products](#coshh_products) | 22 |  |
| [coshh_reviews](#coshh_reviews) | 0 |  |
| [coshh_statistics](#coshh_statistics) | 0 |  |
| [cpc_training_hours](#cpc_training_hours) | 0 |  |
| [customers](#customers) | 475 |  |
| [customer_documents](#customer_documents) | 0 |  |
| [customer_review_history](#customer_review_history) | 3 |  |
| [customer_statements](#customer_statements) | 30 |  |
| [customer_statement_batches](#customer_statement_batches) | 0 |  |
| [daily_runs](#daily_runs) | 22 |  |
| [daily_run_pods](#daily_run_pods) | 83 |  |
| [debtors](#debtors) | 490 |  |
| [debtor_actions](#debtor_actions) | 4 |  |
| [debtor_assignments](#debtor_assignments) | 0 |  |
| [debtor_audit_log](#debtor_audit_log) | 490 |  |
| [debtor_import_logs](#debtor_import_logs) | 18 |  |
| [delivery_docket](#delivery_docket) | 66 |  |
| [delivery_docket_files](#delivery_docket_files) | 0 |  |
| [delivery_type](#delivery_type) | 3 |  |
| [delivery_vehicle](#delivery_vehicle) | 6 |  |
| [del_pod_photos](#del_pod_photos) | 11 |  |
| [document_accreditation_mapping](#document_accreditation_mapping) | 0 |  |
| [document_legislation_mapping](#document_legislation_mapping) | 0 |  |
| [document_types](#document_types) | 7 |  |
| [drivers](#drivers) | 602 |  |
| [driver_alerts](#driver_alerts) | 0 |  |
| [driver_licence_checks](#driver_licence_checks) | 0 |  |
| [emission_factor](#emission_factor) | 10 |  |
| [employee_training_assignments](#employee_training_assignments) | 33 |  |
| [files](#files) | 0 |  |
| [fitter](#fitter) | 1,144 |  |
| [fitters_report](#fitters_report) | 7 |  |
| [forms_staff](#forms_staff) | 2 |  |
| [form_assignments](#form_assignments) | 0 |  |
| [form_submissions](#form_submissions) | 0 |  |
| [form_types](#form_types) | 0 |  |
| [fors_health_safety_elearning](#fors_health_safety_elearning) | 0 |  |
| [ghg_scope2_electricity](#ghg_scope2_electricity) | 17 |  |
| [gra_assessments](#gra_assessments) | 34 |  |
| [gra_hazards](#gra_hazards) | 46 |  |
| [hazard_statements](#hazard_statements) | 82 |  |
| [hire_list](#hire_list) | 7,066 |  |
| [hire_list_additions](#hire_list_additions) | 20 |  |
| [hire_list_audit](#hire_list_audit) | 14,846 |  |
| [hire_list_changexh](#hire_list_changexh) | 48 |  |
| [hire_plant_additions](#hire_plant_additions) | 11 |  |
| [hire_site_map](#hire_site_map) | 187 |  |
| [hire_status](#hire_status) | 5 |  |
| [holiday_dates](#holiday_dates) | 56 |  |
| [holiday_events](#holiday_events) | 0 |  |
| [hours_drivers](#hours_drivers) | 215 |  |
| [hs_documents](#hs_documents) | 188 |  |
| [internal_invoice_batches](#internal_invoice_batches) | 20 |  |
| [internal_invoice_ocr_templates](#internal_invoice_ocr_templates) | 0 |  |
| [internal_invoice_pages](#internal_invoice_pages) | 328 |  |
| [invoice_monthly_report_periods](#invoice_monthly_report_periods) | 12 |  |
| [invoice_pdf_reviews](#invoice_pdf_reviews) | 373 |  |
| [invoice_prepare_queue](#invoice_prepare_queue) | 434 |  |
| [job_type](#job_type) | 5 |  |
| [legislation_references](#legislation_references) | 85 |  |
| [lorry_assignments](#lorry_assignments) | 4 |  |
| [mileage_documents](#mileage_documents) | 0 |  |
| [mileage_statistics](#mileage_statistics) | 0 |  |
| [monthly_invoice_check](#monthly_invoice_check) | 14,937 |  |
| [ms_method_statements](#ms_method_statements) | 0 |  |
| [ms_procedures](#ms_procedures) | 0 |  |
| [off_hire_numbers](#off_hire_numbers) | 0 |  |
| [pcn_appeals](#pcn_appeals) | 0 |  |
| [pcn_payments](#pcn_payments) | 0 |  |
| [pcn_records](#pcn_records) | 0 |  |
| [pcn_statistics](#pcn_statistics) | 0 |  |
| [pdi](#pdi) | 195 |  |
| [pdi_checklist_items](#pdi_checklist_items) | 40 |  |
| [pdi_checklist_model_overrides](#pdi_checklist_model_overrides) | 0 |  |
| [pdi_ocr_templates](#pdi_ocr_templates) | 0 |  |
| [pdi_uploads](#pdi_uploads) | 13 |  |
| [pdi_uploads_archive_2026_06](#pdi_uploads_archive_2026_06) | 15 |  |
| [pdi_upload_batches](#pdi_upload_batches) | 7 |  |
| [phone_calls](#phone_calls) | 88 |  |
| [plant_category](#plant_category) | 242 |  |
| [plant_category_types](#plant_category_types) | 52 |  |
| [plant_category_weights](#plant_category_weights) | 19 |  |
| [plant_equipment_capacity_defaults](#plant_equipment_capacity_defaults) | 97 |  |
| [plant_list](#plant_list) | 270 |  |
| [plant_list_additions](#plant_list_additions) | 0 |  |
| [plant_list_audit](#plant_list_audit) | 17,520 |  |
| [plant_list_weight_category](#plant_list_weight_category) | 14 |  |
| [plant_list_works](#plant_list_works) | 3 |  |
| [plant_list_works_documents](#plant_list_works_documents) | 0 |  |
| [plant_specifications](#plant_specifications) | 51 |  |
| [plant_specification_models](#plant_specification_models) | 38 |  |
| [pod_ocr_templates](#pod_ocr_templates) | 2 |  |
| [pod_uploads](#pod_uploads) | 71 |  |
| [pod_upload_batches](#pod_upload_batches) | 17 |  |
| [postcodelatlng](#postcodelatlng) | 1,767,803 |  |
| [precautionary_combination_codes](#precautionary_combination_codes) | 44 |  |
| [precautionary_statements](#precautionary_statements) | 132 |  |
| [precautionary_statement_combinations](#precautionary_statement_combinations) | 19 |  |
| [price_list](#price_list) | 316 |  |
| [price_list_customer_override](#price_list_customer_override) | 0 |  |
| [ra_assessments](#ra_assessments) | 7 |  |
| [ra_audit_log](#ra_audit_log) | 0 |  |
| [ra_documents](#ra_documents) | 0 |  |
| [ra_hazard_analysis](#ra_hazard_analysis) | 33 |  |
| [riddor_annual_summary](#riddor_annual_summary) | 6 |  |
| [riddor_compliance](#riddor_compliance) | 0 |  |
| [riddor_incidents](#riddor_incidents) | 0 |  |
| [riddor_incident_attachments](#riddor_incident_attachments) | 0 |  |
| [risk_assessments](#risk_assessments) | 0 |  |
| [site_address](#site_address) | 1,438 |  |
| [suppliers](#suppliers) | 572 |  |
| [suppliers_productlists](#suppliers_productlists) | 658 |  |
| [suppliers_product_hickey](#suppliers_product_hickey) | 128 |  |
| [supplier_documents](#supplier_documents) | 102 |  |
| [supplier_invoices](#supplier_invoices) | 6 |  |
| [supplier_invoice_hire_link](#supplier_invoice_hire_link) | 0 |  |
| [supplier_invoice_items](#supplier_invoice_items) | 5 |  |
| [supplier_invoice_templates](#supplier_invoice_templates) | 2 |  |
| [supplier_product_machine_compatibility](#supplier_product_machine_compatibility) | 198 |  |
| [supplier_product_preferred](#supplier_product_preferred) | 41 |  |
| [supplier_product_stock_summary](#supplier_product_stock_summary) | 40 |  |
| [timesheets](#timesheets) | 0 |  |
| [time_dimension](#time_dimension) | 3,287 |  |
| [toolbox_talks](#toolbox_talks) | 0 |  |
| [toolbox_talk_attendance](#toolbox_talk_attendance) | 0 |  |
| [toolbox_talk_summary](#toolbox_talk_summary) | 0 |  |
| [training_completions](#training_completions) | 21 |  |
| [training_compliance_summary](#training_compliance_summary) | 0 |  |
| [training_courses](#training_courses) | 20 |  |
| [ts_ocr_templates](#ts_ocr_templates) | 0 |  |
| [ts_uploads](#ts_uploads) | 2 |  |
| [ts_upload_batches](#ts_upload_batches) | 0 |  |
| [users](#users) | 4 |  |
| [users_page_permissions](#users_page_permissions) | 4 |  |
| [vehicle_alert](#vehicle_alert) | 16 |  |
| [vehicle_document](#vehicle_document) | 0 |  |
| [vehicle_mileage](#vehicle_mileage) | 0 |  |
| [vehicle_monthly_reading](#vehicle_monthly_reading) | 138 |  |
| [vehicle_recall_checks](#vehicle_recall_checks) | 0 |  |
| [xhire](#xhire) | 17 |  |
| [xhire_specs](#xhire_specs) | 33 |  |
| [xh_count](#xh_count) | 0 |  |

---

## accreditations

~2 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_accreditation | `int(11)` | NO | PRI |  | auto_increment |
| accreditation_name | `varchar(100)` | NO | UNI |  |  |
| accreditation_code | `varchar(50)` | YES |  | NULL |  |
| description | `text` | YES |  | NULL |  |
| website_url | `varchar(255)` | YES |  | NULL |  |
| active | `tinyint(4)` | YES |  | 1 |  |
| created_date | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** accreditation_name (unique) → (accreditation_name); PRIMARY (unique) → (id_accreditation)

## accreditation_sections

~42 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_accreditation_section | `int(11)` | NO | PRI |  | auto_increment |
| id_accreditation | `int(11)` | NO | MUL |  |  |
| section_code | `varchar(50)` | NO |  |  |  |
| section_title | `varchar(255)` | YES |  | NULL |  |
| description | `text` | YES |  | NULL |  |
| created_date | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** idx_accreditation → (id_accreditation); PRIMARY (unique) → (id_accreditation_section); unique_section (unique) → (id_accreditation, section_code)

**Foreign keys:**
- `id_accreditation` → `accreditations.id_accreditation`

## adhoc_alerts

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(10) unsigned` | NO | PRI |  | auto_increment |
| title | `varchar(255)` | NO |  |  |  |
| description | `text` | YES |  | NULL |  |
| is_active | `tinyint(1)` | NO |  | 1 |  |
| reminder_date | `date` | YES |  | NULL |  — The date of the event — reminder shows 14 days before |
| actioned_at | `timestamp` | YES |  | NULL |  |
| actioned_by | `varchar(100)` | YES |  | NULL |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** PRIMARY (unique) → (id)

## assessments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_assessment | `int(11)` | NO | PRI |  | auto_increment |
| id_template | `int(11)` | NO | MUL |  |  |
| assessment_type | `enum('Fire Risk','Noise','Site Safety')` | NO | MUL |  |  |
| assessment_title | `varchar(255)` | YES |  | NULL |  |
| assessment_date | `date` | YES |  | NULL |  |
| started_by_user_id | `int(11)` | YES |  | NULL |  |
| started_by_name | `varchar(255)` | YES |  | NULL |  |
| started_at | `timestamp` | YES | MUL | current_timestamp() |  |
| completed_at | `timestamp` | YES |  | NULL |  |
| status | `enum('In Progress','Completed','Archived')` | YES | MUL | 'In Progress' |  |

**Indexes:** idx_started → (started_at); idx_status → (status); idx_type → (assessment_type); id_template → (id_template); PRIMARY (unique) → (id_assessment)

**Foreign keys:**
- `id_template` → `assessment_templates.id_template`

## assessment_documents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_document | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | NO | MUL |  |  |
| document_type | `enum('GRA','MS','Supporting')` | NO | MUL |  |  |
| file_name | `varchar(255)` | NO |  |  |  |
| file_path | `varchar(500)` | NO |  |  |  |
| file_size | `int(11)` | YES |  | NULL |  |
| file_type | `varchar(20)` | YES |  | NULL |  |
| version | `varchar(20)` | YES |  | NULL |  |
| description | `text` | YES |  | NULL |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| uploaded_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** document_type → (document_type); id_assessment → (id_assessment); PRIMARY (unique) → (id_document)

**Foreign keys:**
- `id_assessment` → `risk_assessments.id_assessment`

## assessment_hazards

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_hazard | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | NO | MUL |  |  |
| hazard_description | `text` | NO |  |  |  |
| persons_at_risk | `text` | YES |  | NULL |  |
| likelihood_before | `int(11)` | YES |  | NULL |  — 1-5 scale |
| consequence_before | `int(11)` | YES |  | NULL |  — 1-5 scale |
| risk_level_before | `int(11)` | YES |  | NULL | STORED GENERATED |
| controls_required | `text` | YES |  | NULL |  |
| likelihood_after | `int(11)` | YES |  | NULL |  |
| consequence_after | `int(11)` | YES |  | NULL |  |
| risk_level_after | `int(11)` | YES |  | NULL | STORED GENERATED |
| additional_controls | `text` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** id_assessment → (id_assessment); PRIMARY (unique) → (id_hazard)

**Foreign keys:**
- `id_assessment` → `risk_assessments.id_assessment`

## assessment_history

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_history | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | YES | MUL | NULL |  |
| id_completed | `int(11)` | YES | MUL | NULL |  |
| action | `varchar(100)` | YES | MUL | NULL |  — Created, Updated, Signed, Approved, Archived |
| user_id | `int(11)` | YES |  | NULL |  |
| user_name | `varchar(255)` | YES |  | NULL |  |
| action_details | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** idx_action → (action); idx_assessment → (id_assessment); idx_completed → (id_completed); PRIMARY (unique) → (id_history)

**Foreign keys:**
- `id_assessment` → `assessments.id_assessment`
- `id_completed` → `completed_assessments.id_completed`

## assessment_progress

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_progress | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | NO | MUL |  |  |
| user_id | `int(11)` | YES | MUL | NULL |  |
| user_name | `varchar(255)` | YES |  | NULL |  |
| current_question | `int(11)` | YES |  | 1 |  |
| answers | `longtext` | YES |  | NULL |  — JSON object of all answers |
| last_saved | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_user → (user_id); PRIMARY (unique) → (id_progress); unique_user_assessment (unique) → (id_assessment, user_id)

**Foreign keys:**
- `id_assessment` → `assessments.id_assessment`

## assessment_questions

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_question | `int(11)` | NO | PRI |  | auto_increment |
| id_template | `int(11)` | NO | MUL |  |  |
| section_name | `varchar(255)` | YES |  | NULL |  — e.g., Part A, Detailed Assessment |
| question_order | `int(11)` | NO | MUL |  |  |
| question_text | `longtext` | NO |  |  |  |
| question_type | `enum('Text','YesNo','Textarea','Checkbox','Radio')` | YES |  | 'Text' |  |
| options | `longtext` | YES |  | NULL |  — JSON array of options for Checkbox/Radio |
| required | `tinyint(1)` | YES |  | 1 |  |
| help_text | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_order → (question_order); idx_template → (id_template); PRIMARY (unique) → (id_question)

**Foreign keys:**
- `id_template` → `assessment_templates.id_template`

## assessment_reviews

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_review | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | NO | MUL |  |  |
| review_date | `date` | NO | MUL |  |  |
| reviewed_by | `varchar(100)` | YES |  | NULL |  |
| status | `enum('Compliant','Update Needed','Needs Approval')` | YES |  | 'Compliant' |  |
| notes | `text` | YES |  | NULL |  |
| next_review_date | `date` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_assessment → (id_assessment); PRIMARY (unique) → (id_review); review_date → (review_date)

**Foreign keys:**
- `id_assessment` → `risk_assessments.id_assessment`

## assessment_templates

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| assessment_type | `enum('Fire Risk','Noise','Site Safety')` | NO | MUL |  |  |
| template_name | `varchar(255)` | NO |  |  |  |
| template_description | `longtext` | YES |  | NULL |  |
| version | `int(11)` | YES |  | 1 |  |
| is_active | `tinyint(1)` | YES |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_type → (assessment_type); PRIMARY (unique) → (id_template); unique_assessment_type (unique) → (assessment_type, version)

## audit_runs

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_run | `int(11)` | NO | PRI |  | auto_increment |
| id_template | `int(11)` | NO | MUL |  |  |
| run_title | `varchar(255)` | NO |  |  |  |
| auditor_name | `varchar(255)` | YES |  | NULL |  |
| audit_date | `date` | NO |  |  |  |
| quarter_label | `varchar(20)` | YES | MUL | NULL |  |
| attendees | `text` | YES |  | NULL |  |
| next_meeting_date | `date` | YES |  | NULL |  |
| signed_off_by | `varchar(255)` | YES |  | NULL |  |
| signed_off_date | `date` | YES |  | NULL |  |
| status | `enum('In Progress','Completed')` | YES | MUL | 'In Progress' |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| completed_at | `timestamp` | YES |  | NULL |  |

**Indexes:** id_template → (id_template); PRIMARY (unique) → (id_run); quarter_label → (quarter_label); status → (status)

**Foreign keys:**
- `id_template` → `audit_templates.id_template`

## audit_run_answers

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_answer | `int(11)` | NO | PRI |  | auto_increment |
| id_run | `int(11)` | NO | MUL |  |  |
| id_question | `int(11)` | NO | MUL |  |  |
| compliance | `enum('Y','N','N/A')` | YES |  | NULL |  |
| comments | `longtext` | YES |  | NULL |  |
| owner_name | `varchar(255)` | YES |  | NULL |  |
| owner_date | `date` | YES |  | NULL |  |
| answered_at | `timestamp` | YES |  | NULL |  |

**Indexes:** id_question → (id_question); id_run → (id_run); PRIMARY (unique) → (id_answer); uniq_run_question (unique) → (id_run, id_question)

**Foreign keys:**
- `id_run` → `audit_runs.id_run`
- `id_question` → `audit_template_questions.id_question`

## audit_run_answer_files

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_file | `int(11)` | NO | PRI |  | auto_increment |
| id_run | `int(11)` | NO | MUL |  |  |
| id_question | `int(11)` | NO | MUL |  |  |
| file_name | `varchar(255)` | NO |  |  |  |
| file_path | `varchar(500)` | NO |  |  |  |
| file_size | `int(11)` | YES |  | NULL |  |
| file_type | `varchar(100)` | YES |  | NULL |  |
| uploaded_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_question → (id_question); id_run → (id_run, id_question); PRIMARY (unique) → (id_file)

**Foreign keys:**
- `id_run` → `audit_runs.id_run`
- `id_question` → `audit_template_questions.id_question`

## audit_templates

~12 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| template_name | `varchar(255)` | NO |  |  |  |
| template_code | `varchar(50)` | YES |  | NULL |  — e.g. QMF005 |
| description | `longtext` | YES |  | NULL |  |
| version | `varchar(20)` | YES |  | NULL |  |
| template_type | `enum('checklist','narrative','meeting')` | NO |  | 'checklist' |  |
| is_quarterly | `tinyint(1)` | NO |  | 0 |  |
| fixed_calendar_quarter | `tinyint(4)` | YES |  | NULL |  — 1=Jan-Mar,2=Apr-Jun,3=Jul-Sep,4=Oct-Dec; which calendar quarter this template is run in |
| is_active | `tinyint(1)` | YES |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_template)

## audit_template_questions

~236 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_question | `int(11)` | NO | PRI |  | auto_increment |
| id_template | `int(11)` | NO | MUL |  |  |
| section_name | `varchar(255)` | YES |  | NULL |  |
| question_text | `longtext` | NO |  |  |  |
| question_type | `enum('compliance','text','text_with_owner')` | NO |  | 'compliance' |  |
| sort_order | `int(11)` | YES | MUL | 0 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_template → (id_template); PRIMARY (unique) → (id_question); sort_order → (sort_order)

**Foreign keys:**
- `id_template` → `audit_templates.id_template`

## complaints

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| complaint_id | `int(11)` | NO | PRI |  | auto_increment |
| complaint_date | `date` | NO | MUL |  |  |
| customer_acc | `varchar(100)` | YES | MUL | NULL |  |
| id_hire_list | `int(11)` | YES | MUL | NULL |  |
| complaint_subject | `varchar(255)` | NO |  |  |  |
| complaint_description | `longtext` | YES |  | NULL |  |
| complaint_category | `enum('Service','Equipment','Communication','Delivery','Other')` | NO |  | 'Other' |  |
| reported_by | `varchar(100)` | YES |  | NULL |  |
| complaint_status | `enum('Open','In Progress','Resolved','Closed')` | NO | MUL | 'Open' |  |
| resolution_notes | `longtext` | YES |  | NULL |  |
| resolved_date | `date` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_complaint_date → (complaint_date); idx_customer → (customer_acc); idx_hire_list → (id_hire_list); idx_status → (complaint_status); PRIMARY (unique) → (complaint_id)

**Foreign keys:**
- `id_hire_list` → `hire_list.id_hire_list`

## completed_assessments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_completed | `int(11)` | NO | PRI |  | auto_increment |
| id_assessment | `int(11)` | YES | UNI | NULL |  |
| assessment_type | `enum('Fire Risk','Noise','Site Safety')` | NO | MUL |  |  |
| assessment_title | `varchar(255)` | YES |  | NULL |  |
| assessment_date | `date` | YES | MUL | NULL |  |
| completed_by_user_id | `int(11)` | YES |  | NULL |  |
| completed_by_name | `varchar(255)` | YES |  | NULL |  |
| completed_at | `timestamp` | YES | MUL | current_timestamp() |  |
| signed_by_user_id | `int(11)` | YES |  | NULL |  |
| signed_by_name | `varchar(255)` | YES |  | NULL |  |
| signed_date | `date` | YES |  | NULL |  |
| signed_at | `timestamp` | YES |  | NULL |  |
| signed_notes | `longtext` | YES |  | NULL |  — Additional notes during signature |
| signature_name | `varchar(255)` | YES |  | NULL |  |
| approved_by_user_id | `int(11)` | YES |  | NULL |  |
| approved_by_name | `varchar(255)` | YES |  | NULL |  |
| approved_at | `timestamp` | YES |  | NULL |  |
| assessment_document | `longblob` | YES |  | NULL |  — Final PDF/DOCX document |
| assessment_html | `longtext` | YES |  | NULL |  — HTML version of assessment |
| answers_json | `longtext` | YES |  | NULL |  — JSON of all final answers |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** idx_completed → (completed_at); idx_date → (assessment_date); idx_type → (assessment_type); PRIMARY (unique) → (id_completed); unique_assessment_id (unique) → (id_assessment)

## compliance_task_completions

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_completion | `int(11)` | NO | PRI |  | auto_increment |
| id_task_type | `int(11)` | NO | MUL |  |  |
| entity_id | `int(11)` | YES |  | NULL |  — users.id or delivery_vehicle.id_delivery_vehicle; NULL for global tasks |
| completed_date | `date` | NO |  |  |  |
| completed_by | `varchar(100)` | YES |  | NULL |  |
| notes | `text` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_task_type → (id_task_type, entity_id); PRIMARY (unique) → (id_completion)

**Foreign keys:**
- `id_task_type` → `compliance_task_types.id_task_type`

## compliance_task_types

~11 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_task_type | `int(11)` | NO | PRI |  | auto_increment |
| task_code | `varchar(50)` | NO | UNI |  |  |
| task_name | `varchar(255)` | NO |  |  |  |
| entity_type | `enum('driver','vehicle','global')` | NO |  | 'global' |  |
| interval_unit | `enum('week','month')` | NO |  | 'month' |  |
| interval_value | `int(11)` | NO |  | 1 |  |
| source | `enum('generic','licence_check','mot_due','pmi_due','tacho_due','emissions','mileage')` | NO |  | 'generic' |  |
| complete_url | `varchar(255)` | YES |  | NULL |  — where to go to action this task; NULL = mark done inline on the task list |
| description | `varchar(255)` | YES |  | NULL |  |
| sort_order | `int(11)` | NO |  | 0 |  |
| is_active | `tinyint(1)` | NO |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** PRIMARY (unique) → (id_task_type); task_code (unique) → (task_code)

## contact_list

~241 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_contact_list | `int(11)` | NO | PRI |  | auto_increment |
| contact_name | `varchar(50)` | YES |  | NULL |  |
| contact_surname | `varchar(50)` | YES |  | NULL |  |
| customer_acc | `varchar(50)` | YES |  | NULL |  |
| customer_acc_id | `varchar(50)` | YES |  | NULL |  |
| contact_phone_number | `varchar(50)` | YES |  | NULL |  |
| contact_email | `varchar(250)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_contact_list)

## coshh_documents

~22 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_document | `int(11)` | NO | PRI |  | auto_increment |
| id_product | `int(11)` | NO | MUL |  |  |
| document_type | `enum('Risk Assessment','MSDS','Safety Data Sheet','Other')` | NO | MUL |  |  |
| file_name | `varchar(255)` | NO |  |  |  |
| file_path | `varchar(500)` | NO |  |  |  |
| file_size | `int(11)` | YES |  | NULL |  |
| file_type | `varchar(50)` | YES |  | NULL |  |
| version | `varchar(50)` | YES |  | NULL |  |
| review_date | `date` | YES |  | NULL |  |
| expiry_date | `date` | YES |  | NULL |  |
| description | `varchar(500)` | YES |  | NULL |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** document_type → (document_type); id_product → (id_product); PRIMARY (unique) → (id_document)

**Foreign keys:**
- `id_product` → `coshh_products.id_product`

## coshh_hazard_statements

~49 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_mapping | `int(11)` | NO | PRI |  | auto_increment |
| id_product | `int(11)` | NO | MUL |  |  |
| id_hazard_statement | `int(11)` | NO | MUL |  |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_hazard_statement → (id_hazard_statement); id_product (unique) → (id_product, id_hazard_statement); id_product_2 → (id_product); PRIMARY (unique) → (id_mapping)

**Foreign keys:**
- `id_product` → `coshh_products.id_product`
- `id_hazard_statement` → `hazard_statements.id_hazard_statement`

## coshh_precautionary_statements

~119 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_mapping | `int(11)` | NO | PRI |  | auto_increment |
| id_product | `int(11)` | NO | MUL |  |  |
| id_precautionary_statement | `int(11)` | NO | MUL |  |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_precautionary_statement → (id_precautionary_statement); id_product (unique) → (id_product, id_precautionary_statement); id_product_2 → (id_product); PRIMARY (unique) → (id_mapping)

**Foreign keys:**
- `id_product` → `coshh_products.id_product`
- `id_precautionary_statement` → `precautionary_statements.id_precautionary_statement`

## coshh_products

~22 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_product | `int(11)` | NO | PRI |  | auto_increment |
| coshh_id | `varchar(20)` | NO | UNI |  |  — Product ID number |
| product_name | `varchar(255)` | NO | MUL |  |  |
| hazard_classification | `varchar(255)` | YES |  | NULL |  — Type of hazard |
| substance_description | `longtext` | YES |  | NULL |  |
| toxic_ingredients_json | `longtext` | YES |  | NULL |  |
| signal_word | `varchar(20)` | YES |  | '' |  |
| hazard_statements | `longtext` | YES |  | NULL |  |
| precautionary_statements | `longtext` | YES |  | NULL |  |
| supplemental_label_info | `longtext` | YES |  | NULL |  |
| first_aid_eyes | `longtext` | YES |  | NULL |  |
| first_aid_skin | `longtext` | YES |  | NULL |  |
| first_aid_inhalation | `longtext` | YES |  | NULL |  |
| first_aid_ingestion | `longtext` | YES |  | NULL |  |
| storage_procedures | `longtext` | YES |  | NULL |  |
| control_measures | `longtext` | YES |  | NULL |  — Control measures in place |
| control_measure_icons | `varchar(500)` | YES |  | '' |  |
| description_of_use | `longtext` | YES |  | NULL |  |
| quantities_used | `varchar(500)` | YES |  | '' |  |
| assessment_of_risk | `longtext` | YES |  | NULL |  |
| spillage_procedures | `longtext` | YES |  | NULL |  |
| storage_location | `varchar(100)` | NO | MUL |  |  — Storage location/number |
| supplier_name | `varchar(255)` | YES |  | NULL |  |
| status | `enum('Active','Removed','Archived')` | YES | MUL | 'Active' |  |
| notes | `longtext` | YES |  | NULL |  |
| last_reviewed | `date` | YES |  | NULL |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |
| assessment_date | `date` | YES | MUL | NULL |  — Date the assessment was made |
| assessment_by | `varchar(255)` | YES |  | NULL |  — Email/name of person who made the assessment |
| last_reviewed_date | `date` | YES | MUL | NULL |  — Date of last review |
| last_reviewed_by | `varchar(255)` | YES |  | NULL |  — Email/name of person who last reviewed |
| hazards_description | `longtext` | YES |  | NULL |  — Description of hazards present in the product |
| fire_fighting_measures | `longtext` | YES |  | NULL |  — Suitable and unsuitable fire fighting measures |

**Indexes:** coshh_id (unique) → (coshh_id); coshh_id_2 → (coshh_id); idx_assessment_date → (assessment_date); idx_last_reviewed_date → (last_reviewed_date); PRIMARY (unique) → (id_product); product_name → (product_name); status → (status); storage_location → (storage_location)

## coshh_reviews

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_review | `int(11)` | NO | PRI |  | auto_increment |
| id_product | `int(11)` | NO | MUL |  |  |
| review_date | `date` | NO | MUL |  |  |
| reviewed_by | `varchar(100)` | YES |  | NULL |  |
| findings | `longtext` | YES |  | NULL |  |
| action_required | `longtext` | YES |  | NULL |  |
| status | `enum('Compliant','Non-Compliant','Action Required')` | YES |  | 'Compliant' |  |
| next_review_date | `date` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_product → (id_product); PRIMARY (unique) → (id_review); review_date → (review_date)

**Foreign keys:**
- `id_product` → `coshh_products.id_product`

## coshh_statistics

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_stat | `int(11)` | NO | PRI |  | auto_increment |
| total_products | `int(11)` | YES |  | 0 |  |
| active_products | `int(11)` | YES |  | 0 |  |
| products_with_risk_assessment | `int(11)` | YES |  | 0 |  |
| products_with_msds | `int(11)` | YES |  | 0 |  |
| last_updated | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_stat)

## cpc_training_hours

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_cpc_record | `int(11)` | NO | PRI |  | auto_increment |
| employee_id | `int(11)` | NO | MUL |  |  |
| employee_name | `varchar(255)` | NO |  |  |  |
| training_year | `year(4)` | NO | MUL |  |  — The year the training was completed |
| id_course | `int(11)` | YES | MUL | NULL |  |
| course_name | `varchar(255)` | YES |  | NULL |  |
| course_hours | `int(11)` | NO |  |  |  — Hours for this specific course |
| completion_date | `date` | YES | MUL | NULL |  |
| provider_name | `varchar(100)` | YES |  | NULL |  |
| certificate_number | `varchar(100)` | YES |  | NULL |  |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** completion_date → (completion_date); employee_id → (employee_id); id_course → (id_course); PRIMARY (unique) → (id_cpc_record); training_year → (training_year)

**Foreign keys:**
- `id_course` → `training_courses.id_course`

## customers

~475 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_customer | `int(11)` | NO | PRI |  | auto_increment |
| customer_acc | `varchar(50)` | YES |  | NULL |  |
| customer_name | `varchar(50)` | YES |  | NULL |  |
| customer_accounts_contact | `varchar(50)` | YES |  | NULL |  |
| customer_accounts_contact_no | `varchar(50)` | YES |  | NULL |  |
| customer_accounts_email | `varchar(250)` | YES |  | NULL |  |
| customer_email_invoices | `varchar(50)` | YES |  | NULL |  |
| customer_notes | `varchar(250)` | YES |  | NULL |  |
| customer_requirePO | `varchar(50)` | YES |  | NULL |  |
| customer_plant_insurance | `varchar(50)` | YES |  | NULL |  |
| customer_plant_ins_expiry | `date` | YES |  | NULL |  |
| customer_credit_check_rate | `varchar(50)` | YES |  | NULL |  |
| customer_plant_ins_limit | `varchar(50)` | YES |  | NULL |  |
| customer_vat_no | `varchar(50)` | YES |  | NULL |  |
| customer_comp_no | `varchar(50)` | YES |  | NULL |  |
| customer_creditcheck_date | `date` | YES |  | NULL |  |
| customer_creditcheck_pf | `varchar(50)` | YES |  | NULL |  |
| customer_active | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_customer)

## customer_documents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| cust_doc_id | `int(11)` | NO | PRI |  | auto_increment |
| cust_doc_customer_id | `int(11)` | NO | MUL |  |  |
| cust_doc_type | `enum('Plant Insurance','Credit Check','Other')` | NO | MUL |  |  |
| cust_doc_original_filename | `varchar(255)` | NO |  |  |  |
| cust_doc_stored_filename | `varchar(255)` | NO | UNI |  |  |
| cust_doc_document_name | `varchar(255)` | YES |  | NULL |  |
| cust_doc_file_size | `int(11)` | YES |  | NULL |  |
| cust_doc_mime_type | `varchar(100)` | YES |  | NULL |  |
| cust_doc_uploaded_by | `varchar(100)` | YES |  | NULL |  |
| cust_doc_uploaded_date | `timestamp` | YES |  | current_timestamp() |  |
| cust_doc_modified_date | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** cust_doc_stored_filename (unique) → (cust_doc_stored_filename); idx_customer_id → (cust_doc_customer_id); idx_cust_doc_type_id → (cust_doc_customer_id, cust_doc_type); idx_doc_type → (cust_doc_type); PRIMARY (unique) → (cust_doc_id)

## customer_review_history

~3 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_review | `int(11)` | NO | PRI |  | auto_increment |
| id_customer | `int(11)` | NO | MUL |  |  |
| review_entered_at | `datetime` | NO |  | current_timestamp() |  |
| review_entered_by | `varchar(100)` | YES |  | NULL |  |
| customer_plant_insurance | `varchar(255)` | YES |  | NULL |  |
| customer_plant_ins_expiry | `date` | YES |  | NULL |  |
| customer_plant_ins_limit | `decimal(15,2)` | YES |  | NULL |  |
| customer_credit_check_rate | `varchar(100)` | YES |  | NULL |  |
| customer_creditcheck_date | `date` | YES |  | NULL |  |
| customer_creditcheck_pf | `varchar(255)` | YES |  | NULL |  |
| review_notes | `text` | YES |  | NULL |  |

**Indexes:** idx_customer_review → (id_customer, review_entered_at); PRIMARY (unique) → (id_review)

**Foreign keys:**
- `id_customer` → `customers.id_customer`

## customer_statements

~30 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_statement | `int(11)` | NO | PRI |  | auto_increment |
| id_batch | `int(11)` | NO | MUL |  |  |
| customer_account | `varchar(100)` | YES | MUL | NULL |  |
| filename | `varchar(255)` | NO |  |  |  |
| page_count | `int(11)` | YES |  | 1 |  |
| file_path | `varchar(500)` | YES |  | NULL |  |
| created_at | `timestamp` | YES | MUL | current_timestamp() |  |

**Indexes:** created_at → (created_at); customer_account → (customer_account); id_batch → (id_batch); PRIMARY (unique) → (id_statement)

**Foreign keys:**
- `id_batch` → `customer_statement_batches.id_batch`

## customer_statement_batches

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_batch | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| uploaded_by | `varchar(255)` | YES |  | NULL |  |
| batch_status | `enum('processing','completed','error')` | YES | MUL | 'processing' |  |
| statement_count | `int(11)` | YES |  | 0 |  |
| page_count | `int(11)` | YES |  | 0 |  |
| created_at | `timestamp` | YES | MUL | current_timestamp() |  |

**Indexes:** batch_status → (batch_status); created_at → (created_at); PRIMARY (unique) → (id_batch)

## daily_runs

~22 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| run_id | `int(11)` | NO | PRI |  | auto_increment |
| run_date | `date` | NO |  |  |  |
| lorry_id | `int(11)` | NO |  |  |  |
| user_id | `int(11)` | NO |  |  |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** PRIMARY (unique) → (run_id)

## daily_run_pods

~83 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| run_pod_id | `int(11)` | NO | PRI |  | auto_increment |
| run_id | `int(11)` | NO | MUL |  |  |
| pod_id | `int(11)` | NO | MUL |  |  |
| status | `enum('pending','signed','sent')` | YES |  | 'pending' |  |
| signature_image | `longblob` | YES |  | NULL |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** pod_id → (pod_id); PRIMARY (unique) → (run_pod_id); run_id → (run_id)

## debtors

~490 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_debtor | `int(11)` | NO | PRI |  | auto_increment |
| customer_account | `varchar(100)` | NO | UNI |  |  |
| customer_name | `varchar(255)` | NO |  |  |  |
| current_balance | `decimal(12,2)` | YES |  | 0.00 |  |
| current_0_30 | `decimal(12,2)` | YES | MUL | 0.00 |  |
| current_31_60 | `decimal(12,2)` | YES |  | 0.00 |  |
| current_61_90 | `decimal(12,2)` | YES |  | 0.00 |  |
| current_90_plus | `decimal(12,2)` | YES |  | 0.00 |  |
| debtor_status | `enum('Good Standing','Overdue 30+ days','Overdue 60+ days','Overdue 90+ days','Older than 90','Passed to Top Service','Resolved')` | YES | MUL | 'Good Standing' |  |
| invoice_date | `date` | YES |  | NULL |  |
| days_overdue | `int(11)` | YES | MUL | 0 |  |
| total_promised | `decimal(12,2)` | YES |  | 0.00 |  |
| total_paid | `decimal(12,2)` | YES |  | 0.00 |  |
| last_contact_date | `datetime` | YES |  | NULL |  |
| next_review_date | `date` | YES | MUL | NULL |  |
| assigned_to | `varchar(100)` | YES | MUL | NULL |  |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** assigned_to → (assigned_to); customer_account (unique) → (customer_account); customer_account_2 → (customer_account); days_overdue → (days_overdue); debtor_status → (debtor_status); idx_aging_breakdown → (current_0_30, current_31_60, current_61_90, current_90_plus); next_review_date → (next_review_date); PRIMARY (unique) → (id_debtor)

## debtor_actions

~4 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_action | `int(11)` | NO | PRI |  | auto_increment |
| id_debtor | `int(11)` | NO | MUL |  |  |
| action_type | `enum('Phone call','Email sent','Promise made','Payment received','Letter sent','Legal action','Other')` | NO | MUL |  |  |
| action_date | `datetime` | YES | MUL | current_timestamp() |  |
| amount | `decimal(12,2)` | YES |  | NULL |  |
| promised_date | `date` | YES |  | NULL |  |
| action_notes | `longtext` | YES |  | NULL |  |
| taken_by | `varchar(100)` | YES |  | NULL |  |
| follow_up_date | `date` | YES | MUL | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** action_date → (action_date); action_type → (action_type); follow_up_date → (follow_up_date); id_debtor → (id_debtor); PRIMARY (unique) → (id_action)

**Foreign keys:**
- `id_debtor` → `debtors.id_debtor`

## debtor_assignments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_assignment | `int(11)` | NO | PRI |  | auto_increment |
| id_debtor | `int(11)` | NO | MUL |  |  |
| assigned_to | `varchar(100)` | NO | MUL |  |  |
| assigned_date | `timestamp` | YES |  | current_timestamp() |  |
| removed_date | `datetime` | YES |  | NULL |  |
| is_active | `tinyint(1)` | YES | MUL | 1 |  |

**Indexes:** assigned_to → (assigned_to); id_debtor → (id_debtor); is_active → (is_active); PRIMARY (unique) → (id_assignment)

**Foreign keys:**
- `id_debtor` → `debtors.id_debtor`

## debtor_audit_log

~490 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_audit | `int(11)` | NO | PRI |  | auto_increment |
| id_debtor | `int(11)` | NO | MUL |  |  |
| field_name | `varchar(100)` | NO | MUL |  |  |
| old_value | `longtext` | YES |  | NULL |  |
| new_value | `longtext` | YES |  | NULL |  |
| changed_by | `varchar(100)` | YES | MUL | NULL |  |
| change_date | `timestamp` | YES | MUL | current_timestamp() |  |
| change_source | `varchar(50)` | YES |  | 'manual' |  |
| notes | `longtext` | YES |  | NULL |  |

**Indexes:** changed_by → (changed_by); change_date → (change_date); field_name → (field_name); id_debtor → (id_debtor); PRIMARY (unique) → (id_audit)

**Foreign keys:**
- `id_debtor` → `debtors.id_debtor`

## debtor_import_logs

~18 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_log | `int(11)` | NO | PRI |  | auto_increment |
| filename | `varchar(255)` | YES |  | NULL |  |
| imported_by | `varchar(100)` | YES |  | NULL |  |
| total_records | `int(11)` | YES |  | NULL |  |
| successful_records | `int(11)` | YES |  | NULL |  |
| failed_records | `int(11)` | YES |  | NULL |  |
| import_date | `timestamp` | YES |  | current_timestamp() |  |
| notes | `longtext` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_log)

## delivery_docket

~66 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pod_id | `int(11)` | NO | PRI |  | auto_increment |
| pod_source | `enum('internal','external')` | YES | MUL | 'internal' |  |
| id_hire_list_pod | `int(11)` | YES | MUL | NULL |  |
| pod_number | `varchar(50)` | YES |  | NULL |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |
| pod_del_type | `varchar(50)` | YES |  | NULL |  |
| pod_del_customer | `varchar(50)` | YES |  | NULL |  |
| pod_del_customer_id | `varchar(10)` | YES |  | NULL |  |
| pod_del_site | `varchar(50)` | YES |  | NULL |  |
| pod_site_id | `int(11)` | YES |  | NULL |  |
| pod_date | `date` | YES |  | NULL |  |
| submitted_at | `datetime` | YES |  | NULL |  |
| pod_fleet_no | `varchar(255)` | YES |  | NULL |  |
| pod_needed | `varchar(50)` | YES |  | NULL |  |
| pod_additions | `varchar(250)` | NO |  |  |  |
| pod_del_vehicle | `varchar(50)` | YES |  | NULL |  |
| pod_del_driver | `varchar(50)` | YES |  | NULL |  |
| pod_bucket300 | `varchar(50)` | YES |  | NULL |  |
| pod_bucket450 | `varchar(50)` | YES |  | NULL |  |
| pod_bucket600 | `varchar(50)` | YES |  | NULL |  |
| pod_riddlebucket | `varchar(50)` | YES |  | NULL |  |
| pod_bucket900 | `varchar(50)` | YES |  | NULL |  |
| pod_bucket1050 | `varchar(50)` | YES |  | NULL |  |
| pod_bucket1200 | `varchar(50)` | YES |  | NULL |  |
| pod_bucket1500 | `varchar(50)` | YES |  | NULL |  |
| pod_bucketdig | `varchar(50)` | YES |  | NULL |  |
| pod_bucketditch | `varchar(50)` | YES |  | NULL |  |
| pod_bucket750 | `varchar(50)` | YES |  | NULL |  |
| pod_riddlebucket_fleet_no | `varchar(50)` | YES |  | NULL |  |
| pod_forks | `varchar(50)` | YES |  | NULL |  |
| pod_forks_fleet_no | `varchar(50)` | YES |  | NULL |  |
| pod_breaker | `varchar(50)` | YES |  | NULL |  |
| pod_breaker_fleet_no | `varchar(50)` | YES |  | NULL |  |
| pod_fuel | `varchar(50)` | YES |  | NULL |  |
| pod_tracks_tyres | `varchar(10)` | YES |  | NULL |  |
| pod_panels | `varchar(10)` | YES |  | NULL |  |
| pod_windows | `varchar(10)` | YES |  | NULL |  |
| pod_mirrors | `varchar(10)` | YES |  | NULL |  |
| pod_lights | `varchar(10)` | YES |  | NULL |  |
| pod_beacons | `varchar(10)` | YES |  | NULL |  |
| pod_rams | `varchar(10)` | YES |  | NULL |  |
| pod_hoses | `varchar(10)` | YES |  | NULL |  |
| pod_keys | `varchar(255)` | YES |  | NULL |  |
| pod_adblue | `varchar(50)` | YES |  | NULL |  |
| pod_attachment1 | `varchar(50)` | YES |  | NULL |  |
| pod_attachment2 | `varchar(50)` | YES |  | NULL |  |
| pod_attachment3 | `varchar(50)` | YES |  | NULL |  |
| pod_comments | `varchar(250)` | YES |  | NULL |  |
| pod_signed_by | `mediumtext` | YES |  | NULL |  |
| pod_signedby_name | `varchar(50)` | YES |  | NULL |  |
| pod_img | `varchar(100)` | YES |  | NULL |  |
| tonnes_carried | `decimal(8,2)` | YES |  | NULL |  — Load weight on this delivery, for FORS tonne-km reporting |

**Indexes:** idx_pod_source → (pod_source); PRIMARY (unique) → (pod_id); uniq_hirelist_type (unique) → (id_hire_list_pod, pod_del_type)

## delivery_docket_files

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_delivery_docket_files | `int(11)` | NO | PRI |  | auto_increment |
| delivery_docket_file_name | `varchar(50)` | YES |  | NULL |  |
| delivery_docket_file_path | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_delivery_docket_files)

## delivery_type

~3 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_delivery_type | `int(11)` | NO | PRI |  | auto_increment |
| delivery_type_name | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_delivery_type)

## delivery_vehicle

~6 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_delivery_vehicle | `int(11)` | NO | PRI |  | auto_increment |
| delivery_vehicle_name | `varchar(50)` | YES |  | NULL |  |
| make | `varchar(50)` | YES |  | NULL |  |
| model | `varchar(50)` | YES |  | NULL |  |
| year_first_reg | `smallint(6)` | YES |  | NULL |  |
| fuel_type | `varchar(20)` | NO |  | 'Diesel' |  |
| euro_class | `varchar(10)` | YES |  | NULL |  |
| gross_weight_kg | `int(11)` | YES |  | NULL |  |
| mot_due_date | `date` | YES |  | NULL |  |
| pmi_due_date | `date` | YES |  | NULL |  |
| tax_due_date | `date` | YES |  | NULL |  |
| active | `tinyint(1)` | NO |  | 1 |  |
| notes | `text` | YES |  | NULL |  |
| assigned_driver_id | `int(11)` | YES |  | NULL |  — users.id of the driver permanently assigned to this lorry |
| last_recall_check_date | `date` | YES |  | NULL |  |
| next_recall_check_date | `date` | YES |  | NULL |  |
| recall_check_overdue | `enum('Yes','No')` | YES |  | 'No' |  |
| recall_check_notes | `longtext` | YES |  | NULL |  |
| total_axles | `int(11)` | YES |  | 2 |  — Total number of axles |
| axle1_tyre_size | `varchar(50)` | YES |  | NULL |  — Axle 1 tyre size (e.g., 385/65-22.5) |
| axle1_load_index | `varchar(50)` | YES |  | NULL |  — Axle 1 ply rating or load index |
| axle1_single_dual | `varchar(1)` | YES |  | 'S' |  — Axle 1: S=Single, D=Dual |
| axle2_tyre_size | `varchar(50)` | YES |  | NULL |  — Axle 2 tyre size |
| axle2_load_index | `varchar(50)` | YES |  | NULL |  — Axle 2 ply rating or load index |
| axle2_single_dual | `varchar(1)` | YES |  | 'S' |  — Axle 2: S=Single, D=Dual |
| axle3_tyre_size | `varchar(50)` | YES |  | NULL |  — Axle 3 tyre size |
| axle3_load_index | `varchar(50)` | YES |  | NULL |  — Axle 3 ply rating or load index |
| axle3_single_dual | `varchar(1)` | YES |  | 'S' |  — Axle 3: S=Single, D=Dual |
| axle4_tyre_size | `varchar(50)` | YES |  | NULL |  — Axle 4 tyre size |
| axle4_load_index | `varchar(50)` | YES |  | NULL |  — Axle 4 ply rating or load index |
| axle4_single_dual | `varchar(1)` | YES |  | 'S' |  — Axle 4: S=Single, D=Dual |
| total_tyres | `int(11)` | YES |  | NULL |  — Total number of tyres |
| maintenance_interval | `varchar(50)` | YES |  | NULL |  — Maintenance interval (e.g., 6 weeks) |
| maintenance_provider | `varchar(255)` | YES |  | NULL |  — Maintenance service provider |
| taco_inspection_due | `date` | YES |  | NULL |  — Tachograph inspection due date |
| parking_arrangements | `varchar(255)` | YES |  | NULL |  — Parking arrangements |
| operating_centre | `varchar(100)` | YES |  | 'Main' |  — Operating centre location |
| count_in_fleet | `tinyint(1)` | NO |  | 1 |  — Whether this vehicle should be included in fleet count (1) or excluded (0) |
| include_in_pod | `tinyint(1)` | YES |  | 1 |  |
| show_in_fleet | `tinyint(1)` | YES |  | 1 |  |

**Indexes:** PRIMARY (unique) → (id_delivery_vehicle)

## del_pod_photos

~11 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| pod_id | `int(11)` | NO | MUL |  |  |
| file_path | `varchar(255)` | NO |  |  |  |
| uploaded_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** pod_id → (pod_id); PRIMARY (unique) → (id)

## document_accreditation_mapping

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_mapping | `int(11)` | NO | PRI |  | auto_increment |
| id_hs_document | `int(11)` | NO | MUL |  |  |
| id_accreditation_section | `int(11)` | NO | MUL |  |  |
| mapping_notes | `text` | YES |  | NULL |  |
| coverage_status | `varchar(50)` | YES |  | 'Full' |  — Full, Partial, Supporting |
| created_date | `timestamp` | YES |  | current_timestamp() |  |
| mapping_type | `varchar(50)` | YES |  | 'Document' |  — Document, Risk Assessment, Method Statement, COSHH |

**Indexes:** idx_document → (id_hs_document); idx_section → (id_accreditation_section); PRIMARY (unique) → (id_mapping); unique_mapping (unique) → (id_hs_document, id_accreditation_section)

**Foreign keys:**
- `id_hs_document` → `hs_documents.id_hs_document`
- `id_accreditation_section` → `accreditation_sections.id_accreditation_section`

## document_legislation_mapping

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_dlm | `int(11)` | NO | PRI |  | auto_increment |
| id_legislation | `int(11)` | NO | MUL |  |  |
| id_hs_document | `int(11)` | NO | MUL |  |  |
| mapping_type | `varchar(50)` | NO |  | 'Document' |  — Document \| Risk Assessment \| Method Statement \| COSHH |
| coverage_notes | `varchar(500)` | YES |  | NULL |  |
| last_reviewed | `date` | YES |  | NULL |  |
| review_required | `tinyint(1) unsigned` | YES |  | 0 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_id_doc → (id_hs_document); idx_id_leg → (id_legislation); PRIMARY (unique) → (id_dlm); uq_leg_doc (unique) → (id_legislation, id_hs_document, mapping_type)

**Foreign keys:**
- `id_legislation` → `legislation_references.id_legislation`

## document_types

~7 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_document_type | `int(11)` | NO | PRI |  | auto_increment |
| type_name | `varchar(100)` | NO | UNI |  |  |
| description | `text` | YES |  | NULL |  |
| icon_class | `varchar(50)` | YES |  | NULL |  |
| display_order | `int(11)` | YES |  | 0 |  |
| created_date | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** PRIMARY (unique) → (id_document_type); type_name (unique) → (type_name)

## drivers

~602 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_drivers | `int(11)` | NO | PRI |  | auto_increment |
| driver_name | `varchar(50)` | YES |  | NULL |  |
| driver_comments | `varchar(240)` | YES |  | NULL |  |
| driver_360_above | `varchar(50)` | YES |  | NULL |  |
| driver_360_below | `varchar(50)` | YES |  | NULL |  |
| driver_duck | `varchar(50)` | YES |  | NULL |  |
| driver_lifting_ops | `varchar(50)` | YES |  | NULL |  |
| driver_HGV | `varchar(50)` | YES |  | NULL |  |
| driver_phone_no | `varchar(50)` | YES |  | NULL |  |
| driver_company | `varchar(50)` | YES |  | NULL |  |
| driver_CPCS | `varchar(50)` | YES |  | NULL |  |
| drivers_CPCS_expiry | `date` | YES |  | NULL |  |
| driver_add1 | `varchar(50)` | YES |  | NULL |  |
| driver_add2 | `varchar(50)` | YES |  | NULL |  |
| driver_add3 | `varchar(50)` | YES |  | NULL |  |
| driver_town | `varchar(50)` | YES |  | NULL |  |
| driver_county | `varchar(50)` | YES |  | NULL |  |
| driver_postcode | `varchar(50)` | YES |  | NULL |  |
| driver_pts | `varchar(50)` | YES |  | NULL |  |
| driver_pts_expiry | `date` | YES |  | NULL |  |
| driver_active | `varchar(50)` | YES |  | NULL |  |
| driver_pts_yn | `varchar(50)` | YES |  | NULL |  |
| driver_dob | `date` | YES |  | NULL |  |
| driver_email | `varchar(50)` | YES |  | NULL |  |
| driver_medical | `varchar(50)` | YES |  | NULL |  |
| driver_medical_exp_date | `date` | YES |  | NULL |  |
| driver_emergency_contact1 | `varchar(50)` | YES |  | NULL |  |
| driver_emergency_contact1_no | `varchar(50)` | YES |  | NULL |  |
| driver_emergency_contact1_rel | `varchar(50)` | YES |  | NULL |  |
| driver_emergency_contact2 | `varchar(50)` | YES |  | NULL |  |
| driver_emergency_contact2_no | `varchar(50)` | YES |  | NULL |  |
| driver_emergency_contact2_rel | `varchar(50)` | YES |  | NULL |  |
| driver_CPCS_checked | `date` | YES |  | NULL |  |
| first_aid_training | `varchar(50)` | NO |  |  |  |
| driver_dateadd | `date` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_drivers)

## driver_alerts

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| alert_id | `int(11)` | NO | PRI |  | auto_increment |
| staff_id | `int(11)` | NO | MUL |  |  |
| alert_title | `varchar(255)` | NO |  |  |  |
| alert_description | `text` | YES |  | NULL |  |
| frequency_interval | `int(11)` | YES |  | 6 |  |
| next_due | `date` | NO |  |  |  |
| last_completed | `date` | YES |  | NULL |  |
| status | `enum('Pending','Complete','Overdue')` | YES |  | 'Pending' |  |
| created_on | `datetime` | YES |  | current_timestamp() |  |
| updated_on | `datetime` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (alert_id); staff_id → (staff_id)

## driver_licence_checks

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_licence_check | `int(11)` | NO | PRI |  | auto_increment |
| id_user | `int(11)` | NO | MUL |  |  |
| username | `varchar(255)` | YES |  | NULL |  |
| check_date | `date` | NO | MUL |  |  |
| checked_by_user_id | `int(11)` | YES |  | NULL |  |
| checked_by_name | `varchar(255)` | YES |  | NULL |  |
| status | `varchar(100)` | YES |  | NULL |  — Clean, Clean with restrictions, Expired, Invalid |
| findings | `longtext` | YES |  | NULL |  — Details of check findings |
| action_taken | `longtext` | YES |  | NULL |  — Actions taken in response to findings |
| next_check_date | `date` | YES | MUL | NULL |  |
| dvla_check_method | `varchar(100)` | YES |  | NULL |  — Method used: Online check, DVLA letter, etc |
| pdf_filename | `varchar(255)` | YES |  | NULL |  — PDF filename of check document |
| pdf_data | `longblob` | YES |  | NULL |  — Stored PDF file binary data |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_check_date → (check_date); idx_next_check → (next_check_date); idx_user → (id_user); PRIMARY (unique) → (id_licence_check)

**Foreign keys:**
- `id_user` → `users.id`

## emission_factor

~10 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| factor_key | `varchar(50)` | NO | UNI |  |  |
| factor_value | `decimal(10,4)` | NO |  |  |  |
| unit | `varchar(30)` | NO |  |  |  |
| description | `varchar(255)` | YES |  | NULL |  |
| valid_from | `date` | YES |  | NULL |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** factor_key (unique) → (factor_key); PRIMARY (unique) → (id)

## employee_training_assignments

~33 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_assignment | `int(11)` | NO | PRI |  | auto_increment |
| employee_id | `int(11)` | NO | MUL |  |  |
| employee_name | `varchar(255)` | NO |  |  |  |
| id_course | `int(11)` | NO | MUL |  |  |
| assigned_date | `date` | YES |  | NULL |  |
| is_required | `tinyint(1)` | YES |  | 1 |  — Is this training mandatory for this employee? |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** employee_id → (employee_id); id_course → (id_course); PRIMARY (unique) → (id_assignment); unique_employee_course (unique) → (employee_id, id_course)

**Foreign keys:**
- `id_course` → `training_courses.id_course`

## files

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_files | `int(11)` | NO | PRI |  | auto_increment |
| filepath | `varchar(50)` | YES |  | NULL |  |
| filename | `varchar(50)` | YES |  | NULL |  |
| description | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_files)

## fitter

~1,144 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| fitter_id | `int(11)` | NO | PRI |  | auto_increment |
| fitter_date | `date` | NO | MUL |  |  |
| fitter_job | `varchar(250)` | NO |  |  |  |
| callout_type | `varchar(50)` | YES |  | NULL |  |
| fitter_cus | `varchar(50)` | NO |  |  |  |
| fitter_job_location | `varchar(250)` | NO |  |  |  |
| fitter_address | `longtext` | YES |  | NULL |  |
| id_hire_list | `int(11)` | YES | MUL | NULL |  |
| is_chargeable | `enum('Y','N')` | YES | MUL | 'N' |  |
| pdi_filename | `varchar(255)` | YES |  | NULL |  |
| fit_machine_hrs | `varchar(50)` | NO |  |  |  |
| fitter_priority | `varchar(50)` | NO |  |  |  |
| fitter_comments | `varchar(250)` | NO |  |  |  |
| fitter_completed | `varchar(5)` | NO |  |  |  |

**Indexes:** idx_fitter_chargeable → (is_chargeable); idx_fitter_date → (fitter_date); idx_fitter_hire → (id_hire_list); PRIMARY (unique) → (fitter_id)

**Foreign keys:**
- `id_hire_list` → `hire_list.id_hire_list`

## fitters_report

~7 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_fitters_report | `int(11)` | NO | PRI |  | auto_increment |
| fr_number | `varchar(20)` | NO | UNI |  |  |
| fr_date | `date` | NO |  |  |  |
| fr_driver | `varchar(100)` | YES |  | NULL |  |
| fr_fleet_no | `varchar(50)` | NO |  |  |  |
| fr_make | `varchar(50)` | NO |  |  |  |
| fr_machine | `varchar(100)` | YES |  | NULL |  |
| fr_hours | `decimal(6,2)` | YES |  | NULL |  |
| fr_customer_name | `varchar(150)` | YES |  | NULL |  |
| fr_customer_acc | `varchar(100)` | YES |  | NULL |  |
| fr_site_address | `text` | YES |  | NULL |  |
| fr_fitter_name | `varchar(100)` | YES |  | NULL |  |
| fr_fitter_signature | `text` | YES |  | NULL |  |
| fr_customer_sign_name | `varchar(100)` | YES |  | NULL |  |
| fr_customer_signature | `text` | YES |  | NULL |  |
| fr_comments | `text` | YES |  | NULL |  |
| fr_parts_used | `text` | YES |  | NULL |  |
| fr_chargeable_customer | `enum('Yes','No')` | YES |  | NULL |  |
| fr_breakdown_completed | `enum('Yes','No')` | YES |  | NULL |  |
| fr_time_on_site | `time` | YES |  | NULL |  |
| fr_time_off_site | `time` | YES |  | NULL |  |
| fr_travel_to_from | `time` | YES |  | NULL |  |
| fr_image | `varchar(255)` | YES |  | NULL |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |
| updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** fr_number (unique) → (fr_number); PRIMARY (unique) → (id_fitters_report)

## forms_staff

~2 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| sf_id | `int(11)` | NO | PRI |  | auto_increment |
| staff_id | `int(11)` | NO |  |  |  |
| form_id | `int(11)` | NO | MUL |  |  |
| last_completed | `date` | YES |  | NULL |  |
| next_due | `date` | YES |  | NULL |  |
| status | `enum('Pending','Complete','Overdue')` | YES |  | 'Pending' |  |
| deleted | `tinyint(1)` | YES |  | 0 |  |

**Indexes:** fk_form_id → (form_id); PRIMARY (unique) → (sf_id)

## form_assignments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| assign_id | `int(11)` | NO | PRI |  | auto_increment |
| staff_id | `int(11)` | NO | MUL |  |  |
| form_id | `int(11)` | YES |  | NULL |  |
| form_name | `varchar(255)` | NO |  |  |  |
| pdf_path | `varchar(255)` | NO |  |  |  |
| assigned_by | `int(11)` | YES |  | NULL |  |
| assigned_on | `datetime` | YES |  | current_timestamp() |  |
| due_date | `date` | YES |  | NULL |  |
| completed_on | `datetime` | YES |  | NULL |  |
| status | `enum('Pending','Complete')` | YES |  | 'Pending' |  |
| signed_pdf_path | `varchar(255)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (assign_id); staff_id → (staff_id)

## form_submissions

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| submission_id | `int(11)` | NO | PRI |  | auto_increment |
| staff_form_id | `int(11)` | NO | MUL |  |  |
| submitted_at | `datetime` | YES |  | current_timestamp() |  |
| submitted_by | `int(11)` | YES |  | NULL |  |
| form_data | `longtext` | YES |  | NULL |  |
| pdf_path | `varchar(500)` | YES |  | NULL |  |

**Indexes:** fk_formsub_formstaff → (staff_form_id); PRIMARY (unique) → (submission_id)

## form_types

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| form_id | `int(11)` | NO | PRI |  | auto_increment |
| form_name | `varchar(255)` | NO |  |  |  |
| form_description | `text` | YES |  | NULL |  |
| form_path | `varchar(255)` | YES |  | NULL |  |
| recurrence_interval | `int(11)` | YES |  | 365 |  |
| active | `tinyint(1)` | YES |  | 1 |  |

**Indexes:** PRIMARY (unique) → (form_id)

## fors_health_safety_elearning

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_elearning | `int(11)` | NO | PRI |  | auto_increment |
| employee_id | `int(11)` | NO | MUL |  |  |
| employee_name | `varchar(255)` | NO |  |  |  |
| course_year | `year(4)` | NO | MUL |  |  — Which year this satisfies |
| selected_course_id | `int(11)` | YES | MUL | NULL |  |
| selected_course_name | `varchar(255)` | YES |  | NULL |  |
| completion_date | `date` | YES |  | NULL |  |
| certificate_url | `varchar(255)` | YES |  | NULL |  |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** course_year → (course_year); employee_id → (employee_id); PRIMARY (unique) → (id_elearning); selected_course_id → (selected_course_id); unique_employee_year (unique) → (employee_id, course_year)

**Foreign keys:**
- `selected_course_id` → `training_courses.id_course`

## ghg_scope2_electricity

~17 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_scope2 | `int(11)` | NO | PRI |  | auto_increment |
| entry_month | `date` | NO | MUL |  |  |
| location | `varchar(100)` | NO | MUL | 'Unit 11' |  |
| invoice_ref | `varchar(100)` | YES |  | NULL |  |
| kwh | `decimal(12,2)` | YES |  | NULL |  |
| rate_per_kwh | `decimal(10,4)` | YES |  | NULL |  — pence per kWh |
| standing_rate | `decimal(10,4)` | YES |  | NULL |  — pence per day |
| standing_days | `int(11)` | YES |  | NULL |  |
| tariff | `varchar(100)` | YES |  | NULL |  |
| ccl_rate | `decimal(10,6)` | YES |  | NULL |  — GBP per kWh |
| vat_rate | `decimal(5,4)` | YES |  | NULL |  |
| total_elec_charge | `decimal(12,2)` | YES |  | NULL |  |
| total_standing_charge | `decimal(12,2)` | YES |  | NULL |  |
| government_ccl | `decimal(12,4)` | YES |  | NULL |  |
| total_exc_vat | `decimal(12,2)` | YES |  | NULL |  |
| total_inc_vat | `decimal(12,2)` | YES |  | NULL |  |
| scope2_factor | `decimal(10,6)` | YES |  | 0.177000 |  — kg CO2e per kWh |
| scope3_factor | `decimal(10,6)` | YES |  | 0.027700 |  — kg CO2e per kWh (T&D) |
| scope2_co2e | `decimal(12,4)` | YES |  | NULL |  — kg CO2e |
| scope3_co2e | `decimal(12,4)` | YES |  | NULL |  — kg CO2e |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_location → (location); idx_month → (entry_month); PRIMARY (unique) → (id_scope2)

## gra_assessments

~34 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_gra | `int(11)` | NO | PRI |  | auto_increment |
| gra_ref | `varchar(50)` | NO | UNI |  |  — e.g., GRA 001 |
| title | `varchar(255)` | NO |  |  |  — Activity/Process name |
| department | `varchar(100)` | YES | MUL | NULL |  |
| description | `longtext` | YES |  | NULL |  — Overview of the activity |
| assessment_date | `date` | YES | MUL | NULL |  |
| assessed_by | `varchar(100)` | YES |  | NULL |  |
| last_reviewed_date | `date` | YES |  | NULL |  |
| last_reviewed_by | `varchar(100)` | YES |  | NULL |  |
| next_review_date | `date` | YES |  | NULL |  |
| status | `enum('Draft','Active','Superseded','Archived')` | YES | MUL | 'Draft' |  |
| version | `int(11)` | YES |  | 1 |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** assessment_date → (assessment_date); department → (department); gra_ref (unique) → (gra_ref); gra_ref_2 → (gra_ref); idx_status_date → (status, assessment_date); PRIMARY (unique) → (id_gra); status → (status)

## gra_hazards

~46 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_hazard | `int(11)` | NO | PRI |  | auto_increment |
| id_gra | `int(11)` | NO | MUL |  |  |
| hazard_name | `longtext` | NO | MUL |  |  — Hazard description - supports multiple lines |
| who_at_risk | `longtext` | YES |  | NULL |  — Description of who is at risk |
| current_controls | `longtext` | YES |  | NULL |  — Control measures - supports multiple lines |
| risk_level | `enum('Low','Medium','High','Critical')` | YES | MUL | 'Medium' |  |
| additional_actions | `longtext` | YES |  | NULL |  — Additional controls - supports multiple lines |
| responsibility | `varchar(100)` | YES |  | NULL |  — Who is responsible |
| target_date | `date` | YES |  | NULL |  — Target date for actions |
| sort_order | `int(11)` | YES |  | 0 |  |
| likelihood | `int(11)` | YES |  | 1 |  |
| consequence | `int(11)` | YES |  | 1 |  |
| residual_likelihood | `int(11)` | YES |  | 1 |  |
| residual_consequence | `int(11)` | YES |  | 1 |  |

**Indexes:** ft_hazard_name → (hazard_name); id_gra → (id_gra); PRIMARY (unique) → (id_hazard); risk_level → (risk_level)

**Foreign keys:**
- `id_gra` → `gra_assessments.id_gra`

## hazard_statements

~82 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_hazard_statement | `int(11)` | NO | PRI |  | auto_increment |
| h_code | `varchar(10)` | NO | UNI |  |  |
| description | `text` | NO |  |  |  |
| category | `varchar(50)` | YES | MUL | NULL |  |
| active | `tinyint(1)` | YES |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** category → (category); h_code (unique) → (h_code); h_code_2 → (h_code); PRIMARY (unique) → (id_hazard_statement)

## hire_list

~7,066 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| uniqid | `varchar(50)` | YES |  | NULL |  |
| id_hire_list | `int(11)` | NO | PRI |  | auto_increment |
| on_hire_date | `date` | YES |  | NULL |  |
| off_hire_date | `date` | YES |  | NULL |  |
| fleet_number | `varchar(255)` | YES |  | NULL |  |
| customer_acc | `varchar(50)` | YES |  | NULL |  |
| customer_acc_id | `int(11)` | YES |  | NULL |  |
| id_site_address | `varchar(50)` | YES |  | NULL |  |
| site_name | `varchar(50)` | YES |  | NULL |  |
| site_postcode_now | `varchar(50)` | YES |  | NULL |  |
| site_lat | `decimal(18,15)` | YES |  | NULL |  |
| site_long | `decimal(18,15)` | YES |  | NULL |  |
| job_type_name | `varchar(50)` | YES |  | NULL |  |
| purchase_order | `varchar(50)` | YES |  | NULL |  |
| drivers_name | `varchar(50)` | YES |  | NULL |  |
| delivery_vehicle_name | `varchar(50)` | YES |  | NULL |  |
| delivery_type | `varchar(50)` | YES |  | NULL |  |
| Xhire_from | `varchar(50)` | YES |  | NULL |  |
| Xhire_ref | `varchar(50)` | YES |  | NULL |  |
| xh_rate | `varchar(50)` | YES |  | NULL |  |
| hl_hire_extinguisher | `varchar(50)` | YES |  | NULL |  |
| hl_tracker | `varchar(10)` | YES |  | NULL |  |
| hl_cameras_360 | `varchar(10)` | YES |  | NULL |  |
| hl_rails | `varchar(10)` | YES |  | NULL |  |
| hl_zts | `varchar(10)` | YES |  | NULL |  |
| hl_heigh_slew | `varchar(10)` | YES |  | NULL |  |
| hl_rubber_tracks | `varchar(10)` | YES |  | NULL |  |
| hl_rotate_circuit | `varchar(10)` | YES |  | NULL |  |
| hl_bio_oil | `varchar(10)` | YES |  | NULL |  |
| hl_bladed_bkts | `varchar(10)` | YES |  | NULL |  |
| hl_vcas | `varchar(10)` | YES |  | NULL |  |
| hl_straight | `varchar(10)` | YES |  | NULL |  |
| hl_swivel | `varchar(10)` | YES |  | NULL |  |
| hl_pts | `varchar(10)` | YES |  | NULL |  |
| hl_driver_medical | `varchar(10)` | YES |  | NULL |  |
| hl_lifting_ops | `varchar(10)` | YES |  | NULL |  |
| hire_rate | `varchar(50)` | YES |  | NULL |  |
| transport_rate | `varchar(50)` | YES |  | NULL |  |
| hire_status_name | `varchar(50)` | YES |  | NULL |  |
| hire_comments | `varchar(250)` | YES |  | NULL |  |
| delivery_docket_number | `varchar(50)` | YES |  | NULL |  |
| delivery_docket_file | `mediumblob` | YES |  | NULL |  |
| collection_docket_number | `varchar(50)` | YES |  | NULL |  |
| off_hire_number | `varchar(50)` | NO |  | 'On hire' |  |
| xh_plantlist_description | `varchar(50)` | YES |  | NULL |  |
| needed | `varchar(50)` | YES |  | NULL |  |
| sd_op_changes | `varchar(50)` | YES |  | NULL |  |
| bkt300 | `varchar(10)` | YES |  | NULL |  |
| bkt450 | `varchar(10)` | YES |  | NULL |  |
| bkt600 | `varchar(10)` | YES |  | NULL |  |
| bkt750 | `varchar(10)` | YES |  | NULL |  |
| bkt900 | `varchar(10)` | YES |  | NULL |  |
| bkt1050 | `varchar(10)` | YES |  | NULL |  |
| bkt1200 | `varchar(10)` | YES |  | NULL |  |
| bkt1500 | `varchar(10)` | YES |  | NULL |  |
| bktdig | `varchar(10)` | YES |  | NULL |  |
| bktditch | `varchar(10)` | YES |  | NULL |  |
| fuel_on_return | `decimal(10,3)` | YES |  | NULL |  |
| adblue_on_return | `decimal(10,3)` | YES |  | NULL |  |
| XH_actioned_OH | `tinyint(1)` | YES |  | 0 |  |

**Indexes:** PRIMARY (unique) → (id_hire_list)

## hire_list_additions

~20 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hla_id | `int(10) unsigned` | NO | PRI |  | auto_increment |
| hla_hire_id | `int(10) unsigned` | NO | MUL |  |  |
| hla_addition_id | `int(10) unsigned` | NO |  |  |  |
| hla_qty | `decimal(10,2)` | YES |  | NULL |  |
| hla_notes | `varchar(255)` | YES |  | NULL |  |
| hla_added_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** PRIMARY (unique) → (hla_id); uniq_hire_addition (unique) → (hla_hire_id, hla_addition_id)

## hire_list_audit

~14,846 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| audit_id | `int(10) unsigned` | NO | PRI |  | auto_increment |
| uniqid | `varchar(50)` | YES |  | NULL |  |
| id_hire_list | `int(11)` | NO | MUL |  |  |
| on_hire_date | `date` | YES |  | NULL |  |
| off_hire_date | `date` | YES |  | NULL |  |
| fleet_number | `varchar(50)` | YES |  | NULL |  |
| customer_acc | `varchar(50)` | YES |  | NULL |  |
| customer_acc_id | `int(11)` | YES |  | NULL |  |
| id_site_address | `varchar(50)` | YES |  | NULL |  |
| site_name | `varchar(50)` | YES |  | NULL |  |
| site_postcode_now | `varchar(50)` | YES |  | NULL |  |
| site_lat | `decimal(18,15)` | YES |  | NULL |  |
| site_long | `decimal(18,15)` | YES |  | NULL |  |
| job_type_name | `varchar(50)` | YES |  | NULL |  |
| purchase_order | `varchar(50)` | YES |  | NULL |  |
| drivers_name | `varchar(50)` | YES |  | NULL |  |
| delivery_vehicle_name | `varchar(50)` | YES |  | NULL |  |
| delivery_type | `varchar(50)` | YES |  | NULL |  |
| Xhire_from | `varchar(50)` | YES |  | NULL |  |
| Xhire_ref | `varchar(50)` | YES |  | NULL |  |
| xh_rate | `varchar(50)` | YES |  | NULL |  |
| hl_hire_extinguisher | `varchar(50)` | YES |  | NULL |  |
| hl_tracker | `varchar(10)` | YES |  | NULL |  |
| hl_cameras_360 | `varchar(10)` | YES |  | NULL |  |
| hl_rails | `varchar(10)` | YES |  | NULL |  |
| hl_zts | `varchar(10)` | YES |  | NULL |  |
| hl_heigh_slew | `varchar(10)` | YES |  | NULL |  |
| hl_rubber_tracks | `varchar(10)` | YES |  | NULL |  |
| hl_rotate_circuit | `varchar(10)` | YES |  | NULL |  |
| hl_bio_oil | `varchar(10)` | YES |  | NULL |  |
| hl_bladed_bkts | `varchar(10)` | YES |  | NULL |  |
| hl_vcas | `varchar(10)` | YES |  | NULL |  |
| hl_straight | `varchar(10)` | YES |  | NULL |  |
| hl_swivel | `varchar(10)` | YES |  | NULL |  |
| hl_pts | `varchar(10)` | YES |  | NULL |  |
| hl_driver_medical | `varchar(10)` | YES |  | NULL |  |
| hl_lifting_ops | `varchar(10)` | YES |  | NULL |  |
| hire_rate | `varchar(50)` | YES |  | NULL |  |
| transport_rate | `varchar(50)` | YES |  | NULL |  |
| hire_status_name | `varchar(50)` | YES |  | NULL |  |
| hire_comments | `varchar(250)` | YES |  | NULL |  |
| delivery_docket_number | `varchar(50)` | YES |  | NULL |  |
| delivery_docket_file | `mediumblob` | YES |  | NULL |  |
| collection_docket_number | `varchar(50)` | YES |  | NULL |  |
| off_hire_number | `varchar(50)` | NO |  | 'On hire' |  |
| xh_plantlist_description | `varchar(50)` | YES |  | NULL |  |
| needed | `varchar(50)` | YES |  | NULL |  |
| sd_op_changes | `varchar(50)` | YES |  | NULL |  |
| bkt300 | `varchar(10)` | YES |  | NULL |  |
| bkt450 | `varchar(10)` | YES |  | NULL |  |
| bkt600 | `varchar(10)` | YES |  | NULL |  |
| bkt750 | `varchar(10)` | YES |  | NULL |  |
| bkt900 | `varchar(10)` | YES |  | NULL |  |
| bkt1050 | `varchar(10)` | YES |  | NULL |  |
| bkt1200 | `varchar(10)` | YES |  | NULL |  |
| bkt1500 | `varchar(10)` | YES |  | NULL |  |
| bktdig | `varchar(10)` | YES |  | NULL |  |
| bktditch | `varchar(10)` | YES |  | NULL |  |
| fuel_on_return | `decimal(10,3)` | YES |  | NULL |  |
| adblue_on_return | `decimal(10,3)` | YES |  | NULL |  |
| XH_actioned_OH | `tinyint(1)` | YES |  | 0 |  |
| hl_date_change | `datetime` | NO |  | current_timestamp() |  |
| audit_action | `enum('INSERT','UPDATE','DELETE')` | NO |  |  |  |
| audit_changed_at | `datetime` | NO |  | current_timestamp() |  |
| audit_changed_by | `varchar(100)` | YES |  | NULL |  |

**Indexes:** idx_hire_list_audit_id_hire_list → (id_hire_list); PRIMARY (unique) → (audit_id)

## hire_list_changexh

~48 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| uniqid | `varchar(50)` | YES |  | NULL |  |
| id_hire_list | `int(11)` | NO | PRI |  | auto_increment |
| on_hire_date | `date` | YES |  | NULL |  |
| off_hire_date | `date` | YES |  | NULL |  |
| fleet_number | `varchar(50)` | YES |  | NULL |  |
| customer_acc | `varchar(50)` | YES |  | NULL |  |
| customer_acc_id | `int(11)` | YES |  | NULL |  |
| id_site_address | `varchar(50)` | YES |  | NULL |  |
| site_name | `varchar(50)` | YES |  | NULL |  |
| site_postcode_now | `varchar(50)` | YES |  | NULL |  |
| site_lat | `decimal(18,15)` | YES |  | NULL |  |
| site_long | `decimal(18,15)` | YES |  | NULL |  |
| job_type_name | `varchar(50)` | YES |  | NULL |  |
| purchase_order | `varchar(50)` | YES |  | NULL |  |
| drivers_name | `varchar(50)` | YES |  | NULL |  |
| delivery_vehicle_name | `varchar(50)` | YES |  | NULL |  |
| delivery_type | `varchar(50)` | YES |  | NULL |  |
| Xhire_from | `varchar(50)` | YES |  | NULL |  |
| Xhire_ref | `varchar(50)` | YES |  | NULL |  |
| xh_rate | `varchar(50)` | YES |  | NULL |  |
| hl_hire_extinguisher | `varchar(50)` | YES |  | NULL |  |
| hl_tracker | `varchar(10)` | YES |  | NULL |  |
| hl_cameras_360 | `varchar(10)` | YES |  | NULL |  |
| hl_rails | `varchar(10)` | YES |  | NULL |  |
| hl_zts | `varchar(10)` | YES |  | NULL |  |
| hl_heigh_slew | `varchar(10)` | YES |  | NULL |  |
| hl_rubber_tracks | `varchar(10)` | YES |  | NULL |  |
| hl_rotate_circuit | `varchar(10)` | YES |  | NULL |  |
| hl_bio_oil | `varchar(10)` | YES |  | NULL |  |
| hl_bladed_bkts | `varchar(10)` | YES |  | NULL |  |
| hl_vcas | `varchar(10)` | YES |  | NULL |  |
| hl_straight | `varchar(10)` | YES |  | NULL |  |
| hl_swivel | `varchar(10)` | YES |  | NULL |  |
| hl_pts | `varchar(10)` | YES |  | NULL |  |
| hl_driver_medical | `varchar(10)` | YES |  | NULL |  |
| hl_lifting_ops | `varchar(10)` | YES |  | NULL |  |
| hire_rate | `varchar(50)` | YES |  | NULL |  |
| transport_rate | `varchar(50)` | YES |  | NULL |  |
| hire_status_name | `varchar(50)` | YES |  | NULL |  |
| hire_comments | `varchar(250)` | YES |  | NULL |  |
| delivery_docket_number | `varchar(50)` | YES |  | NULL |  |
| delivery_docket_file | `mediumblob` | YES |  | NULL |  |
| collection_docket_number | `varchar(50)` | YES |  | NULL |  |
| off_hire_number | `varchar(50)` | NO |  | 'On hire' |  |
| xh_plantlist_description | `varchar(50)` | YES |  | NULL |  |
| needed | `varchar(50)` | YES |  | NULL |  |
| sd_op_changes | `varchar(50)` | NO |  |  |  |
| bkt300 | `varchar(10)` | YES |  | NULL |  |
| bkt450 | `varchar(10)` | YES |  | NULL |  |
| bkt600 | `varchar(10)` | YES |  | NULL |  |
| bkt750 | `varchar(10)` | YES |  | NULL |  |
| bkt900 | `varchar(10)` | YES |  | NULL |  |
| bkt1050 | `varchar(10)` | YES |  | NULL |  |
| bkt1200 | `varchar(10)` | YES |  | NULL |  |
| bkt1500 | `varchar(10)` | YES |  | NULL |  |
| bktdig | `varchar(10)` | YES |  | NULL |  |
| bktditch | `varchar(10)` | YES |  | NULL |  |
| fuel_on_return | `decimal(10,3)` | YES |  | NULL |  |
| adblue_on_return | `decimal(10,3)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_hire_list)

## hire_plant_additions

~11 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hpa_id | `int(11)` | NO | PRI |  | auto_increment |
| hpa_addition_code | `varchar(10)` | NO |  |  |  |
| hpa_description | `varchar(50)` | NO |  |  |  |
| hpa_addition_plant | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (hpa_id)

## hire_site_map

~187 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hsm_id | `int(11)` | NO | PRI |  | auto_increment |
| id_hire_list | `int(11)` | NO | MUL |  |  |
| from_site_id | `int(11)` | YES | MUL | NULL |  |
| to_site_id | `int(11)` | YES | MUL | NULL |  |

**Indexes:** fk_from_site → (from_site_id); fk_hire → (id_hire_list); fk_to_site → (to_site_id); PRIMARY (unique) → (hsm_id)

## hire_status

~5 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hire_status_id | `int(11)` | NO | PRI |  | auto_increment |
| hire_status_name | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (hire_status_id)

## holiday_dates

~56 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hol_uniq | `int(11)` | NO | PRI |  | auto_increment |
| hol_date | `date` | NO |  |  |  |
| hol_type | `varchar(50)` | NO |  |  |  |
| hol_desc | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (hol_uniq)

## holiday_events

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| evt_id | `int(11)` | YES |  | NULL |  |
| evt_start | `date` | YES |  | NULL |  |
| evt_end | `date` | YES |  | NULL |  |
| evt_text | `varchar(50)` | YES |  | NULL |  |
| evt_color | `varchar(7)` | YES |  | NULL |  |
| evt_bg | `varchar(7)` | YES |  | NULL |  |

## hours_drivers

~215 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| hours_id | `int(11)` | NO | PRI |  | auto_increment |
| hours_timesheet_no | `varchar(50)` | YES |  | NULL |  |
| hours_cus_acc | `varchar(50)` | YES |  | NULL |  |
| hours_cus_acc_id | `int(11)` | YES |  | NULL |  |
| hours_site | `varchar(50)` | YES |  | NULL |  |
| hours_site_id | `int(11)` | YES |  | NULL |  |
| hours_op | `varchar(50)` | YES |  | NULL |  |
| hours_WE | `date` | YES |  | NULL |  |
| hours_machine | `varchar(50)` | YES |  | NULL |  |
| day1 | `date` | YES |  | NULL |  |
| day2 | `date` | YES |  | NULL |  |
| day3 | `date` | YES |  | NULL |  |
| day4 | `date` | YES |  | NULL |  |
| day5 | `date` | YES |  | NULL |  |
| day6 | `date` | YES |  | NULL |  |
| day7 | `date` | YES |  | NULL |  |
| day_hours1 | `varchar(10)` | YES |  | NULL |  |
| day_hours2 | `varchar(10)` | YES |  | NULL |  |
| day_hours3 | `varchar(10)` | YES |  | NULL |  |
| day_hours4 | `varchar(10)` | YES |  | NULL |  |
| day_hours5 | `varchar(10)` | YES |  | NULL |  |
| day_hours6 | `varchar(10)` | YES |  | NULL |  |
| day_hours7 | `varchar(10)` | YES |  | NULL |  |
| remarks_day_hours_1 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_2 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_3 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_4 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_5 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_6 | `varchar(255)` | YES |  | NULL |  |
| remarks_day_hours_7 | `varchar(255)` | YES |  | NULL |  |
| day_hours_nights1 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights2 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights3 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights4 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights5 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights6 | `varchar(50)` | YES |  | NULL |  |
| day_hours_nights7 | `varchar(50)` | YES |  | NULL |  |
| day1_bh | `varchar(5)` | YES |  | NULL |  |
| day2_bh | `varchar(5)` | YES |  | NULL |  |
| day3_bh | `varchar(5)` | YES |  | NULL |  |
| day4_bh | `varchar(5)` | YES |  | NULL |  |
| day5_bh | `varchar(5)` | YES |  | NULL |  |
| total_ot1 | `varchar(50)` | YES |  | NULL |  |
| total_ot2 | `varchar(50)` | YES |  | NULL |  |
| total_ot1_n | `varchar(50)` | YES |  | NULL |  |
| total_ot2_n | `varchar(50)` | YES |  | NULL |  |
| d_bonus | `varchar(50)` | YES |  | NULL |  |
| d_travel | `varchar(50)` | YES |  | NULL |  |
| total_hours_bh | `varchar(50)` | YES |  | NULL |  |
| total_hours_days | `varchar(50)` | YES |  | NULL |  |
| total_nights | `varchar(50)` | YES |  | NULL |  |
| total_week_hours_days | `varchar(50)` | YES |  | NULL |  |
| totalBankholidayNights | `varchar(50)` | YES |  | NULL |  |
| hirer_sign_name | `varchar(250)` | YES |  | NULL |  |
| hirer_sign_img | `mediumtext` | YES |  | NULL |  |
| op_sign_img | `mediumtext` | YES |  | NULL |  |
| signed_date | `date` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (hours_id)

## hs_documents

~188 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_hs_document | `int(11)` | NO | PRI |  | auto_increment |
| id_document_type | `int(11)` | NO | MUL |  |  |
| document_code | `varchar(50)` | NO | UNI |  |  |
| document_title | `varchar(255)` | NO |  |  |  |
| issue_number | `varchar(50)` | YES |  | NULL |  |
| issue_date | `date` | YES |  | NULL |  |
| last_reviewed_date | `date` | YES |  | NULL |  |
| next_review_due | `date` | YES |  | NULL |  |
| description | `text` | YES |  | NULL |  |
| file_path | `varchar(500)` | YES |  | NULL |  |
| original_filename | `varchar(255)` | YES |  | NULL |  |
| status | `varchar(50)` | YES | MUL | 'Active' |  — Active, Archived, Under Review, Draft |
| created_date | `timestamp` | YES |  | current_timestamp() |  |
| updated_date | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** document_code (unique) → (document_code); idx_code → (document_code); idx_status → (status); idx_type → (id_document_type); PRIMARY (unique) → (id_hs_document)

**Foreign keys:**
- `id_document_type` → `document_types.id_document_type`

## internal_invoice_batches

~20 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_invoice_batch | `int(10) unsigned` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_original_path | `varchar(500)` | NO |  |  |  |
| batch_status | `enum('uploaded','split','ocr_done','reviewing','complete','error')` | NO |  | 'uploaded' |  |
| page_count | `int(10) unsigned` | NO |  | 0 |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| uploaded_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_invoice_batch)

## internal_invoice_ocr_templates

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_invoice_template | `int(10) unsigned` | NO | PRI |  | auto_increment |
| template_name | `varchar(255)` | NO |  |  |  |
| supplier_name | `varchar(255)` | YES |  | NULL |  |
| page_width_points | `decimal(10,2)` | YES |  | NULL |  |
| page_height_points | `decimal(10,2)` | YES |  | NULL |  |
| boxes_json | `longtext` | NO |  |  |  |
| filename_pattern | `varchar(500)` | NO |  | '{invoice_number} - {customer} - {po}.pdf' |  |
| is_active | `enum('Y','N')` | NO |  | 'Y' |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_invoice_template)

## internal_invoice_pages

~328 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_invoice_page | `int(10) unsigned` | NO | PRI |  | auto_increment |
| id_invoice_batch | `int(10) unsigned` | NO | MUL |  |  |
| page_number | `int(10) unsigned` | NO |  |  |  |
| page_pdf_path | `varchar(500)` | NO |  |  |  |
| ocr_text | `longtext` | YES |  | NULL |  |
| extracted_json | `longtext` | YES |  | NULL |  |
| annotations_json | `longtext` | YES |  | NULL |  |
| extracted_invoice_number | `varchar(100)` | YES |  | NULL |  |
| extracted_customer | `varchar(255)` | YES |  | NULL |  |
| extracted_po | `varchar(255)` | YES |  | NULL |  |
| extracted_date | `date` | YES |  | NULL |  |
| extracted_amount | `decimal(10,2)` | YES |  | NULL |  |
| suggested_filename | `varchar(500)` | YES |  | NULL |  |
| confirmed_filename | `varchar(500)` | YES |  | NULL |  |
| final_pdf_path | `varchar(500)` | YES |  | NULL |  |
| review_status | `enum('pending','reviewed','confirmed','error')` | NO | MUL | 'pending' |  |
| review_notes | `text` | YES |  | NULL |  |
| confirmed_by | `varchar(100)` | YES |  | NULL |  |
| confirmed_at | `datetime` | YES |  | NULL |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_internal_invoice_pages_batch → (id_invoice_batch); idx_internal_invoice_pages_status → (review_status); PRIMARY (unique) → (id_invoice_page)

## invoice_monthly_report_periods

~12 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_invoice_monthly_report_period | `int(10) unsigned` | NO | PRI |  | auto_increment |
| report_mth | `varchar(20)` | NO | UNI |  |  |
| start_date | `date` | YES |  | NULL |  |
| end_date | `date` | YES |  | NULL |  |
| weeks_inc_bh | `decimal(6,2)` | YES |  | NULL |  |
| notes | `varchar(255)` | YES |  | NULL |  |
| updated_by | `varchar(100)` | YES |  | NULL |  |
| updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_invoice_monthly_report_period); report_mth (unique) → (report_mth)

## invoice_pdf_reviews

~373 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| filename | `varchar(255)` | NO | UNI |  |  |
| status | `enum('pending','approved','amend')` | NO |  | 'pending' |  |
| notes | `text` | YES |  | NULL |  |
| annotations_json | `mediumtext` | YES |  | NULL |  |
| updated_by | `varchar(100)` | YES |  | NULL |  |
| updated_at | `datetime` | NO |  | current_timestamp() | on update current_timestamp() |
| created_at | `datetime` | NO |  | current_timestamp() |  |

**Indexes:** filename (unique) → (filename); PRIMARY (unique) → (id)

## invoice_prepare_queue

~434 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_invoice_prepare | `int(10) unsigned` | NO | PRI |  | auto_increment |
| filename | `varchar(255)` | NO | UNI |  |  |
| hire_ref | `varchar(255)` | YES |  | NULL |  |
| customer | `varchar(255)` | YES |  | NULL |  |
| supplier | `varchar(255)` | YES |  | NULL |  |
| selected_docs_json | `longtext` | YES |  | NULL |  |
| prep_status | `varchar(50)` | NO |  | 'not_prepared' |  |
| updated_by | `varchar(100)` | YES |  | NULL |  |
| updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_invoice_prepare); uq_invoice_prepare_filename (unique) → (filename)

## job_type

~5 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_job_type | `int(11)` | NO | PRI |  | auto_increment |
| job_type_name | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_job_type)

## legislation_references

~85 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_legislation | `int(11)` | NO | PRI |  | auto_increment |
| legislation_name | `varchar(500)` | NO |  |  |  |
| category | `varchar(100)` | NO | MUL |  |  |
| legislation_year | `smallint(5) unsigned` | YES |  | NULL |  |
| status | `enum('Currently Referenced','Suggested')` | YES | MUL | 'Currently Referenced' |  |
| notes | `longtext` | YES |  | NULL |  |
| last_reviewed | `date` | YES |  | NULL |  |
| next_review_date | `date` | YES | MUL | NULL |  |
| review_frequency_months | `int(10) unsigned` | YES |  | 12 |  |
| active | `tinyint(1) unsigned` | NO | MUL | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_active → (active); idx_category → (category); idx_review → (next_review_date); idx_status → (status); PRIMARY (unique) → (id_legislation)

## lorry_assignments

~4 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| job_id | `int(11)` | NO | UNI |  |  |
| lorry_day | `varchar(50)` | NO |  |  |  |
| assigned_date | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** job_id (unique) → (job_id); PRIMARY (unique) → (id)

## mileage_documents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_document | `int(11)` | NO | PRI |  | auto_increment |
| id_mileage | `int(11)` | NO | MUL |  |  |
| file_name | `varchar(255)` | NO |  |  |  |
| file_path | `varchar(500)` | NO |  |  |  |
| file_size | `int(11)` | YES |  | NULL |  |
| file_type | `varchar(50)` | YES |  | NULL |  |
| document_type | `varchar(100)` | YES |  | NULL |  — e.g. MOT Certificate, Driver Notes, Tachograph, etc. |
| description | `varchar(500)` | YES |  | NULL |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_mileage → (id_mileage); PRIMARY (unique) → (id_document)

**Foreign keys:**
- `id_mileage` → `vehicle_mileage.id_mileage`

## mileage_statistics

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_stat | `int(11)` | NO | PRI |  | auto_increment |
| vehicle_registration | `varchar(20)` | NO | MUL |  |  |
| stat_year | `year(4)` | NO |  |  |  |
| total_missing_mileage | `decimal(12,2)` | YES |  | 0.00 |  |
| total_months | `int(11)` | YES |  | 0 |  |
| last_updated | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_stat); unique_vehicle_year (unique) → (vehicle_registration, stat_year); vehicle_registration → (vehicle_registration)

## monthly_invoice_check

~14,937 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| mic_uniqid | `int(11)` | NO | PRI |  | auto_increment |
| mic_id | `varchar(50)` | YES | MUL | NULL |  |
| mic_month | `varchar(50)` | YES |  | NULL |  |
| mic_invoice_no | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (mic_uniqid); uniq_mic_month (unique) → (mic_id, mic_month)

## ms_method_statements

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_ms | `int(11)` | NO | PRI |  | auto_increment |
| ms_ref | `varchar(50)` | NO | UNI |  |  — e.g., MS 001 |
| id_ra | `int(11)` | YES | MUL | NULL |  |
| id_gra | `int(11)` | YES | MUL | NULL |  |
| title | `varchar(255)` | NO |  |  |  — Activity/Task being described |
| activity_description | `longtext` | YES |  | NULL |  |
| equipment_required | `longtext` | YES |  | NULL |  — Tools and equipment needed |
| ppe_required | `longtext` | YES |  | NULL |  — Personal Protective Equipment |
| emergency_procedures | `longtext` | YES |  | NULL |  |
| site_specific_notes | `longtext` | YES |  | NULL |  |
| created_date | `date` | YES |  | NULL |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| review_date | `date` | YES |  | NULL |  |
| reviewed_by | `varchar(100)` | YES |  | NULL |  |
| next_review_date | `date` | YES |  | NULL |  |
| approved_by | `varchar(100)` | YES |  | NULL |  |
| approved_date | `date` | YES |  | NULL |  |
| approval_status | `enum('Pending','Approved','Rejected')` | YES |  | 'Pending' |  |
| status | `enum('Draft','Active','Superseded','Archived')` | YES | MUL | 'Draft' |  |
| version | `int(11)` | YES |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_status_date → (status, created_date); id_gra → (id_gra); id_ra → (id_ra); ms_ref (unique) → (ms_ref); ms_ref_2 → (ms_ref); PRIMARY (unique) → (id_ms); status → (status)

**Foreign keys:**
- `id_ra` → `ra_assessments.id_ra`
- `id_gra` → `gra_assessments.id_gra`

## ms_procedures

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_procedure | `int(11)` | NO | PRI |  | auto_increment |
| id_ms | `int(11)` | NO | MUL |  |  |
| step_number | `int(11)` | NO |  |  |  |
| description | `longtext` | YES |  | NULL |  |
| safety_considerations | `longtext` | YES |  | NULL |  — Safety notes for this step |
| sort_order | `int(11)` | YES |  | 0 |  |

**Indexes:** id_ms → (id_ms); id_ms_2 (unique) → (id_ms, step_number); PRIMARY (unique) → (id_procedure)

**Foreign keys:**
- `id_ms` → `ms_method_statements.id_ms`

## off_hire_numbers

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| Offhire_id | `int(11)` | NO | PRI |  | auto_increment |
| Off_id_hire_list | `varchar(50)` | YES |  | NULL |  |
| Off_fleet_number | `varchar(50)` | YES |  | NULL |  |
| Off_customer | `varchar(50)` | YES |  | NULL |  |
| Off_Site | `varchar(50)` | YES |  | NULL |  |
| Off_off_hire_date | `date` | YES |  | NULL |  |
| Off_hire_number | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (Offhire_id)

## pcn_appeals

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_appeal | `int(11)` | NO | PRI |  | auto_increment |
| id_pcn | `int(11)` | NO | MUL |  |  |
| appeal_date | `date` | NO |  |  |  |
| appeal_reason | `longtext` | NO |  |  |  |
| appeal_status | `enum('Submitted','Under Review','Rejected','Accepted','Withdrawn')` | YES | MUL | 'Submitted' |  |
| decision_date | `date` | YES |  | NULL |  |
| decision_notes | `longtext` | YES |  | NULL |  |
| submitted_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** appeal_status → (appeal_status); id_pcn → (id_pcn); PRIMARY (unique) → (id_appeal)

**Foreign keys:**
- `id_pcn` → `pcn_records.id_pcn`

## pcn_payments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_payment | `int(11)` | NO | PRI |  | auto_increment |
| id_pcn | `int(11)` | NO | MUL |  |  |
| payment_date | `date` | NO | MUL |  |  |
| payment_amount | `decimal(10,2)` | NO |  |  |  |
| payment_method | `varchar(50)` | YES |  | NULL |  — Cash, Card, Bank Transfer, etc. |
| payment_reference | `varchar(100)` | YES |  | NULL |  |
| notes | `longtext` | YES |  | NULL |  |
| recorded_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_pcn → (id_pcn); payment_date → (payment_date); PRIMARY (unique) → (id_payment)

**Foreign keys:**
- `id_pcn` → `pcn_records.id_pcn`

## pcn_records

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pcn | `int(11)` | NO | PRI |  | auto_increment |
| pcn_date | `date` | NO | MUL |  |  |
| pcn_reference | `varchar(100)` | YES |  | NULL |  |
| driver_name | `varchar(255)` | NO | MUL |  |  |
| vehicle_registration | `varchar(20)` | NO | MUL |  |  |
| penalty_amount | `decimal(10,2)` | NO |  | 65.00 |  |
| details | `longtext` | NO |  |  |  — Description of the infraction |
| issued_by | `varchar(255)` | YES |  | NULL |  — Authority that issued PCN |
| location | `varchar(255)` | YES |  | NULL |  — Location of infraction |
| pcn_status | `enum('Issued','Acknowledged','Appealed','Paid','Cancelled','Expired')` | YES | MUL | 'Issued' |  |
| comments | `longtext` | YES |  | NULL |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** driver_name → (driver_name); pcn_date → (pcn_date); pcn_status → (pcn_status); PRIMARY (unique) → (id_pcn); vehicle_registration → (vehicle_registration)

## pcn_statistics

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_stat | `int(11)` | NO | PRI |  | auto_increment |
| stat_year | `year(4)` | NO | MUL |  |  |
| stat_month | `int(11)` | YES |  | NULL |  |
| total_pcns | `int(11)` | YES |  | 0 |  |
| total_amount | `decimal(12,2)` | YES |  | 0.00 |  |
| paid_amount | `decimal(12,2)` | YES |  | 0.00 |  |
| appealed_count | `int(11)` | YES |  | 0 |  |
| cancelled_count | `int(11)` | YES |  | 0 |  |
| last_updated | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_stat); stat_year → (stat_year); unique_year_month (unique) → (stat_year, stat_month)

## pdi

~195 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pdi_id | `int(11)` | NO | PRI |  | auto_increment |
| pdi_model | `varchar(100)` | YES |  | NULL |  |
| pdi_number | `int(11)` | YES |  | NULL |  |
| pdi_date | `date` | YES |  | NULL |  |
| pdi_fleet_no | `varchar(50)` | YES |  | NULL |  |
| pdi_hours | `int(11)` | YES |  | NULL |  |
| pdi_nxt_svc_due | `int(11)` | YES |  | NULL |  |
| pdi_service250 | `varchar(10)` | YES |  | NULL |  |
| pdi_service500 | `varchar(10)` | YES |  | NULL |  |
| pdi_service1000 | `varchar(10)` | YES |  | NULL |  |
| pdi_resetComputer | `varchar(10)` | YES |  | NULL |  |
| pdi_updateSticker | `varchar(10)` | YES |  | NULL |  |
| pdi_hs | `varchar(10)` | YES |  | NULL |  |
| pdi_rt | `varchar(10)` | YES |  | NULL |  |
| pdi_fe | `varchar(10)` | YES |  | NULL |  |
| pdi_rot | `varchar(10)` | YES |  | NULL |  |
| pdi_bio | `varchar(10)` | YES |  | NULL |  |
| pdi_rams_bushings | `varchar(10)` | YES |  | NULL |  |
| pdi_cab_guards | `varchar(10)` | YES |  | NULL |  |
| pdi_fuel_connectors | `varchar(10)` | YES |  | NULL |  |
| pdi_fueling_hose | `varchar(50)` | YES |  | NULL |  |
| pdi_lifting_eye | `varchar(10)` | YES |  | NULL |  |
| pdi_engine_oil | `varchar(10)` | YES |  | NULL |  |
| pdi_cab_glass | `varchar(10)` | YES |  | NULL |  |
| pdi_coolant_level | `varchar(10)` | YES |  | NULL |  |
| pdi_chassis_bolts | `varchar(10)` | YES |  | NULL |  |
| pdi_hydraulic_fluid | `varchar(10)` | YES |  | NULL |  |
| pdi_seat_secure | `varchar(10)` | YES |  | NULL |  |
| pdi_washer_fluid | `varchar(10)` | YES |  | NULL |  |
| pdi_tracks | `varchar(10)` | YES |  | NULL |  |
| pdi_ad_blue | `varchar(10)` | YES |  | NULL |  |
| pdi_blade_stabilizers | `varchar(10)` | YES |  | NULL |  |
| pdi_seat_belt | `varchar(10)` | YES |  | NULL |  |
| pdi_cable_connections | `varchar(10)` | YES |  | NULL |  |
| pdi_steering | `varchar(10)` | YES |  | NULL |  |
| pdi_cleanliness | `varchar(10)` | YES |  | NULL |  |
| pdi_brakes | `varchar(10)` | YES |  | NULL |  |
| pdi_battery_security | `varchar(10)` | YES |  | NULL |  |
| pdi_bodywork | `varchar(10)` | YES |  | NULL |  |
| pdi_operating_controls | `varchar(10)` | YES |  | NULL |  |
| pdi_front_left_wheel | `varchar(10)` | YES |  | NULL |  |
| pdi_warning_lights | `varchar(10)` | YES |  | NULL |  |
| pdi_front_right_wheel | `varchar(10)` | YES |  | NULL |  |
| pdi_gauges_instruments | `varchar(10)` | YES |  | NULL |  |
| pdi_rear_left_wheel | `varchar(10)` | YES |  | NULL |  |
| pdi_railings_boxing_ring | `varchar(10)` | YES |  | NULL |  |
| pdi_rear_right_wheel | `varchar(10)` | YES |  | NULL |  |
| pdi_fan_belts_chains | `varchar(10)` | YES |  | NULL |  |
| pdi_fuel_cap_secured | `varchar(10)` | YES |  | NULL |  |
| pdi_lenses_mirrors | `varchar(10)` | YES |  | NULL |  |
| pdi_rear_360_cameras | `varchar(10)` | YES |  | NULL |  |
| pdi_horn | `varchar(10)` | YES |  | NULL |  |
| pdi_travel_alarm | `varchar(10)` | YES |  | NULL |  |
| pdi_lights_beacons | `varchar(10)` | YES |  | NULL |  |
| pdi_obvious_leaks | `varchar(10)` | YES |  | NULL |  |
| pdi_safety_pins_bolts | `varchar(10)` | YES |  | NULL |  |
| pdi_floor_mats_air_freshener | `varchar(10)` | YES |  | NULL |  |
| pdi_comments | `varchar(500)` | YES |  | NULL |  |
| pdi_fuel | `decimal(3,2)` | YES |  | NULL |  |
| pdi_signed_canvas | `mediumtext` | YES |  | NULL |  |
| pdi_signed_by_data | `varchar(100)` | YES |  | NULL |  |
| pdi_signed_name | `varchar(100)` | YES |  | NULL |  |
| pdi_image | `varchar(255)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (pdi_id)

## pdi_checklist_items

~40 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pdi_checklist_item | `int(11)` | NO | PRI |  | auto_increment |
| item_key | `varchar(64)` | NO | UNI |  |  |
| item_label | `varchar(128)` | NO |  |  |  |
| applicable_categories | `varchar(255)` | YES |  | NULL |  |
| sort_order | `int(11)` | NO |  | 0 |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |
| updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** item_key (unique) → (item_key); PRIMARY (unique) → (id_pdi_checklist_item)

## pdi_checklist_model_overrides

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pdi_checklist_model_override | `int(11)` | NO | PRI |  | auto_increment |
| model | `varchar(128)` | NO | MUL |  |  |
| item_key | `varchar(64)` | NO |  |  |  |
| applicable | `tinyint(1)` | NO |  |  |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |
| updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_pdi_checklist_model_override); uniq_model_item (unique) → (model, item_key)

## pdi_ocr_templates

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| template_name | `varchar(100)` | NO |  |  |  |
| page_no | `int(11)` | NO |  | 1 |  |
| dpi | `int(11)` | NO |  | 300 |  |
| boxes_json | `longtext` | NO |  |  |  |
| is_active | `tinyint(4)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_template)

## pdi_uploads

~13 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pdi_upload | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO | UNI |  |  |
| extracted_json | `longtext` | YES |  | NULL |  |
| extracted_at | `datetime` | YES |  | NULL |  |
| needs_review | `tinyint(1)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| ocr_status | `varchar(20)` | YES |  | NULL |  |
| ocr_ran_at | `datetime` | YES |  | NULL |  |
| ocr_json | `longtext` | YES |  | NULL |  |
| ocr_error | `text` | YES |  | NULL |  |
| id_batch | `int(11)` | YES | MUL | NULL |  |
| page_no | `int(11)` | YES | MUL | NULL |  |

**Indexes:** id_batch → (id_batch); page_no → (page_no); PRIMARY (unique) → (id_pdi_upload); uq_pod_sha (unique) → (sha256)

## pdi_uploads_archive_2026_06

~15 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pdi_upload | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO | UNI |  |  |
| extracted_json | `longtext` | YES |  | NULL |  |
| extracted_at | `datetime` | YES |  | NULL |  |
| needs_review | `tinyint(1)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| ocr_status | `varchar(20)` | YES |  | NULL |  |
| ocr_ran_at | `datetime` | YES |  | NULL |  |
| ocr_json | `longtext` | YES |  | NULL |  |
| ocr_error | `text` | YES |  | NULL |  |
| id_batch | `int(11)` | YES | MUL | NULL |  |
| page_no | `int(11)` | YES | MUL | NULL |  |

**Indexes:** id_batch → (id_batch); page_no → (page_no); PRIMARY (unique) → (id_pdi_upload); uq_pod_sha (unique) → (sha256)

## pdi_upload_batches

~7 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_batch | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO |  |  |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| status | `varchar(20)` | NO |  | 'processing' |  |

**Indexes:** PRIMARY (unique) → (id_batch)

## phone_calls

~88 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| call_id | `int(11)` | NO | PRI |  | auto_increment |
| caller_name | `varchar(255)` | YES |  | NULL |  |
| caller_number | `varchar(50)` | YES |  | NULL |  |
| call_subject | `varchar(255)` | YES |  | NULL |  |
| call_details | `text` | YES |  | NULL |  |
| action_required | `enum('Action Required','No Action','Message to Pass On','Other')` | YES |  | 'Other' |  |
| message_to_user | `int(11)` | YES |  | NULL |  |
| action_status | `enum('Pending','Completed')` | YES |  | 'Pending' |  |
| call_datetime | `datetime` | NO |  |  |  |
| created_by | `int(11)` | YES | MUL | NULL |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | NULL |  |

**Indexes:** created_by → (created_by); PRIMARY (unique) → (call_id)

## plant_category

~242 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| xh_plantlist_id | `int(11)` | NO | PRI |  | auto_increment |
| xh_plantlist_description | `varchar(50)` | YES |  | NULL |  |
| xh_list_order | `varchar(50)` | YES |  | NULL |  |
| plant_category_name | `varchar(50)` | NO |  | '0' |  |
| plant_sub_category_name | `varchar(50)` | YES |  | NULL |  |
| pc_weight_category | `varchar(45)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (xh_plantlist_id)

## plant_category_types

~52 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pc_id | `int(11)` | NO | PRI |  | auto_increment |
| pct_plant_category_name | `varchar(50)` | NO |  |  |  |
| pct_plant_sub_category_name | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (pc_id)

## plant_category_weights

~19 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pcw_id | `int(11)` | NO | PRI |  | auto_increment |
| pcw_category_weight | `varchar(10)` | NO | UNI |  |  |

**Indexes:** pcw_category_weight (unique) → (pcw_category_weight); PRIMARY (unique) → (pcw_id)

## plant_equipment_capacity_defaults

~97 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| needed_key | `varchar(100)` | NO | UNI |  |  |
| fuel_tank_litres | `decimal(10,2)` | YES |  | NULL |  |
| adblue_tank_litres | `decimal(10,2)` | YES |  | NULL |  |
| notes | `varchar(255)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id); uq_needed_key (unique) → (needed_key)

## plant_list

~270 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_plant_list | `int(11)` | NO | PRI |  | auto_increment |
| fleet_Number | `varchar(50)` | NO |  |  |  |
| Model | `varchar(50)` | YES | MUL | NULL |  |
| display | `varchar(50)` | YES |  | NULL |  |
| Serial_Number | `varchar(50)` | YES |  | NULL |  |
| Quick_Hitch_Number | `varchar(50)` | YES |  | NULL |  |
| Fire_Extinguisher | `varchar(50)` | YES |  | NULL |  |
| Tracker | `varchar(50)` | YES |  | NULL |  |
| Cameras_360 | `varchar(50)` | YES |  | NULL |  |
| Rails | `varchar(50)` | YES |  | NULL |  |
| Immobiliser | `varchar(50)` | YES |  | NULL |  |
| Height_Slew | `varchar(50)` | YES |  | NULL |  |
| Rubber_Tracks | `varchar(50)` | YES |  | NULL |  |
| Rotate_Circuit | `varchar(50)` | YES |  | NULL |  |
| Bio_Oil | `varchar(50)` | YES |  | NULL |  |
| Rego | `varchar(50)` | YES |  | NULL |  |
| vcas | `varchar(50)` | YES |  | NULL |  |
| code | `varchar(50)` | YES |  | NULL |  |
| Last_Serviced | `date` | YES |  | NULL |  |
| Last_Serviced_Hours | `varchar(50)` | YES |  | NULL |  |
| DPF_Cleaned | `varchar(50)` | YES |  | NULL |  |
| DPF_Cleaned_date | `date` | YES |  | NULL |  |
| Lifting_Cert_Expiry_Date | `date` | YES |  | NULL |  |
| Loler_Cert_Path | `varchar(255)` | YES |  | NULL |  |
| Lifting_Cert_File | `varchar(255)` | YES |  | NULL |  |
| Hitch_Cert_Expiry_Date | `date` | YES |  | NULL |  |
| Hitch_Cert_Path | `varchar(255)` | YES |  | NULL |  |
| Hitch_Cert_File | `varchar(255)` | YES |  | NULL |  |
| Machine_hours | `varchar(50)` | YES |  | NULL |  |
| Machine_hours_date_recorded | `date` | YES |  | NULL |  |
| Next_service_due | `varchar(50)` | YES |  | NULL |  |
| service_due_500_or_1000 | `varchar(50)` | YES |  | NULL |  |
| last_big_service_interval | `enum('500','1000')` | YES |  | NULL |  |
| Last_PDI | `varchar(50)` | YES |  | NULL |  |
| Last_service_PDI | `varchar(50)` | YES |  | NULL |  |
| category_and_weight | `varchar(50)` | NO |  |  |  |
| Category | `varchar(50)` | YES |  | NULL |  |
| pl_sub_category | `varchar(50)` | NO |  |  |  |
| Weight_category | `varchar(50)` | YES |  | NULL |  |
| Purchase_Date | `date` | YES |  | NULL |  |
| master_pin | `varchar(50)` | YES |  | NULL |  |
| depot_pin | `varchar(50)` | YES |  | NULL |  |
| track_size | `varchar(50)` | YES |  | NULL |  |
| pl_sold_date | `date` | YES |  | NULL |  |
| plant_archive | `varchar(50)` | YES |  | NULL |  |
| ready_flag | `enum('Y','N')` | YES |  | 'N' |  |

**Indexes:** idx_pl_Model_archive → (Model, plant_archive); PRIMARY (unique) → (id_plant_list)

## plant_list_additions

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pla_id | `int(10) unsigned` | NO | PRI |  | auto_increment |
| pla_plant_id | `int(10) unsigned` | NO | MUL |  |  |
| pla_addition_id | `int(10) unsigned` | NO | MUL |  |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |

**Indexes:** idx_pla_addition_id → (pla_addition_id); idx_pla_plant_id → (pla_plant_id); PRIMARY (unique) → (pla_id); uk_plant_addition (unique) → (pla_plant_id, pla_addition_id)

## plant_list_audit

~17,520 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| pl_uniq_id | `int(11)` | NO | PRI |  | auto_increment |
| id_plant_list | `int(11)` | YES |  | NULL |  |
| fleet_Number | `varchar(50)` | NO |  |  |  |
| Model | `varchar(50)` | YES |  | NULL |  |
| display | `varchar(50)` | YES |  | NULL |  |
| Serial_Number | `varchar(50)` | YES |  | NULL |  |
| Quick_Hitch_Number | `varchar(50)` | YES |  | NULL |  |
| Fire_Extinguisher | `varchar(50)` | YES |  | NULL |  |
| Tracker | `varchar(50)` | YES |  | NULL |  |
| Cameras_360 | `varchar(50)` | YES |  | NULL |  |
| Rails | `varchar(50)` | YES |  | NULL |  |
| Immobiliser | `varchar(50)` | YES |  | NULL |  |
| Height_Slew | `varchar(50)` | YES |  | NULL |  |
| Rubber_Tracks | `varchar(50)` | YES |  | NULL |  |
| Rotate_Circuit | `varchar(50)` | YES |  | NULL |  |
| Bio_Oil | `varchar(50)` | YES |  | NULL |  |
| Rego | `varchar(50)` | YES |  | NULL |  |
| code | `varchar(50)` | YES |  | NULL |  |
| Last_Serviced | `date` | YES |  | NULL |  |
| Last_Serviced_Hours | `varchar(50)` | YES |  | NULL |  |
| DPF_Cleaned | `varchar(50)` | YES |  | NULL |  |
| DPF_Cleaned_date | `date` | YES |  | NULL |  |
| Lifting_Cert_Expiry_Date | `date` | YES |  | NULL |  |
| Hitch_Cert_Expiry_Date | `date` | YES |  | NULL |  |
| Machine_hours | `varchar(50)` | YES |  | NULL |  |
| Machine_hours_date_recorded | `date` | YES |  | NULL |  |
| Next_service_due | `varchar(50)` | YES |  | NULL |  |
| Last_PDI | `varchar(50)` | YES |  | NULL |  |
| Last_service_PDI | `varchar(50)` | YES |  | NULL |  |
| Category | `varchar(50)` | YES |  | NULL |  |
| Weight_category | `varchar(50)` | YES |  | NULL |  |
| Purchase_Date | `date` | YES |  | NULL |  |
| master_pin | `varchar(50)` | YES |  | NULL |  |
| depot_pin | `varchar(50)` | YES |  | NULL |  |
| track_size | `varchar(50)` | YES |  | NULL |  |
| plant_archive | `varchar(50)` | YES |  | NULL |  |
| pl_date_change | `date` | YES |  | NULL |  |
| audit_action | `enum('INSERT','UPDATE','DELETE')` | NO |  |  |  |
| audit_changed_at | `datetime` | NO |  | current_timestamp() |  |
| audit_changed_by | `varchar(100)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (pl_uniq_id)

## plant_list_weight_category

~14 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_plant_list | `int(11)` | NO | PRI |  |  |
| pcw_id | `int(11)` | NO | PRI |  |  |

**Indexes:** idx_pcw_id → (pcw_id); PRIMARY (unique) → (id_plant_list, pcw_id)

**Foreign keys:**
- `pcw_id` → `plant_category_weights.pcw_id`
- `id_plant_list` → `plant_list.id_plant_list`

## plant_list_works

~3 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| plw_uniq_id | `int(11)` | NO | PRI |  | auto_increment |
| plw_id_plant_list | `int(11)` | NO |  |  |  |
| plw_fleet_number | `varchar(50)` | YES |  | NULL |  |
| plw_model | `varchar(50)` | YES |  | NULL |  |
| plw_date | `varchar(50)` | YES |  | NULL |  |
| plw_works | `varchar(500)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (plw_uniq_id)

## plant_list_works_documents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| plwd_id | `int(11)` | NO | PRI |  | auto_increment |
| plwd_plw_uniq_id | `int(11)` | NO | MUL |  |  |
| plwd_original_filename | `varchar(255)` | NO |  |  |  |
| plwd_stored_filename | `varchar(255)` | NO | UNI |  |  |
| plwd_document_name | `varchar(255)` | NO |  |  |  — User-provided name/description |
| plwd_file_size | `int(10) unsigned` | YES |  | NULL |  |
| plwd_mime_type | `varchar(100)` | YES |  | NULL |  |
| plwd_uploaded_date | `timestamp` | YES |  | current_timestamp() |  |
| plwd_uploaded_by | `varchar(100)` | YES |  | NULL |  |

**Indexes:** idx_plw_id → (plwd_plw_uniq_id); idx_plw_uniq_id → (plwd_plw_uniq_id); plwd_stored_filename (unique) → (plwd_stored_filename); PRIMARY (unique) → (plwd_id)

## plant_specifications

~51 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_plant_specifications | `int(11)` | NO | PRI |  | auto_increment |
| Model | `varchar(50)` | NO |  |  |  |
| EC_conform_no | `varchar(50)` | YES |  | NULL |  |
| EU_Stage | `varchar(50)` | NO |  |  |  |
| Fuel_tank_size | `varchar(50)` | YES |  | NULL |  |
| Adblue_tank_size | `varchar(50)` | YES |  | NULL |  |
| Pin_size | `varchar(50)` | YES |  | NULL |  |
| Pipes | `varchar(50)` | YES |  | NULL |  |
| Boom_length | `varchar(50)` | YES |  | NULL |  |
| Arm_length | `varchar(50)` | YES |  | NULL |  |
| Test_radius | `varchar(50)` | YES |  | NULL |  |
| SWL | `varchar(50)` | YES |  | NULL |  |
| engine_power_rate | `varchar(50)` | YES |  | NULL |  |
| engine | `varchar(50)` | YES |  | NULL |  |
| height_to_cab | `varchar(50)` | YES |  | NULL |  |
| height_to_upper_structure | `varchar(50)` | YES |  | NULL |  |
| length | `varchar(50)` | YES |  | NULL |  |
| operating_weight | `varchar(50)` | YES |  | NULL |  |
| width | `varchar(50)` | YES |  | NULL |  |
| weight_of_quick_hitch | `varchar(50)` | YES |  | NULL |  |
| Track_size | `varchar(50)` | YES |  | NULL |  |
| Master_pin | `varchar(50)` | YES |  | NULL |  |
| Depot_pin | `varchar(50)` | YES |  | NULL |  |
| category | `varchar(50)` | NO |  |  |  |
| ps_sub_category | `varchar(50)` | YES |  | NULL |  |
| ps_weight_category | `varchar(50)` | YES |  | NULL |  |
| archive | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_plant_specifications)

## plant_specification_models

~38 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_plant_specification_model | `int(10) unsigned` | NO | PRI |  | auto_increment |
| psm_model | `varchar(150)` | NO | UNI |  |  |
| psm_category | `varchar(150)` | NO | MUL |  |  |
| psm_sub_category | `varchar(150)` | NO | MUL |  |  |
| psm_weight_category | `varchar(50)` | NO | MUL |  |  |
| psm_archive | `char(1)` | NO | MUL | 'N' |  |
| psm_created_at | `timestamp` | NO |  | current_timestamp() |  |
| psm_updated_at | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_psm_archive → (psm_archive); idx_psm_category → (psm_category); idx_psm_sub_category → (psm_sub_category); idx_psm_weight_category → (psm_weight_category); PRIMARY (unique) → (id_plant_specification_model); uq_psm_model (unique) → (psm_model)

## pod_ocr_templates

~2 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| template_name | `varchar(100)` | NO |  |  |  |
| page_no | `int(11)` | NO |  | 1 |  |
| dpi | `int(11)` | NO |  | 300 |  |
| boxes_json | `longtext` | NO |  |  |  |
| is_active | `tinyint(4)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_template)

## pod_uploads

~71 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_pod_upload | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO | UNI |  |  |
| extracted_json | `longtext` | YES |  | NULL |  |
| extracted_at | `datetime` | YES |  | NULL |  |
| needs_review | `tinyint(1)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| ocr_status | `varchar(20)` | YES |  | NULL |  |
| ocr_ran_at | `datetime` | YES |  | NULL |  |
| ocr_json | `longtext` | YES |  | NULL |  |
| ocr_error | `text` | YES |  | NULL |  |
| id_batch | `int(11)` | YES | MUL | NULL |  |
| page_no | `int(11)` | YES | MUL | NULL |  |

**Indexes:** id_batch → (id_batch); page_no → (page_no); PRIMARY (unique) → (id_pod_upload); uq_pod_sha (unique) → (sha256)

## pod_upload_batches

~17 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_batch | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO |  |  |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| status | `varchar(20)` | NO |  | 'processing' |  |

**Indexes:** PRIMARY (unique) → (id_batch)

## postcodelatlng

~1,767,803 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| postcode | `varchar(8)` | NO | MUL |  |  |
| latitude | `decimal(18,15)` | NO |  |  |  |
| longitude | `decimal(18,15)` | NO |  |  |  |
| postcode_active | `varchar(50)` | NO |  |  |  |

**Indexes:** idx_postcode → (postcode); PRIMARY (unique) → (id)

## precautionary_combination_codes

~44 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_mapping | `int(11)` | NO | PRI |  | auto_increment |
| id_combination | `int(11)` | NO | MUL |  |  |
| id_precautionary_statement | `int(11)` | NO | MUL |  |  |
| sequence_order | `int(11)` | NO |  |  |  — Order in which codes appear in the combination |

**Indexes:** id_combination (unique) → (id_combination, id_precautionary_statement); id_combination_2 → (id_combination); id_precautionary_statement → (id_precautionary_statement); PRIMARY (unique) → (id_mapping)

**Foreign keys:**
- `id_combination` → `precautionary_statement_combinations.id_combination`
- `id_precautionary_statement` → `precautionary_statements.id_precautionary_statement`

## precautionary_statements

~132 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_precautionary_statement | `int(11)` | NO | PRI |  | auto_increment |
| p_code | `varchar(10)` | NO | UNI |  |  |
| description | `text` | NO |  |  |  |
| category | `varchar(50)` | YES | MUL | NULL |  |
| active | `tinyint(1)` | YES |  | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** category → (category); PRIMARY (unique) → (id_precautionary_statement); p_code (unique) → (p_code); p_code_2 → (p_code)

## precautionary_statement_combinations

~19 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_combination | `int(11)` | NO | PRI |  | auto_increment |
| combination_code | `varchar(50)` | NO | UNI |  |  — e.g., P302+P352 |
| combined_description | `text` | NO |  |  |  — Full meaning when combined, e.g., IF ON SKIN: Wash with plenty of water |
| display_order | `int(11)` | YES | MUL | 0 |  |
| active | `tinyint(1)` | YES | MUL | 1 |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** active → (active); combination_code (unique) → (combination_code); display_order → (display_order); PRIMARY (unique) → (id_combination)

## price_list

~316 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| price_id | `int(11)` | NO | PRI |  | auto_increment |
| xh_plantlist_id | `int(11)` | YES |  | NULL |  |
| price_description | `varchar(50)` | NO |  |  |  |
| hpa_id | `int(11)` | NO |  |  |  |
| price_item_type | `varchar(50)` | YES |  | NULL |  |
| hire_type | `varchar(50)` | YES |  | NULL |  |
| additions_type | `varchar(50)` | YES |  | NULL |  |
| price | `decimal(10,2)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (price_id)

## price_list_customer_override

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| plco_id | `int(11)` | NO | PRI |  | auto_increment |
| plco_price_id | `int(11)` | NO |  |  |  |
| plco_id_customer | `int(11)` | NO |  |  |  |
| plco_price | `decimal(10,2)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (plco_id)

## ra_assessments

~7 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_ra | `int(11)` | NO | PRI |  | auto_increment |
| ra_ref | `varchar(50)` | NO | UNI |  |  — e.g., RA 001 |
| id_gra | `int(11)` | YES | MUL | NULL |  |
| title | `varchar(255)` | NO |  |  |  — Specific task/activity being assessed |
| description | `longtext` | YES |  | NULL |  |
| assessment_date | `date` | YES |  | NULL |  |
| assessed_by | `varchar(100)` | YES |  | NULL |  |
| last_reviewed_date | `date` | YES |  | NULL |  |
| last_reviewed_by | `varchar(100)` | YES |  | NULL |  |
| next_review_date | `date` | YES |  | NULL |  |
| residual_risk_level | `enum('Low','Medium','High','Critical')` | YES |  | 'Medium' |  |
| ppe_required | `longtext` | YES |  | NULL |  — Personal Protective Equipment required |
| emergency_procedures | `longtext` | YES |  | NULL |  |
| approved_by | `varchar(100)` | YES |  | NULL |  |
| approved_date | `date` | YES |  | NULL |  |
| approval_status | `enum('Pending','Approved','Rejected')` | YES | MUL | 'Pending' |  |
| status | `enum('Draft','Active','Superseded','Archived')` | YES | MUL | 'Draft' |  |
| version | `int(11)` | YES |  | 1 |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |
| permit_to_work_needed | `varchar(3)` | NO |  | 'No' |  — Yes or No — is a permit-to-work needed for this activity? |
| safe_system_of_work | `varchar(3)` | NO |  | 'No' |  — Yes or No — is a safe system of work in place? |
| id_ms | `int(11)` | YES | MUL | NULL |  — FK to ms_method_statements.id_ms — linked Method Statement |

**Indexes:** approval_status → (approval_status); idx_ra_id_ms → (id_ms); idx_status_date → (status, assessment_date); id_gra → (id_gra); PRIMARY (unique) → (id_ra); ra_ref (unique) → (ra_ref); ra_ref_2 → (ra_ref); status → (status)

**Foreign keys:**
- `id_gra` → `gra_assessments.id_gra`

## ra_audit_log

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_log | `int(11)` | NO | PRI |  | auto_increment |
| document_type | `enum('GRA','RA','MS')` | NO | MUL |  |  |
| document_id | `int(11)` | NO |  |  |  |
| action | `varchar(100)` | YES |  | NULL |  — Created, Updated, Approved, Reviewed |
| changed_by | `varchar(100)` | YES |  | NULL |  |
| change_date | `timestamp` | YES | MUL | current_timestamp() |  |
| notes | `longtext` | YES |  | NULL |  — What was changed |

**Indexes:** change_date → (change_date); document_type → (document_type, document_id); PRIMARY (unique) → (id_log)

## ra_documents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_doc | `int(11)` | NO | PRI |  | auto_increment |
| id_gra | `int(11)` | YES | MUL | NULL |  |
| id_ra | `int(11)` | YES | MUL | NULL |  |
| id_ms | `int(11)` | YES | MUL | NULL |  |
| document_type | `enum('GRA','RA','MS','Supporting')` | NO | MUL |  |  |
| file_name | `varchar(255)` | YES |  | NULL |  |
| file_path | `varchar(500)` | YES |  | NULL |  |
| file_size | `int(11)` | YES |  | NULL |  |
| document_format | `varchar(50)` | YES |  | NULL |  — PDF, DOCX, etc |
| description | `varchar(500)` | YES |  | NULL |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| uploaded_date | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** document_type → (document_type); id_gra → (id_gra); id_ms → (id_ms); id_ra → (id_ra); PRIMARY (unique) → (id_doc)

**Foreign keys:**
- `id_gra` → `gra_assessments.id_gra`
- `id_ra` → `ra_assessments.id_ra`
- `id_ms` → `ms_method_statements.id_ms`

## ra_hazard_analysis

~33 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_analysis | `int(11)` | NO | PRI |  | auto_increment |
| id_ra | `int(11)` | NO | MUL |  |  |
| hazard | `longtext` | NO | MUL |  |  — Hazard description - supports multiple lines |
| who_at_risk | `longtext` | YES |  | NULL |  |
| current_controls | `longtext` | YES |  | NULL |  — Control measures - supports multiple lines |
| risk_level | `enum('Low','Medium','High','Critical')` | YES | MUL | 'Medium' |  |
| residual_risk | `enum('Low','Medium','High','Critical')` | YES |  | 'Medium' |  |
| action_required | `longtext` | YES |  | NULL |  — Actions required - supports multiple lines |
| responsibility | `varchar(100)` | YES |  | NULL |  |
| target_date | `date` | YES |  | NULL |  |
| sort_order | `int(11)` | YES |  | 0 |  |
| likelihood | `int(11)` | YES |  | 1 |  |
| consequence | `int(11)` | YES |  | 1 |  |
| residual_likelihood | `int(11)` | YES |  | 1 |  |
| residual_consequence | `int(11)` | YES |  | 1 |  |

**Indexes:** ft_hazard → (hazard); id_ra → (id_ra); PRIMARY (unique) → (id_analysis); risk_level → (risk_level)

**Foreign keys:**
- `id_ra` → `ra_assessments.id_ra`

## riddor_annual_summary

~6 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_summary | `int(11)` | NO | PRI |  | auto_increment |
| summary_year | `year(4)` | NO | UNI |  |  |
| fatalities | `int(11)` | YES |  | 0 |  |
| riddor_incidents | `int(11)` | YES |  | 0 |  |
| lost_time_injuries | `int(11)` | YES |  | 0 |  |
| non_lost_time_injuries | `int(11)` | YES |  | 0 |  |
| dangerous_occurrences | `int(11)` | YES |  | 0 |  |
| near_misses | `int(11)` | YES |  | 0 |  |
| average_employees | `int(11)` | YES |  | 0 |  |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (id_summary); summary_year → (summary_year); unique_year (unique) → (summary_year)

## riddor_compliance

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_compliance | `int(11)` | NO | PRI |  | auto_increment |
| compliance_year | `year(4)` | NO | UNI |  |  |
| total_incidents | `int(11)` | YES |  | 0 |  |
| incidents_reported | `int(11)` | YES |  | 0 |  |
| incidents_investigated | `int(11)` | YES |  | 0 |  |
| investigation_completion_rate | `decimal(5,2)` | YES |  | NULL |  |
| prevention_actions_implemented | `int(11)` | YES |  | 0 |  |
| trend_vs_previous_year | `int(11)` | YES |  | 0 |  |
| hse_performance_rating | `enum('Excellent','Good','Fair','Poor')` | YES |  | 'Fair' |  |
| notes | `longtext` | YES |  | NULL |  |
| last_updated | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** compliance_year → (compliance_year); PRIMARY (unique) → (id_compliance); unique_compliance_year (unique) → (compliance_year)

## riddor_incidents

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_incident | `int(11)` | NO | PRI |  | auto_increment |
| incident_date | `date` | NO | MUL |  |  |
| incident_year | `year(4)` | NO | MUL |  |  |
| incident_type | `enum('Fatality','RIDDOR Incident','Lost Time Injury','Non-lost Time Injury','Dangerous Occurrence','Near Miss')` | NO | MUL |  |  |
| employee_name | `varchar(255)` | YES |  | NULL |  |
| department | `varchar(255)` | YES |  | NULL |  |
| description | `longtext` | NO |  |  |  — What happened |
| investigation_outcome | `longtext` | YES |  | NULL |  — Outcome of investigation |
| prevention_actions | `longtext` | YES |  | NULL |  — Actions taken to prevent reoccurrence |
| included_in_other_category | `tinyint(1)` | YES |  | 0 |  — Whether incident included in multiple categories |
| severity_level | `enum('Low','Medium','High','Critical')` | YES |  | 'Medium' |  |
| status | `enum('Open','Under Investigation','Closed')` | YES | MUL | 'Open' |  |
| investigation_date | `date` | YES |  | NULL |  |
| investigation_completed_date | `date` | YES |  | NULL |  |
| responsible_person | `varchar(255)` | YES |  | NULL |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** incident_date → (incident_date); incident_type → (incident_type); incident_year → (incident_year); PRIMARY (unique) → (id_incident); status → (status)

## riddor_incident_attachments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_attachment | `int(11)` | NO | PRI |  | auto_increment |
| id_incident | `int(11)` | NO | MUL |  |  |
| file_name | `varchar(255)` | NO |  |  |  |
| file_path | `varchar(500)` | NO |  |  |  |
| file_size | `int(11)` | YES |  | NULL |  |
| file_type | `varchar(50)` | YES |  | NULL |  |
| description | `varchar(500)` | YES |  | NULL |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** id_incident → (id_incident); PRIMARY (unique) → (id_attachment)

**Foreign keys:**
- `id_incident` → `riddor_incidents.id_incident`

## risk_assessments

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_assessment | `int(11)` | NO | PRI |  | auto_increment |
| assessment_type | `enum('GRA','MS')` | NO | MUL | 'GRA' |  |
| assessment_id | `varchar(50)` | NO | UNI |  |  — e.g., GRA/002, MS/005 |
| title | `varchar(255)` | NO |  |  |  |
| location | `varchar(255)` | YES |  | NULL |  |
| objective | `text` | YES |  | NULL |  |
| assessed_by | `varchar(100)` | YES |  | NULL |  |
| assessment_date | `date` | YES | MUL | NULL |  |
| next_review_date | `date` | YES | MUL | NULL |  |
| last_review_date | `date` | YES |  | NULL |  |
| status | `enum('Draft','Completed','Under Review','Approved','Overdue')` | YES | MUL | 'Draft' |  |
| hazard_count | `int(11)` | YES |  | 0 |  |
| document_count | `int(11)` | YES |  | 0 |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** assessment_date → (assessment_date); assessment_id (unique) → (assessment_id); assessment_type → (assessment_type); next_review_date → (next_review_date); PRIMARY (unique) → (id_assessment); status → (status)

## site_address

~1,438 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_site_address | `int(11)` | NO | PRI |  | auto_increment |
| site_name | `varchar(50)` | YES |  | NULL |  |
| site_customer | `varchar(50)` | YES |  | NULL |  |
| site_customer_id | `varchar(10)` | YES |  | NULL |  |
| site_add1 | `varchar(100)` | YES |  | NULL |  |
| site_add2 | `varchar(100)` | YES |  | NULL |  |
| site_add3 | `varchar(100)` | YES |  | NULL |  |
| site_town | `varchar(50)` | YES |  | NULL |  |
| site_county | `varchar(50)` | YES |  | NULL |  |
| site_post_code | `varchar(50)` | YES | MUL | NULL |  |
| site_contact | `varchar(50)` | YES |  | NULL |  |
| site_contact_no | `varchar(50)` | YES |  | NULL |  |
| site_contact_id | `int(11)` | YES |  | NULL |  |
| site_active | `varchar(50)` | YES |  | NULL |  |
| site_description | `varchar(50)` | YES |  | NULL |  |
| site_lat | `decimal(18,15)` | YES |  | NULL |  |
| site_long | `decimal(18,15)` | YES |  | NULL |  |

**Indexes:** idx_site_post_code → (site_post_code); PRIMARY (unique) → (id_site_address)

## suppliers

~572 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_supplier | `int(11)` | NO | PRI |  | auto_increment |
| supplier_acc | `varchar(50)` | YES | UNI | NULL |  |
| supplier_customer_no | `varchar(50)` | YES |  | NULL |  |
| supplier_type | `varchar(50)` | YES |  | NULL |  |
| supplier_sub_type | `varchar(50)` | YES |  | NULL |  |
| supplier_name | `varchar(50)` | YES |  | NULL |  |
| supplier_add1 | `varchar(50)` | YES |  | NULL |  |
| supplier_add2 | `varchar(50)` | YES |  | NULL |  |
| supplier_town | `varchar(50)` | YES |  | NULL |  |
| supplier_county | `varchar(50)` | YES |  | NULL |  |
| supplier_postcode | `varchar(50)` | YES |  | NULL |  |
| supplier_accounts_contact | `varchar(50)` | YES |  | NULL |  |
| supplier_accounts_contact_no | `varchar(50)` | YES |  | NULL |  |
| supplier_email | `varchar(50)` | YES |  | NULL |  |
| supplier_xhire | `varchar(50)` | YES |  | NULL |  |
| supplier_active | `varchar(50)` | YES |  | NULL |  |
| supplier_is_waste_carrier | `enum('Y','N')` | NO |  | 'N' |  |
| supplier_waste_carrier_no | `varchar(50)` | YES |  | NULL |  |
| supplier_waste_carrier_expiry | `date` | YES |  | NULL |  |
| supplier_name_norm | `varchar(255)` | YES | MUL | NULL |  |
| supplier_aliases | `longtext` | YES |  | NULL |  |
| supplier_vat_no | `varchar(40)` | YES | MUL | NULL |  |
| supplier_postcode_norm | `varchar(20)` | YES | MUL | NULL |  |
| supplier_match_notes | `varchar(255)` | YES |  | NULL |  |

**Indexes:** idx_suppliers_name_norm → (supplier_name_norm); idx_suppliers_postcode_norm → (supplier_postcode_norm); idx_suppliers_vat_no → (supplier_vat_no); PRIMARY (unique) → (id_supplier); uk_supplier_acc (unique) → (supplier_acc)

## suppliers_productlists

~658 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_product_uniq | `int(11)` | NO | PRI |  | auto_increment |
| supplier_prod_code | `varchar(50)` | YES |  | NULL |  |
| product_hick_code | `varchar(50)` | YES | MUL | NULL |  |
| product_hick_code_id | `int(11)` | YES |  | NULL |  |
| product_supplier | `varchar(50)` | YES |  | NULL |  |
| product_supplier_id | `int(11)` | NO | MUL |  |  |
| product_description | `varchar(250)` | YES |  | NULL |  |
| product_uom_qty | `varchar(50)` | YES |  | NULL |  |
| product_uom | `varchar(50)` | YES |  | NULL |  |
| product_price | `varchar(50)` | YES |  | NULL |  |
| product_price_date | `date` | YES |  | NULL |  |
| product_vat | `varchar(50)` | YES |  | NULL |  |
| product_forplant | `varchar(250)` | YES |  | NULL |  |
| product_stock_on_hand | `varchar(50)` | YES |  | NULL |  |
| product_bay_location | `varchar(50)` | YES |  | NULL |  |
| product_no_machines | `varchar(50)` | YES |  | NULL |  |
| product_min_stock | `varchar(50)` | YES |  | NULL |  |
| product_max_stock | `varchar(50)` | YES |  | NULL |  |

**Indexes:** idx_spl_product_hick_code → (product_hick_code); idx_spl_product_supplier_id → (product_supplier_id); PRIMARY (unique) → (id_product_uniq)

## suppliers_product_hickey

~128 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| sphl_id | `int(11)` | NO | PRI |  | auto_increment |
| sphl_hickey_stock_code | `varchar(50)` | YES |  | NULL |  |
| sphl_stock_hickey_description | `varchar(50)` | YES |  | NULL |  |
| sphl_date_added | `date` | YES |  | NULL |  |
| sphl_stock_on_hand | `int(11)` | YES |  | NULL |  |
| sphl_stock_location | `varchar(10)` | YES |  | NULL |  |
| sphl_archive | `varchar(10)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (sphl_id)

## supplier_documents

~102 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| supp_doc_id | `int(11)` | NO | PRI |  | auto_increment |
| supp_doc_supplier_id | `int(11)` | NO | MUL |  |  |
| supp_doc_type | `enum('Invoice','Quote','Certificate','Insurance','Other')` | NO | MUL |  |  |
| supp_doc_original_filename | `varchar(255)` | NO |  |  |  |
| supp_doc_stored_filename | `varchar(255)` | NO | UNI |  |  |
| supp_doc_document_name | `varchar(255)` | YES |  | NULL |  |
| supp_doc_expiry_date | `date` | YES |  | NULL |  |
| supp_doc_file_size | `int(11)` | YES |  | NULL |  |
| supp_doc_mime_type | `varchar(100)` | YES |  | NULL |  |
| supp_doc_uploaded_by | `varchar(100)` | YES |  | NULL |  |
| supp_doc_uploaded_date | `timestamp` | YES |  | current_timestamp() |  |
| supp_doc_modified_date | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_doc_type → (supp_doc_type); idx_supplier_id → (supp_doc_supplier_id); idx_supp_doc_type_id → (supp_doc_supplier_id, supp_doc_type); PRIMARY (unique) → (supp_doc_id); supp_doc_stored_filename (unique) → (supp_doc_stored_filename)

## supplier_invoices

~6 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_supplier_invoice | `int(11)` | NO | PRI |  | auto_increment |
| id_supplier | `int(11)` | YES | MUL | NULL |  |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `varchar(500)` | NO |  |  |  |
| sha256 | `char(64)` | NO | UNI |  |  |
| supplier_name_raw | `varchar(255)` | YES |  | NULL |  |
| supplier_match_method | `varchar(50)` | YES |  | NULL |  |
| supplier_match_score | `decimal(5,2)` | YES |  | NULL |  |
| invoice_number | `varchar(80)` | YES | MUL | NULL |  |
| invoice_date | `date` | YES | MUL | NULL |  |
| vat_no | `varchar(50)` | YES |  | NULL |  |
| postcode | `varchar(50)` | YES |  | NULL |  |
| tax_point_date | `date` | YES |  | NULL |  |
| net_total | `decimal(10,2)` | YES |  | NULL |  |
| vat_total | `decimal(10,2)` | YES |  | NULL |  |
| gross_total | `decimal(10,2)` | YES |  | NULL |  |
| currency | `char(3)` | YES |  | 'GBP' |  |
| extraction_method | `varchar(50)` | NO |  | 'text_pdf' |  |
| confidence | `decimal(4,3)` | NO |  | 0.000 |  |
| needs_review | `tinyint(1)` | NO |  | 1 |  |
| raw_text | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | NO |  | current_timestamp() |  |
| purchase_order_no | `varchar(100)` | YES |  | NULL |  |
| contract_no | `varchar(100)` | YES |  | NULL |  |

**Indexes:** idx_invoice_date → (invoice_date); idx_invoice_number → (invoice_number); idx_supplier → (id_supplier); PRIMARY (unique) → (id_supplier_invoice); uniq_sha256 (unique) → (sha256); uq_supplier_invoice_no (unique) → (id_supplier, invoice_number)

## supplier_invoice_hire_link

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_link | `int(11)` | NO | PRI |  | auto_increment |
| id_supplier_invoice | `int(11)` | NO | MUL |  |  |
| id_hire_list | `int(11)` | NO | MUL |  |  |
| linked_at | `timestamp` | YES |  | current_timestamp() |  |
| linked_by | `varchar(255)` | YES |  | NULL |  |
| notes | `text` | YES |  | NULL |  |

**Indexes:** idx_hire → (id_hire_list); idx_invoice → (id_supplier_invoice); PRIMARY (unique) → (id_link); uk_invoice_hire (unique) → (id_supplier_invoice, id_hire_list)

**Foreign keys:**
- `id_supplier_invoice` → `supplier_invoices.id_supplier_invoice`
- `id_hire_list` → `hire_list.id_hire_list`

## supplier_invoice_items

~5 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_supplier_invoice_item | `int(11)` | NO | PRI |  | auto_increment |
| id_supplier_invoice | `int(11)` | NO | MUL |  |  |
| line_no | `int(11)` | YES |  | NULL |  |
| description | `text` | YES |  | NULL |  |
| product_code | `varchar(80)` | YES |  | NULL |  |
| qty | `decimal(10,3)` | YES |  | NULL |  |
| product_uom_qty | `decimal(10,3)` | YES |  | NULL |  |
| product_uom | `varchar(20)` | YES |  | NULL |  |
| unit_price | `decimal(10,2)` | YES |  | NULL |  |
| line_total | `decimal(10,2)` | YES |  | NULL |  |
| is_stock_item | `tinyint(1)` | NO | MUL | 0 |  |

**Indexes:** idx_invoice → (id_supplier_invoice); idx_sii_stock → (is_stock_item); PRIMARY (unique) → (id_supplier_invoice_item); uq_inv_line (unique) → (id_supplier_invoice, line_no)

## supplier_invoice_templates

~2 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| id_supplier | `int(11)` | NO | UNI |  |  |
| copied_from_supplier_id | `int(11)` | YES |  | NULL |  |
| template_name | `varchar(120)` | NO |  |  |  |
| page_no | `tinyint(4)` | NO |  | 1 |  |
| dpi | `smallint(6)` | NO |  | 300 |  |
| boxes_json | `longtext` | NO |  |  |  |
| is_active | `tinyint(1)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_template); uniq_supplier_template (unique) → (id_supplier)

## supplier_product_machine_compatibility

~198 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| spmc_id | `int(11)` | NO | PRI |  | auto_increment |
| supplier_product_id | `varchar(50)` | YES | MUL | NULL |  |
| supplier_machine_id | `varchar(50)` | YES | MUL | NULL |  |

**Indexes:** idx_spmc_supplier_machine_id → (supplier_machine_id); idx_spmc_supplier_product_id → (supplier_product_id); PRIMARY (unique) → (spmc_id)

## supplier_product_preferred

~41 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| spp_id | `int(11)` | NO | PRI |  | auto_increment |
| spp_hickey_product_id | `int(11)` | NO | MUL |  |  |
| spp_stock_product_id | `int(11)` | NO |  |  |  |
| spp_supplier_id | `int(11)` | NO |  |  |  |
| spp_is_preferred | `tinyint(1)` | YES |  | 0 |  |

**Indexes:** idx_spp_product_id_preferred → (spp_hickey_product_id, spp_is_preferred); PRIMARY (unique) → (spp_id)

## supplier_product_stock_summary

~40 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| sphl_id | `int(11)` | NO | PRI |  |  |
| hickey_stock_code | `varchar(255)` | YES |  | NULL |  |
| stock_description | `text` | YES |  | NULL |  |
| stock_on_hand | `int(11)` | YES |  | NULL |  |
| stock_location | `varchar(50)` | YES |  | NULL |  |
| models | `text` | YES |  | NULL |  |
| model_usage_count | `int(11)` | YES |  | NULL |  |
| preferred_supplier | `varchar(255)` | YES |  | NULL |  |
| preferred_stock_code | `varchar(255)` | YES |  | NULL |  |
| last_updated | `timestamp` | NO |  | current_timestamp() | on update current_timestamp() |

**Indexes:** PRIMARY (unique) → (sphl_id)

## timesheets

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| timesheets_id | `int(11)` | NO | PRI |  | auto_increment |
| timesheets_cus | `varchar(50)` | NO |  |  |  |
| timesheets_site | `varchar(50)` | NO |  |  |  |
| timesheet_driver | `varchar(50)` | NO |  |  |  |
| timesheet_we | `varchar(50)` | NO |  |  |  |
| timesheet_machine | `varchar(50)` | NO |  |  |  |
| timesheet_mon | `varchar(50)` | NO |  |  |  |
| timesheet_tue | `decimal(10,0)` | NO |  |  |  |
| timesheet_wed | `decimal(10,0)` | NO |  |  |  |
| timesheet_thu | `decimal(10,0)` | NO |  |  |  |
| timesheet_fri | `decimal(10,0)` | NO |  |  |  |
| timesheet_sat | `decimal(10,0)` | NO |  |  |  |
| timesheet_sun | `decimal(10,0)` | NO |  |  |  |
| timesheet_signed | `varchar(50)` | NO |  |  |  |
| timesheet_signdate | `varchar(50)` | NO |  |  |  |
| timesheet_driv_bon | `varchar(50)` | NO |  |  |  |
| timesheet_comments | `varchar(240)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (timesheets_id)

## time_dimension

~3,287 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  |  |
| db_date | `date` | NO | UNI |  |  |
| year | `int(11)` | NO | MUL |  |  |
| month | `int(11)` | NO |  |  |  |
| day | `int(11)` | NO |  |  |  |
| quarter | `int(11)` | NO |  |  |  |
| week | `int(11)` | NO |  |  |  |
| day_name | `varchar(9)` | NO |  |  |  |
| month_name | `varchar(9)` | NO |  |  |  |
| holiday_flag | `char(1)` | YES |  | 'f' |  |
| weekend_flag | `char(1)` | YES |  | 'f' |  |
| event | `varchar(50)` | YES |  | NULL |  |
| WE | `varchar(50)` | NO |  |  |  |
| WE_date | `date` | NO |  |  |  |
| inv_period | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (id); td_dbdate_idx (unique) → (db_date); td_ymd_idx (unique) → (year, month, day)

## toolbox_talks

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_toolbox_talk | `int(11)` | NO | PRI |  | auto_increment |
| talk_title | `varchar(255)` | NO |  |  |  |
| talk_date | `date` | NO | MUL |  |  |
| briefing_topic | `varchar(255)` | NO |  |  |  — e.g., Health & Safety, Traffic Safety, Equipment Use |
| briefed_by_user_id | `int(11)` | YES | MUL | NULL |  |
| briefed_by_name | `varchar(255)` | YES |  | NULL |  |
| duration_minutes | `int(11)` | YES |  | NULL |  |
| location | `varchar(255)` | YES |  | NULL |  |
| document_filename | `varchar(255)` | YES |  | NULL |  — Briefing document filename |
| document_data | `longblob` | YES |  | NULL |  — Stored briefing document binary data |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_briefed_by → (briefed_by_user_id); idx_talk_date → (talk_date); PRIMARY (unique) → (id_toolbox_talk)

## toolbox_talk_attendance

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_attendance | `int(11)` | NO | PRI |  | auto_increment |
| id_toolbox_talk | `int(11)` | NO | MUL |  |  |
| employee_id | `int(11)` | NO | MUL |  |  |
| employee_name | `varchar(255)` | YES |  | NULL |  |
| attendance_status | `enum('Attended','Absent','Excused')` | YES |  | 'Attended' |  — Attendance status |
| notes | `longtext` | YES |  | NULL |  — Individual notes for this employee |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** idx_employee → (employee_id); idx_talk → (id_toolbox_talk); PRIMARY (unique) → (id_attendance); unique_talk_employee (unique) → (id_toolbox_talk, employee_id)

**Foreign keys:**
- `id_toolbox_talk` → `toolbox_talks.id_toolbox_talk`

## toolbox_talk_summary

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_summary | `int(11)` | NO | PRI |  | auto_increment |
| employee_id | `int(11)` | NO | UNI |  |  |
| employee_name | `varchar(255)` | YES |  | NULL |  |
| total_talks | `int(11)` | YES |  | 0 |  |
| talks_attended | `int(11)` | YES |  | 0 |  |
| talks_missed | `int(11)` | YES |  | 0 |  |
| last_talk_date | `date` | YES | MUL | NULL |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_last_talk → (last_talk_date); PRIMARY (unique) → (id_summary); unique_employee (unique) → (employee_id)

## training_completions

~21 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_completion | `int(11)` | NO | PRI |  | auto_increment |
| id_assignment | `int(11)` | NO | MUL |  |  |
| employee_id | `int(11)` | NO | MUL |  |  |
| id_course | `int(11)` | NO | MUL |  |  |
| completion_date | `date` | NO | MUL |  |  |
| completion_time | `datetime` | YES |  | NULL |  |
| certificate_number | `varchar(100)` | YES |  | NULL |  |
| expiry_date | `date` | YES | MUL | NULL |  |
| provider_name | `varchar(100)` | YES |  | NULL |  |
| course_hours | `int(11)` | YES |  | NULL |  — Hours completed (for CPC tracking) |
| completion_notes | `longtext` | YES |  | NULL |  |
| recorded_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |

**Indexes:** completion_date → (completion_date); employee_id → (employee_id); expiry_date → (expiry_date); id_assignment → (id_assignment); id_course → (id_course); PRIMARY (unique) → (id_completion)

**Foreign keys:**
- `id_assignment` → `employee_training_assignments.id_assignment`
- `id_course` → `training_courses.id_course`

## training_compliance_summary

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_summary | `int(11)` | NO | PRI |  | auto_increment |
| employee_id | `int(11)` | NO | MUL |  |  |
| employee_name | `varchar(255)` | NO |  |  |  |
| id_course | `int(11)` | NO |  |  |  |
| course_name | `varchar(255)` | YES |  | NULL |  |
| last_completion_date | `date` | YES |  | NULL |  |
| next_due_date | `date` | YES | MUL | NULL |  |
| days_until_due | `int(11)` | YES |  | NULL |  |
| status | `enum('Current','Due Soon','Overdue','Not Started')` | YES | MUL | 'Not Started' |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** employee_id → (employee_id); next_due_date → (next_due_date); PRIMARY (unique) → (id_summary); status → (status)

## training_courses

~20 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_course | `int(11)` | NO | PRI |  | auto_increment |
| course_name | `varchar(255)` | NO |  |  |  |
| course_category | `enum('Health & Safety','CPC','Other')` | YES | MUL | 'Other' |  |
| expiry_months | `int(11)` | NO |  |  |  — Months until retraining required (e.g., 12 for 1 year, 60 for 5 years) |
| provider | `varchar(100)` | YES |  | NULL |  |
| course_hours | `int(11)` | YES |  | NULL |  — Training hours (for CPC tracking) |
| description | `longtext` | YES |  | NULL |  |
| is_cpc | `tinyint(1)` | YES | MUL | 0 |  — Is this a CPC course? |
| max_repeats_period | `int(11)` | YES |  | NULL |  — For CPC: cannot repeat same course within this many months |
| notes | `longtext` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** course_category → (course_category); is_cpc → (is_cpc); PRIMARY (unique) → (id_course)

## ts_ocr_templates

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_template | `int(11)` | NO | PRI |  | auto_increment |
| template_name | `varchar(100)` | NO |  |  |  |
| page_no | `int(11)` | NO |  | 1 |  |
| dpi | `int(11)` | NO |  | 300 |  |
| boxes_json | `longtext` | NO |  |  |  |
| is_active | `tinyint(4)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| updated_at | `datetime` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id_template)

## ts_uploads

~2 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_ts_upload | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO | UNI |  |  |
| extracted_json | `longtext` | YES |  | NULL |  |
| extracted_at | `datetime` | YES |  | NULL |  |
| needs_review | `tinyint(1)` | NO |  | 1 |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| ocr_status | `varchar(20)` | YES |  | NULL |  |
| ocr_ran_at | `datetime` | YES |  | NULL |  |
| ocr_json | `longtext` | YES |  | NULL |  |
| ocr_error | `text` | YES |  | NULL |  |
| id_batch | `int(11)` | YES | MUL | NULL |  |
| page_no | `int(11)` | YES | MUL | NULL |  |

**Indexes:** id_batch → (id_batch); page_no → (page_no); PRIMARY (unique) → (id_ts_upload); uq_pod_sha (unique) → (sha256)

## ts_upload_batches

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_batch | `int(11)` | NO | PRI |  | auto_increment |
| original_filename | `varchar(255)` | NO |  |  |  |
| stored_path | `text` | NO |  |  |  |
| sha256 | `char(64)` | NO |  |  |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| status | `varchar(20)` | NO |  | 'processing' |  |

**Indexes:** PRIMARY (unique) → (id_batch)

## users

~4 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| username | `varchar(100)` | NO | UNI |  |  |
| password_hash | `varchar(255)` | NO |  |  |  |
| role | `enum('manager','driver','fitter')` | NO |  |  |  |
| last_licence_check_date | `date` | YES |  | NULL |  |
| next_licence_check_date | `date` | YES |  | NULL |  |
| licence_check_overdue | `enum('Yes','No')` | YES |  | 'No' |  |
| licence_check_notes | `longtext` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id); username (unique) → (username)

## users_page_permissions

~4 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| page_path | `varchar(255)` | NO |  |  |  |
| allowed_role | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (id)

## vehicle_alert

~16 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| alert_id | `int(11)` | NO | PRI |  | auto_increment |
| id_delivery_vehicle | `int(11)` | NO | MUL |  |  |
| alert_type | `varchar(50)` | NO |  |  |  — PMI, MOT, Tax, Insurance, Calibration, Service, Other |
| alert_title | `varchar(255)` | YES |  | NULL |  — Optional free text, e.g. front-axle service |
| next_due | `date` | NO | MUL |  |  |
| frequency_interval | `int(11)` | YES |  | NULL |  — Weeks between repeats; NULL = one-off |
| status | `varchar(20)` | NO | MUL | 'Pending' |  — Pending, Done, Cancelled |
| notes | `text` | YES |  | NULL |  |
| created_at | `datetime` | NO |  | current_timestamp() |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| staff_id | `int(11)` | YES | MUL | NULL |  — users.id of the driver this alert is assigned to (defaults from lorry on create) |

**Indexes:** idx_va_due → (next_due); idx_va_staff → (staff_id); idx_va_status → (status); idx_va_vehicle → (id_delivery_vehicle); PRIMARY (unique) → (alert_id)

## vehicle_document

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| id_delivery_vehicle | `int(11)` | NO | MUL |  |  |
| doc_type | `varchar(50)` | NO |  |  |  — PMI, MOT, Tax, Insurance, V5C, O-Licence, Tachograph, Other |
| file_path | `varchar(500)` | NO |  |  |  |
| original_filename | `varchar(255)` | YES |  | NULL |  |
| uploaded_at | `datetime` | NO |  | current_timestamp() |  |
| uploaded_by | `varchar(100)` | YES |  | NULL |  |
| expires_at | `date` | YES | MUL | NULL |  — When the document expires (so we can warn before) |
| notes | `text` | YES |  | NULL |  |

**Indexes:** idx_vd_expires → (expires_at); idx_vd_vehicle → (id_delivery_vehicle); PRIMARY (unique) → (id)

**Foreign keys:**
- `id_delivery_vehicle` → `delivery_vehicle.id_delivery_vehicle`

## vehicle_mileage

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_mileage | `int(11)` | NO | PRI |  | auto_increment |
| vehicle_registration | `varchar(20)` | NO | MUL |  |  |
| mileage_year | `year(4)` | NO | MUL |  |  |
| mileage_month | `int(11)` | NO |  |  |  — 1-12 |
| missing_mileage | `decimal(10,2)` | NO |  | 0.00 |  — Miles or KM of undocumented mileage |
| notes | `longtext` | YES |  | NULL |  — Reason for missing mileage, e.g. MOT, driver notes |
| status | `enum('Recorded','Verified','Disputed','Resolved')` | YES | MUL | 'Recorded' |  |
| created_by | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** mileage_year → (mileage_year); PRIMARY (unique) → (id_mileage); status → (status); unique_vehicle_month (unique) → (vehicle_registration, mileage_year, mileage_month); vehicle_registration → (vehicle_registration)

## vehicle_monthly_reading

~138 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | `int(11)` | NO | PRI |  | auto_increment |
| id_delivery_vehicle | `int(11)` | NO | MUL |  |  |
| year_month_label | `char(7)` | NO |  |  |  — Format YYYY-MM, e.g. 2026-05 |
| gallons_used | `decimal(10,2)` | YES |  | NULL |  |
| miles_driven | `int(11)` | YES |  | NULL |  |
| notes | `text` | YES |  | NULL |  |
| recorded_at | `datetime` | NO |  | current_timestamp() |  |
| recorded_by | `varchar(100)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (id); uk_vehicle_month (unique) → (id_delivery_vehicle, year_month_label)

**Foreign keys:**
- `id_delivery_vehicle` → `delivery_vehicle.id_delivery_vehicle`

## vehicle_recall_checks

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_recall_check | `int(11)` | NO | PRI |  | auto_increment |
| id_delivery_vehicle | `int(11)` | NO | MUL |  |  |
| delivery_vehicle_name | `varchar(50)` | YES |  | NULL |  |
| check_date | `date` | NO | MUL |  |  |
| checked_by_user_id | `int(11)` | YES |  | NULL |  |
| checked_by_name | `varchar(255)` | YES |  | NULL |  |
| status | `varchar(50)` | YES |  | NULL |  |
| findings | `longtext` | YES |  | NULL |  |
| action_taken | `longtext` | YES |  | NULL |  |
| next_review_date | `date` | YES | MUL | NULL |  |
| website_source | `varchar(100)` | YES |  | NULL |  |
| created_at | `timestamp` | YES |  | current_timestamp() |  |
| updated_at | `timestamp` | YES |  | current_timestamp() | on update current_timestamp() |

**Indexes:** idx_check_date → (check_date); idx_delivery_vehicle → (id_delivery_vehicle); idx_next_review → (next_review_date); PRIMARY (unique) → (id_recall_check)

**Foreign keys:**
- `id_delivery_vehicle` → `delivery_vehicle.id_delivery_vehicle`

## xhire

~17 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| Xhire_id | `int(11)` | NO | PRI |  | auto_increment |
| Xhire_Supplier_name | `varchar(50)` | YES |  | NULL |  |

**Indexes:** PRIMARY (unique) → (Xhire_id)

## xhire_specs

~33 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| xh_spec_id | `int(11)` | NO | PRI |  | auto_increment |
| xh_spec_fleetno | `varchar(50)` | NO |  |  |  |
| xh_spec_fleetreq | `varchar(50)` | NO |  |  |  |
| xh_spec_display | `varchar(50)` | NO |  |  |  |
| xh_spec_fueltank | `varchar(50)` | NO |  |  |  |
| xh_spec_adbtank | `varchar(50)` | NO |  |  |  |

**Indexes:** PRIMARY (unique) → (xh_spec_id)

## xh_count

~0 rows

| Column | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| needed | `varchar(50)` | YES |  | NULL |  |
| COUNT(needed) | `bigint(21)` | YES |  | NULL |  |

