diff --git a/src/components/forms/DynamicForm.tsx b/src/components/forms/DynamicForm.tsx index 84006de..556a911 100644 --- a/src/components/forms/DynamicForm.tsx +++ b/src/components/forms/DynamicForm.tsx @@ -354,95 +354,6 @@ export function DynamicForm({ client, activityId: initialActivityId, instanceId: finalValues[actionField.id] = clickedActionRef.current; } - // 1. Pre-submit consolidation for grid fields & total fields - normalFields.forEach((f) => { - if (f.data_type.startsWith('grid')) { - const rawGrid = (finalValues[f.id] as Record[]) || []; - if (rawGrid.length > 0) { - const merged: Record[] = []; - const indexMap = new Map(); - - const getGridVal = (obj: Record, searchTokens: string[], excludeTokens: string[] = []) => { - for (const k of Object.keys(obj)) { - const lowerK = k.toLowerCase(); - if (searchTokens.some(t => lowerK.includes(t)) && !excludeTokens.some(t => lowerK.includes(t))) { - return obj[k]; - } - } - return undefined; - }; - - for (const r of rawGrid) { - const cat = String(getGridVal(r, ['category', 'cat']) || '').trim().toLowerCase(); - const prod = String(getGridVal(r, ['product', 'name'], ['category', 'cat']) || '').trim().toLowerCase(); - const currentBags = Number(getGridVal(r, ['bags', 'quantity'])) || 0; - const currentSku = Number(getGridVal(r, ['sku'], ['code'])) || 0; - - const key = prod ? (cat ? `${cat}::${prod}` : prod) : cat; - if (key) { - if (indexMap.has(key)) { - if (currentBags > 0) { - const targetIdx = indexMap.get(key)!; - const existingRow = merged[targetIdx]; - const existingBags = Number(getGridVal(existingRow, ['bags', 'quantity'])) || 0; - const addedBags = currentBags; - const newBags = existingBags + addedBags; - const skuVal = Number(getGridVal(existingRow, ['sku'], ['code']) || currentSku || 0); - - merged[targetIdx] = { - ...existingRow, - bags: newBags, - quantity: newBags, - row_kgs: skuVal * newBags, - }; - } - continue; - } else { - indexMap.set(key, merged.length); - } - } - merged.push(r); - } - - // Clean virtual keys - const cleanGrid = merged.map((r) => { - const clean: Record = {}; - Object.keys(r).forEach((k) => { - if (k !== '_row_total_kgs' && k !== 'row_kgs' && k !== 'row_total') { - clean[k] = r[k]; - } - }); - return clean; - }); - - finalValues[f.id] = cleanGrid; - - // Recalculate total_bags and total_kgs - let totalB = 0; - let totalK = 0; - cleanGrid.forEach((r) => { - const b = Number(getGridVal(r, ['bags', 'quantity'])) || 0; - const sku = Number(getGridVal(r, ['sku'], ['code'])) || 0; - totalB += b; - totalK += b * sku; - }); - - const getBaseId = (id: string) => id.replace(/_\d+$/, ''); - normalFields.forEach((tf) => { - const baseId = getBaseId(tf.id); - const mapped = (tf.mapped_workflow_field || '').toLowerCase(); - if (baseId === 'total_bags' || mapped === 'total_bags' || tf.id === 'total_bags') { - finalValues[tf.id] = Math.round(totalB); - } - if (baseId === 'total_kgs' || mapped === 'total_kgs' || tf.id === 'total_kgs') { - finalValues[tf.id] = Math.round(totalK); - } - }); - } - } - }); - - // 2. Validate grid fields (Order Details) const extractGridRowDetails = (r: Record, columns?: FormScreenField[]) => { let cat = String(r.category || r.product_category || r.cat || '').trim(); let prod = String(r.productName || r.product_name || r.product || r.name || '').trim(); @@ -488,6 +399,109 @@ export function DynamicForm({ client, activityId: initialActivityId, instanceId: return { cat, prod, bags: isNaN(bagsNum) ? 0 : bagsNum }; }; + // 1. Pre-submit consolidation for grid fields & total fields + normalFields.forEach((f) => { + if (f.data_type.startsWith('grid')) { + const rawGrid = (finalValues[f.id] as Record[]) || []; + if (rawGrid.length > 0) { + const merged: Record[] = []; + const indexMap = new Map(); + + const getGridVal = (obj: Record, searchTokens: string[], excludeTokens: string[] = []) => { + for (const k of Object.keys(obj)) { + const lowerK = k.toLowerCase(); + if (searchTokens.some(t => lowerK.includes(t)) && !excludeTokens.some(t => lowerK.includes(t))) { + return obj[k]; + } + } + return undefined; + }; + + for (const r of rawGrid) { + const cat = String(getGridVal(r, ['category', 'cat']) || '').trim().toLowerCase(); + const prod = String(getGridVal(r, ['product', 'name'], ['category', 'cat']) || '').trim().toLowerCase(); + const currentBags = Number(getGridVal(r, ['bags', 'quantity'])) || 0; + const currentSku = Number(getGridVal(r, ['sku'], ['code'])) || 0; + + const key = prod ? (cat ? `${cat}::${prod}` : prod) : cat; + if (key) { + if (indexMap.has(key)) { + if (currentBags > 0) { + const targetIdx = indexMap.get(key)!; + const existingRow = merged[targetIdx]; + const existingBags = Number(getGridVal(existingRow, ['bags', 'quantity'])) || 0; + const addedBags = currentBags; + const newBags = existingBags + addedBags; + const skuVal = Number(getGridVal(existingRow, ['sku'], ['code']) || currentSku || 0); + + const updatedRow = { ...existingRow }; + Object.keys(existingRow).forEach((k) => { + const lowerK = k.toLowerCase(); + if ((lowerK.includes('bags') || lowerK.includes('quantity') || lowerK.includes('potential')) && !lowerK.includes('total') && !lowerK.includes('kgs')) { + updatedRow[k] = newBags; + } + if (lowerK.includes('row_kgs') || lowerK.includes('rowkgs')) { + updatedRow[k] = skuVal * newBags; + } + }); + updatedRow.bags = newBags; + updatedRow.quantity = newBags; + updatedRow.row_kgs = skuVal * newBags; + + merged[targetIdx] = updatedRow; + } + continue; + } else { + indexMap.set(key, merged.length); + } + } + merged.push(r); + } + + // Clean virtual keys and filter out empty rows + const cleanGrid = merged + .filter((r) => { + const { cat, prod, bags } = extractGridRowDetails(r, f.columns); + return !!(cat || prod || bags > 0); + }) + .map((r) => { + const clean: Record = {}; + Object.keys(r).forEach((k) => { + if (k !== '_row_total_kgs' && k !== 'row_kgs' && k !== 'row_total') { + clean[k] = r[k]; + } + }); + return clean; + }); + + finalValues[f.id] = cleanGrid; + + // Recalculate total_bags and total_kgs + let totalB = 0; + let totalK = 0; + cleanGrid.forEach((r) => { + const b = Number(getGridVal(r, ['bags', 'quantity'])) || 0; + const sku = Number(getGridVal(r, ['sku'], ['code'])) || 0; + totalB += b; + totalK += b * sku; + }); + + const getBaseId = (id: string) => id.replace(/_\d+$/, ''); + normalFields.forEach((tf) => { + const baseId = getBaseId(tf.id); + const mapped = (tf.mapped_workflow_field || '').toLowerCase(); + if (baseId === 'total_bags' || mapped === 'total_bags' || tf.id === 'total_bags') { + finalValues[tf.id] = Math.round(totalB); + } + if (baseId === 'total_kgs' || mapped === 'total_kgs' || tf.id === 'total_kgs') { + finalValues[tf.id] = Math.round(totalK); + } + }); + } + } + }); + + // 2. Validate grid fields (Order Details) for (const f of normalFields) { if (f.data_type.startsWith('grid')) { if (currentActivityId === 'af8ac8df-d868-4f7d-88b2-123955d69c56') {