fteg-cms-dev fteg-cms-ichiwa-dev do not edit web-ichiwa-dev
Single plan for the CMS product: architecture, implementation steps, sprint timeline,
and Ichiwa tenant (first restaurant clone). Keep /srv/www/web-ichiwa-dev read-only.
/srv/www/fteg-products/fteg-cms-dev/srv/www/fteg-products/fteg-cms-ichiwa-dev
site_name, primary_domain, template_profile, and seo_tier.
| Buyer | Example | Subscriptions |
|---|---|---|
| FTEG (internal RM0) | Official site + investor microsite | 2 × cms-web @ RM0 — portal lists 2 CMS cards, each with Open CMS BO (SSO) |
| External client | 5 brand websites | 5 × cms-web — one tenant per domain; ERP/portal show N instances |
Policy also documented in Platform Architecture and /srv/www/hubs/GROUP-ARCHITECTURE.md (CMS section).
fteg-cms-dev = corporate CMS shell (package-cms Site Content BO).fteg-cms-ichiwa-dev) = custom Blade template + optional host modules.package-reservation = optional package — not every CMS site installs it.
Same rule as PropFlex: structure in code; marketing copy in package-cms; transactional data in host modules or optional packages.
| Concern | Layer | Why |
|---|---|---|
| Layout, nav, tabs, calendar UI, CSS tokens | template code | Per-project brand look |
| Hero, story, contact, SEO, footer, CTAs | package-cms | Site Content BO — PageDefinition fields |
| Menu items, omakase tiers, events | host module | CRUD with price/image — not EAV |
| Reservations, capacity, Fiuu deposit | fteg-reservation | Standalone product — CMS consumes API only |
| In package-cms | Outside package-cms |
|---|---|
| Brand, logo, phone, WhatsApp, hero copy, contact, page heroes, T&C text | MenuItem, OmakaseTier, RestaurantEvent, Booking, Session, PaymentGuarantee |
package-cms (marketing pages).fteg-reservation product (subscribe via fteg-erp). CMS Site Content holds reservation page copy/T&C only.Reservation reference: makiisushi.com/reservation (Makii-style flow — date → session → courses → T&C → deposit; now Fiuu on product API).
| App | Role | What lives here |
|---|---|---|
fteg-cms-dev |
Default / base product | bo-starter shell, package-cms, package-seo, generic marketing templates (home/about/contact/footer) |
fteg-cms-ichiwa-dev |
Tenant / project instance | Ichiwa Blade + CSS (copied from static site), restaurant modules (menu/events/omakase), reservation via fteg-reservation product API |
web-ichiwa-dev |
Frozen design reference | Static HTML/CSS/JS — read-only for this work |
package-cms.
Each tenant is its own Laravel app (project-style), not a runtime multi-tenant switch inside one process.
/srv/www/fteg-products/ ├── ROADMAP.md ├── fteg-cms-dev/ │ └── docs/ │ ├── README.md │ └── fteg-cms-plan.html ← this file (canonical) └── fteg-cms-ichiwa-dev/ ← tenant clone (create) /srv/www/web-ichiwa-dev/ ← DO NOT CHANGE (reference only) /srv/www/package-cms/ ← Site Content BO /srv/www/package-admin-core/ /srv/www/package-admin-ui/ /srv/www/package-seo/ /srv/www/package-reservation/ ← engine (consumed by fteg-reservation product) /srv/www/fteg-products/reservation/ ← standalone product (live — G0–G3 + B6)
/srv/www/package-*propflex or fame-proplist for CMS wiringfteg-cms-dev/srv/www/fteg-products/fteg-cms-dev..env (APP_NAME=FTEG CMS, unique APP_KEY, DB credentials).# Example skeleton (adjust if you use an internal bo-starter) cd /srv/www/fteg-products # Prefer: copy from an approved FTEG CMS host skeleton when available. # Fallback: composer create-project laravel/laravel fteg-cms-dev cd fteg-cms-dev cp .env.example .env php artisan key:generate
package-admin-core + auth BO
(e.g. patterns from PropFlex / fame-proplist) over a bare Laravel app — less rework.
In fteg-cms-dev/composer.json add path repos (adjust relative paths):
{
"repositories": [
{ "type": "path", "url": "../../package-cms", "options": { "symlink": true } },
{ "type": "path", "url": "../../package-admin-core", "options": { "symlink": true } },
{ "type": "path", "url": "../../package-admin-ui", "options": { "symlink": true } },
{ "type": "path", "url": "../../package-seo", "options": { "symlink": true } }
],
"require": {
"fdev2024/package-cms": "@dev",
"fdev2024/package-admin-core": "@dev",
"fdev2024/package-admin-ui": "@dev",
"fdev2024/package-seo": "@dev"
}
}
composer update fdev2024/package-cms fdev2024/package-admin-core fdev2024/package-admin-ui fdev2024/package-seo php artisan vendor:publish --tag=cms-config php artisan migrate
php artisan cms:make-template Home --type=site --key=home php artisan cms:make-template Contact --type=site --key=contact php artisan cms:make-template Footer --type=site --key=footer # Register each in config/cms.php, then: php artisan cms:sync-elements home php artisan cms:seed-page home # …repeat for contact, footer
Public Blade uses CMS helpers (same as PropFlex):
@php($page = cms_page('home'))
<x-cms::text :page="$page" key="hero.title" tag="h1" />
<x-cms::image :page="$page" key="hero.background" />
{{-- with config fallback while migrating --}}
{{ cms('contact', 'intro.title', config('site.contact.intro.title')) }}
BO: Site Content should appear under admin (package-cms routes, typically /site-content) once admin-core is wired.
.env + APP_KEY.cd /srv/www/fteg-products cp -a fteg-cms-dev fteg-cms-ichiwa-dev cd fteg-cms-ichiwa-dev # New env / DB cp .env.example .env # or edit existing .env # APP_NAME=Ichiwa CMS # APP_URL=https://ichiwa-….fteg.dev # DB_DATABASE=fteg_cms_ichiwa_dev php artisan key:generate php artisan migrate php artisan cms:sync-elements # after templates registered php artisan cms:seed-page home php artisan cms:seed-page contact php artisan cms:seed-page footer
From /srv/www/web-ichiwa-dev, copy into the tenant — do not edit the source tree.
| Static reference | Tenant destination |
|---|---|
*.html pages |
resources/views/web/*.blade.php (+ layouts) |
assets/css/style.css |
public/css/ or Vite/resources |
assets/js/*.js |
public/js/ (reservation.js → product API) |
assets/images, assets/logo |
public/assets/ or CMS media disk |
# COPY only — never write back into web-ichiwa-dev SRC=/srv/www/web-ichiwa-dev DST=/srv/www/fteg-products/fteg-cms-ichiwa-dev mkdir -p "$DST/public/assets" "$DST/resources/views/web" cp -a "$SRC/assets/." "$DST/public/assets/" # Then manually convert each HTML → Blade layout + sections # index.html → resources/views/web/home.blade.php # menu.html → resources/views/web/menu.blade.php # …
| Page | Route | CMS template key |
|---|---|---|
| Home | / | home |
| Menu | /menu | menu (hero/disclaimer only) |
| Omakase | /omakase | omakase (story band only) |
| Events | /events | events (page chrome only) |
| Contact | /contact | contact |
| Reservation | /reservation | reservation (copy/T&C) |
| Footer / site | — | footer |
| Put in package-cms | Put in tenant modules (Eloquent + BO) |
|---|---|
|
Brand, logo, phone, WhatsApp, email Hero / story / pillars / CTAs Contact address, hours, map Page titles, disclaimers, SEO, T&C text |
MenuCategory / MenuItem (24 items, prices)OmakaseTier / CourseStepRestaurantEventRestaurantSettings (slots, closed days)Later: Reservation / sessions / guarantees
|
Build order inside the Ichiwa tenant:
fteg-reservation product)Reservation is a standalone FTEG product — not installed inside CMS. Ichiwa calls the product API with a venue key (G2 done).
reservation.js in tenant public assets → remote API + X-Api-Keyfteg-reservationFull product plan: fteg-reservation-plan.html
Example vhosts (create when apps exist):
# /etc/nginx/conf.d/fteg-cms-dev.conf
server {
listen 80;
server_name cms-32829402.fteg.dev;
root /srv/www/fteg-products/fteg-cms-dev/public;
index index.php;
access_log /srv/www/logs/fteg-cms-dev-access.log;
error_log /srv/www/logs/fteg-cms-dev-error.log;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# /etc/nginx/conf.d/fteg-cms-ichiwa-dev.conf
# server_name ichiwa-38902193.fteg.dev; # can point here later
# root /srv/www/fteg-products/fteg-cms-ichiwa-dev/public;
ichiwa-38902193.fteg.dev still points at static web-ichiwa-dev.
Only switch nginx root to fteg-cms-ichiwa-dev/public after the tenant app serves the pages.
CMS development is part of sprint Track E (Dev 4). Reservation Track G + B6 are done (product API + Fiuu).
| Week | Deliverable | Notes |
|---|---|---|
| Wk 1–2 | fteg-cms-dev shell + Site Content BO | package-cms, admin-core, package-seo |
| Wk 2–3 | Clone fteg-cms-ichiwa-dev | Own DB + .env |
| Wk 3–4 | Ichiwa Blade/CSS port | Copy from web-ichiwa-dev only |
| Wk 4–5 | Menu / Events / Omakase host modules | Not package-cms EAV |
| Wk 3–5 | fteg-officialweb migrate | Corporate site on CMS |
| Wk 5–7 | ymsb-corporate-web scaffold | YMSB corporate |
| Wk 6–7 | package-reservation P0 (engine) | Engine P0 done — product owns bookings |
| Done | fteg-reservation product + Ichiwa API | G0–G3 + B6 live — Fiuu subscribe/deposit |
Milestones: S4b Aug 8 (CMS shell + Ichiwa on BO) · S5 Sep 5 (corporate CMS sites live).
| Check | Default | Ichiwa tenant |
|---|---|---|
| App boots, migrate OK | ☐ | ☐ |
| Admin login + Site Content BO | ☐ | ☐ |
| home / contact / footer editable in CMS | ☐ | ☐ |
| Ichiwa look ported (Blade + CSS + assets) | — | ☐ |
web-ichiwa-dev unchanged |
☐ verify git status / mtime |
|
| Menu/Events modules (not EAV) | — | ☐ (P1) |
| Reservation lead capture | — | ☐ (P2) |
mkdir -p /srv/www/fteg-products # then scaffold fteg-cms-dev (bo-starter or Laravel + packages) # then: cp -a fteg-cms-dev fteg-cms-ichiwa-dev