From 524eea38f4923d8927440c35659a1abab6a76672 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 16 Jul 2026 10:55:28 -0300 Subject: [PATCH] feat(checkout): enhance transfer payment flow with DNI input and validation --- src/app/core/services/checkout.service.ts | 8 +- .../checkout-page.component.html | 1 + .../checkout-page/checkout-page.component.ts | 41 +++++-- .../checkout-payment-step.component.html | 3 +- .../checkout-payment-step.component.scss | 2 +- .../checkout-payment-step.component.ts | 3 +- .../checkout-payment-qr.component.scss | 2 +- .../checkout-payment-telepagos.component.scss | 2 +- .../checkout-payment-transfer.component.html | 108 +++++++++++------- .../checkout-payment-transfer.component.scss | 43 ++++++- .../checkout-payment-transfer.component.ts | 19 ++- 11 files changed, 173 insertions(+), 59 deletions(-) diff --git a/src/app/core/services/checkout.service.ts b/src/app/core/services/checkout.service.ts index 6df8573..7eab990 100644 --- a/src/app/core/services/checkout.service.ts +++ b/src/app/core/services/checkout.service.ts @@ -81,9 +81,13 @@ export class CheckoutService { return purchase; } - async generatePaymentIntent(tenantCode: string, purchaseId: number, method: 'qr' | 'transfer' | 'telepagos'): Promise { + async generatePaymentIntent(tenantCode: string, purchaseId: number, method: 'qr' | 'transfer' | 'telepagos', payerDni?: string): Promise { + const payload: any = { method }; + if (payerDni) { + payload.payer_dni = payerDni; + } const response = await firstValueFrom( - this.http.post(`${environment.url}tenants/${tenantCode}/compras/${purchaseId}/payment-intent`, { method }) + this.http.post(`${environment.url}tenants/${tenantCode}/compras/${purchaseId}/payment-intent`, payload) ); if (!response) { throw new Error('Error al generar la intención de pago.'); diff --git a/src/app/features/store/pages/checkout-page/checkout-page.component.html b/src/app/features/store/pages/checkout-page/checkout-page.component.html index 42339a6..baa353c 100644 --- a/src/app/features/store/pages/checkout-page/checkout-page.component.html +++ b/src/app/features/store/pages/checkout-page/checkout-page.component.html @@ -21,6 +21,7 @@ (paymentMethodChange)="selectPaymentMethod($event)" (copyTransferValue)="copyTransferValue($event.field, $event.value)" (cancelStep)="onCancel()" + (generateTransferIntent)="generateTransferIntent($event)" (complete)="onComplete()" /> diff --git a/src/app/features/store/pages/checkout-page/checkout-page.component.ts b/src/app/features/store/pages/checkout-page/checkout-page.component.ts index 9839f26..e2b1433 100644 --- a/src/app/features/store/pages/checkout-page/checkout-page.component.ts +++ b/src/app/features/store/pages/checkout-page/checkout-page.component.ts @@ -86,12 +86,7 @@ export class CheckoutPageComponent implements OnInit { ]; protected readonly selectedPaymentMethod = signal('qr'); protected readonly copiedTransferField = signal(null); - protected readonly transferAccount = signal({ - titular: 'Nombre y Apellido', - entidad: 'TelePagos', - cvu: '0000000000000000000000', - alias: 'telepagos.ar', - }); + protected readonly transferAccount = signal(null); protected readonly isCreatingPurchase = signal(false); protected readonly createdPurchaseId = signal(null); @@ -219,6 +214,11 @@ export class CheckoutPageComponent implements OnInit { return; } + if (method === 'transfer') { + this.transferAccount.set(null); + return; + } + this.isGeneratingIntent.set(true); try { @@ -230,7 +230,32 @@ export class CheckoutPageComponent implements OnInit { if (method === 'qr' && response.qr_data?.qr_code) { this.qrData.set(response.qr_data.qr_code); - } else if (method === 'transfer' && response.transfer_data) { + } + } catch (error) { + console.error('Failed to generate payment intent:', error); + } finally { + this.isGeneratingIntent.set(false); + } + } + + protected async generateTransferIntent(dni: string): Promise { + const purchaseId = this.createdPurchaseId(); + const tenant = this.tenantService.tenant(); + + if (!purchaseId || !tenant) { + return; + } + + this.isGeneratingIntent.set(true); + try { + const response = await this.checkoutService.generatePaymentIntent( + tenant.codigo, + purchaseId, + 'transfer', + dni + ); + + if (response.transfer_data) { this.transferAccount.set({ titular: response.transfer_data.titular, entidad: response.transfer_data.entidad, @@ -239,7 +264,7 @@ export class CheckoutPageComponent implements OnInit { }); } } catch (error) { - console.error('Failed to generate payment intent:', error); + console.error('Failed to generate transfer payment intent:', error); } finally { this.isGeneratingIntent.set(false); } diff --git a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.html b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.html index d6cf2ce..9713457 100644 --- a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.html +++ b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.html @@ -46,6 +46,7 @@ [transferAccount]="transferAccount()" [copiedTransferField]="copiedTransferField()" (copyTransferValue)="requestCopy($event.field, $event.value)" + (submitDni)="generateTransferIntent.emit($event)" /> } @else { @@ -68,7 +69,7 @@ type="button" hostClass="checkout-payment__action-btn" buttonClass="w-100" - [disabled]="isGeneratingIntent()" + [disabled]="isGeneratingIntent() || (selectedPaymentMethod() === 'transfer' && !transferAccount())" (click)="complete.emit()" > Finalizar compra diff --git a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.scss b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.scss index 7f41e3d..1233377 100644 --- a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.scss +++ b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.scss @@ -112,7 +112,7 @@ min-width: 0; &__card { width: 100%; - max-width: 290px; + max-width: 320px; min-height: 269px; padding: 1.5rem 1.75rem; border-radius: 5px; diff --git a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.ts b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.ts index 2f1f505..dff0d64 100644 --- a/src/app/features/store/pages/checkout-page/checkout-payment-step.component.ts +++ b/src/app/features/store/pages/checkout-page/checkout-payment-step.component.ts @@ -18,7 +18,7 @@ export class CheckoutPaymentStepComponent { readonly paymentMethods = input.required>(); readonly selectedPaymentMethod = input.required(); readonly copiedTransferField = input(null); - readonly transferAccount = input.required(); + readonly transferAccount = input(null); readonly isGeneratingIntent = input(false); readonly qrData = input(null); @@ -26,6 +26,7 @@ export class CheckoutPaymentStepComponent { readonly copyTransferValue = output<{ field: TransferField; value: string }>(); readonly cancelStep = output(); readonly complete = output(); + readonly generateTransferIntent = output(); protected selectPaymentMethod(method: PaymentMethod): void { this.paymentMethodChange.emit(method); diff --git a/src/app/features/store/pages/checkout-page/components/checkout-payment-qr/checkout-payment-qr.component.scss b/src/app/features/store/pages/checkout-page/components/checkout-payment-qr/checkout-payment-qr.component.scss index 4c13ebc..72a4918 100644 --- a/src/app/features/store/pages/checkout-page/components/checkout-payment-qr/checkout-payment-qr.component.scss +++ b/src/app/features/store/pages/checkout-page/components/checkout-payment-qr/checkout-payment-qr.component.scss @@ -1,6 +1,6 @@ .payment-panel__card { width: 100%; - max-width: 290px; + max-width: 320px; min-height: 269px; padding: 1.5rem 1.75rem; border-radius: 5px; diff --git a/src/app/features/store/pages/checkout-page/components/checkout-payment-telepagos/checkout-payment-telepagos.component.scss b/src/app/features/store/pages/checkout-page/components/checkout-payment-telepagos/checkout-payment-telepagos.component.scss index 3902980..d8bace7 100644 --- a/src/app/features/store/pages/checkout-page/components/checkout-payment-telepagos/checkout-payment-telepagos.component.scss +++ b/src/app/features/store/pages/checkout-page/components/checkout-payment-telepagos/checkout-payment-telepagos.component.scss @@ -1,6 +1,6 @@ .payment-panel__card { width: 100%; - max-width: 290px; + max-width: 320px; min-height: 269px; padding: 1.5rem 1.75rem; border-radius: 5px; diff --git a/src/app/features/store/pages/checkout-page/components/checkout-payment-transfer/checkout-payment-transfer.component.html b/src/app/features/store/pages/checkout-page/components/checkout-payment-transfer/checkout-payment-transfer.component.html index ca7e67c..24bb456 100644 --- a/src/app/features/store/pages/checkout-page/components/checkout-payment-transfer/checkout-payment-transfer.component.html +++ b/src/app/features/store/pages/checkout-page/components/checkout-payment-transfer/checkout-payment-transfer.component.html @@ -1,46 +1,74 @@
-

Transferi a la siguiente cuenta desde cualquier billetera

-
+ @if (transferAccount()) { +

Transferi a la siguiente cuenta desde cualquier billetera

+
-