Initial plugin commit
This commit is contained in:
270
includes/Schema.php
Normal file
270
includes/Schema.php
Normal file
@@ -0,0 +1,270 @@
|
||||
<?php
|
||||
/**
|
||||
* Database schema management.
|
||||
*
|
||||
* @package KGV\VereinManager
|
||||
*/
|
||||
|
||||
namespace KGV\VereinManager;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
class Schema {
|
||||
|
||||
/**
|
||||
* Get the full table name by key.
|
||||
*
|
||||
* @param string $key Table key.
|
||||
* @return string
|
||||
*/
|
||||
public static function table( $key ) {
|
||||
global $wpdb;
|
||||
|
||||
$map = array(
|
||||
'sections' => $wpdb->prefix . 'kgvvm_sections',
|
||||
'parcels' => $wpdb->prefix . 'kgvvm_parcels',
|
||||
'meters' => $wpdb->prefix . 'kgvvm_meters',
|
||||
'tenants' => $wpdb->prefix . 'kgvvm_tenants',
|
||||
'parcel_members' => $wpdb->prefix . 'kgvvm_parcel_members',
|
||||
'parcel_tenants' => $wpdb->prefix . 'kgvvm_parcel_tenants',
|
||||
'chat_messages' => $wpdb->prefix . 'kgvvm_chat_messages',
|
||||
'meter_readings' => $wpdb->prefix . 'kgvvm_meter_readings',
|
||||
'cost_years' => $wpdb->prefix . 'kgvvm_cost_years',
|
||||
'cost_rates' => $wpdb->prefix . 'kgvvm_cost_rates',
|
||||
'cost_entries' => $wpdb->prefix . 'kgvvm_cost_entries',
|
||||
);
|
||||
|
||||
return isset( $map[ $key ] ) ? $map[ $key ] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Create plugin tables.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function create_tables() {
|
||||
global $wpdb;
|
||||
|
||||
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
|
||||
|
||||
$charset_collate = $wpdb->get_charset_collate();
|
||||
|
||||
$sql = array();
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'sections' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(190) NOT NULL,
|
||||
description TEXT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active',
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY name (name),
|
||||
KEY status (status)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'parcels' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
label VARCHAR(100) NOT NULL,
|
||||
section_id BIGINT UNSIGNED NOT NULL,
|
||||
area DECIMAL(10,2) NULL,
|
||||
annual_rent DECIMAL(12,2) NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'free',
|
||||
note TEXT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY section_label (section_id, label),
|
||||
KEY status (status),
|
||||
KEY section_id (section_id)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'meters' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
type VARCHAR(20) NOT NULL,
|
||||
meter_number VARCHAR(100) NOT NULL,
|
||||
section_id BIGINT UNSIGNED NOT NULL,
|
||||
parcel_id BIGINT UNSIGNED NULL,
|
||||
installed_at DATE NULL,
|
||||
calibration_year SMALLINT UNSIGNED NULL,
|
||||
is_main_meter TINYINT(1) NOT NULL DEFAULT 0,
|
||||
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
||||
note TEXT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY type_meter_number (type, meter_number),
|
||||
KEY section_id (section_id),
|
||||
KEY parcel_id (parcel_id),
|
||||
KEY type (type),
|
||||
KEY is_main_meter (is_main_meter),
|
||||
KEY is_active (is_active)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'tenants' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
first_name VARCHAR(100) NOT NULL,
|
||||
last_name VARCHAR(100) NOT NULL,
|
||||
address TEXT NULL,
|
||||
phone VARCHAR(100) NULL,
|
||||
email VARCHAR(190) NULL,
|
||||
contract_start DATE NOT NULL,
|
||||
contract_end DATE NULL,
|
||||
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
||||
note TEXT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY name_lookup (last_name, first_name),
|
||||
KEY is_active (is_active)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'parcel_members' ) . " (
|
||||
parcel_id BIGINT UNSIGNED NOT NULL,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (parcel_id, user_id),
|
||||
KEY user_id (user_id)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'parcel_tenants' ) . " (
|
||||
parcel_id BIGINT UNSIGNED NOT NULL,
|
||||
tenant_id BIGINT UNSIGNED NOT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (parcel_id, tenant_id),
|
||||
KEY tenant_id (tenant_id)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'chat_messages' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
room_key VARCHAR(50) NOT NULL,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY room_key (room_key),
|
||||
KEY user_id (user_id),
|
||||
KEY created_at (created_at)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'meter_readings' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
meter_id BIGINT UNSIGNED NOT NULL,
|
||||
parcel_id BIGINT UNSIGNED NOT NULL,
|
||||
reading_value DECIMAL(12,3) NOT NULL,
|
||||
reading_date DATE NOT NULL,
|
||||
note TEXT NULL,
|
||||
submitted_by BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
is_self_reading TINYINT(1) NOT NULL DEFAULT 0,
|
||||
created_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY meter_id (meter_id),
|
||||
KEY parcel_id (parcel_id),
|
||||
KEY reading_date (reading_date)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'cost_years' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
entry_year SMALLINT UNSIGNED NOT NULL,
|
||||
power_price_per_kwh DECIMAL(12,4) NULL,
|
||||
water_price_per_m3 DECIMAL(12,4) NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY entry_year (entry_year)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'cost_rates' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
entry_year SMALLINT UNSIGNED NOT NULL,
|
||||
section_id BIGINT UNSIGNED NOT NULL,
|
||||
power_price_per_kwh DECIMAL(12,4) NULL,
|
||||
water_price_per_m3 DECIMAL(12,4) NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY year_section (entry_year, section_id),
|
||||
KEY section_id (section_id)
|
||||
) {$charset_collate};";
|
||||
|
||||
$sql[] = "CREATE TABLE " . self::table( 'cost_entries' ) . " (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
entry_year SMALLINT UNSIGNED NOT NULL,
|
||||
name VARCHAR(190) NOT NULL,
|
||||
distribution_type VARCHAR(20) NOT NULL DEFAULT 'parcel',
|
||||
unit_amount DECIMAL(12,2) NULL,
|
||||
total_cost DECIMAL(12,2) NOT NULL DEFAULT 0.00,
|
||||
note TEXT NULL,
|
||||
created_at DATETIME NOT NULL,
|
||||
updated_at DATETIME NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY entry_year (entry_year),
|
||||
KEY name (name),
|
||||
KEY distribution_type (distribution_type)
|
||||
) {$charset_collate};";
|
||||
|
||||
foreach ( $sql as $statement ) {
|
||||
dbDelta( $statement );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Optimize plugin tables.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function optimize_tables() {
|
||||
global $wpdb;
|
||||
|
||||
$tables = array(
|
||||
self::table( 'sections' ),
|
||||
self::table( 'parcels' ),
|
||||
self::table( 'meters' ),
|
||||
self::table( 'tenants' ),
|
||||
self::table( 'parcel_members' ),
|
||||
self::table( 'parcel_tenants' ),
|
||||
self::table( 'chat_messages' ),
|
||||
self::table( 'meter_readings' ),
|
||||
self::table( 'cost_years' ),
|
||||
self::table( 'cost_rates' ),
|
||||
self::table( 'cost_entries' ),
|
||||
);
|
||||
|
||||
foreach ( $tables as $table ) {
|
||||
if ( ! empty( $table ) ) {
|
||||
$wpdb->query( 'OPTIMIZE TABLE `' . esc_sql( $table ) . '`' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Drop plugin tables during uninstall.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function drop_tables() {
|
||||
global $wpdb;
|
||||
|
||||
$tables = array(
|
||||
self::table( 'cost_entries' ),
|
||||
self::table( 'cost_rates' ),
|
||||
self::table( 'cost_years' ),
|
||||
self::table( 'chat_messages' ),
|
||||
self::table( 'meter_readings' ),
|
||||
self::table( 'parcel_members' ),
|
||||
self::table( 'parcel_tenants' ),
|
||||
self::table( 'meters' ),
|
||||
self::table( 'parcels' ),
|
||||
self::table( 'tenants' ),
|
||||
self::table( 'sections' ),
|
||||
);
|
||||
|
||||
foreach ( $tables as $table ) {
|
||||
if ( $table ) {
|
||||
$wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user