feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run

- Base: wintercms/winter branch 1.2 (full framework)
- Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS
- Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication
- Partials: hero (offline-first), features, modes (offline/nube toggle),
  screenshots, pricing (3 planes), comparison, FAQ, CTA
- Plugin VivesPOS.Site with ContactForm
- Dockerfile: PHP 8.2 Apache, port 80, healthcheck
- Added winter/wn-pages, blog, sitemap, seo plugins
- Active theme set to vivespos
This commit is contained in:
2026-08-21 19:29:00 -06:00
commit 1f72193a64
3266 changed files with 531480 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbDeferredBindings extends Migration
{
public function up()
{
Schema::create('deferred_bindings', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('master_type')->index();
$table->string('master_field')->index();
$table->string('slave_type')->index();
$table->string('slave_id')->index();
$table->string('session_key');
$table->boolean('is_bind')->default(true);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('deferred_bindings');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemFiles extends Migration
{
public function up()
{
Schema::create('system_files', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('disk_name');
$table->string('file_name');
$table->integer('file_size');
$table->string('content_type');
$table->string('title')->nullable();
$table->text('description')->nullable();
$table->string('field')->nullable()->index();
$table->string('attachment_id')->index()->nullable();
$table->string('attachment_type')->index()->nullable();
$table->boolean('is_public')->default(true);
$table->integer('sort_order')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_files');
}
}

View File

@@ -0,0 +1,23 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemPluginVersions extends Migration
{
public function up()
{
Schema::create('system_plugin_versions', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('code')->index();
$table->string('version', 50);
$table->timestamp('created_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists('system_plugin_versions');
}
}

View File

@@ -0,0 +1,25 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemPluginHistory extends Migration
{
public function up()
{
Schema::create('system_plugin_history', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('code')->index();
$table->string('type', 20)->index();
$table->string('version', 50);
$table->string('detail')->nullable();
$table->timestamp('created_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists('system_plugin_history');
}
}

View File

@@ -0,0 +1,22 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemSettings extends Migration
{
public function up()
{
Schema::create('system_settings', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('item')->nullable()->index();
$table->mediumtext('value')->nullable();
});
}
public function down()
{
Schema::dropIfExists('system_settings');
}
}

View File

@@ -0,0 +1,25 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemParameters extends Migration
{
public function up()
{
Schema::create('system_parameters', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('namespace', 100);
$table->string('group', 50);
$table->string('item', 150);
$table->text('value')->nullable();
$table->index(['namespace', 'group', 'item'], 'item_index');
});
}
public function down()
{
Schema::dropIfExists('system_parameters');
}
}

View File

@@ -0,0 +1,21 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemAddDisabledFlag extends Migration
{
public function up()
{
Schema::table('system_plugin_versions', function (Blueprint $table) {
$table->boolean('is_disabled')->default(0);
});
}
public function down()
{
Schema::table('system_plugin_versions', function (Blueprint $table) {
$table->dropColumn('is_disabled');
});
}
}

View File

@@ -0,0 +1,28 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemMailTemplates extends Migration
{
public function up()
{
Schema::create('system_mail_templates', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('code')->nullable();
$table->string('subject')->nullable();
$table->text('description')->nullable();
$table->text('content_html')->nullable();
$table->text('content_text')->nullable();
$table->integer('layout_id')->index()->nullable();
$table->boolean('is_custom')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_mail_templates');
}
}

View File

@@ -0,0 +1,27 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemMailLayouts extends Migration
{
public function up()
{
Schema::create('system_mail_layouts', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name')->nullable();
$table->string('code')->nullable();
$table->text('content_html')->nullable();
$table->text('content_text')->nullable();
$table->text('content_css')->nullable();
$table->boolean('is_locked')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_mail_layouts');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbJobs extends Migration
{
public function up()
{
Schema::create($this->getTableName(), function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->bigIncrements('id');
$table->string('queue');
$table->text('payload');
$table->tinyInteger('attempts')->unsigned();
$table->tinyInteger('reserved')->unsigned();
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
}
public function down()
{
Schema::dropIfExists($this->getTableName());
}
protected function getTableName()
{
return Config::get('queue.connections.database.table', 'jobs');
}
}

View File

@@ -0,0 +1,24 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemEventLogs extends Migration
{
public function up()
{
Schema::create('system_event_logs', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('level')->nullable()->index();
$table->text('message')->nullable();
$table->mediumtext('details')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_event_logs');
}
}

View File

@@ -0,0 +1,25 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemRequestLogs extends Migration
{
public function up()
{
Schema::create('system_request_logs', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('status_code')->nullable();
$table->string('url')->nullable();
$table->text('referer')->nullable();
$table->integer('count')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_request_logs');
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemSessions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->unique();
$table->text('payload')->nullable();
$table->integer('last_activity')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sessions');
}
}

View File

@@ -0,0 +1,24 @@
<?php
use System\Models\MailLayout;
use Winter\Storm\Database\Updates\Migration;
class DbSystemMailLayoutRename extends Migration
{
public function up()
{
foreach (MailLayout::all() as $layout) {
try {
$layout->content_html = preg_replace("/({{\s*message\s*[|]raw\s*}})/i", "{{ content|raw }}", $layout->content_html);
$layout->content_text = preg_replace("/({{\s*message\s*[|]raw\s*}})/i", "{{ content|raw }}", $layout->content_text);
$layout->forceSave();
}
catch (Exception $ex) {
}
}
}
public function down()
{
}
}

View File

@@ -0,0 +1,21 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemAddFrozenFlag extends Migration
{
public function up()
{
Schema::table('system_plugin_versions', function (Blueprint $table) {
$table->boolean('is_frozen')->default(0);
});
}
public function down()
{
Schema::table('system_plugin_versions', function (Blueprint $table) {
$table->dropColumn('is_frozen');
});
}
}

View File

@@ -0,0 +1,21 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbCache extends Migration
{
public function up()
{
Schema::create('cache', function (Blueprint $table) {
$table->string('key')->unique();
$table->longText('value');
$table->integer('expiration');
});
}
public function down()
{
Schema::dropIfExists('cache');
}
}

View File

@@ -0,0 +1,29 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemRevisions extends Migration
{
public function up()
{
Schema::create('system_revisions', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('user_id')->unsigned()->nullable()->index();
$table->string('field')->nullable()->index();
$table->string('cast')->nullable();
$table->text('old_value')->nullable();
$table->text('new_value')->nullable();
$table->string('revisionable_type');
$table->integer('revisionable_id');
$table->timestamps();
$table->index(['revisionable_id', 'revisionable_type']);
});
}
public function down()
{
Schema::dropIfExists('system_revisions');
}
}

View File

@@ -0,0 +1,29 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbFailedJobs extends Migration
{
public function up()
{
Schema::create($this->getTableName(), function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->text('connection');
$table->text('queue');
$table->text('payload');
$table->timestamp('failed_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists($this->getTableName());
}
protected function getTableName()
{
return Config::get('queue.failed.table', 'failed_jobs');
}
}

View File

@@ -0,0 +1,24 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemPluginHistoryDetailText extends Migration
{
public function up()
{
// Migration occurs before timestamps are patched (see next migration)
DbDongle::disableStrictMode();
Schema::table('system_plugin_history', function (Blueprint $table) {
$table->text('detail')->nullable()->change();
});
}
public function down()
{
Schema::table('system_plugin_history', function (Blueprint $table) {
$table->string('detail')->nullable()->change();
});
}
}

View File

@@ -0,0 +1,54 @@
<?php
use Winter\Storm\Database\Updates\Migration;
/**
* This migration addresses a MySQL specific issue around STRICT MODE.
* In past versions, Laravel would give timestamps a bad default value
* of "0" considered invalid by MySQL. Strict mode is disabled and the
* the timestamps are patched up. Credit for this work: Dave Shoreman.
*/
class DbSystemTimestampFix extends Migration
{
public function up()
{
DbDongle::disableStrictMode();
foreach ($this->getCoreTables() as $table => $columns) {
if (is_int($table)) {
$table = $columns;
$columns = ['created_at', 'updated_at'];
}
DbDongle::convertTimestamps($table, $columns);
}
// Use this opportunity to reset backend styles for stable
Db::table('system_settings')
->where('item', 'backend_brand_settings')
->delete();
}
public function down()
{
// ...
}
protected function getCoreTables()
{
$failedJobsTable = Config::get('queue.failed.table', 'failed_jobs');
return [
'deferred_bindings',
$failedJobsTable => 'failed_at',
'system_files',
'system_event_logs',
'system_mail_layouts',
'system_mail_templates',
'system_plugin_history' => 'created_at',
'system_plugin_versions' => 'created_at',
'system_request_logs',
'system_revisions',
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class DbDeferredBindingsAddIndexSession extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('deferred_bindings', function (Blueprint $table) {
$table->index('session_key');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('deferred_bindings', function (Blueprint $table) {
$table->dropIndex(['session_key']);
});
}
}

View File

@@ -0,0 +1,31 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemSessionsUpdate extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('sessions', function (Blueprint $table) {
$table->unsignedInteger('user_id')->nullable();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// ...
}
}

View File

@@ -0,0 +1,51 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbJobsFailedJobsUpdate extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table($this->getTableName(), function (Blueprint $table) {
$table->dropColumn('reserved');
$table->index(['queue', 'reserved_at']);
});
Schema::table($this->getFailedTableName(), function (Blueprint $table) {
$table->longText('exception')->nullable()->after('payload');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table($this->getTableName(), function (Blueprint $table) {
$table->tinyInteger('reserved')->unsigned()->default(0);
$table->dropIndex('jobs_queue_reserved_at_index');
});
Schema::table($this->getFailedTableName(), function (Blueprint $table) {
$table->dropColumn('exception');
});
}
protected function getTableName()
{
return Config::get('queue.connections.database.table', 'jobs');
}
protected function getFailedTableName()
{
return Config::get('queue.failed.table', 'failed_jobs');
}
}

View File

@@ -0,0 +1,26 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemMailPartials extends Migration
{
public function up()
{
Schema::create('system_mail_partials', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name')->nullable();
$table->string('code')->nullable();
$table->text('content_html')->nullable();
$table->text('content_text')->nullable();
$table->boolean('is_custom')->default(0);
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('system_mail_partials');
}
}

View File

@@ -0,0 +1,21 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbSystemMailLayoutsAddOptionsField extends Migration
{
public function up()
{
Schema::table('system_mail_layouts', function (Blueprint $table) {
$table->text('options')->nullable()->after('is_locked');
});
}
public function down()
{
Schema::table('system_mail_layouts', function (Blueprint $table) {
$table->dropColumn('options');
});
}
}

View File

@@ -0,0 +1,21 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbAddPivotDataToDeferredBindings extends Migration
{
public function up()
{
Schema::table('deferred_bindings', function (Blueprint $table) {
$table->mediumText('pivot_data')->nullable()->after('slave_id');
});
}
public function down()
{
Schema::table('deferred_bindings', function (Blueprint $table) {
$table->dropColumn('pivot_data');
});
}
}

View File

@@ -0,0 +1,30 @@
<?php
use Winter\Storm\Database\Updates\Migration;
use Carbon\Carbon;
use System\Models\Parameter;
use System\Models\PluginVersion;
return new class extends Migration
{
public function up()
{
$appBirthday = Parameter::get('system::app.birthday');
if ($appBirthday) {
// Return early if the birthday has already been set
return;
}
$firstPluginCreated = PluginVersion::orderBy('created_at')
->first()
?->created_at;
$appBirthday = $firstPluginCreated ?: Carbon::now();
Parameter::set('system::app.birthday', $appBirthday);
}
public function down()
{
}
};

View File

@@ -0,0 +1,44 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Support\Str;
return new class extends \Winter\Storm\Database\Updates\Migration
{
public function up()
{
Schema::table($this->getTableName(), function (Blueprint $table) {
$table->longText('payload')->change();
});
Schema::table($this->getFailedTableName(), function (Blueprint $table) {
$table->string('uuid')->nullable()->unique()->after('id');
$table->longText('payload')->change();
$table->longText('exception')->change();
});
// Generate UUIDs for existing failed jobs
DB::table($this->getFailedTableName())->whereNull('uuid')->cursor()->each(function ($job) {
DB::table($this->getFailedTableName())
->where('id', $job->id)
->update(['uuid' => (string) Str::uuid()]);
});
}
public function down()
{
Schema::table($this->getFailedTableName(), function (Blueprint $table) {
$table->dropColumn('uuid');
});
}
protected function getTableName()
{
return Config::get('queue.connections.database.table', 'jobs');
}
protected function getFailedTableName()
{
return Config::get('queue.failed.table', 'failed_jobs');
}
};

View File

@@ -0,0 +1,23 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Support\Str;
return new class extends \Winter\Storm\Database\Updates\Migration
{
public function up()
{
Schema::table('sessions', function ($table) {
$table->index(['last_activity']);
$table->index(['user_id']);
});
}
public function down()
{
Schema::table('sessions', function ($table) {
$table->dropIndex(['last_activity']);
$table->dropIndex(['user_id']);
});
}
};

View File

@@ -0,0 +1,33 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
class DbJobsBatches extends Migration
{
public function up()
{
Schema::create($this->getTableName(), function (Blueprint $table) {
$table->string('id')->primary();
$table->string('name');
$table->integer('total_jobs');
$table->integer('pending_jobs');
$table->integer('failed_jobs');
$table->longText('failed_job_ids');
$table->mediumText('options')->nullable();
$table->integer('cancelled_at')->nullable();
$table->integer('created_at');
$table->integer('finished_at')->nullable();
});
}
public function down()
{
Schema::dropIfExists($this->getTableName());
}
protected function getTableName()
{
return Config::get('queue.batching.table', 'job_batches');
}
}

View File

@@ -0,0 +1,23 @@
<?php
use Winter\Storm\Database\Schema\Blueprint;
use Winter\Storm\Database\Updates\Migration;
return new class extends Migration
{
public function up()
{
if (!Schema::hasColumn('system_files', 'metadata')) {
Schema::table('system_files', function (Blueprint $table) {
$table->mediumText('metadata')->nullable()->after('sort_order');
});
}
}
public function down()
{
Schema::table('system_files', function (Blueprint $table) {
$table->dropColumnIfExists('metadata');
});
}
};

View File

@@ -0,0 +1,18 @@
<?php
return new class extends \Winter\Storm\Database\Updates\Migration
{
public function up()
{
Schema::table('system_request_logs', function ($table) {
$table->index(['url', 'status_code']);
});
}
public function down()
{
Schema::table('system_request_logs', function ($table) {
$table->dropIndex(['url', 'status_code']);
});
}
};

View File

@@ -0,0 +1,20 @@
<?php namespace System\Database\Seeds;
use Seeder;
use Eloquent;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguarded(function () {
$this->call('System\Database\Seeds\SeedSetupMailLayouts');
});
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace System\Database\Seeds;
use Seeder;
use System\Models\MailLayout;
class SeedSetupMailLayouts extends Seeder
{
public function run()
{
MailLayout::createLayouts();
}
}