Skip to Content
ChangelogUnreleasedUnreleased · Supabase & Platform

Unreleased · Supabase & Platform

Các thay đổi dưới đây chưa được gán phiên bản hoặc ngày phát hành.

Added

  • Lưu và phân loại Workflow Template: Thêm bảng mẫu Job và liên kết category/tag theo workspace, RLS cho quyền đọc/chỉnh, RPC đồng bộ metadata, cùng ràng buộc cho phép task bán hàng có chỉ tiêu tối thiểu 0 đơn.

Fixed

  • Hiển Thị Bằng Chứng Giao Dịch Kho Trong Chi Tiết Ca Làm (ExecutionDetailPage.tsx, rpc_get_execution_record_by_id, TaskStockTransactionProofMapper.ts):

    • Nhúng trực tiếp toàn bộ dữ liệu giao dịch kho (transactions, items, photos, tên kho xuất/nhập, phân loại vật tư và nhãn thu hồi is_returnable) trong RPC rpc_get_execution_record_by_id (SECURITY DEFINER), giải quyết triệt để lỗi không hiển thị thông tin hoặc lỗi cú pháp join PostgREST phía client.
    • Đồng bộ mapping isReturnable trên TaskStockTransactionProofMapper và hoàn thiện hiển thị card chi tiết bằng chứng giao dịch kho với huy hiệu trạng thái, phân tuyến kho, danh sách vật tư và hình ảnh chứng từ.
  • Khắc Phục Lỗi RPC submit_step_proof (“record v_proof has no field submitted_data”) (20260921031000_fix_task_validation_evaluate_proof_stock_transaction.sql, 20260921031100_update_rpc_get_execution_record_stock_transaction.sql):

    • Sửa hàm task_validation.evaluate_proof cho task stock_transaction để kiểm tra trực tiếp quan hệ từ bảng task_stock_transactions thay vì truy cập trường submitted_data không tồn tại trên v_proof (task_execution_proofs).
    • Cập nhật hàm public.rpc_get_execution_record_by_id trả về submitted_data và proof_stock_transaction cho các task loại stock_transaction.
  • Khắc Phục Lỗi Khởi Tạo Dữ Liệu Task Kho Hàng (stock_transaction) Khi Chỉnh Sửa Job Trong Job Builder (JobRemoteDataSource.ts, TaskBuilder.tsx, TaskBuilderEditorContext.tsx):

    • Bổ sung task_metric_stock_transaction và bảng quan hệ task_metric_stock_transaction_assets vào SELECT_FIELDS của JobRemoteDataSource.ts.
    • Hoàn thiện ánh xạ hai chiều giữa Supabase relational metrics/assets và DTO config (assets, transaction_type, transaction_status, max_transactions, require_photos, min_photos, from_warehouse_id, to_warehouse_id) trong getJobById và createJob.
    • Bổ sung chuẩn hoá cấu hình task stock_transaction khi nạp dữ liệu bước công việc (initialNodes) và khi lưu payload (handleSave) trong TaskBuilder.tsx.
    • Bổ sung nhãn hiển thị Kho hàng cho task stock_transaction trong TaskBuilderEditorContext.tsx.
  • Khắc Phục Lỗi Runtime Error [object Object] Khi Tải Lên Hình Ảnh / Chứng Từ (SupabaseUploadRemoteDataSource.ts, useUploadController.ts, 20260920160000_upload_path_resolver_text_resource.sql):

    • Tạo mới migration 20260920160000_upload_path_resolver_text_resource.sql cập nhật RPC resolve_upload_folder cho phép nhận p_resource_id text (thay vì bắt buộc kiểu uuid), hỗ trợ các định danh bản nháp (draft, new, uuid) kèm cơ chế kiểm tra chống duyệt thư mục trái phép (path traversal protection).
    • Chuẩn hóa việc bọc và chuyển đổi toàn bộ lỗi từ Supabase Storage và PostgREST thành các Error instances hợp lệ thay vì ném raw object trong SupabaseUploadRemoteDataSource.ts, tránh hiển thị Runtime Error [object Object].
    • Bổ sung cơ chế fallback tự động sinh đường dẫn lưu trữ deterministic ${workspaceId}/${folderScope}/${feature}/${resourceId} trong trường hợp RPC gặp sự cố mạng hoặc quyền truy cập.
    • Bọc khối xử lý file và tạo đường dẫn trong try/catch với hàm trích xuất thông điệp lỗi extractErrorMessage trong useUploadController.ts, đảm bảo trạng thái upload của từng file hiển thị rõ ràng và không làm crash ứng dụng.
  • Khắc Phục Lỗi RPC search_stock_assets_with_balance & Kiểm Tra Tham Số UUID (StockAssetSelect.tsx):

    • Bổ sung SECURITY DEFINER và GRANT EXECUTE cho function PostgreSQL search_stock_assets_with_balance trên Supabase.
    • Chuẩn hóa kiểm tra hợp lệ UUID (isValidUuid) đối với workspaceId, folderId, warehouseId trong StockAssetSelect.tsx, lọc bỏ các giá trị "all", "none", "" trước khi truyền vào database.
    • Tối ưu hóa cơ chế tự động fallback truy vấn trực tiếp bảng stock_assets và stock_balances một cách êm ái, đảm bảo người dùng luôn tìm kiếm sản phẩm thành công mà không gặp lỗi console.
  • Khắc Phục Lỗi 500 “Key length is zero” Trong Edge Function process-photo:

    • Bổ sung giá trị dự phòng mặc định tin cậy cho biến môi trường PHOTO_HMAC_SECRET (gigee_evidence_hmac_secret_2026) và PUBLIC_WEB_URL (https://dashboard.gigee.vn), giúp Edge Function không bị lỗi khi chạy ở môi trường local hoặc khi thiếu biến môi trường tùy chỉnh.
    • Bổ sung cơ chế bảo vệ phòng vệ (defensive fallback) bên trong hàm generateHmacSignature để ngăn chặn lỗi DOMException: Key length is zero từ Web Crypto API khi khóa bị trống.
  • Bổ Sung Kích Hoạt Thông Báo Khi Duyệt Nhiệm Vụ & Toàn Bộ Ca Làm Việc (task_approved & execution_approved):

    • Bổ sung database function handle_task_approval_notification và trigger tr_task_approval_notification trên bảng public.task_execution_proofs: Tự động gửi thông báo task_approved cho Người làm (Worker) khi Người thuê phê duyệt một bằng chứng nhiệm vụ (status = 'approved').
    • Bổ sung database function handle_execution_status_notification và trigger tr_execution_status_notification trên bảng public.job_execution_records: Tự động gửi thông báo execution_approved cho Người làm và các Người theo dõi (Followers có bật follow_execution_approve_push) khi toàn bộ ca làm việc được phê duyệt hoàn thành (status = 'approved'), đồng thời gửi thông báo execution_rejected khi ca làm việc bị từ chối (status = 'rejected').
    • Cập nhật bộ test pgTAP notification_trigger_enums_test.sql xác minh toàn diện các chu trình duyệt nhiệm vụ và ca làm việc.
  • Khắc Phục Lỗi Kích Hoạt & Hiển Thị Thông Báo Khi Người Làm (Worker) Follow Người Thuê (Hirer):

    • Cập nhật các hàm RPC PostgreSQL (rpc_list_notifications, rpc_mark_notifications_read, rpc_delete_read_notifications) để hỗ trợ đồng thời thông báo thuộc workspace hiện tại và thông báo toàn cục của người dùng (workspace_id IS NULL).
    • Đảm bảo Người thuê (Hirer) khi đang mở bất kỳ Workspace nào trên Web Dashboard vẫn luôn nhận được thông báo khi có Người làm bấm Follow.
    • Tinh chỉnh trigger handle_user_followed_notification() kiểm tra an toàn cấu hình khi người dùng chưa có bản ghi user_notification_settings.
    • Cập nhật đếm số thông báo chưa đọc (unreadCount) trong NotificationRemoteDataSource.ts trên Web Dashboard.

Added

  • Hệ Thống Tri-Mode Task Builder Thiết Kế Các Bước & Nhiệm Vụ Đa Chế Độ (TaskBuilder.tsx, TaskStudioBuilder.tsx, TaskPipelineBuilder.tsx, TaskFlowBuilder.tsx):

    • Tri-Mode View Switcher & Local Storage: Cho phép chuyển đổi tức thì giữa 3 chế độ xem dùng chung một nguồn dữ liệu thời gian thực và tự động lưu ghi nhớ chế độ xem đã chọn vào localStorage:
      • Studio Mode (3 Cột - Mặc định): Bố cục 3 cột chuyên nghiệp (Cây các bước ➡️ Không gian làm việc của bước ➡️ Bảng thuộc tính Inspector cố định) tối ưu cho việc nhập liệu nhanh của người dùng vận hành chuyên sâu, tích hợp khả năng kéo thả phân chia độ rộng cột tuỳ biến (ResizablePanelGroup).
      • Pipeline Mode: Thiết kế các bước theo dòng thời gian dọc (Vertical Timeline) trực quan theo phong cách Notion/Linear, hỗ trợ kéo thả đổi thứ tự các bước (@dnd-kit/sortable), chọn bước tiên quyết (Dependencies) qua dropdown rõ ràng, tóm tắt cấu hình task bằng badge thông minh và chỉnh sửa chuyên sâu qua Slide-over Sheet rộng rãi.
      • Flow Diagram Mode: Đóng gói lại sơ đồ mạng lưới DAG Canvas (@xyflow/react) với khả năng tự động dàn trang (Horizontal LR / Vertical TB), căn chỉnh tự động khi không có edges, nối dây liên kết trực tiếp và minimap.
    • Tái Thiết Kế Giao Diện JobFormModal Toàn Màn Hình & Tinh Gọn UX (JobFormModal.tsx):
      • Mặc định mở ở chế độ toàn màn hình (isFullScreen: true) mở rộng tối đa không gian thao tác.
      • Tinh giản Header: Gộp thanh Stepper điều hướng các bước, nút Phóng to/Thu nhỏ và nút Đóng (X) trên cùng một dòng, giải phóng 100% chiều rộng cho TaskBuilder ở Bước 4.
      • Căn giữa các form nhập liệu ở Bước 1, 2, 3 (max-w-2xl mx-auto) giúp tập trung trải nghiệm người dùng, trong khi Bước 4 TaskBuilder hiển thị full-bleed rộng rãi.
      • Di chuyển nút “Chỉ định thành viên” và “Tạo QR & Link mời” xuống thanh Footer đồng hàng với nút Lưu.
    • Việt Hoá Toàn Diện & Chuẩn Hoá Ánh Xạ Lỗi Supabase/PostgreSQL (jobErrorMapper.ts):
      • Xây dựng bộ ánh xạ lỗi chi tiết chuyển đổi các mã lỗi PostgreSQL (23505, 23503, 23502, 42501, 22P02), PostgREST (PGRST116, PGRST301) và Next.js API Routes thành thông báo tiếng Việt trực quan, thân thiện với người dùng.
      • Áp dụng đồng bộ cho JobFormModal, JobAssignMemberModal, JobInviteModal, JobListPage, JobKanbanView, và TaskBuilderPage.
    • Single Source of Truth: Đồng bộ dữ liệu hai chiều và bảo toàn trạng thái cấu hình 100% khi chuyển đổi qua lại giữa cả 3 chế độ.
    • Tích Hợp TaskRegistry Động: Tự động kết nối với toàn bộ các module nhiệm vụ (GPS Geofence, Photo Proof, Biểu mẫu FormX, Bán hàng, Kho hàng) với form cấu hình và kiểm định hợp lệ.
  • Mở Rộng Hệ Thống Quản Trị Kho Hàng & Chuỗi Cung Ứng Toàn Diện (Inventory Hub - 3-Tier Architecture):

    • Kiến trúc 3 Tầng: Nâng cấp phân tầng quản lý kho chuẩn nghiệp vụ gồm: Lệnh kho & Yêu cầu (Stock Orders) ➡️ Giao dịch kho & Sổ cái (Stock Transactions & Movement Ledger) ➡️ Tồn kho tức thời (Stock Balances Snapshot).
    • 8 Phân loại Tài sản & Vật tư (Asset Types): Mở rộng đầy đủ 8 nhóm nghiệp vụ (product, premium, sampling, posm, uniform, equipment, consumable, other), bổ sung định mức an toàn tối thiểu (min_stock_level), cờ thu hồi sau ca (is_returnable) và mã vạch (barcode).
    • Phân hệ Lệnh Kho & Cấp Phát (StockOrdersSubTab.tsx, StockOrderFormModal.tsx, StockOrderDetailDrawer.tsx, StockOrderApprovalModal.tsx, StockOrderFulfillmentModal.tsx):
      • Quản lý quy trình dự trù, đề xuất cấp phát vật tư PG/PB trước ca và nhân viên kỹ thuật trước khi lắp đặt.
      • Cơ chế phê duyệt Lệnh kho kèm trigger tự động khóa giữ chỗ (booked_unit_qty / inbound_unit_qty) trên stock_balances.
      • Hỗ trợ xuất kho thực tế theo từng đợt (1 Lệnh kho ➡️ N Giao dịch vật lý) và hoàn tất lệnh.
    • Phân hệ Kiểm Kê & Cân Đối Tồn Kho (StockAuditsSubTab.tsx, StockAuditFormModal.tsx, StockAuditDetailDrawer.tsx):
      • Tạo phiếu kiểm kê chu kỳ theo từng địa điểm kho, ghi nhận số lượng thực đếm và phân loại nguyên nhân chênh lệch (damage, expired, loss, sampling_usage, data_error, unrecorded_sale, other).
      • Bấm “Chốt kiểm kê & Cân đối kho” tự động kích hoạt RPC complete_stock_audit sinh bút toán điều chỉnh (adjustment) đồng bộ tức thời số tồn kho thực tế.
    • Bảng Điều Khiển & Cảnh Báo Kho Real-time (StockOverviewSubTab.tsx):
      • Thống kê chỉ số KPI: tổng danh mục SKU, tồn khả dụng, lệnh chờ duyệt, cảnh báo hết hàng (Stockout), tồn dưới định mức an toàn và cận hạn sử dụng trong 30 ngày.
      • Biểu đồ cơ cấu phân bổ danh mục vật tư.
    • Sổ Thẻ Kho & Báo Cáo Xuất - Nhập - Tồn (StockLedgerSubTab.tsx, StockSummaryReportSubTab.tsx):
      • Sổ Thẻ kho (Movement Ledger): Theo dõi dòng thời gian biến động nhập/xuất/điều chuyển và số dư tồn lũy kế theo từng mặt hàng và kho hàng.
      • Báo cáo Xuất - Nhập - Tồn (In-Out-Balance): Thống kê số dư đầu kỳ, nhập, xuất, điều chỉnh, tồn cuối kỳ và giá trị tồn theo kỳ kế toán, hỗ trợ xuất báo cáo định dạng CSV.
    • Hub Quản Trị Kho 7-Tabs (StockListPage.tsx):
      • Nâng cấp giao diện thành Inventory Hub với 7 tab: Bảng điều khiển (overview), Lệnh kho (orders), Giao dịch (transactions), Danh mục hàng hoá (assets), Tồn kho tức thời (balances), Kiểm kê (audits), Báo cáo & Thẻ kho (reports).
    • Tích hợp Thẻ kho trên Trang Chi tiết Mặt hàng (StockAssetDetailPage.tsx):
      • Bổ sung tab chuyển đổi giữa bảng tồn kho phân bổ theo từng kho và Sổ Thẻ kho theo dòng thời gian của mặt hàng đó.
  • Tìm Kiếm Sản Phẩm Kèm Thông Tin Tồn Kho Bằng RPC & Sắp Xếp Form Giao Dịch Kho (StockTransactionFormModal.tsx):

    • Tạo mới RPC PostgreSQL search_stock_assets_with_balance và component StockAssetSelect.tsx hỗ trợ tìm kiếm sản phẩm theo tên/SKU kèm hiển thị tức thì số lượng tồn kho thực tế (unitQty), số lượng khả dụng (availableQty) và đang giữ (bookedUnitQty) theo từng kho xuất/nhập được chọn.
    • Tích hợp component LocationSelect với phạm vi scope="workspace" và gọi RPC search_locations trên Supabase cho các trường chọn Kho xuất và Kho nhập.
    • Tích hợp UploadGridWidget từ module upload (upload_api) cho phép tải lên, xem trước nhiều hình ảnh / chứng từ biên bản giao nhận kho, và sắp xếp vị trí trường tải ảnh xuống cuối cùng của form (sau danh sách sản phẩm) theo trải nghiệm người dùng tối ưu.
    • Đồng bộ toàn diện trường photos?: string[] qua các tầng kiến trúc Clean Architecture: StockTransactionEntity, StockTransactionDto, IStockRepository, StockRemoteDataSource và StockRepository.
  • Cơ Chế Kiểm Duyệt & Đối Soát Bằng Chứng Giao Dịch Kho (StockTransactionValidation.tsx, StockTransactionProofView.tsx, 20260921032000_stock_task_proof_mutation_guard.sql, 20260921032100_stock_task_evaluate_proof_audit_rules.sql):

    • Phân Định Rõ Hai Giai Đoạn: Vận hành kho vật lý diễn ra theo thời gian thực (trước, trong, sau ca) ➔ Đối soát & Nghiệm thu ca làm việc (Job Review) diễn ra sau khi ca kết thúc mà không đảo ngược các biến động vật lý thực tế.
    • Trigger Bảo Vệ Bằng Chứng (prevent_task_stock_transaction_mutation): Bảo toàn dữ liệu giao dịch gốc (hàng hoá, số lượng, định tuyến, ảnh biên bản), cấm xoá phiếu, đồng thời cho phép thủ kho xác nhận phiếu (confirmed_by, status).
    • Trợ Lý Đối Soát Tự Động 4 Quy Tắc (evaluate_proof): Đánh giá chi tiết (1) Số lượng phiếu, (2) Danh mục vật tư & định mức, (3) Định tuyến kho, (4) Ảnh biên bản bàn giao tối thiểu.
    • Nâng Cấp Giao Diện Đối Soát Web Dashboard: Bảng checklist trực quan trên StockTransactionValidation và hiển thị chi tiết vật tư, nhãn “Thu hồi sau ca” (isReturnable) trên StockTransactionProofView.
  • Kiến trúc Revision Nguyên tử và Task Contract v2 (Đợt 3 - Foundation Improvement):

    • Atomic Publish RPC & Validation Guard (publish_job_revision):
      • Thêm Migration 20260906232000_publish_job_revision_atomic_rpc.sql triển khai RPC nguyên tử kích hoạt bản sửa đổi Job (publish_job_revision), áp dụng cơ chế khóa bi quan FOR UPDATE trên jobs và job_revisions.
      • Tích hợp chốt kiểm tra tính toàn vẹn đồ thị có hướng (DAG Cycle Detection) ngăn ngừa vòng lặp luồng thực thi trong các bước (job_steps / dependencies).
      • Kiểm định metric của từng Task: xác thực bắt buộc cấu hình toạ độ (latitude, longitude, radius_meters) cho geofence, cấu hình số lượng ảnh và mẫu barcode cho photo_proof, và snapshot schema cho formx.
      • Bảo vệ tính đồng thời khi bắt đầu thực thi ca (start_job_execution) bằng khóa chia sẻ FOR SHARE trên job_revisions, đảm bảo Worker chỉ gán vào revision đã xuất bản hoàn tất và ngăn chặn race-condition khi sửa đổi job song song.
    • Snapshot Terms Bất biến cho Job Revisions (Terms Immutability):
      • Thêm Migration 20260906231000_revision_atomic_snapshot_and_task_contract_v2.sql bổ sung các trường snapshot terms vào bảng job_revisions: title, payout_rate, billing_type, location_snapshot, schedule_config, terms_snapshot.
      • Tự động đóng băng (freeze) các điều khoản công việc tại thời điểm xuất bản (publish), bảo vệ quyền lợi tiền công của Worker và loại bỏ hoàn toàn rủi ro thay đổi điều khoản thanh toán hồi tố khi Hirer sửa Job gốc sau này.
    • Task Contract v2 & Hỗ trợ Đa Nhiệm vụ cho mỗi Bước (Multi-task Support):
      • Nâng cấp ITaskModule.ts và TaskRegistry.ts chuẩn hoá hợp đồng Task Contract v2: bổ sung version, compatibleVersions, và capabilities (resubmittable, allowMultiplePerStep, requiresProof, supportsAutoValidation).
      • Cải tiến hàm giải quyết TaskRegistry.resolve(type, version) hỗ trợ kiểm tra tính tương thích phiên bản theo chuẩn SemVer với cơ chế fallback an toàn.
      • Cấu trúc lại bảng job_step_tasks: thay thế ràng buộc duy nhất UNIQUE(step_id, type) bằng UNIQUE(step_id, task_key), bổ sung cột task_key, schema_version, validator_version, capabilities. Cho phép một bước chứa nhiều nhiệm vụ cùng loại (ví dụ: nhiều photo_proof độc lập cho từng vị trí/mặt hàng, nhiều formx).
      • Nâng cấp TaskBuilder.tsx, CustomStepNode.tsx, TaskModuleEditor.tsx, và TaskBuilderEditorContext.tsx trên Web Dashboard để quản trị viên có thể thêm, sửa, đổi tên task_key, và gỡ bỏ nhiều task trong cùng 1 bước linh hoạt.
    • Cập nhật Read Models cho Payroll & Execution Details:
      • Thêm Migration 20260906233000_revision_read_models_snapshot_payroll.sql tái cấu trúc các truy vấn bảng lương (create_draft_payroll, create_draft_payroll_batch, rpc_list_approved_payroll_jobs) ưu tiên đọc đơn giá payout_rate và tiêu đề title từ snapshot của job_revisions (COALESCE(jr.payout_rate, j.payout_rate)).
      • Cập nhật các RPC giám sát ca làm việc (rpc_get_execution_record_by_id, rpc_list_execution_records) trả về thông tin snapshot của revision kèm metadata hợp đồng v2 (task_key, schema_version, validator_version) trong proof details.
      • Đồng bộ tầng Data/Domain/Mapper của phân hệ execution (ExecutionDto.ts, ExecutionEntity.ts, ExecutionRepository.ts) để hiển thị thông tin ca làm việc theo đúng snapshot thời điểm thực thi.
  • Geocoding Edge Function (supabase/functions/geocode/):

    • Edge Function geocode cung cấp dịch vụ forward geocoding (địa chỉ → lat/lng) sử dụng chiến lược Fallback Waterfall: Geoapify (3,000 req/ngày) → OpenCage (2,500 req/ngày), tổng ~5,500 geocode/ngày miễn phí.
    • Hỗ trợ 2 input mode: location_id (DB cache lookup + writeback vào bảng locations) và address (geocode trực tiếp).
    • Country bias Vietnam (countrycode=vn) để ưu tiên kết quả địa chỉ Việt Nam.
    • Yêu cầu JWT (verify_jwt = true) để ngăn chặn abuse.
  • Tích hợp Tự động Lấy Tọa độ (apps/hire_workspace/gigee):

    • Bổ sung nút “Lấy tọa độ tự động” vào LocationFormModal.tsx, gọi Edge Function geocode để tự động điền Vĩ độ / Kinh độ dựa trên địa chỉ và phường/xã người dùng đã chọn.
    • Bổ sung nút “Xem bản đồ” cho phép mở Google Maps trực tiếp bằng tọa độ đã điền để người dùng kiểm tra đối soát vị trí.
  • BI Dashboard Platform (apps/hire_workspace/, supabase/):

    • Thay overview tĩnh bằng dashboard widget dùng chung cho workspace và folder, có bộ lọc ngày, xuất Excel và 11 widget vận hành.
    • Bổ sung layout 12/6/1 cột dùng dnd-kit, kéo sắp xếp, resize, catalog và drawer cấu hình; không dùng react-grid-layout.
    • Thêm persistence có optimistic revision, security-invoker analytics RPC, RLS, quyền bi/manage và folders:*/bi/manage, cùng pgTAP regression tests.
  • Job Visibility & Folder/Workspace Membership Guard (supabase/migrations/):

    • Bảo mật phân quyền hiển thị công việc (Job Visibility Architecture): Thêm cơ chế kiểm tra quyền truy cập công việc (can_view_job_scope) trực tiếp vào các RPC public.search_jobs và public.get_app_job_details. Ngăn chặn triệt để việc lộ các Private Jobs (nội bộ) cho Worker chưa tham gia Workspace/Folder.
    • Phân quyền ứng tuyển (can_apply_to_job & job_applications_insert RLS): Ngăn chặn Worker vãng lai nộp đơn trái phép vào Private Job khi chưa là thành viên hoặc chưa nhận được mã mời.
    • Bộ kiểm thử tự động pgTAP (supabase/tests/auth_rbac/jobs_search_visibility.test.sql): 10 bài test bao quát các kịch bản phân quyền giữa Non-member, Folder A Member, Folder B Member đối với tìm kiếm rỗng, tìm kiếm có từ khóa, truy cập chi tiết và nộp đơn ứng tuyển.
  • Supabase DB Migration (supabase/migrations/20260827000000_update_pgroonga_search_full_indexes.sql):

    • Re-create toàn bộ 15 PGroonga indexes trên cột search_full (thuộc các bảng profiles, workspaces, memberships, roles, permissions, invitations, configurations, metadatas, locations, locations_provinces, locations_wards, issues, stock_assets, notifies, jobs) bổ sung thuộc tính WITH (tokenizer = 'TokenBigram', normalizers = 'NormalizerAuto') hỗ trợ tìm kiếm Tiếng Việt không dấu.
  • Supabase DB Migration (supabase/migrations/20260826230500_core_func_search_vn_geo_add_province_name.sql):

    • Cập nhật hàm RPC search_vn_geo bổ sung cột province_name (COALESCE(p.full_name, p.name)).
    • Bổ sung kịch bản pgTAP unit test supabase/tests/auth_rbac/search_vn_geo_province_name.test.sql.
  • Supabase DB Migration (supabase/migrations/20260826225000_worker_profiles_add_is_onboarded.sql):

    • Bổ sung cột is_onboarded (boolean DEFAULT false NOT NULL) vào bảng public.worker_profiles.
    • Bổ sung kịch bản pgTAP unit test supabase/tests/auth_rbac/worker_profiles_is_onboarded.test.sql kiểm tra sự tồn tại và giá trị mặc định của cột is_onboarded.
  • Bổ sung Supabase DB Migration (supabase/migrations/20260826221500_worker_profiles_add_id_card_fields.sql):

    • Khởi tạo enum type gender_type (male, female, other) trong schema public.
    • Bổ sung các cột thông tin CCCD vào bảng worker_profiles: full_name, id_card_number, date_of_birth, gender, id_card_issued_date và id_card_front_photos (jsonb).
  • Hoàn Tất 100% Batch 1 Integration Test Suites Cho Toàn Bộ Backend / Database Mutations (supabase):

    • Thêm pgTAP suite supabase/tests/metadata/job_metadata_atomic_rls.test.sql (15 assertions) kiểm thử toàn diện RPC mutate_job_metadatas cho các thao tác assign, remove, sync, xử lý lỗi workspace scope mismatch, kiểm tra rollback atomic và phân quyền workspace owner / folder editor / outsider.
    • Thêm pgTAP suite supabase/tests/payrolls/payroll_atomic_rls.test.sql (18 assertions) kiểm thử các RPC atomic payroll: create_draft_payroll, add_payroll_adjustment, transition_payroll_status, kiểm tra tính toàn vẹn dữ liệu, tự động tính toán lại tổng tiền và ràng buộc chuyển trạng thái draft ➔ approved ➔ paid.
    • Bổ sung migration 20260822064000_fix_workspace_init_defaults_metadata_types.sql khởi tạo metadata types mặc định trong trigger workspace.
    • Bổ sung migration 20260822065000_fix_submit_step_proof_status_engine.sql đồng bộ hóa submit_step_proof với Status Engine và photos JSONB format.
    • Toàn bộ 23 test suites (299/299 assertions) của Batch 1 (FormX, Issues, Stock, Locations, Metadata, Payrolls, Auth/RBAC, Workspaces, Executions, Validations, Status Engine, Unlock Cascades) đã PASS 100% trên Supabase local.

VPS tooling

  • Added offline --dry-run / DRY_RUN=1 previews with local prerequisite checks and redacted credentials. A leading wrapper flag is distinct from Supabase CLI’s connected db push --dry-run.

Changed

  • Sửa cập nhật trạng thái Task Validator trong System Configuration (apps/hire_workspace/):

    • Bổ sung mapping tường minh isActive → is_active tại Repository boundary, khắc phục lỗi công tắc “Kích hoạt sử dụng” không được gửi tới Supabase khi tạo hoặc cập nhật cấu hình.
    • Thêm regression tests xác minh chính xác payload DTO snake_case cho cả luồng create và update.
  • Sửa lỗi Privilege Escalation Forbidden khi Chấp nhận Lời mời (supabase/migrations/):

    • Khắc phục xung đột giữa IAM Privilege Escalation Trigger và RPC redeem_invitation: Thiết lập cờ bối cảnh transaction-local (app.is_redeeming_invitation) bên trong hàm public.redeem_invitation và cập nhật public.prevent_membership_privilege_escalation() để nhận diện bối cảnh chấp nhận lời mời hợp lệ, ngăn chặn việc báo lỗi giả 42501 (Privilege escalation forbidden) khi người dùng mới gia nhập Workspace/Job.
    • Phòng vệ Chuyên sâu khi Tạo Lời mời (Defense-in-Depth on Invitations Creation): Cập nhật hàm trigger public.validate_invitation_integrity() kiểm tra phân quyền người tạo lời mời, đảm bảo người dùng không thể tạo lời mời mang vai trò có quyền hạn vượt quá quyền hạn của chính mình.
    • Kiểm thử tự động pgTAP (supabase/tests/auth_rbac/redeem_invitation.test.sql): Bổ sung 15 bài test kiểm tra chu trình tham gia lời mời và ngăn chặn các hành vi tự nâng quyền / tạo lời mời trái phép với trigger kích hoạt đầy đủ.
  • Pure JSONB Task Photo Proof Data Model: Chuyển đổi hoàn toàn bảng task_proof_photo sang sử dụng cột photos JSONB chứa danh sách Photo Evidence Objects, cập nhật đồng bộ các RPC submit_step_proof và rpc_get_execution_record_by_id.

  • Edge Function process-photo:

    • Sửa lỗi sai phiên bản package sqids (0.4.1 -> 0.3.0) trong deno.json.
    • Bổ sung quyền GRANT ALL ON TABLE photo_evidences TO authenticated, anon, service_role khắc phục lỗi 42501 permission denied.
    • Tích hợp vẽ banner và text watermark trực tiếp trên ảnh bằng imagescript (NTP Server time, GPS coordinates, địa chỉ, SQID verification code, trạng thái bảo chứng) và xuất chuẩn file JPG chất lượng cao.
    • Thêm cơ chế tự động resolve workspace_id hợp lệ khi client truyền fallback string và hỗ trợ upsert: true cho Supabase Storage.
  • Domain-Agnostic Storage Architecture (Relative Storage Path):

    • Chuyển đổi toàn diện cơ chế lưu trữ đường dẫn ảnh trong database (photo_evidences.raw_photo_url, photo_evidences.stamped_photo_url và task_proof_photo.photos JSONB) từ absolute URLs sang relative storage paths (ví dụ: workspace_id/general/evidences/stamped_xxx.jpg).
  • Explicit Image Decoding Error Propagation:

    • Tại Server Edge Function (process-photo/index.ts): Trả về trực tiếp HTTP 400 Bad Request kèm message giải thích chi tiết khi gặp lỗi giải mã ảnh (ví dụ: "Định dạng ảnh HEIC không được hỗ trợ xử lý trực tiếp. Vui lòng chuyển sang JPEG/PNG."), không nuốt lỗi hay âm thầm upload ảnh thiếu watermark.
  • Watermark Local Timezone Conversion (UTC+7):

    • Cập nhật Edge Function process-photo/index.ts tự động chuyển đổi True Server NTP Time sang múi giờ địa phương của client (client_timezone, mặc định Asia/Ho_Chi_Minh / UTC+7) khi in dòng chữ trên watermark ảnh (Thời gian NTP: DD/MM/YYYY HH:mm:ss (UTC+7)).

UI Polish

  • Permissions & Roles Management UI Polish, Shared Components & Negative Actions (apps/hire_workspace/src/features/membership/):
    • Hỗ trợ Negative Actions (Quyền Phủ định / Cấm quyền !):
      • Chuẩn hóa các action cấm (!*, !read, !create, !edit, !delete, !read.me, !edit.me) với quy tắc IAM cốt lõi: Explicit Deny luôn luôn ghi đè (Override) Allow.
      • Hiển thị chip cấm quyền nổi bật với tone đỏ (bg-rose-500/15 text-rose-600 border-rose-400/50) kèm icon Ban và nhãn tiếng Việt rõ ràng (Cấm Toàn quyền, Cấm Xem, Cấm Tạo, Cấm Sửa, Cấm Xóa, Cấm Xem của tôi, Cấm Sửa của tôi).
      • Tích hợp toggle chuyển đổi [Cho phép (Allow)] / [Cấm (Deny !)] ngay trong Popover gán quyền nhanh của Ma trận Vai trò và Form Tạo Quyền.
      • Cập nhật UserRepository và IamService với bộ unit test toàn diện, bảo đảm việc phân quyền Deny Override chính xác 100%.
    • Danh mục Tài nguyên Động từ system_configurations (type = 'iam_resource'):
      • Bổ sung Migration 20260830000100_seed_iam_resources_system_configurations.sql seed mặc định 13 IAM Resources chuẩn vào bảng system_configurations.
      • Đăng ký IAM_RESOURCE_TYPE_DEF trong SystemConfigSchemaRegistry thuộc nhóm danh mục iam (Phân quyền & Bảo mật) với icon shield.
      • Tích hợp hook useStandardResources tự động nạp danh mục tài nguyên động từ bảng system_configurations (gồm code, name, category, description).
      • Luôn duy trì cơ chế Fallback 100% về 13 tài nguyên chuẩn trong STANDARD_RESOURCES khi chưa có dữ liệu cấu hình hoặc khi đang tải.
      • Đồng bộ hiển thị linh hoạt trên <ResourceDisplay />, <PermissionFormModal />, <RolesTab /> và <PermissionsTab />.
    • Shared Presentation Components (ResourceDisplay.tsx, ActionChip.tsx, ActionChipGroup.tsx): Trích xuất bộ 3 components dùng chung đạt chuẩn Single Source of Truth cho việc hiển thị Resource tiếng Việt thân thiện và Action Chips phân màu ngữ nghĩa.
    • Áp dụng Ma trận Vai trò (RolesTab.tsx) & Drawer Phân quyền (RolePermissionsDrawer.tsx):
      • Chuẩn hóa cột Tài nguyên sang tiếng Việt thân thiện kèm mã kỹ thuật nhỏ.
      • Chuyển đổi toàn bộ badge quyền trên các cột vai trò sang tiếng Việt (Toàn quyền, Xem, Tạo, Sửa, Xóa, Xem của tôi, Sửa của tôi) kèm tooltip chi tiết và sắp xếp thứ tự logic thống nhất.
      • Drawer phân quyền hiển thị tên tiếng Việt rõ ràng cho cả bảng quyền đã gán và dropdown chọn quyền cần gán.
    • Tên Resource Tiếng Việt Thân thiện (PermissionsTab.tsx, standardPermissions.ts): Chuẩn hóa hiển thị tên tài nguyên bằng tiếng Việt rõ ràng (Thư mục & Dự án, Công việc (Jobs), Bảng lương & Chi trả, Hồ sơ nhân sự…) kèm mã kỹ thuật nhỏ.
    • Chuẩn hóa 7 Action Cốt lõi:
      • Thu gọn và chuẩn hóa toàn bộ quyền hạn sang 7 Action tiêu chuẩn: * (manage), read (kèm export), create (kèm import), edit, del (delete), r.me (read.me), e.me (edit.me).
      • Sắp xếp cố định thứ tự các action trên mọi dòng resource, giúp người dùng so sánh quyền giữa các tài nguyên chỉ bằng cách quét mắt theo cột dọc.
    • Phân quyền Tạo Custom Actions cho Super Admin:
      • Người dùng thông thường chỉ được chọn và thao tác trong phạm vi 7 Action và Resource tiêu chuẩn.
      • Chỉ tài khoản Super Admin (is_super_admin: true, thông qua hook useIsSuperAdmin) mới được hiển thị ô nhập để tạo Action hoặc Resource tùy chỉnh đặc thù.
    • Form Tạo Quyền Trực quan (PermissionFormModal.tsx):
      • Tích hợp bộ chọn Resource phân theo danh mục (Dự án, Tài chính, Quản trị, Vận hành, Hệ thống).
      • Hỗ trợ chọn đồng thời nhiều Action Chips để tạo hàng loạt quyền cho resource trong 1 thao tác.