import React, { useState, useEffect } from 'react'; 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'; interface WizardDataProps extends WizardStepProps { data: Record; onDataChange: (data: Record) => void; } const SupplierDetailsStep: React.FC = ({ data, onDataChange, onComplete }) => { const { currentTenant } = useTenant(); const [supplierData, setSupplierData] = useState({ // Required fields name: data.name || '', supplierType: data.supplierType || 'ingredients', status: data.status || 'pending_approval', paymentTerms: data.paymentTerms || 'net_30', currency: data.currency || 'EUR', standardLeadTime: data.standardLeadTime || 3, // Basic optional fields contactPerson: data.contactPerson || '', email: data.email || '', phone: data.phone || '', // Advanced optional fields supplierCode: data.supplierCode || '', taxId: data.taxId || '', registrationNumber: data.registrationNumber || '', mobile: data.mobile || '', website: data.website || '', addressLine1: data.addressLine1 || '', addressLine2: data.addressLine2 || '', city: data.city || '', stateProvince: data.stateProvince || '', postalCode: data.postalCode || '', country: data.country || '', creditLimit: data.creditLimit || '', minimumOrderAmount: data.minimumOrderAmount || '', deliveryArea: data.deliveryArea || '', isPreferredSupplier: data.isPreferredSupplier || false, autoApproveEnabled: data.autoApproveEnabled || false, notes: data.notes || '', certifications: data.certifications || '', specializations: data.specializations || '', }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!supplierData.supplierCode && supplierData.name) { const code = `SUP-${supplierData.name.substring(0, 3).toUpperCase()}-${Date.now().toString().slice(-4)}`; setSupplierData(prev => ({ ...prev, supplierCode: code })); } }, [supplierData.name]); useEffect(() => { onDataChange({ ...data, ...supplierData }); }, [supplierData]); const handleCreateSupplier = async () => { if (!currentTenant?.id) { setError('Could not obtain tenant information'); return; } setLoading(true); setError(null); try { const payload = { name: supplierData.name, supplier_type: supplierData.supplierType, status: supplierData.status, payment_terms: supplierData.paymentTerms, currency: supplierData.currency, standard_lead_time: supplierData.standardLeadTime, supplier_code: supplierData.supplierCode || undefined, tax_id: supplierData.taxId || undefined, registration_number: supplierData.registrationNumber || undefined, contact_person: supplierData.contactPerson || undefined, email: supplierData.email || undefined, phone: supplierData.phone || undefined, mobile: supplierData.mobile || undefined, website: supplierData.website || undefined, address_line1: supplierData.addressLine1 || undefined, address_line2: supplierData.addressLine2 || undefined, city: supplierData.city || undefined, state_province: supplierData.stateProvince || undefined, postal_code: supplierData.postalCode || undefined, country: supplierData.country || undefined, credit_limit: supplierData.creditLimit ? parseFloat(supplierData.creditLimit) : undefined, minimum_order_amount: supplierData.minimumOrderAmount ? parseFloat(supplierData.minimumOrderAmount) : undefined, delivery_area: supplierData.deliveryArea || undefined, is_preferred_supplier: supplierData.isPreferredSupplier, auto_approve_enabled: supplierData.autoApproveEnabled, notes: supplierData.notes || undefined, certifications: supplierData.certifications ? JSON.parse(`{"items": ${JSON.stringify(supplierData.certifications.split(',').map(c => c.trim()))}}`) : undefined, specializations: supplierData.specializations ? JSON.parse(`{"items": ${JSON.stringify(supplierData.specializations.split(',').map(s => s.trim()))}}`) : undefined, created_by: currentTenant.id, updated_by: currentTenant.id, }; await suppliersService.createSupplier(currentTenant.id, payload); showToast.success('Supplier created successfully'); onComplete(); } catch (err: any) { console.error('Error creating supplier:', err); const errorMessage = err.response?.data?.detail || 'Error creating supplier'; setError(errorMessage); showToast.error(errorMessage); } finally { setLoading(false); } }; return (

Supplier Details

Essential supplier information

{error && (
{error}
)} {/* Required Fields */}
setSupplierData({ ...supplierData, name: e.target.value })} placeholder="e.g., Premium Flour Suppliers Ltd." 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)]" />
setSupplierData({ ...supplierData, currency: e.target.value })} placeholder="EUR" 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)]" />
setSupplierData({ ...supplierData, 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)]" />
setSupplierData({ ...supplierData, contactPerson: e.target.value })} placeholder="John Doe" 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)]" />
setSupplierData({ ...supplierData, email: e.target.value })} placeholder="contact@supplier.com" 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)]" />
setSupplierData({ ...supplierData, phone: e.target.value })} placeholder="+1 234 567 8900" 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 */}
setSupplierData({ ...supplierData, supplierCode: e.target.value })} placeholder="SUP-001" 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)]" />
setSupplierData({ ...supplierData, mobile: e.target.value })} placeholder="+1 234 567 8900" 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)]" />
setSupplierData({ ...supplierData, taxId: e.target.value })} placeholder="VAT/Tax ID" 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)]" />
setSupplierData({ ...supplierData, registrationNumber: e.target.value })} placeholder="Business registration number" 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)]" />
setSupplierData({ ...supplierData, website: e.target.value })} placeholder="https://www.supplier.com" 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)]" />
setSupplierData({ ...supplierData, addressLine1: e.target.value })} placeholder="Street address" 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)]" />
setSupplierData({ ...supplierData, addressLine2: e.target.value })} placeholder="Suite, building, etc." 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)]" />
setSupplierData({ ...supplierData, city: e.target.value })} placeholder="City" 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)]" />
setSupplierData({ ...supplierData, stateProvince: e.target.value })} placeholder="State" 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)]" />
setSupplierData({ ...supplierData, postalCode: e.target.value })} placeholder="12345" 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)]" />
setSupplierData({ ...supplierData, country: e.target.value })} placeholder="Country" 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)]" />
setSupplierData({ ...supplierData, creditLimit: e.target.value })} placeholder="10000.00" 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)]" />
setSupplierData({ ...supplierData, minimumOrderAmount: e.target.value })} placeholder="100.00" 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)]" />
setSupplierData({ ...supplierData, deliveryArea: e.target.value })} placeholder="e.g., New York Metro Area" 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)]" />
setSupplierData({ ...supplierData, 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)]" />
setSupplierData({ ...supplierData, 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)]" />
setSupplierData({ ...supplierData, certifications: e.target.value })} placeholder="e.g., ISO 9001, HACCP, Organic (comma-separated)" 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)]" />
setSupplierData({ ...supplierData, specializations: e.target.value })} placeholder="e.g., Organic flours, Gluten-free products (comma-separated)" 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)]" />