import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { WizardStep, WizardStepProps } from '../../../ui/WizardModal/WizardModal'; import { Building2, CheckCircle2, Loader2 } from 'lucide-react'; import { useTenant } from '../../../../stores/tenant.store'; import { suppliersService } from '../../../../api/services/suppliers'; import { showToast } from '../../../../utils/toast'; import { AdvancedOptionsSection } from '../../../ui/AdvancedOptionsSection'; import Tooltip from '../../../ui/Tooltip/Tooltip'; const SupplierDetailsStep: React.FC = ({ dataRef, onDataChange, onComplete }) => { const { t } = useTranslation('wizards'); // New architecture: access data from dataRef.current const data = dataRef?.current || {}; const { currentTenant } = useTenant(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const handleFieldChange = (field: string, value: any) => { onDataChange?.({ ...data, [field]: value }); }; useEffect(() => { if (!data.supplierCode && data.name) { const code = `SUP-${data.name.substring(0, 3).toUpperCase()}-${Date.now().toString().slice(-4)}`; onDataChange?.({ ...data, supplierCode: code }); } }, [data.name]); const handleCreateSupplier = async () => { const i18next = (await import('i18next')).default; if (!currentTenant?.id) { const errorMsg = i18next.t('wizards:supplier.messages.errorObtainingTenantInfo'); setError(errorMsg); return; } setLoading(true); setError(null); try { const payload = { name: data.name, supplier_type: data.supplierType, status: data.status, payment_terms: data.paymentTerms, currency: data.currency, standard_lead_time: data.standardLeadTime, supplier_code: data.supplierCode || undefined, tax_id: data.taxId || undefined, registration_number: data.registrationNumber || undefined, contact_person: data.contactPerson || undefined, email: data.email || undefined, phone: data.phone || undefined, mobile: data.mobile || undefined, website: data.website || undefined, address_line1: data.addressLine1 || undefined, address_line2: data.addressLine2 || undefined, city: data.city || undefined, state_province: data.stateProvince || undefined, postal_code: data.postalCode || undefined, country: data.country || undefined, credit_limit: data.creditLimit ? parseFloat(data.creditLimit) : undefined, minimum_order_amount: data.minimumOrderAmount ? parseFloat(data.minimumOrderAmount) : undefined, delivery_area: data.deliveryArea || undefined, is_preferred_supplier: data.isPreferredSupplier, auto_approve_enabled: data.autoApproveEnabled, notes: data.notes || undefined, certifications: data.certifications ? JSON.parse(`{"items": ${JSON.stringify(data.certifications.split(',').map(c => c.trim()))}}`) : undefined, specializations: data.specializations ? JSON.parse(`{"items": ${JSON.stringify(data.specializations.split(',').map(s => s.trim()))}}`) : undefined, created_by: currentTenant.id, updated_by: currentTenant.id, }; await suppliersService.createSupplier(currentTenant.id, payload); showToast.success(i18next.t('wizards:supplier.messages.supplierCreatedSuccessfully')); // Let the wizard handle completion via the Next/Complete button } catch (err: any) { console.error('Error creating supplier:', err); const errorMessage = err.response?.data?.detail || i18next.t('wizards:supplier.messages.errorCreatingSupplier'); setError(errorMessage); showToast.error(errorMessage); } finally { setLoading(false); } }; return (

{t('supplier.supplierDetails')}

{t('supplier.subtitle')}

{error && (
{error}
)} {/* Required Fields */}
handleFieldChange('name', e.target.value)} placeholder={t('supplier.fields.namePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('currency', e.target.value)} placeholder={t('supplier.fields.currencyPlaceholder')} maxLength={3} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('standardLeadTime', parseInt(e.target.value) || 0)} placeholder="3" min="0" className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('contactPerson', e.target.value)} placeholder={t('supplier.fields.contactPersonPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('email', e.target.value)} placeholder={t('supplier.fields.emailPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('phone', e.target.value)} placeholder={t('supplier.fields.phonePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
{/* Advanced Options */}
handleFieldChange('supplierCode', e.target.value)} placeholder={t('supplier.fields.supplierCodePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('mobile', e.target.value)} placeholder={t('supplier.fields.mobilePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('taxId', e.target.value)} placeholder={t('supplier.fields.taxIdPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('registrationNumber', e.target.value)} placeholder={t('supplier.fields.registrationNumberPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('website', e.target.value)} placeholder={t('supplier.fields.websitePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('addressLine1', e.target.value)} placeholder={t('supplier.fields.addressLine1Placeholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('addressLine2', e.target.value)} placeholder={t('supplier.fields.addressLine2Placeholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('city', e.target.value)} placeholder={t('supplier.fields.cityPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('stateProvince', e.target.value)} placeholder={t('supplier.fields.statePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('postalCode', e.target.value)} placeholder={t('supplier.fields.postalCodePlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('country', e.target.value)} placeholder={t('supplier.fields.countryPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('creditLimit', e.target.value)} placeholder={t('supplier.fields.creditLimitPlaceholder')} min="0" step="0.01" className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('minimumOrderAmount', e.target.value)} placeholder={t('supplier.fields.minOrderAmountPlaceholder')} min="0" step="0.01" className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('deliveryArea', e.target.value)} placeholder={t('supplier.fields.deliveryAreaPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('isPreferredSupplier', e.target.checked)} className="w-4 h-4 text-[var(--color-primary)] border-[var(--border-secondary)] rounded focus:ring-2 focus:ring-[var(--color-primary)]" />
handleFieldChange('autoApproveEnabled', e.target.checked)} className="w-4 h-4 text-[var(--color-primary)] border-[var(--border-secondary)] rounded focus:ring-2 focus:ring-[var(--color-primary)]" />
handleFieldChange('certifications', e.target.value)} placeholder={t('supplier.fields.certificationsPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />
handleFieldChange('specializations', e.target.value)} placeholder={t('supplier.fields.specializationsPlaceholder')} className="w-full px-3 py-2 border border-[var(--border-secondary)] rounded-lg focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)] bg-[var(--bg-primary)] text-[var(--text-primary)]" />