feat: initial scaffold
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
.claude/
|
||||
.mcp.json
|
||||
TODO.md
|
||||
*.min.css
|
||||
*.min.js
|
||||
@@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
INGROUP: MokoSuiteGym.Documentation
|
||||
BRIEF: Version history using Keep a Changelog
|
||||
-->
|
||||
|
||||
# Changelog
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- **Repository** -- initial repo creation with scaffolding
|
||||
- **System Plugin** -- Extension class, service provider
|
||||
- **SQL Schema** -- 9 tables
|
||||
- **Admin Component** -- 6 views: Dashboard, Members, Memberships, Classes, Trainers, Equipment
|
||||
- **Webservices Plugin** -- 6 API routes
|
||||
- **Configuration** -- basic settings fieldset
|
||||
- **Access Control** -- core permissions
|
||||
- **Language Files** -- en-GB translations
|
||||
@@ -0,0 +1,30 @@
|
||||
# MokoSuiteGym
|
||||
|
||||
Layer 2 — Fitness center management, memberships, class scheduling, trainer management, equipment tracking
|
||||
|
||||
## Quick Reference
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| **Package** | `pkg_mokosuitegym` |
|
||||
| **Layer** | 2 (requires: Client, CRM) |
|
||||
| **Language** | PHP 8.3+ |
|
||||
| **Branch** | develop on `dev`, merge to `main` (protected) |
|
||||
|
||||
## Architecture
|
||||
|
||||
Joomla **package** -- Layer 2 add-on. CRM contacts as gym members and trainers, membership tiers, class scheduling with enrollment, and equipment maintenance.
|
||||
|
||||
## Rules
|
||||
|
||||
- **Never commit** `.claude/`, `.mcp.json`, `TODO.md`, `*.min.css`/`*.min.js`
|
||||
- **Attribution**: `Authored-by: Moko Consulting`
|
||||
- **Workflow directory**: `.mokogitea/`
|
||||
- **Standards**: [MokoStandards](https://git.mokoconsulting.tech/MokoConsulting/MokoCLI/wiki)
|
||||
- **Changelog**: `[Unreleased]` only -- release system assigns versions
|
||||
|
||||
## Coding Standards
|
||||
|
||||
- PHP 8.3+ / Joomla 6 patterns
|
||||
- `$this->getDatabase()` in models, `Factory::getContainer()->get(DatabaseInterface::class)` in helpers
|
||||
- `Factory::getApplication()->getIdentity()` for user
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<access component="com_mokosuitegym">
|
||||
<section name="component">
|
||||
<action name="core.admin" title="JACTION_ADMIN" />
|
||||
<action name="core.manage" title="JACTION_MANAGE" />
|
||||
<action name="core.create" title="JACTION_CREATE" />
|
||||
<action name="core.delete" title="JACTION_DELETE" />
|
||||
<action name="core.edit" title="JACTION_EDIT" />
|
||||
<action name="core.edit.state" title="JACTION_EDITSTATE" />
|
||||
</section>
|
||||
</access>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<config>
|
||||
<fieldset name="component" label="COM_MOKOSUITEGYM_CONFIG">
|
||||
<field name="items_per_page" type="number" default="20" label="Items Per Page" min="5" max="100" />
|
||||
</fieldset>
|
||||
</config>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright (C) 2026 Moko Consulting
|
||||
* @license GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Dispatcher\ComponentDispatcherFactoryInterface;
|
||||
use Joomla\CMS\Extension\ComponentInterface;
|
||||
use Joomla\CMS\Extension\MVCComponent;
|
||||
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
|
||||
use Joomla\CMS\Router\ApiRouter;
|
||||
use Joomla\DI\Container;
|
||||
use Joomla\DI\ServiceProviderInterface;
|
||||
|
||||
return new class implements ServiceProviderInterface
|
||||
{
|
||||
public function register(Container $container): void
|
||||
{
|
||||
$container->set(
|
||||
ComponentInterface::class,
|
||||
function (Container $container) {
|
||||
$component = new MVCComponent($container->get(ComponentDispatcherFactoryInterface::class));
|
||||
$component->setMVCFactory($container->get(MVCFactoryInterface::class));
|
||||
return $component;
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="component" method="upgrade">
|
||||
<name>com_mokosuitegym</name>
|
||||
<version>0.0.0</version>
|
||||
<creationDate>2026-06</creationDate>
|
||||
<author>Moko Consulting</author>
|
||||
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
||||
<authorUrl>https://mokoconsulting.tech</authorUrl>
|
||||
<copyright>(C) 2026 Moko Consulting</copyright>
|
||||
<license>GPL-3.0-or-later</license>
|
||||
<description>Layer 2 — Fitness center management, memberships, class scheduling, trainer management, equipment tracking</description>
|
||||
<namespace path="src">MokoConsulting\Component\MokoSuiteGym</namespace>
|
||||
<administration>
|
||||
<files folder="admin">
|
||||
<folder>services</folder>
|
||||
<folder>src</folder>
|
||||
<folder>tmpl</folder>
|
||||
<folder>language</folder>
|
||||
<filename>access.xml</filename>
|
||||
<filename>config.xml</filename>
|
||||
</files>
|
||||
<menu>MokoSuiteGym</menu>
|
||||
<submenu>
|
||||
<menu link="option=com_mokosuitegym&view=gymdashboard">Dashboard</menu>
|
||||
<menu link="option=com_mokosuitegym&view=gymmembers">Members</menu>
|
||||
<menu link="option=com_mokosuitegym&view=gymmemberships">Memberships</menu>
|
||||
<menu link="option=com_mokosuitegym&view=gymclasses">Classes</menu>
|
||||
<menu link="option=com_mokosuitegym&view=gymtrainers">Trainers</menu>
|
||||
<menu link="option=com_mokosuitegym&view=gymequipment">Equipment</menu>
|
||||
</submenu>
|
||||
</administration>
|
||||
</extension>
|
||||
@@ -0,0 +1,3 @@
|
||||
PLG_SYSTEM_MOKOSUITEGYM="Gym"
|
||||
PLG_SYSTEM_MOKOSUITEGYM_DESCRIPTION="MokoSuiteGym system plugin"
|
||||
PLG_SYSTEM_MOKOSUITEGYM_ENABLED="Enable MokoSuiteGym"
|
||||
@@ -0,0 +1,3 @@
|
||||
PLG_SYSTEM_MOKOSUITEGYM="Gym"
|
||||
PLG_SYSTEM_MOKOSUITEGYM_DESCRIPTION="MokoSuiteGym system plugin"
|
||||
PLG_SYSTEM_MOKOSUITEGYM_ENABLED="Enable MokoSuiteGym"
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="plugin" group="system" method="upgrade">
|
||||
<name>plg_system_mokosuitegym</name>
|
||||
<version>0.0.0</version>
|
||||
<creationDate>2026-06</creationDate>
|
||||
<author>Moko Consulting</author>
|
||||
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
||||
<authorUrl>https://mokoconsulting.tech</authorUrl>
|
||||
<copyright>(C) 2026 Moko Consulting</copyright>
|
||||
<license>GPL-3.0-or-later</license>
|
||||
<description>MokoSuiteGym system plugin -- schema owner and bootstrap</description>
|
||||
<namespace path="src">MokoConsulting\Plugin\System\MokoSuiteGym</namespace>
|
||||
<files>
|
||||
<folder>src</folder>
|
||||
<folder>services</folder>
|
||||
<folder>sql</folder>
|
||||
<folder>language</folder>
|
||||
</files>
|
||||
<install>
|
||||
<sql>
|
||||
<file driver="mysql" charset="utf8mb4">sql/install.mysql.sql</file>
|
||||
</sql>
|
||||
</install>
|
||||
<uninstall>
|
||||
<sql>
|
||||
<file driver="mysql" charset="utf8mb4">sql/uninstall.mysql.sql</file>
|
||||
</sql>
|
||||
</uninstall>
|
||||
<languages folder="language">
|
||||
<language tag="en-GB">en-GB/plg_system_mokosuitegym.ini</language>
|
||||
<language tag="en-GB">en-GB/plg_system_mokosuitegym.sys.ini</language>
|
||||
</languages>
|
||||
<config>
|
||||
<fields name="params">
|
||||
<fieldset name="basic">
|
||||
<field name="enabled" type="radio" label="PLG_SYSTEM_MOKOSUITEGYM_ENABLED" default="1" class="btn-group">
|
||||
<option value="0">JNO</option>
|
||||
<option value="1">JYES</option>
|
||||
</field>
|
||||
</fieldset>
|
||||
</fields>
|
||||
</config>
|
||||
</extension>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright (C) 2026 Moko Consulting
|
||||
* @license GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Extension\PluginInterface;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Plugin\PluginHelper;
|
||||
use Joomla\DI\Container;
|
||||
use Joomla\DI\ServiceProviderInterface;
|
||||
use Joomla\Event\DispatcherInterface;
|
||||
use MokoConsulting\Plugin\System\MokoSuiteGym\Extension\Gym;
|
||||
|
||||
return new class implements ServiceProviderInterface
|
||||
{
|
||||
public function register(Container $container): void
|
||||
{
|
||||
$container->set(
|
||||
PluginInterface::class,
|
||||
function (Container $container) {
|
||||
$dispatcher = $container->get(DispatcherInterface::class);
|
||||
$plugin = new Gym($dispatcher, (array) PluginHelper::getPlugin('system', 'mokosuitegym'));
|
||||
$plugin->setApplication(Factory::getApplication());
|
||||
return $plugin;
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,181 @@
|
||||
-- MokoSuiteGym Schema
|
||||
-- Copyright (C) 2026 Moko Consulting
|
||||
-- SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_memberships` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`description` TEXT NULL,
|
||||
`tier` ENUM('basic','standard','premium','vip','student','senior') NOT NULL DEFAULT 'basic',
|
||||
`duration_months` INT UNSIGNED NOT NULL DEFAULT 1,
|
||||
`price` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
||||
`enrollment_fee` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
||||
`guest_passes` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`class_access` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`trainer_sessions` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
`status` ENUM('active','inactive','archived') NOT NULL DEFAULT 'active',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tier` (`tier`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_members` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`contact_id` INT UNSIGNED NULL COMMENT 'FK to CRM contacts',
|
||||
`member_number` VARCHAR(50) NOT NULL,
|
||||
`first_name` VARCHAR(255) NOT NULL,
|
||||
`last_name` VARCHAR(255) NOT NULL,
|
||||
`date_of_birth` DATE NULL,
|
||||
`gender` ENUM('male','female','other') NULL,
|
||||
`phone` VARCHAR(50) NULL,
|
||||
`email` VARCHAR(255) NULL,
|
||||
`emergency_contact_name` VARCHAR(255) NULL,
|
||||
`emergency_contact_phone` VARCHAR(50) NULL,
|
||||
`photo` VARCHAR(500) NULL,
|
||||
`join_date` DATE NOT NULL,
|
||||
`status` ENUM('active','inactive','frozen','cancelled') NOT NULL DEFAULT 'active',
|
||||
`notes` TEXT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_member_number` (`member_number`),
|
||||
KEY `idx_contact` (`contact_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_member_memberships` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`member_id` INT UNSIGNED NOT NULL,
|
||||
`membership_id` INT UNSIGNED NOT NULL,
|
||||
`start_date` DATE NOT NULL,
|
||||
`end_date` DATE NULL,
|
||||
`auto_renew` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`payment_method` ENUM('cash','card','bank_transfer','online') NULL,
|
||||
`amount_paid` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
|
||||
`status` ENUM('active','expired','cancelled','frozen') NOT NULL DEFAULT 'active',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_member` (`member_id`),
|
||||
KEY `idx_membership` (`membership_id`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_end_date` (`end_date`),
|
||||
CONSTRAINT `fk_membermembership_member` FOREIGN KEY (`member_id`) REFERENCES `#__mokosuitegym_members`(`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_membermembership_membership` FOREIGN KEY (`membership_id`) REFERENCES `#__mokosuitegym_memberships`(`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_trainers` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`contact_id` INT UNSIGNED NULL COMMENT 'FK to CRM contacts',
|
||||
`first_name` VARCHAR(255) NOT NULL,
|
||||
`last_name` VARCHAR(255) NOT NULL,
|
||||
`specializations` JSON NULL,
|
||||
`certifications` JSON NULL,
|
||||
`bio` TEXT NULL,
|
||||
`phone` VARCHAR(50) NULL,
|
||||
`email` VARCHAR(255) NULL,
|
||||
`photo` VARCHAR(500) NULL,
|
||||
`hourly_rate` DECIMAL(10,2) NULL,
|
||||
`hire_date` DATE NULL,
|
||||
`status` ENUM('active','inactive','on_leave') NOT NULL DEFAULT 'active',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_contact` (`contact_id`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_classes` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`description` TEXT NULL,
|
||||
`class_type` ENUM('yoga','pilates','spinning','hiit','crossfit','zumba','boxing','swimming','strength','cardio','other') NOT NULL DEFAULT 'other',
|
||||
`trainer_id` INT UNSIGNED NULL,
|
||||
`duration_minutes` INT UNSIGNED NOT NULL DEFAULT 60,
|
||||
`max_capacity` INT UNSIGNED NULL,
|
||||
`difficulty` ENUM('beginner','intermediate','advanced','all_levels') NOT NULL DEFAULT 'all_levels',
|
||||
`room` VARCHAR(100) NULL,
|
||||
`status` ENUM('active','inactive','archived') NOT NULL DEFAULT 'active',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_trainer` (`trainer_id`),
|
||||
KEY `idx_class_type` (`class_type`),
|
||||
KEY `idx_status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_class_schedules` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`class_id` INT UNSIGNED NOT NULL,
|
||||
`trainer_id` INT UNSIGNED NULL,
|
||||
`day_of_week` ENUM('monday','tuesday','wednesday','thursday','friday','saturday','sunday') NOT NULL,
|
||||
`start_time` TIME NOT NULL,
|
||||
`end_time` TIME NOT NULL,
|
||||
`room` VARCHAR(100) NULL,
|
||||
`effective_from` DATE NULL,
|
||||
`effective_until` DATE NULL,
|
||||
`status` ENUM('active','cancelled','suspended') NOT NULL DEFAULT 'active',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_class` (`class_id`),
|
||||
KEY `idx_trainer` (`trainer_id`),
|
||||
KEY `idx_day` (`day_of_week`),
|
||||
KEY `idx_status` (`status`),
|
||||
CONSTRAINT `fk_schedule_class` FOREIGN KEY (`class_id`) REFERENCES `#__mokosuitegym_classes`(`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_class_enrollments` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`class_schedule_id` INT UNSIGNED NOT NULL,
|
||||
`member_id` INT UNSIGNED NOT NULL,
|
||||
`enrollment_date` DATE NOT NULL,
|
||||
`session_date` DATE NOT NULL,
|
||||
`status` ENUM('enrolled','attended','no_show','cancelled') NOT NULL DEFAULT 'enrolled',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_schedule` (`class_schedule_id`),
|
||||
KEY `idx_member` (`member_id`),
|
||||
KEY `idx_session_date` (`session_date`),
|
||||
KEY `idx_status` (`status`),
|
||||
CONSTRAINT `fk_enrollment_schedule` FOREIGN KEY (`class_schedule_id`) REFERENCES `#__mokosuitegym_class_schedules`(`id`) ON DELETE CASCADE,
|
||||
CONSTRAINT `fk_enrollment_member` FOREIGN KEY (`member_id`) REFERENCES `#__mokosuitegym_members`(`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_equipment` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`category` ENUM('cardio','strength','free_weights','machines','accessories','other') NOT NULL DEFAULT 'other',
|
||||
`brand` VARCHAR(255) NULL,
|
||||
`model` VARCHAR(255) NULL,
|
||||
`serial_number` VARCHAR(255) NULL,
|
||||
`purchase_date` DATE NULL,
|
||||
`purchase_cost` DECIMAL(10,2) NULL,
|
||||
`warranty_expiry` DATE NULL,
|
||||
`location` VARCHAR(100) NULL,
|
||||
`last_maintenance` DATE NULL,
|
||||
`next_maintenance` DATE NULL,
|
||||
`status` ENUM('operational','maintenance','out_of_order','retired') NOT NULL DEFAULT 'operational',
|
||||
`notes` TEXT NULL,
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modified` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_category` (`category`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_next_maintenance` (`next_maintenance`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `#__mokosuitegym_check_ins` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`member_id` INT UNSIGNED NOT NULL,
|
||||
`check_in_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`check_out_time` DATETIME NULL,
|
||||
`location` VARCHAR(100) NULL COMMENT 'e.g. main entrance, pool, spa',
|
||||
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_member` (`member_id`),
|
||||
KEY `idx_check_in_time` (`check_in_time`),
|
||||
CONSTRAINT `fk_checkin_member` FOREIGN KEY (`member_id`) REFERENCES `#__mokosuitegym_members`(`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,9 @@
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_check_ins`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_equipment`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_class_enrollments`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_class_schedules`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_classes`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_trainers`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_member_memberships`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_members`;
|
||||
DROP TABLE IF EXISTS `#__mokosuitegym_memberships`;
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright (C) 2026 Moko Consulting
|
||||
* @license GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace MokoConsulting\Plugin\System\MokoSuiteGym\Extension;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Plugin\CMSPlugin;
|
||||
use Joomla\Event\SubscriberInterface;
|
||||
|
||||
final class Gym extends CMSPlugin implements SubscriberInterface
|
||||
{
|
||||
public static function getSubscribedEvents(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension type="package" method="upgrade">
|
||||
<name>MokoSuiteGym</name>
|
||||
<packagename>mokosuitegym</packagename>
|
||||
<version>0.0.0</version>
|
||||
<creationDate>2026-06</creationDate>
|
||||
<author>Moko Consulting</author>
|
||||
<authorEmail>hello@mokoconsulting.tech</authorEmail>
|
||||
<authorUrl>https://mokoconsulting.tech</authorUrl>
|
||||
<copyright>(C) 2026 Moko Consulting</copyright>
|
||||
<license>GPL-3.0-or-later</license>
|
||||
<description>Layer 2 — Fitness center management, memberships, class scheduling, trainer management, equipment tracking</description>
|
||||
<files>
|
||||
<file type="plugin" id="mokosuitegym" group="system">plg_system_mokosuitegym.zip</file>
|
||||
<file type="component" id="mokosuitegym">com_mokosuitegym.zip</file>
|
||||
<file type="plugin" id="mokosuitegym" group="webservices">plg_webservices_mokosuitegym.zip</file>
|
||||
</files>
|
||||
<updateservers>
|
||||
<server type="extension" name="MokoSuiteGym Updates">https://git.mokoconsulting.tech/api/packages/MokoConsulting/generic/updates/mokosuitegym/updates.xml</server>
|
||||
</updateservers>
|
||||
</extension>
|
||||
Reference in New Issue
Block a user