diff --git a/src/app/core/services/checkout.service.ts b/src/app/core/services/checkout.service.ts index 6df8573..74c6914 100644 --- a/src/app/core/services/checkout.service.ts +++ b/src/app/core/services/checkout.service.ts @@ -52,6 +52,7 @@ export interface PurchaseDetailResponse extends PurchaseStatusResponse { created_at: string | null; payment_method: string | null; dni: string | null; + payer_dni: string | null; telefono: string | null; nombre_apellido: string | null; email: string | null; @@ -81,9 +82,17 @@ 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 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`, { + method, + ...(method === 'transfer' ? { payer_dni: payerDni } : {}) + }) ); 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..0891071 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 @@ -12,14 +12,7 @@ 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 6c7e3a3..cccb4dd 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 @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, computed, effect, inject, OnInit, signal, untracked, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal, ViewChild } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { Router } from '@angular/router'; import { startWith } from 'rxjs'; @@ -7,15 +7,13 @@ import { CartService } from '../../../../core/services/cart/cart.service'; import { TenantService } from '../../../../core/services/tenant.service'; import { CheckoutService, CreatePurchasePayload } from '../../../../core/services/checkout.service'; import { AuthService } from '../../../../core/services/auth/auth.service'; -import { ToastService } from '../../../../core/services/toast.service'; -import { BankAccount } from '../../../../core/services/tenant.interface'; import { CartItem } from '../../../../core/services/cart/cart.interface'; import { CartComponent, CartItemMock } from '../../../../shared/components/cart/cart.component'; import { StepComponent } from '../../../../shared/components/stepper/step.component'; import { StepperComponent } from '../../../../shared/components/stepper/stepper.component'; import { CheckoutDataStepComponent } from './checkout-data-step.component'; import { CheckoutPaymentStepComponent } from './checkout-payment-step.component'; -import { CheckoutForm, PaymentMethod, PaymentMethodOption, TransferAccount, TransferField } from './checkout-page.models'; +import { CheckoutForm } from './checkout-page.models'; @Component({ selector: 'app-checkout-page', @@ -38,7 +36,6 @@ export class CheckoutPageComponent implements OnInit { private readonly tenantService = inject(TenantService); private readonly checkoutService = inject(CheckoutService); private readonly authService = inject(AuthService); - private readonly toastService = inject(ToastService); @ViewChild(StepperComponent) stepper!: StepperComponent; @@ -65,41 +62,10 @@ export class CheckoutPageComponent implements OnInit { }); protected readonly isStep1Valid = signal(this.form.valid); - protected readonly paymentMethods: ReadonlyArray = [ - { id: 'qr', label: 'QR' }, - { id: 'transfer', label: 'Transferencia' }, - { id: 'telepagos', label: 'TelePagos' } - ]; - 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 isCreatingPurchase = signal(false); protected readonly createdPurchaseId = signal(null); - protected readonly isGeneratingIntent = signal(false); - protected readonly isPaymentLoading = computed(() => this.isGeneratingIntent() || this.cartService.isUpdating()); - protected readonly qrData = signal(null); constructor() { - effect(() => { - // We only want to trigger the intent generation when the cart changes. - // So we track the cart, but untrack the other signals to prevent duplicate calls. - const cart = this.cartService.cart(); - - untracked(() => { - const purchaseId = this.createdPurchaseId(); - if (cart && purchaseId) { - // Trigger payment intent generation when cart changes and we are on the payment step - void this.selectPaymentMethod(this.selectedPaymentMethod()); - } - }); - }); - this.form.statusChanges .pipe(startWith(this.form.status)) .subscribe(() => this.isStep1Valid.set(this.form.valid)); @@ -178,9 +144,6 @@ export class CheckoutPageComponent implements OnInit { this.createdPurchaseId.set(response.id); this.stepper.next(); - - // Auto trigger intent for default option - void this.selectPaymentMethod(this.selectedPaymentMethod()); } catch (error) { console.error('Failed to create purchase:', error); @@ -194,62 +157,6 @@ export class CheckoutPageComponent implements OnInit { void this.router.navigate(['/']); } - protected async selectPaymentMethod(method: PaymentMethod): Promise { - this.selectedPaymentMethod.set(method); - - const purchaseId = this.createdPurchaseId(); - const tenant = this.tenantService.tenant(); - - if (!purchaseId || !tenant || method === 'telepagos') { - return; - } - - this.isGeneratingIntent.set(true); - - try { - const response = await this.checkoutService.generatePaymentIntent(tenant.codigo, purchaseId, method); - - if (method === 'qr' && response.qr_data?.qr_code) { - this.qrData.set(response.qr_data.qr_code); - } else if (method === 'transfer' && response.transfer_data) { - this.transferAccount.set({ - titular: response.transfer_data.titular, - entidad: response.transfer_data.entidad, - cvu: response.transfer_data.cvu, - alias: response.transfer_data.alias - }); - } - } catch (error) { - console.error('Failed to generate payment intent:', error); - const backendMessage = (error as { error?: { message?: unknown } } | null)?.error?.message; - const message = typeof backendMessage === 'string' - ? backendMessage - : error instanceof Error - ? error.message - : 'No pudimos obtener la información de pago. Intentá nuevamente.'; - this.toastService.danger(message); - } finally { - this.isGeneratingIntent.set(false); - } - } - - protected async copyTransferValue(field: TransferField, value: string): Promise { - if (!globalThis.navigator?.clipboard?.writeText) return; - - try { - await globalThis.navigator.clipboard.writeText(value); - this.copiedTransferField.set(field); - - setTimeout(() => { - if (this.copiedTransferField() === field) { - this.copiedTransferField.set(null); - } - }, 1800); - } catch { - this.copiedTransferField.set(null); - } - } - protected async onComplete(): Promise { const purchaseId = this.createdPurchaseId(); const tenant = this.tenantService.tenant(); 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 6685883..7001224 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 @@ -4,17 +4,17 @@

Selecciona el metodo de pago

- @for (method of paymentMethods(); track method.id) { + @for (method of payment.paymentMethods; track method.id) {