import React, { useEffect, useState } from 'react' import { FaCreditCard, FaLock, FaArrowLeft, FaUser, FaBuilding, FaMailBulk, FaPhone, FaMapMarkerAlt, FaMap, FaGlobe, FaMoneyBillWave, FaDollarSign, FaUserPlus, } from 'react-icons/fa' import { BillingCycle, BasketItem, InstallmentOptionDto, PaymentMethodDto, } from '@/proxy/order/models' import { OrderService } from '@/services/order.service' import { CustomTenantDto } from '@/proxy/config/models' import { useLocalization } from '@/utils/hooks/useLocalization' interface CartState { items: BasketItem[] total: number globalBillingCycle: BillingCycle globalPeriod: number } interface PaymentFormProps { tenant: CustomTenantDto onBack: () => void onComplete: (paymentData: Record) => void cartState: CartState } export const PaymentForm: React.FC = ({ tenant, onBack, onComplete, cartState, }) => { const defaultPaymentMethod = 'Kredi Kartı' const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(defaultPaymentMethod) const [selectedInstallment, setSelectedInstallment] = useState() const [paymentData, setPaymentData] = useState({ cardNumber: '', expiryDate: '', cvv: '', cardName: '', }) const { translate } = useLocalization() const [paymentMethods, setPaymentMethods] = useState([]) const [installmentOptions, setInstallmentOptions] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { const fetchData = async () => { const orderService = new OrderService() try { const paymentResponse = await orderService.getPaymentMethodList() setPaymentMethods(paymentResponse.data) if (paymentResponse.data.length > 0) { setSelectedPaymentMethod(paymentResponse.data[1].name) } const installmentResponse = await orderService.getInstallmentOptionList() setInstallmentOptions(installmentResponse.data) } catch (err) { console.error('Ödeme şekilleri ve Komisyon Bilgileri alınamadı', err) } finally { setLoading(false) } } fetchData() }, []) const selectedMethod = paymentMethods.find((m) => m.name === selectedPaymentMethod) let commission = 0 if (selectedPaymentMethod === defaultPaymentMethod && selectedInstallment) { commission = cartState.total * selectedInstallment.commission } else if (selectedMethod) { commission = cartState.total * selectedMethod.commission } const finalTotal = cartState.total + commission const formatPrice = (price: number) => new Intl.NumberFormat('tr-TR', { style: 'currency', currency: 'TRY', minimumFractionDigits: 2, }).format(price) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() onComplete({ ...paymentData, paymentMethodId: selectedMethod?.id, installment: selectedPaymentMethod === defaultPaymentMethod ? (selectedInstallment?.installment ?? 1) : 1, commission, total: finalTotal, }) } const handleInputChange = (field: string, value: string) => { setPaymentData((prev) => ({ ...prev, [field]: value })) } return (
{loading ? (
{translate('::Public.payment.loading')}
) : (
{/* 3 Sütun: Ödeme Yöntemi | Taksit Seçenekleri | Sipariş Özeti */}
{tenant && ( <>

{' '} {translate('::Public.payment.customerInfo')}

{translate('::Public.payment.customer.code')} {tenant.name}
{translate('::Public.payment.customer.founder')} {tenant.founder}
{translate('::Public.payment.customer.company')} {tenant.organizationName}
{translate('::Public.payment.customer.email')} {tenant.email}
{translate('::Public.payment.customer.phone')} {tenant.phone}
{translate('::Public.payment.customer.address')}:
{tenant.address1}
{translate('::Public.payment.customer.country')} {tenant.country}
{translate('::Public.payment.customer.city')} {tenant.city}
{translate('::Public.payment.customer.district')} {tenant.district}
{translate('::Public.payment.customer.postalCode')}: {tenant.postalCode}
{translate('::Public.payment.customer.taxOffice')}: {tenant.taxOffice}
{translate('::Public.payment.customer.taxNumber')}: {tenant.vknTckn}
{tenant.reference && (
{translate('::Public.payment.customer.reference')}: {tenant.reference}
)}
)}
{/* 1. Sütun: Ödeme Yöntemi */}

{' '} {translate('::Public.payment.method.title')}

{paymentMethods.map((method) => ( ))}
{/* Taksit Seçenekleri */} {selectedPaymentMethod === defaultPaymentMethod && (

{translate('::Public.payment.installments.title')}

{installmentOptions.map((option) => ( ))}
)}
{/* 3. Sütun: Kart Bilgileri + Sipariş Özeti ve Butonlar */}
{/* Kart Bilgileri */} {selectedPaymentMethod !== defaultPaymentMethod && (

{translate('::Public.payment.card.title')}

handleInputChange('cardName', e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg" placeholder={translate('::Public.payment.card.name')} /> handleInputChange('cardNumber', e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg" placeholder={translate('::Public.payment.card.number')} maxLength={19} />
handleInputChange('expiryDate', e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg" placeholder="MM/YY" maxLength={5} /> handleInputChange('cvv', e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg" placeholder="CVV" maxLength={4} />
)} {/* Sipariş Özeti ve Butonlar */}

{translate('::Public.payment.summary.title')}

{cartState.items.map((item, index) => (
{item.product.name}
{item.quantity}x -{' '} {item.billingCycle === 'monthly' ? 'Aylık' : item.billingCycle === 'yearly' ? 'Yıllık' : 'Aylık'}{' '} {cartState.globalPeriod > 1 && `(${cartState.globalPeriod} ${item.billingCycle === 'monthly' ? 'Ay' : 'Yıl'})`}
{formatPrice(item.totalPrice)}
))}
{translate('::Public.payment.summary.subtotal')} {formatPrice(cartState.total)}
{translate('::Public.payment.summary.commission')} {formatPrice(commission)}
{selectedPaymentMethod === defaultPaymentMethod && selectedInstallment?.installment && selectedInstallment.installment > 1 && (
{translate('::Public.payment.summary.monthlyInstallment')}: {formatPrice(finalTotal / selectedInstallment.installment)} x{' '} {selectedInstallment.installment}
)}
{translate('::Public.payment.summary.total')} {formatPrice(finalTotal)}
{/* Butonlar */}
)}
) }