{
  "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
  }
}