Kết luận Tổng hợp Kiến trúc, Nghiệp vụ & Bảo mật (Conclusion-First)
Hệ thống Đăng Khôi Fresh ERP (HKD Vũ Đức Đăng Khôi) vận hành theo kiến trúc Sổ cái Kho – Tài chính – Nhân sự – Bảo mật hợp nhất (Single Source of Truth): lấy Lô hàng thực tế từ Hóa đơn mua vào làm gốc dữ liệu duy nhất để tự động phân bổ xuất kho FEFO/FIFO, cân bằng phương trình Xuất – Nhập – Tồn (Đầu kỳ + Nhập − Xuất = Cuối kỳ), in chứng từ Mẫu 01-VT / 02-VT, tự động hóa chấm công Camera AI & Bảng lương HRM V2 và bảo vệ bằng hàng rào Zero-Trust (8/8 chốt chặn PASS theo chuẩn Cloudflare Security Audit).
- Quản lý Kho & Báo cáo Xuất Nhập Tồn (01-VT / 02-VT): Đồng bộ 903 mặt hàng & 283 lô nhập kho từ chứng từ hóa đơn thật (
data/embedded_data.js,data/invoices_data.js), kiểm chứng đẳng thức4 + 479.144 − 4 = 479.144đơn vị (467.814.718 ₫), cảnh báo tồn tối thiểu và in Phiếu Nhập/Xuất01-VT,02-VTkèm đọc số tiền bằng chữ.[1][3][5][6][7] - Định giá vốn Lô hàng FEFO / FIFO & Đối soát Đa sàn: Mọi đơn xuất bán đa kênh (POS, Menu Online, Shopee, TikTok, Lazada, GrabFood) đều chạy qua
sellOrDeductProductQuantity()ưu tiên lô hết hạn trước (FEFO) hoặc nhập trước (FIFO), giữ nguyên đơn giá vốn gốc của từng lô.[2][8] - Quản trị Nhân sự HRM V2 & Camera AI Rảnh tay: Tích hợp 9 tab con chuyên sâu (Tổng quan Quỹ lương SVG, Bảng chấm công ma trận 31 ngày tự động đồng bộ từ Camera AI
1 ca = N, ≥2 ca = X, Bảng lương Gross/Net, Tăng ca 150%, trừ phạt tự động và In Phiếu lương A4).[9] - Kiểm toán Bảo mật 6 Giai đoạn Cloudflare & Cổng API Hệ thống: Xác nhận 8/8 chốt chặn cốt lõi Đạt Chuẩn An Toàn (ký JWT HMAC-SHA256 tại
_worker.js, khử leo quyềnsanitizeClientPermissions, ẩn Giá vốn gốc trước nhân viên Sales, cô lập khóa MISA meInvoice / Zalo OA trongsessionStorage) và ghi nhận minh bạch 2 điểm khuyến nghị gia cố nhẹ (CF-SEC-01,CF-SEC-02).[10][13][14][15][16]
Phạm vi xác thực HKD Vũ Đức Đăng Khôi 903 Sản phẩm & 283 Lô hàng thật Mẫu 01-VT & 02-VT (TT 133/200) HRM V2 Camera AI (9 Sub-tabs) Cloudflare Security Audit (6 Phases) Archify v3.2.0 (4 Diagrams · 16 Pinned Sources)
Sơ đồ Kiến trúc Tổng thể 3 Tầng của Đăng Khôi Fresh ERP kết nối các phân hệ như thế nào?
Cấu trúc Sơ đồ
- Hóa đơn Mua vào PDF/XML
inv_source - Đa kênh Bán hàng
omni_channels - Camera AI Quầy/Kho
cam_webrtc - Bảo mật Session-Only
auth_session - Đồng bộ Lô & HSD
batch_sync - Xuất kho FEFO / FIFO
fefo_engine - Bộ máy Chấm công HRM V2
hrm_engine - Cổng API Hệ thống
api_gateway - Báo cáo Xuất Nhập Tồn
xnt_report - In Phiếu 01-VT & 02-VT
voucher_print - Đối soát Lãi/Lỗ & Thuế
pnl_recon - Bảng Lương & Phiếu Lương
payroll_sheet
-
1. Đồng bộ Hóa đơn Mua hàng sang Lô & HSD
Hóa đơn đầu vào PDF/XML (
data/invoices_data.js) đượcsyncBatchesFromInvoices()bóc tách thành 283 lô nhập kho kèm đơn giá vốn và hạn sử dụng.[1] -
2. Phân bổ Xuất kho Đa kênh theo FEFO / FIFO
Đơn hàng từ POS, Menu Online, Shopee, TikTok, GrabFood gọi
sellOrDeductProductQuantity()để trừ tồn kho ưu tiên lô sắp hết hạn (FEFO).[2] -
3. Cân bằng Xuất Nhập Tồn & In Phiếu 01-VT / 02-VT
Động cơ
computeXntReportData()tổng hợp Tồn đầu, Nhập, Xuất, Tồn cuối trên 903 mặt hàng và xuất Phiếu Nhập (01-VT) / Phiếu Xuất (02-VT).[3][5][6] -
4. Chấm công Camera AI & Bảng lương HRM V2
Camera WebRTC/RTSP nhận diện khuôn mặt nhân viên theo cơ sở (CS1/CS2/Kho), tự động đồng bộ vào bảng công 31 ngày, tính OT 150% và lương thực lĩnh.[9]
-
5. Bảo mật Session-Only & Cổng API MISA / Zalo OA
Phiên làm việc Super Admin và khóa API MISA meInvoice / Zalo OA được bảo vệ trong
sessionStorage, tự xóa sạch khi đóng tab.[10]
Chu trình Báo cáo Xuất Nhập Tồn & Chứng từ 01-VT / 02-VT vận hành như thế nào?
Cấu trúc Sơ đồ
- 1. Nhập Hóa đơn Mua
wf_invoice - 2. Đồng bộ Lô & HSD
wf_batch - 3. Xuất kho FEFO/FIFO
wf_fefo - 4. Cân bằng Xuất Nhập Tồn
wf_xnt - 5. Cảnh báo Tồn tối thiểu
wf_alert - 6. In Phiếu 01-VT / 02-VT
wf_voucher
Số liệu Kiểm thử Thực tế trên Kho Dữ liệu Thật
903mặt hàng / 283 lô thực tế
Kiểm chứng bằng WebKit JavaScriptCore (jsc) trên data/embedded_data.js & data/invoices_data.js.[3]
- Tồn đầu kỳ
- 4 đơn vị (288.000 ₫)
- Nhập trong kỳ
- 479.144 đơn vị (467.814.718 ₫)
- Xuất trong kỳ
- 4 đơn vị (288.000 ₫)
- Tồn cuối kỳ
- 479.144 đơn vị (467.814.718 ₫)
- Chứng từ Kế toán
- Mẫu 01-VT & 02-VT (TT 133/200)
- Chốt chặn Bảo mật
- 8/8 Verified Safe (PASS)[13]
Trình tự Chấm công Khuôn mặt Camera AI & Tự động Tính lương HRM V2 diễn ra như thế nào?
Cấu trúc Sơ đồ
- Camera AI Quầy/Kho
act_cam - Bộ máy HRM V2
act_hrm - Cấu hình Hệ thống
act_cfg - Bảng Công & Lương
act_pay
So sánh Năng lực Quản trị Kho, Nhân sự & Bảo mật sau nâng cấp
| Tiêu chí Nghiệp vụ | Mẫu Rời rạc | Đăng Khôi Fresh ERP (T10/2026) |
|---|---|---|
| Nguồn dữ liệu Nhập kho | Thủ côngGõ tay từng dòng phiếu nhập | Tự động 100%Đồng bộ từ Hóa đơn PDF/XML thật[1] |
| Định giá vốn Xuất kho | Đơn giá tĩnhKhông tách theo lô và hạn sử dụng | Chuẩn FEFO / FIFOTrừ đúng lô sắp hết hạn & giữ giá vốn lô[2] |
| Báo cáo XNT & Chứng từ | 4 nhóm cột XNT, phiếu cơ bản | Chuẩn TT 133/200XNT + Cảnh báo tồn + In 01-VT & 02-VT[3][5] |
| Chấm công & Tính lương | Tick bảng công tay, tính OT 150% | Camera AI + HRM V2Quét FaceID đa cơ sở + Ma trận 31 ngày + Gross/Net[9] |
| Kiểm toán Bảo mật | Không cóLưu toàn bộ trên trình duyệt | Cloudflare 6 PhasesJWT HMAC-SHA256 + Ẩn Giá vốn + Session-Only[13][16] |
Sơ đồ Ranh giới Tin cậy & Kết quả Kiểm toán Bảo mật 6 Giai đoạn (Cloudflare Security Audit)
Cấu trúc Sơ đồ
- Larksuite OAuth Callback
tb_lark_oauth - Cloudflare Edge (_worker.js)
tb_edge_worker - Chủ Hộ Super Admin
tb_owner_admin - Khóa MISA / Zalo / Cam AI
tb_api_inputs - Bộ lọc Phân quyền RBAC
tb_rbac_guard - Bảo vệ Giá vốn Gốc (COGS)
tb_cogs_shield
Bằng chứng Mã nguồn Thực tế (Pinned Code) & Danh mục Kiểm định Hệ thống
src/js/catalog_manager.js:2042–2066
if (policy === 'FEFO') {
// FEFO (First-Expired, First-Out): Hết hạn trước xuất trước
activeBatches.sort((a, b) => {
const hasExpA = !!a.expiry_date;
const hasExpB = !!b.expiry_date;
if (hasExpA && hasExpB) {
if (a.expiry_date !== b.expiry_date) return a.expiry_date.localeCompare(b.expiry_date);
return new Date(a.import_date || '1970-01-01') - new Date(b.import_date || '1970-01-01');
}
if (hasExpA && !hasExpB) return -1; // Có HSD ưu tiên xuất trước
if (!hasExpA && hasExpB) return 1;
return new Date(a.import_date || '1970-01-01') - new Date(b.import_date || '1970-01-01');
});
} else {
// FIFO (First-In, First-Out): Nhập trước xuất trước
activeBatches.sort((a, b) => new Date(a.import_date || '1970-01-01') - new Date(b.import_date || '1970-01-01'));
}
for (const b of activeBatches) {
if (remainingToDeduct <= 0) break;
const currentBatchQty = Number(b.quantity) || 0;
const deductFromThis = Math.min(currentBatchQty, remainingToDeduct);
b.quantity = currentBatchQty - deductFromThis;
b.sold_quantity = (Number(b.sold_quantity) || 0) + deductFromThis;
src/js/app.js:6046–6072
const computeXntReportData = (overrideOpts = {}) => {
window.catalogManager?.syncBatchesFromInvoices?.();
const allProducts = window.catalogManager?.getAllProducts?.() || [];
const allVouchers = getSavedDispatchVouchers() || [];
const minStockMap = getXntMinStockMap();
const defaultMinStock = overrideOpts.defaultMinStock !== undefined
? Math.max(0, Math.round(Number(overrideOpts.defaultMinStock) || 0))
: getXntDefaultMinStock();
const fromDate = overrideOpts.fromDate !== undefined
? String(overrideOpts.fromDate || '').trim()
: (document.getElementById('xnt-from-date')?.value || '').trim();
const toDate = overrideOpts.toDate !== undefined
? String(overrideOpts.toDate || '').trim()
: (document.getElementById('xnt-to-date')?.value || '').trim();
const catFilter = overrideOpts.catFilter !== undefined
? String(overrideOpts.catFilter || '').trim()
: (document.getElementById('xnt-category-filter')?.value || '').trim();
const statusFilter = overrideOpts.statusFilter !== undefined
? String(overrideOpts.statusFilter || 'active_or_moved').trim()
: (document.getElementById('xnt-status-filter')?.value || 'active_or_moved').trim();
const searchVal = (overrideOpts.search !== undefined
? String(overrideOpts.search || '')
: (document.getElementById('xnt-search-input')?.value || '')).trim().toLowerCase();
const sortBy = overrideOpts.sortBy !== undefined
? String(overrideOpts.sortBy || 'moved_first')
: (document.getElementById('xnt-sort-select')?.value || 'moved_first');
Danh mục Kiểm định Vận hành Thực tế dành cho Chủ Hộ (Tick lưu trạng thái tự động):