Lemonway — Virements¶
Endpoints liés aux virements (wire) entrants : webhook Lemonway de notification d'un wire-in (investisseur, SPV, ou compte Checkout) et provisioning du virtual IBAN (vIBAN) investisseur. Source : wire.controller.ts.
Tous les endpoints sont sous le préfixe /customers/lemonway. Le webhook (POST /webhook/moneyin) est public mais protégé par ApiAuthService.assertApiKeyInQueryParams(queryParams, 'lemonway'). L'endpoint vIBAN (GET /wire/viban) requiert un JWT investisseur (JwtAuthGuard) + rôle CUSTOMER (UserRoleGuard).
POST /webhook/moneyin¶
Webhook Lemonway notifiant un nouveau money-in (filtré côté handler aux wire-in uniquement). Crée la WalletTransaction correspondante côté Bricks (TOPUP_WIRE) après lookup du destinataire. Source : wire.controller.ts#L73.
Query params¶
apiKey— requis silemonway.apiKeyInternalWebhookconfiguré
Request body¶
Validé via lemonwayHookWireInPayload (voir lemonway.dto.ts#L176) :
IntId,IdTransaction(numbers from string)ExtId— UUID investisseur, external id SPV, ou wallet id CheckoutNotifCategory— un de10, 11, 12, 22, 48Amount(cents)Status—0(success),4(pending),6(error)Payment method— number
Effets¶
- Re-fetch chez Lemonway (
lemonwayApi.getMoneyIn) pour vérifier les détails réels. - Si
lwWireIn.method !== 'wireIn'→ ignore (le hook handle aussi les non-wire mais on les laisse aux autres pipes). - Branche selon le destinataire :
- Compte Checkout (
ExtId === businessRules.moneyIn.checkout.wallet.lemonwayWalletId) → log + ignore (géré parsync-lw-wiresscript). - SPV trouvé (
SpecialPurposeVehiculeRepository.findOneByLemonwayExternalId) →echeancierWireToBeAssignedService.getOrCreateWireToBeAssigned(sera assigné à un échéancier). - Investisseur (UUID valide + trouvé) → crée la
WalletTransactionTOPUP_WIREdans une transaction Postgres avec lock du customer et idempotence surlemonwayTransactionId. - Aucun : log d'erreur +
200. - Pour les WT investisseur
CONFIRMED/DECLINED: envoie l'évènement Customer.iotopup_wire.
Mapping statut Lemonway → WT¶
| Lemonway | WalletTransactionsStatuses |
|---|---|
success |
CONFIRMED |
lemonwayError, pspError, cancelled |
DECLINED |
pending, validationPending |
WAITING |
Response¶
200 (pas de body).
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
UnauthorizedException |
401 | API key manquante / invalide |
BadRequestException |
400 | Validation lemonwayHookWireInPayload échouée |
InternalServerError |
500 | Échec re-fetch chez Lemonway (incl. not-found) |
money-in.transaction-already-exists |
200 | Idempotence : un wire-in avec ce lemonwayTransactionId existe déjà (log warn, pas de double WT ni event Customer.io) |
GET /wire/viban¶
Récupère ou crée à la volée le virtual IBAN dédié à l'investisseur pour ses dépôts par virement. Si un vIBAN actif existe déjà → renvoyé tel quel. Sinon → crée chez Lemonway. Source : wire.controller.ts#L214.
Pré-conditions¶
- JWT valide + rôle
CUSTOMER - L'investisseur doit avoir
lemonwayStatus === RegisteredKYC2(sinon412 Precondition Failed)
Response¶
PaymentMethod.mapForView(viban) — forme PaymentMethod (kind VIRTUAL_IBAN_DEPOSIT) avec champs IBAN, BIC, etc.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
customer.must-be-kyc-2 |
412 | Investisseur pas encore en KYC2 (vIBAN refusé) |
Liens¶
- Service customer Lemonway (création vIBAN) :
customers-lemonway.service.ts - Service échéancier wires SPV :
echeancier-wire-to-be-assigned.service.ts - Service balance customer :
customer-balance.service.ts - Auth API key webhook :
api-auth.service.ts - DTO Lemonway :
lemonway.dto.ts