fteg-cms-dev fteg-cms-ichiwa-dev do not edit web-ichiwa-dev

FTEG CMS Product Plan

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.

Target paths
Default product: /srv/www/fteg-products/fteg-cms-dev
Ichiwa tenant: /srv/www/fteg-products/fteg-cms-ichiwa-dev

Commercial policy — 1 site = 1 subscription

cms-web SKU — each subscription provisions exactly one CMS tenant (one public website + one CMS backoffice). Checkout collects site_name, primary_domain, template_profile, and seo_tier.
BuyerExampleSubscriptions
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).

Overview

6Ichiwa pages
24Menu items
4Events
3Omakase tiers
Product shape
Default fteg-cms-dev = corporate CMS shell (package-cms Site Content BO).
Tenant clones (e.g. fteg-cms-ichiwa-dev) = custom Blade template + optional host modules.
package-reservation = optional package — not every CMS site installs it.

Architecture — template vs CMS vs modules

Same rule as PropFlex: structure in code; marketing copy in package-cms; transactional data in host modules or optional packages.

ConcernLayerWhy
Layout, nav, tabs, calendar UI, CSS tokenstemplate codePer-project brand look
Hero, story, contact, SEO, footer, CTAspackage-cmsSite Content BO — PageDefinition fields
Menu items, omakase tiers, eventshost moduleCRUD with price/image — not EAV
Reservations, capacity, Fiuu depositfteg-reservationStandalone product — CMS consumes API only
In package-cmsOutside package-cms
Brand, logo, phone, WhatsApp, hero copy, contact, page heroes, T&C text MenuItem, OmakaseTier, RestaurantEvent, Booking, Session, PaymentGuarantee
BO split
Site Content BO = package-cms (marketing pages).
Reservation BO = fteg-reservation product (subscribe via fteg-erp). CMS Site Content holds reservation page copy/T&C only.
See fteg-reservation-plan.html for product architecture.

Reservation reference: makiisushi.com/reservation (Makii-style flow — date → session → courses → T&C → deposit; now Fiuu on product API).

Contents

  1. 1 site = 1 sub
  2. Overview
  3. Architecture
  4. Deploy model
  5. How to start — scaffold
  6. Wire packages + Site Content
  7. Clone Ichiwa tenant
  8. Port Ichiwa template
  9. CMS vs restaurant modules
  10. Reservation (optional package)
  11. Sprint timeframe
  12. Checklist

1. Deploy model

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
Same pattern as PropFlex: template in code, content in DB via 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)

2. Prerequisites

How to start — scaffold fteg-cms-dev

  1. Create the Laravel host (prefer copying a known FTEG bo-starter / PropFlex-lite shell if you have one; otherwise fresh Laravel + packages).
  2. Place it at /srv/www/fteg-products/fteg-cms-dev.
  3. Create DB + .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
Prefer cloning an existing FTEG host that already has package-admin-core + auth BO (e.g. patterns from PropFlex / fame-proplist) over a bare Laravel app — less rework.

4. Step 2 — Wire packages + Site Content

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

First CMS templates (default product)

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.

5. Step 3 — Clone Ichiwa tenant

  1. Copy the default app to the tenant path.
  2. Give it its own DB + .env + APP_KEY.
  3. Keep package versions in sync with default (same path repos).
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
Default vs tenant
Default keeps generic corporate templates.
Ichiwa replaces public views/CSS and adds restaurant PageDefinitions + modules. Shared packages stay shared; tenant-specific code stays in the tenant app.

6. Step 4 — Port Ichiwa template (copy only)

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
# …

Suggested Blade map

PageRouteCMS template key
Home/home
Menu/menumenu (hero/disclaimer only)
Omakase/omakaseomakase (story band only)
Events/eventsevents (page chrome only)
Contact/contactcontact
Reservation/reservationreservation (copy/T&C)
Footer / sitefooter

7. Step 5 — CMS fields vs restaurant modules

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 / CourseStep
RestaurantEvent
RestaurantSettings (slots, closed days)
Later: Reservation / sessions / guarantees

Build order inside the Ichiwa tenant:

  1. P0 — Layout + home/contact/footer on CMS (hardcoded menu/events OK temporarily).
  2. P1 — Menu / Omakase / Event CRUD in BO; public pages read DB.
  3. P2 — Reservation lead capture (store request + notify WhatsApp/email).
  4. P3 — Real availability + admin calendar.
  5. P4 — Fiuu guest deposit (G3 done on product API), confirmation email.

8. Step 6 — Reservation (fteg-reservation product)

Reservation is a standalone FTEG product — not installed inside CMS. Ichiwa calls the product API with a venue key (G2 done).

Full product plan: fteg-reservation-plan.html

9. Nginx + local check

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;
Today 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.

10. Sprint timeframe (8-week plan)

CMS development is part of sprint Track E (Dev 4). Reservation Track G + B6 are done (product API + Fiuu).

WeekDeliverableNotes
Wk 1–2fteg-cms-dev shell + Site Content BOpackage-cms, admin-core, package-seo
Wk 2–3Clone fteg-cms-ichiwa-devOwn DB + .env
Wk 3–4Ichiwa Blade/CSS portCopy from web-ichiwa-dev only
Wk 4–5Menu / Events / Omakase host modulesNot package-cms EAV
Wk 3–5fteg-officialweb migrateCorporate site on CMS
Wk 5–7ymsb-corporate-web scaffoldYMSB corporate
Wk 6–7package-reservation P0 (engine)Engine P0 done — product owns bookings
Donefteg-reservation product + Ichiwa APIG0–G3 + B6 live — Fiuu subscribe/deposit

Milestones: S4b Aug 8 (CMS shell + Ichiwa on BO) · S5 Sep 5 (corporate CMS sites live).

11. Done-when checklist

CheckDefaultIchiwa 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)
First concrete command to run when ready to build
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