{ "version": "4.22.0", "focus": "Configurable proof upload and payment approval for QRIS, Transfer, and E-Wallet", "php_files_checked": 133, "php_lint_errors": [], "database_tables": 56, "foreign_keys": 104, "foreign_key_errors": [], "table_order_issues": [], "insert_column_lists_checked": 133, "insert_column_errors": [], "alter_add_columns_checked": 94, "missing_upgrade_columns": [], "missing_local_php_links": [], "missing_critical_files": [], "payment_policy": { "QRIS": { "proof_toggle": "noncash_qris_proof_enabled", "approval_toggle": "noncash_qris_approval_enabled" }, "Transfer": { "proof_toggle": "noncash_transfer_proof_enabled", "approval_toggle": "noncash_transfer_approval_enabled" }, "E-Wallet": { "proof_toggle": "noncash_ewallet_proof_enabled", "approval_toggle": "noncash_ewallet_approval_enabled" }, "defaults": "OFF — preserves v4.21 behavior" }, "approval_flow": [ "Cash and unmanaged methods remain unchanged", "Proof-only mode keeps normal payment status but stores evidence", "Approval mode stores requested status/amount and holds effective payment as unpaid", "Approve restores requested paid/partial status", "Reject keeps effective status unpaid", "Member points are applied only after validated paid status", "Existing finance/report/accounting queries continue using payment_status=paid, so pending approvals are excluded" ], "checks": { "php_lint_all": true, "payment_verification_log_table": true, "transaction_payment_columns": true, "settings_qris_toggles": true, "settings_transfer_toggles": true, "settings_ewallet_toggles": true, "settings_default_off": true, "policy_per_method": true, "proof_upload_validation": true, "pos_multipart": true, "pos_dynamic_proof": true, "proof_backend_required": true, "approval_holds_payment": true, "requested_status_preserved": true, "approval_page": true, "approve_restores_status": true, "reject_keeps_unpaid": true, "points_deferred": true, "proof_reupload_resets_pending": true, "verification_audit_log": true, "receipt_verification": true, "transaction_verification_badge": true, "feature_off_hides_proof": true, "finance_existing_paid_logic": true, "reports_existing_paid_logic": true, "accounting_existing_paid_logic": true, "member_customization_preserved": true, "zkteco_step_preserved": true, "operational_inventory_preserved": true, "receipt_customization_preserved": true, "backup_restore_preserved": true, "critical_files_present": true, "foreign_keys_valid": true, "table_order_valid": true, "upgrade_vs_fresh_valid": true, "insert_columns_valid": true, "local_php_links_valid": true, "no_create_database": true, "no_use_database": true, "member_registration_custom_preserved": true, "card_front_back_preserved": true, "thermal_receipt_preserved": true, "card_printer_preserved": true, "membership_preserved": true, "staff_portal_preserved": true, "renovation_preserved": true, "pwa_preserved": true, "finance_ledger_preserved": true, "zkteco_receiver_preserved": true } }