Welcome to MetfaB VDA 6.3 Portal
Fusing Excellence with Precision | ISO 9001:2015 Aligned
Quick Actions
VDA 6.3 P1-P7 Process Elements
Admin Panel
User Management & Access Control
Cloudflare Zero Trust Integration
This portal is protected by Cloudflare Access. Admin emails: sean@metfabworks.com, seanjmoh@gmail.com
| Name | Role | Created | Actions |
|---|
CAPA Tracker
Corrective & Preventive Action Management
| ID | Issue | Owner | Due Date | Priority | Status | Actions |
|---|
Calibration Register
Equipment Calibration Schedule & Records
| Equipment | Serial | Last Cal | Due Date | Status | Actions |
|---|
5S Audit
Workplace Organization Scoring
5S Breakdown
| Area | Date | Auditor | S1 | S2 | S3 | S4 | S5 | Total | Status |
|---|
Kaizen Board
Continuous Improvement Ideas
Ideas
0In Progress
0Review
0Done
0Risk Register
Risk Assessment & Mitigation
| Description | Process | Likelihood | Impact | Score | Owner | Status | Actions |
|---|
Welding & WPS
Welder Qualifications & Welding Procedure Specs
Qualified Welders
| Name | Stamp | Processes | Expiry | Status |
|---|
WPS Library
Material Certificates
MTR / Mill Cert Tracking
| Cert No | Heat No | Material | Supplier | Job No | Status |
|---|
Document Register
QM Documentation Control
| Doc No | Title | Type | P Element | Rev | Status | Review Date |
|---|
QM Folder Structure
VDA 6.3 Process Elements Documentation
P1: Project Mgmt
APQP, Planning, Control Plan
P2: Planning
FMEA, Process Flow, Specs
P3: Realization
Production, Inspection, NC
P4: Suppliers
Supplier Audit, Incoming
P5: Customer
Requirements, Feedback, PPAP
P6: Analysis
Data Analysis, KPIs, SPC
P7: Improvement
CAPA, Lessons, Innovation
Supporting Docs
Policies, Procedures, Forms
P1: Project Management
Documents
Global Search
Search across all modules
Setup & Mobile
Cloudflare D1 Database Integration
Cloudflare D1 Database
Production-ready backend deployment kit
Status: Demo mode using localStorage. Follow steps below to migrate to D1.
Complete D1 Schema SQL
Copy and paste into Cloudflare D1 Console → Execute
-- MetfaB VDA 6.3 Portal D1 Schema v1
-- Run this in Cloudflare D1 Console
CREATE TABLE users (
email TEXT PRIMARY KEY,
name TEXT NOT NULL,
role TEXT NOT NULL CHECK(role IN ('admin','staff','auditor')),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE capa (
id TEXT PRIMARY KEY,
issue TEXT NOT NULL,
root_cause TEXT,
action TEXT,
owner TEXT,
due_date DATE,
status TEXT DEFAULT 'open' CHECK(status IN ('open','in_progress','closed')),
priority TEXT DEFAULT 'medium' CHECK(priority IN ('low','medium','high','critical')),
created_by TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE calibration (
id TEXT PRIMARY KEY,
equipment TEXT NOT NULL,
serial TEXT,
type TEXT,
last_cal DATE,
due_date DATE,
status TEXT DEFAULT 'ok' CHECK(status IN ('ok','due_soon','overdue')),
location TEXT,
certificate_url TEXT
);
CREATE TABLE risks (
id TEXT PRIMARY KEY,
description TEXT NOT NULL,
process TEXT,
likelihood INTEGER CHECK(likelihood BETWEEN 1 AND 5),
impact INTEGER CHECK(impact BETWEEN 1 AND 5),
score INTEGER GENERATED ALWAYS AS (likelihood * impact) STORED,
mitigation TEXT,
owner TEXT,
status TEXT DEFAULT 'active' CHECK(status IN ('active','mitigated','closed')),
review_date DATE
);
CREATE TABLE documents (
id TEXT PRIMARY KEY,
doc_no TEXT UNIQUE,
title TEXT NOT NULL,
type TEXT,
p_element TEXT,
rev TEXT,
status TEXT DEFAULT 'draft' CHECK(status IN ('draft','active','obsolete')),
owner TEXT,
review_date DATE,
file_url TEXT,
folder_path TEXT
);
CREATE TABLE audit_5s (
id TEXT PRIMARY KEY,
area TEXT NOT NULL,
audit_date DATE,
auditor TEXT,
s1_score INTEGER CHECK(s1_score BETWEEN 0 AND 20),
s2_score INTEGER CHECK(s2_score BETWEEN 0 AND 20),
s3_score INTEGER CHECK(s3_score BETWEEN 0 AND 20),
s4_score INTEGER CHECK(s4_score BETWEEN 0 AND 20),
s5_score INTEGER CHECK(s5_score BETWEEN 0 AND 20),
total INTEGER GENERATED ALWAYS AS (s1_score + s2_score + s3_score + s4_score + s5_score) STORED,
percentage REAL GENERATED ALWAYS AS (total / 100.0 * 100) STORED,
status TEXT
);
CREATE TABLE kaizen (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
submitted_by TEXT,
date DATE,
category TEXT,
impact TEXT,
effort TEXT,
saving_monthly REAL,
status TEXT,
kanban_column TEXT DEFAULT 'ideas' CHECK(kanban_column IN ('ideas','progress','review','done'))
);
CREATE TABLE welders (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
stamp TEXT UNIQUE,
processes TEXT,
expiry DATE,
status TEXT DEFAULT 'active' CHECK(status IN ('active','expired','pending')),
id_card_url TEXT
);
CREATE TABLE wps (
id TEXT PRIMARY KEY,
wps_no TEXT UNIQUE NOT NULL,
process TEXT,
material TEXT,
thickness TEXT,
joint TEXT,
position TEXT,
file_url TEXT
);
CREATE TABLE material_certs (
id TEXT PRIMARY KEY,
cert_no TEXT UNIQUE NOT NULL,
heat_no TEXT,
material TEXT,
supplier TEXT,
po_no TEXT,
date_received DATE,
job_no TEXT,
status TEXT DEFAULT 'received' CHECK(status IN ('received','approved','rejected')),
file_url TEXT
);
-- Initial Admin Users
INSERT INTO users VALUES ('sean@metfabworks.com', 'Sean Moh', 'admin', CURRENT_TIMESTAMP);
INSERT INTO users VALUES ('seanjmoh@gmail.com', 'Sean J Moh', 'admin', CURRENT_TIMESTAMP);
-- Indexes for performance
CREATE INDEX idx_capa_status ON capa(status);
CREATE INDEX idx_capa_due ON capa(due_date);
CREATE INDEX idx_cal_due ON calibration(due_date);
CREATE INDEX idx_risks_score ON risks(score);
CREATE INDEX idx_5s_date ON audit_5s(audit_date);
CREATE INDEX idx_kaizen_column ON kaizen(kanban_column);
Cloudflare Worker API
Save as worker.js and deploy via Pages Functions
// worker.js for portal.metfabworks.com
// Place in /functions/api/[[path]].js for Cloudflare Pages
export default {
async fetch(request, env) {
const url = new URL(request.url);
const { pathname } = url;
const method = request.method;
// Get user from Cloudflare Access JWT
const jwt = request.headers.get('CF-Authorization');
const user = jwt ? JSON.parse(atob(jwt.split('.')[1])) : null;
const role = user?.groups?.[0] || user?.email === 'sean@metfabworks.com' ? 'admin' : 'guest';
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET,POST,PUT,DELETE,OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type,CF-Authorization'
};
if (method === 'OPTIONS') return new Response(null, { headers });
// CAPA Endpoints
if (pathname === '/api/capa' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM capa ORDER BY due_date ASC"
).all();
return Response.json(results, { headers });
}
if (pathname === '/api/capa' && method === 'POST' && role !== 'auditor') {
const data = await request.json();
const id = crypto.randomUUID();
await env.DB.prepare(
"INSERT INTO capa VALUES (?, ?, ?, ?, ?, ?)"
).bind(
id, data.issue, data.root_cause, data.action, data.owner,
data.due_date, data.status || 'open', data.priority || 'medium',
user.email, new Date().toISOString()
).run();
return Response.json({success: true, id}, { headers });
}
// Calibration Endpoints
if (pathname === '/api/calibration' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM calibration ORDER BY due_date ASC"
).all();
return Response.json(results, { headers });
}
// Risks Endpoints
if (pathname === '/api/risks' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM risks ORDER BY score DESC"
).all();
return Response.json(results, { headers });
}
// 5S Audit Endpoints
if (pathname === '/api/5s' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM audit_5s ORDER BY audit_date DESC"
).all();
return Response.json(results, { headers });
}
// Kaizen Endpoints
if (pathname === '/api/kaizen' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM kaizen ORDER BY date DESC"
).all();
return Response.json(results, { headers });
}
// Documents Endpoints
if (pathname === '/api/documents' && method === 'GET') {
const { results } = await env.DB.prepare(
"SELECT * FROM documents ORDER BY review_date ASC"
).all();
return Response.json(results, { headers });
}
// Users Endpoint (Admin only)
if (pathname === '/api/users' && method === 'GET' && role === 'admin') {
const { results } = await env.DB.prepare(
"SELECT * FROM users ORDER BY created_at DESC"
).all();
return Response.json(results, { headers });
}
return new Response('Not Found', { status: 404, headers });
}
}
Step-by-Step Deployment
-
1
Create D1 DatabaseCloudflare Dashboard → D1 → Create Database → Name:
metfab-vda→ Execute schema.sql from Schema tab -
2
Deploy to Cloudflare PagesPages → Create Project → Upload this HTML file → Custom domain:
portal.metfabworks.com -
3
Bind D1 DatabasePages → Settings → Functions → D1 database bindings → Variable:
DB→ Database: metfab-vda -
4
Configure Zero Trust AccessZero Trust → Access → Applications → Add portal.metfabworks.com → Policy: Include sean@metfabworks.com, seanjmoh@gmail.com as Admin
-
5
Deploy Worker APICreate
/functions/api/[[path]].jswith code from Worker API tab → Deploy -
6
Replace localStorage with API CallsUpdate JS: Replace
localStorage.getItem()withfetch('/api/capa')etc. See Migration tab for sample code.
Data Migration
Important: Click Export to JSON on each module now to backup sample data. After D1 deployment, use Import JSON to load into database.
Sample API Replacement Code:
// BEFORE (localStorage)
const capaData = JSON.parse(localStorage.getItem('capa')) || [];
localStorage.setItem('capa', JSON.stringify(data));
// AFTER (Cloudflare D1 API)
async function getCapa() {
const res = await fetch('/api/capa');
return await res.json();
}
async function saveCapa(data) {
await fetch('/api/capa', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
}
// Migration Script (run once after D1 setup)
async function migrateToD1() {
const modules = ['capa', 'calibration', 'risks', '5s', 'kaizen', 'documents'];
for (const mod of modules) {
const data = JSON.parse(localStorage.getItem(mod) || '[]');
for (const item of data) {
await fetch(`/api/${mod}`, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(item)
});
}
}
alert('Migration complete! Clear localStorage.');
}
Audit Dashboard
VDA 6.3 Audit planning and execution module. Coming soon.
Quotation Builder
Generate branded quotations with line items. Coming soon.
QR Posters
Generate QR code posters for shop floor access. Coming soon.
Equipment QR Labels
Generate equipment QR labels for calibration tracking. Coming soon.
Welder ID Cards
Generate branded welder ID cards with QR codes. Coming soon.
Branded Templates
Download branded letterhead, inspection reports, and forms.
P2: Planning Product/Process
FMEA, Process Flow Charts, Specifications
P3: Realizing Product/Process
Production, Inspection Plans, Non-Conformance
P4: Supplier Management
Supplier Audits, Incoming Inspection, Supplier CAPA
P5: Customer Management
Customer Requirements, Feedback, PPAP
P6: Analysis & Evaluation
Data Analysis, KPIs, SPC, Management Review
P7: Improvement
CAPA, Lessons Learned, Innovation, Kaizen