meta { name: 04 Create type: http seq: 4 } post { url: {{baseUrl}}/api/v1/invoices body: json auth: inherit } body:json { { "clientId": "{{clientId}}", "clientName": "Boulangerie Martin SARL", "numero": "F-2026-0047", "amountTtcCents": 124000, "issueDate": "2026-04-20T09:00:00.000Z", "dueDate": "2026-04-01T09:00:00.000Z" } } script:post-response { if (res.getStatus() === 201) { bru.setEnvVar("invoiceId", res.getBody().data.id); } } tests { test("201 Created", function () { expect(res.getStatus()).to.equal(201); }); test("invoiceId saved", function () { expect(bru.getEnvVar("invoiceId")).to.not.be.empty; }); test("rubisEarned = 1 (bonus saisie)", function () { expect(res.getBody().data.rubisEarned).to.equal(1); }); } docs { POST /api/v1/invoices Saisie manuelle. Résolution client en 3 étapes : 1. `clientId` fourni → utilise tel quel 2. sinon match par nom (case-insensitive) sur les clients existants 3. sinon création à la volée — `clientEmail` REQUIS sinon 422 `client_email_required` Bonus +1 rubis à la création (gamification). Si `planId` est fourni : programme automatiquement les RelanceTasks BullMQ pour chaque step du plan (sendAt = dueDate + offsetDays). Les jobs scheduled sont visibles via : `docker exec rubis-redis redis-cli zrange bull:relances:delayed 0 -1` Pour tester l'envoi immédiat : passer une `dueDate` dans le passé → la première RelanceTask est programmée à `now + 1min`. Mailpit http://localhost:8025 affichera le mail capté ~1min plus tard. Capture `invoiceId` dans l'env pour les requêtes suivantes. }