Aller au contenu

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 si lemonway.apiKeyInternalWebhook configuré

Request body

Validé via lemonwayHookWireInPayload (voir lemonway.dto.ts#L176) :

  • IntId, IdTransaction (numbers from string)
  • ExtId — UUID investisseur, external id SPV, ou wallet id Checkout
  • NotifCategory — un de 10, 11, 12, 22, 48
  • Amount (cents)
  • Status0 (success), 4 (pending), 6 (error)
  • Payment method — number

Effets

  1. Re-fetch chez Lemonway (lemonwayApi.getMoneyIn) pour vérifier les détails réels.
  2. Si lwWireIn.method !== 'wireIn' → ignore (le hook handle aussi les non-wire mais on les laisse aux autres pipes).
  3. Branche selon le destinataire :
  4. Compte Checkout (ExtId === businessRules.moneyIn.checkout.wallet.lemonwayWalletId) → log + ignore (géré par sync-lw-wires script).
  5. SPV trouvé (SpecialPurposeVehiculeRepository.findOneByLemonwayExternalId) → echeancierWireToBeAssignedService.getOrCreateWireToBeAssigned (sera assigné à un échéancier).
  6. Investisseur (UUID valide + trouvé) → crée la WalletTransaction TOPUP_WIRE dans une transaction Postgres avec lock du customer et idempotence sur lemonwayTransactionId.
  7. Aucun : log d'erreur + 200.
  8. Pour les WT investisseur CONFIRMED/DECLINED : envoie l'évènement Customer.io topup_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 (sinon 412 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