{
  "when": "2026-10-04T00:37:46.096Z",
  "kind": "exemple-personnel-local",
  "engine": "PostgreSQL 18.3 (PGlite 0.5.8) on wasm32-unknown-emscripten, compiled by emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.74 (1092ec30a3fb1d46b1782ff1b4db5094d3d06ae5), 32-bit",
  "pglite_version": "0.5.8",
  "identity": "auth.uid simulée par le banc SQL ; ni JWT ni Supabase Auth hébergé",
  "checks": 39,
  "results": [
    {
      "name": "Employée : son propre profil seulement",
      "user": "employee",
      "when": "2026-10-04T00:37:45.828Z",
      "passed": true,
      "sql": "SELECT user_id FROM employees ORDER BY user_id",
      "observed": [
        {
          "user_id": "11111111-1111-4111-8111-111111111111"
        }
      ]
    },
    {
      "name": "Employée : un seul pointage",
      "user": "employee",
      "when": "2026-10-04T00:37:45.844Z",
      "passed": true,
      "sql": "SELECT id FROM time_entries ORDER BY id",
      "observed": [
        {
          "id": 1
        }
      ]
    },
    {
      "name": "Employée : salaire non visible même par SQL direct",
      "user": "employee",
      "when": "2026-10-04T00:37:45.849Z",
      "passed": true,
      "sql": "SELECT id FROM salaries ORDER BY id",
      "observed": []
    },
    {
      "name": "Employée : congé du collègue invisible",
      "user": "employee",
      "when": "2026-10-04T00:37:45.853Z",
      "passed": true,
      "sql": "SELECT id FROM leaves WHERE id=2",
      "observed": []
    },
    {
      "name": "Manager : pointages de son entreprise",
      "user": "manager",
      "when": "2026-10-04T00:37:45.858Z",
      "passed": true,
      "sql": "SELECT id FROM time_entries ORDER BY id",
      "observed": [
        {
          "id": 1
        },
        {
          "id": 2
        }
      ]
    },
    {
      "name": "Manager : aucun salaire",
      "user": "manager",
      "when": "2026-10-04T00:37:45.862Z",
      "passed": true,
      "sql": "SELECT id FROM salaries ORDER BY id",
      "observed": []
    },
    {
      "name": "Admin A : deux salaires de son entreprise",
      "user": "admin",
      "when": "2026-10-04T00:37:45.865Z",
      "passed": true,
      "sql": "SELECT id FROM salaries ORDER BY id",
      "observed": [
        {
          "id": 1
        },
        {
          "id": 2
        }
      ]
    },
    {
      "name": "Admin B : un salaire de son entreprise",
      "user": "foreign",
      "when": "2026-10-04T00:37:45.868Z",
      "passed": true,
      "sql": "SELECT id FROM salaries ORDER BY id",
      "observed": [
        {
          "id": 3
        }
      ]
    },
    {
      "name": "Admin A : salaire de B invisible avec identifiant connu",
      "user": "admin",
      "when": "2026-10-04T00:37:45.872Z",
      "passed": true,
      "sql": "SELECT amount FROM salaries WHERE id=3",
      "observed": []
    },
    {
      "name": "Anonyme : accès salarial refusé",
      "user": "anon",
      "when": "2026-10-04T00:37:45.876Z",
      "passed": true,
      "sql": "SELECT * FROM salaries",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Identité absente : zéro ligne salariale",
      "user": "authenticated",
      "when": "2026-10-04T00:37:45.882Z",
      "passed": true,
      "sql": "SELECT * FROM salaries",
      "observed": []
    },
    {
      "name": "Employée : création de son pointage",
      "user": "employee",
      "when": "2026-10-04T00:37:45.887Z",
      "passed": true,
      "sql": "INSERT INTO time_entries VALUES (10,1,'11111111-1111-4111-8111-111111111111',60) RETURNING id",
      "observed": [
        {
          "id": 10
        }
      ]
    },
    {
      "name": "Employée : pointage au nom du collègue refusé",
      "user": "employee",
      "when": "2026-10-04T00:37:45.892Z",
      "passed": true,
      "sql": "INSERT INTO time_entries VALUES (10,1,'22222222-2222-4222-8222-222222222222',60)",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : changement entreprise par insert refusé",
      "user": "employee",
      "when": "2026-10-04T00:37:45.896Z",
      "passed": true,
      "sql": "INSERT INTO time_entries VALUES (10,2,'11111111-1111-4111-8111-111111111111',60)",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : auto-approbation de congé refusée",
      "user": "employee",
      "when": "2026-10-04T00:37:45.900Z",
      "passed": true,
      "sql": "INSERT INTO leaves VALUES (10,1,'11111111-1111-4111-8111-111111111111','approved')",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : création de son congé en attente",
      "user": "employee",
      "when": "2026-10-04T00:37:45.904Z",
      "passed": true,
      "sql": "INSERT INTO leaves VALUES (10,1,'11111111-1111-4111-8111-111111111111','pending') RETURNING id",
      "observed": [
        {
          "id": 10
        }
      ]
    },
    {
      "name": "Employée : approbation par update sans effet",
      "user": "employee",
      "when": "2026-10-04T00:37:45.908Z",
      "passed": true,
      "sql": "UPDATE leaves SET status='approved' WHERE id=1 RETURNING id",
      "observed": []
    },
    {
      "name": "Manager : approbation interne autorisée",
      "user": "manager",
      "when": "2026-10-04T00:37:45.913Z",
      "passed": true,
      "sql": "UPDATE leaves SET status='approved' WHERE id=1 RETURNING id",
      "observed": [
        {
          "id": 1
        }
      ]
    },
    {
      "name": "Manager : approbation entreprise B sans effet",
      "user": "manager",
      "when": "2026-10-04T00:37:45.920Z",
      "passed": true,
      "sql": "UPDATE leaves SET status='approved' WHERE id=3 RETURNING id",
      "observed": []
    },
    {
      "name": "Manager : déplacement propriétaire congé refusé",
      "user": "manager",
      "when": "2026-10-04T00:37:45.933Z",
      "passed": true,
      "sql": "UPDATE leaves SET user_id='33333333-3333-4333-8333-333333333333' WHERE id=1",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : auto-promotion en admin refusée",
      "user": "employee",
      "when": "2026-10-04T00:37:45.938Z",
      "passed": true,
      "sql": "UPDATE memberships SET staff_role='admin'",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : création appartenance admin refusée",
      "user": "employee",
      "when": "2026-10-04T00:37:45.942Z",
      "passed": true,
      "sql": "INSERT INTO memberships VALUES ('66666666-6666-4666-8666-666666666666',1,'admin')",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Admin A : lecture appartenance uniquement personnelle",
      "user": "admin",
      "when": "2026-10-04T00:37:45.947Z",
      "passed": true,
      "sql": "SELECT user_id FROM memberships",
      "observed": [
        {
          "user_id": "44444444-4444-4444-8444-444444444444"
        }
      ]
    },
    {
      "name": "Admin A : création salariale interne autorisée",
      "user": "admin",
      "when": "2026-10-04T00:37:45.952Z",
      "passed": true,
      "sql": "INSERT INTO salaries VALUES (10,1,'11111111-1111-4111-8111-111111111111',123) RETURNING id",
      "observed": [
        {
          "id": 10
        }
      ]
    },
    {
      "name": "Admin A : création salariale chez B refusée",
      "user": "admin",
      "when": "2026-10-04T00:37:45.959Z",
      "passed": true,
      "sql": "INSERT INTO salaries VALUES (10,2,'55555555-5555-4555-8555-555555555555',123)",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Admin A : utilisateur étranger dans entreprise A refusé",
      "user": "admin",
      "when": "2026-10-04T00:37:45.964Z",
      "passed": true,
      "sql": "INSERT INTO salaries VALUES (10,1,'55555555-5555-4555-8555-555555555555',123)",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Admin A : changement salaire interne autorisé",
      "user": "admin",
      "when": "2026-10-04T00:37:45.970Z",
      "passed": true,
      "sql": "UPDATE salaries SET amount=123 WHERE id=1 RETURNING id",
      "observed": [
        {
          "id": 1
        }
      ]
    },
    {
      "name": "Admin A : changement salaire B sans effet",
      "user": "admin",
      "when": "2026-10-04T00:37:45.976Z",
      "passed": true,
      "sql": "UPDATE salaries SET amount=123 WHERE id=3 RETURNING id",
      "observed": []
    },
    {
      "name": "Admin A : déplacement salaire vers B refusé",
      "user": "admin",
      "when": "2026-10-04T00:37:45.982Z",
      "passed": true,
      "sql": "UPDATE salaries SET company_id=2 WHERE id=1",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Admin A : suppression interne autorisée",
      "user": "admin",
      "when": "2026-10-04T00:37:45.988Z",
      "passed": true,
      "sql": "DELETE FROM salaries WHERE id=1 RETURNING id",
      "observed": [
        {
          "id": 1
        }
      ]
    },
    {
      "name": "Admin A : suppression B sans effet",
      "user": "admin",
      "when": "2026-10-04T00:37:45.993Z",
      "passed": true,
      "sql": "DELETE FROM salaries WHERE id=3 RETURNING id",
      "observed": []
    },
    {
      "name": "Manager : modification salaire sans effet",
      "user": "manager",
      "when": "2026-10-04T00:37:46.002Z",
      "passed": true,
      "sql": "UPDATE salaries SET amount=0 RETURNING id",
      "observed": []
    },
    {
      "name": "Employée : suppression salaire sans effet",
      "user": "employee",
      "when": "2026-10-04T00:37:46.008Z",
      "passed": true,
      "sql": "DELETE FROM salaries RETURNING id",
      "observed": []
    },
    {
      "name": "Employée : pointage invalide refusé",
      "user": "employee",
      "when": "2026-10-04T00:37:46.014Z",
      "passed": true,
      "sql": "INSERT INTO time_entries VALUES (10,1,'11111111-1111-4111-8111-111111111111',2000)",
      "observed": {
        "error_code": "23514"
      }
    },
    {
      "name": "Manager : déplacement de pointage vers B refusé",
      "user": "manager",
      "when": "2026-10-04T00:37:46.019Z",
      "passed": true,
      "sql": "UPDATE time_entries SET company_id=2 WHERE id=1",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Employée : site B invisible",
      "user": "employee",
      "when": "2026-10-04T00:37:46.024Z",
      "passed": true,
      "sql": "SELECT id FROM sites ORDER BY id",
      "observed": [
        {
          "id": 1
        }
      ]
    },
    {
      "name": "Admin B : site A invisible",
      "user": "foreign",
      "when": "2026-10-04T00:37:46.030Z",
      "passed": true,
      "sql": "SELECT id FROM sites ORDER BY id",
      "observed": [
        {
          "id": 2
        }
      ]
    },
    {
      "name": "Anonyme : écriture pointage refusée",
      "user": "anon",
      "when": "2026-10-04T00:37:46.035Z",
      "passed": true,
      "sql": "INSERT INTO time_entries VALUES (10,1,'11111111-1111-4111-8111-111111111111',1)",
      "observed": {
        "error_code": "42501"
      }
    },
    {
      "name": "Transactions annulées : salaires et pointages initiaux conservés",
      "when": "2026-10-04T00:37:46.096Z",
      "passed": true
    }
  ],
  "snapshots": {
    "employee": {
      "employees": [
        {
          "user_id": "11111111-1111-4111-8111-111111111111",
          "company_id": 1,
          "name": "Employée A — fictive"
        }
      ],
      "salaries": [],
      "time_entries": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "worked_minutes": 420
        }
      ],
      "leaves": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "status": "pending"
        }
      ],
      "sites": [
        {
          "id": 1,
          "company_id": 1,
          "label": "Site A — fictif"
        }
      ]
    },
    "other": {
      "employees": [
        {
          "user_id": "22222222-2222-4222-8222-222222222222",
          "company_id": 1,
          "name": "Employé B — fictif"
        }
      ],
      "salaries": [],
      "time_entries": [
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "worked_minutes": 480
        }
      ],
      "leaves": [
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "status": "pending"
        }
      ],
      "sites": [
        {
          "id": 1,
          "company_id": 1,
          "label": "Site A — fictif"
        }
      ]
    },
    "manager": {
      "employees": [
        {
          "user_id": "11111111-1111-4111-8111-111111111111",
          "company_id": 1,
          "name": "Employée A — fictive"
        },
        {
          "user_id": "22222222-2222-4222-8222-222222222222",
          "company_id": 1,
          "name": "Employé B — fictif"
        },
        {
          "user_id": "33333333-3333-4333-8333-333333333333",
          "company_id": 1,
          "name": "Manager A — fictif"
        },
        {
          "user_id": "44444444-4444-4444-8444-444444444444",
          "company_id": 1,
          "name": "Admin A — fictif"
        }
      ],
      "salaries": [],
      "time_entries": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "worked_minutes": 420
        },
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "worked_minutes": 480
        }
      ],
      "leaves": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "status": "pending"
        },
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "status": "pending"
        }
      ],
      "sites": [
        {
          "id": 1,
          "company_id": 1,
          "label": "Site A — fictif"
        }
      ]
    },
    "admin": {
      "employees": [
        {
          "user_id": "11111111-1111-4111-8111-111111111111",
          "company_id": 1,
          "name": "Employée A — fictive"
        },
        {
          "user_id": "22222222-2222-4222-8222-222222222222",
          "company_id": 1,
          "name": "Employé B — fictif"
        },
        {
          "user_id": "33333333-3333-4333-8333-333333333333",
          "company_id": 1,
          "name": "Manager A — fictif"
        },
        {
          "user_id": "44444444-4444-4444-8444-444444444444",
          "company_id": 1,
          "name": "Admin A — fictif"
        }
      ],
      "salaries": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "amount": 300000
        },
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "amount": 350000
        }
      ],
      "time_entries": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "worked_minutes": 420
        },
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "worked_minutes": 480
        }
      ],
      "leaves": [
        {
          "id": 1,
          "company_id": 1,
          "user_id": "11111111-1111-4111-8111-111111111111",
          "status": "pending"
        },
        {
          "id": 2,
          "company_id": 1,
          "user_id": "22222222-2222-4222-8222-222222222222",
          "status": "pending"
        }
      ],
      "sites": [
        {
          "id": 1,
          "company_id": 1,
          "label": "Site A — fictif"
        }
      ]
    },
    "foreign": {
      "employees": [
        {
          "user_id": "55555555-5555-4555-8555-555555555555",
          "company_id": 2,
          "name": "Admin B — fictif"
        }
      ],
      "salaries": [
        {
          "id": 3,
          "company_id": 2,
          "user_id": "55555555-5555-4555-8555-555555555555",
          "amount": 400000
        }
      ],
      "time_entries": [
        {
          "id": 3,
          "company_id": 2,
          "user_id": "55555555-5555-4555-8555-555555555555",
          "worked_minutes": 360
        }
      ],
      "leaves": [
        {
          "id": 3,
          "company_id": 2,
          "user_id": "55555555-5555-4555-8555-555555555555",
          "status": "pending"
        }
      ],
      "sites": [
        {
          "id": 2,
          "company_id": 2,
          "label": "Site B — fictif"
        }
      ]
    }
  },
  "limits": [
    "Aucune donnée ou infrastructure cliente",
    "Ni React connecté à Supabase hébergé ni Auth Supabase éprouvés",
    "Ni géolocalisation, calcul de paie, audit exhaustif, ni charge de production"
  ]
}