import { Store, MapPin, TrendingUp, Calendar, Clock, Info, Truck } from 'lucide-react'; import { formatValue } from '../../lib/format'; import './card.css'; export function CallCard({ row, isDetailView = false }: { row: Record; isDetailView?: boolean }) { // Status Mapping const stateName = row.current_state_name; const lowerState = stateName.toLowerCase(); const showOrderDetails = lowerState.includes('ordered') || lowerState.includes('order closed') || lowerState.includes('close order'); let statusClass = 'z-card-status--neutral'; if (lowerState.includes('productive call')) { statusClass = 'z-card-status--success'; } else if (lowerState.includes('close order') || lowerState.includes('completed') || lowerState.includes('success')) { statusClass = 'z-card-status--success'; } else if (lowerState.includes('no order')) { statusClass = 'z-card-status--danger'; } else if (lowerState.includes('visited')) { statusClass = 'z-card-status--primary'; } else { statusClass = 'z-card-status--primary'; // default fallback for other active states } // Extract nested objects if they exist const storeObj = typeof row.select_store === 'object' ? row.select_store : (typeof row.store === 'object' ? row.store : {}); const userKey = Object.keys(row).find(k => k.includes('user_id')); const userObj = userKey ? row[userKey] : null; const storeName = formatValue(storeObj?.business_name || storeObj?.distributor_name || row.store_name || row.customer_name || (typeof row.store === 'string' ? row.store : 'Unknown Store')); const storeCode = formatValue(storeObj?.store_code || row.store_code || '—'); // Phone and Email const storeEmail = formatValue(storeObj?.email || row.email || row.store_email || '—'); const storePhoneRaw = storeObj?.phone_number || row.phone_number || row.phone || row.store_phone; let storePhone = '—'; if (typeof storePhoneRaw === 'object' && storePhoneRaw !== null) { storePhone = formatValue(storePhoneRaw.phone_with_dial_code || storePhoneRaw.phone || '—'); } else if (typeof storePhoneRaw === 'string') { storePhone = formatValue(storePhoneRaw); } // Distributor Details const distName = formatValue(storeObj?.distributor_name || '—'); const distOwner = formatValue(storeObj?.distributor_owner_name || '—'); const distEmail = formatValue(storeObj?.distributor_email || '—'); const distPhoneRaw = storeObj?.distributor_phone_number; let distPhone = '—'; if (typeof distPhoneRaw === 'object' && distPhoneRaw !== null) { distPhone = formatValue(distPhoneRaw.phone_with_dial_code || distPhoneRaw.phone || '—'); } else if (typeof distPhoneRaw === 'string') { distPhone = formatValue(distPhoneRaw); } const hasDistributor = distName !== '—' || distOwner !== '—' || distEmail !== '—' || distPhone !== '—'; // Grid Details (Calculate from potential or orders if missing) let totalWeightVal = Number(row.total_kgs_3 || row.total_kgs || row.total_weight || row.weight || 0); let totalQuantityVal = Number(row.total_bags_3 || row.total_bags || row.total_quantity || row.quantity || 0); let totalOrdersVal = Number(row.order_count || row.total_orders || (row.order_details_3 ? row.order_details_3.length : 0)); if (totalWeightVal === 0 && totalQuantityVal === 0 && storeObj?.potential) { try { const pot = typeof storeObj.potential === 'string' ? JSON.parse(storeObj.potential) : storeObj.potential; if (Array.isArray(pot)) { totalOrdersVal = pot.length; pot.forEach((p: any) => { totalWeightVal += Number(p.row_kgs || 0); totalQuantityVal += Number(p.quantity || 0); }); } } catch (e) { } } const totalWeight = formatValue(totalWeightVal); const totalQuantity = formatValue(totalQuantityVal); const totalOrders = formatValue(totalOrdersVal); // Route & Assignment const routeName = formatValue(storeObj?.route_name || storeObj?.route || row.route_name || row.route || '—'); const areaName = formatValue(storeObj?.area || row.area || row.area_name || '—'); // User const userName = formatValue(userObj?.name || row.sales_officer || row.user_name || '—'); const userEmail = formatValue(userObj?.email || row.performed_by_email || row.user_email || '—'); const initials = userName !== '—' ? String(userName).substring(0, 2).toUpperCase() : 'SO'; // Date & Time let dateStr = '—'; let timeStr = '—'; if (row.date_of_visit || row.visit_date) { try { const dVal = String(row.date_of_visit || row.visit_date); const d = new Date(dVal); if (!isNaN(d.getTime())) { dateStr = d.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' }).replace(/ /g, '-'); } else dateStr = dVal.split('T')[0]; } catch { dateStr = String(row.date_of_visit || row.visit_date).split('T')[0]; } } if (row.time_of_visit || row.visit_time) { try { const t = String(row.time_of_visit || row.visit_time); let timeParts = t.split(':'); if (t.includes('T')) { timeParts = t.split('T')[1].replace('Z', '').split(':'); } if (timeParts.length >= 2) { let h = parseInt(timeParts[0]); const m = timeParts[1]; const ampm = h >= 12 ? 'PM' : 'AM'; h = h % 12; h = h ? h : 12; const hStr = h < 10 ? '0' + h : h; timeStr = `${hStr}:${m} ${ampm}`; } else { timeStr = t; } } catch { timeStr = String(row.time_of_visit || row.visit_time); } } return (
{/* Top Row */}
{storeCode}
{stateName}
{/* Store Name & Location */}

{storeName}

{areaName}

{/* Divider */}
{/* Date & Time */}
DATE
{dateStr}
TIME
{timeStr}
{/* Button (List View Only) */} {!isDetailView && (
See More Details
)} {/* Detail View Additions */} {isDetailView && (
{storePhone !== '—' && (

Phone: {storePhone}

)} {storeEmail !== '—' && (

Email: {storeEmail}

)} {/* Route & Assignment */}

Route

{routeName}

Area

{areaName}

Sales Officer

{initials}

{userName}

{userEmail !== '—' && (

{userEmail}

)}
{/* Call Meta Chips */}
{row.order_received_channel && ( Channel: {String(row.order_received_channel).replace(/_/g, ' ').toUpperCase()} )} {row.remarks && (
Remarks: {row.remarks}
)}
{/* Product Cards (Order Details) */} {showOrderDetails && row.order_details_3 && Array.isArray(row.order_details_3) && row.order_details_3.length > 0 && (

Order Products

{totalOrders} {Number(totalOrders) === 1 ? 'Item' : 'Items'}
{row.order_details_3.map((prod: any, idx: number) => { const productName = formatValue(prod.product_name_3 || prod.product_category_3 || 'Unknown Product'); const bagsStr = formatValue(prod.bags_3 || 0); const bagsNum = Number(prod.bags_3 || 0); const skuNum = Number(prod.sku_3 || prod.sku || 0); const kgsNum = skuNum > 0 ? skuNum * bagsNum : Number(prod.row_kgs_3 || prod.row_kgs || prod.kgs_3 || prod.weight_3 || 0); const kgsStr = kgsNum > 0 ? ` (${kgsNum} kg)` : ''; return (
{productName} {bagsStr} Bags{kgsStr}
); })}
)} {/* Logistics Totals at the bottom */} {showOrderDetails && (Number(totalWeightVal) > 0 || Number(totalQuantityVal) > 0) && (
Total Weight {totalWeight} Kgs
Total Quantity {totalQuantity} Bags
)} {/* Distributor Details */} {hasDistributor && (

Distributor Details

{distName !== '—' && (

{distName}

)} {distOwner !== '—' && (

Owner: {distOwner}

)} {distPhone !== '—' && (

Phone: {distPhone}

)} {distEmail !== '—' && (

Email: {distEmail}

)}
)}
)}
); }