« Back to History
jobwork_send_entry.js
|
20260723_000646.php
Initial Domain Snapshot
Copy Code
// debug jobwork_send_entry.js — verbose (replace your file with this) (() => { const endpoint = '/erp/assets/php/jobwork_send_entry.php'; const $ = id => document.getElementById(id); const $qa = s => Array.from(document.querySelectorAll(s)); // DOM const badges = $qa('#materialBadges [data-material]'); const materialInput = $('materialInput'); const $yType = $('yarn_type'); const $yCo = $('yarn_company'); const $yCo2 = $('yarn_company_repeat'); const $denier = $('denier'); const $color = $('color'); const $party = $('party_id'); const $box = $('box_count'); const $weight = $('weight_kg'); const $date = $('entry_date'); const $btn = $('btnSubmit'); const $report = $('btnReport'); const $stockInfo = $('stockInfo'); const $last = $('lastEntry'); if(!endpoint){ alert('Missing endpoint'); return; } console.log('[JOBWORK] endpoint=', endpoint); let currentMaterial = (materialInput && materialInput.value) ? materialInput.value : 'yarn'; let lastStockResp = null; const fetchJSON = (url, opts={}) => { console.log('[JOBWORK] fetch ->', url, opts); return fetch(url, Object.assign({headers:{'X-Requested-With':'XMLHttpRequest'}}, opts)) .then(async r => { const text = await r.text().catch(()=>null); let json = null; try { json = text ? JSON.parse(text) : null; } catch(e) {} return { ok: r.ok, status: r.status, text, json }; }) .catch(e => ({ ok:false, status:0, err:e, text:null, json:null })); }; function fillOptions(el, arr, placeholder='-- Select --') { if(!el) return; el.innerHTML = ''; const p = document.createElement('option'); p.value=''; p.textContent = placeholder; el.appendChild(p); arr.forEach(v => { const o=document.createElement('option'); o.value=v; o.textContent=v; el.appendChild(o); }); } async function loadOptions(level) { const params = new URLSearchParams({ajax:'options', level:level, material: currentMaterial}); if ($yType && $yType.value) params.set('yarn_type', $yType.value); if ($yCo && $yCo.value) params.set('company', $yCo.value); if ($denier && $denier.value) params.set('denier', $denier.value); const url = endpoint + '?' + params.toString(); const res = await fetchJSON(url); if (!res.ok) { console.error('[JOBWORK] OPTIONS FAILED', level, res); alert(`OPTIONS(${level}) failed: HTTP ${res.status}\nResponse: ${res.text || res.err}`); return; } if (!res.json) { console.error('[JOBWORK] OPTIONS BAD JSON', level, res.text); alert(`OPTIONS(${level}) returned invalid JSON:\n${res.text}`); return; } const j = res.json; if (!j.ok) { console.error('[JOBWORK] OPTIONS response ok:false', j); alert(`OPTIONS(${level}) error: ${j.error || JSON.stringify(j)}`); return; } const opts = j.data.options || []; console.log('[JOBWORK] OPTIONS', level, opts); if (level === 'type') fillOptions($yType, opts, '-- Type --'); if (level === 'company') { fillOptions($yCo, opts, '-- Company --'); fillOptions($yCo2, opts, '-- Company --'); } if (level === 'denier') fillOptions($denier, opts, '-- Denier --'); if (level === 'color') fillOptions($color, opts, '-- Color --'); } async function loadParties() { const url = endpoint+'?ajax=parties'; const res = await fetchJSON(url); if(!res.ok || !res.json){ alert('Parties load failed: '+ (res.status||'noresp')); console.error(res); return; } const j = res.json; if(!j.ok){ alert('Parties error: '+(j.error||JSON.stringify(j))); return; } $party.innerHTML = '<option value="">-- Select Party --</option>'; (j.data.options||[]).forEach(o=>{ const el=document.createElement('option'); el.value=o.id; el.textContent=o.name; $party.appendChild(el);}); console.log('[JOBWORK] Parties loaded', j.data.options); } async function loadStockPreview(){ if(!$yType || !$yCo || !$denier || !$color){ $stockInfo.textContent='Current stock: —'; return; } const url = endpoint + '?ajax=stock&material='+encodeURIComponent(currentMaterial) + '&yarn_type=' + encodeURIComponent($yType.value||'') + '&company=' + encodeURIComponent($yCo.value||'') + '&denier=' + encodeURIComponent($denier.value||'') + '&color=' + encodeURIComponent($color.value||'') + '&form_boxes=' + encodeURIComponent($box.value||0) + '&form_weight=' + encodeURIComponent($weight.value||0); const res = await fetchJSON(url); if(!res.ok || !res.json){ console.error('stock fail',res); $stockInfo.textContent='Stock: error'; return; } const j = res.json; if(!j.ok){ console.error('stock api err', j); $stockInfo.textContent='Stock: api err'; return; } lastStockResp = j.data; if (j.data.current) $stockInfo.textContent = `Current Boxes: ${j.data.current.boxes} • Weight: ${j.data.current.weight} kg • AVG: ${j.data.current.avg_box_weight} • Diff: ${j.data.diff_pct}% (${j.data.status})`; else $stockInfo.textContent = 'Current stock: —'; console.log('[JOBWORK] stock', j.data); } async function loadLast(){ const url = endpoint + '?ajax=last'; const res = await fetchJSON(url); if(!res.ok || !res.json){ $last.value='No entries or error'; return; } const j = res.json; if(!j.ok){ $last.value='No entries'; return; } const last = j.data.last; if(!last){ $last.value='No entries yet.'; return; } $last.value = `${last.entry_date||''} | ${last.material||''} | ${last.yarn_type||''} | ${last.yarn_company||''} | ${last.color||''} | ${Number(last.box_count||0).toFixed(3)}`; } // wire events if (badges && badges.length) { badges.forEach(b => { b.addEventListener('click', () => { currentMaterial = b.dataset.material || 'yarn'; if (materialInput) materialInput.value = currentMaterial; badges.forEach(x => x.classList.toggle('active', x===b)); initChain(); }); }); } if ($yType) $yType.addEventListener('change', ()=>{ loadOptions('company'); loadOptions('denier'); loadOptions('color'); loadStockPreview(); }); if ($yCo) $yCo.addEventListener('change', ()=>{ loadOptions('denier'); loadOptions('color'); loadStockPreview(); $yCo2.value = $yCo.value; }); if ($yCo2) $yCo2.addEventListener('change', ()=>{ $yCo.value=$yCo2.value; $yCo.dispatchEvent(new Event('change')); }); if ($denier) $denier.addEventListener('change', ()=>{ loadOptions('color'); loadStockPreview(); }); if ($color) $color.addEventListener('change', loadStockPreview); if ($box) $box.addEventListener('input', loadStockPreview); if ($weight) $weight.addEventListener('input', loadStockPreview); $btn.addEventListener('click', async ()=>{ const payload = { material: currentMaterial, entry_date: $date.value, yarn_type: $yType.value, yarn_company: $yCo.value, denier: $denier.value, color: $color.value, box_count: parseFloat($box.value||0), weight_kg: parseFloat($weight.value||0), party_id: $party.value, party_name: ($party.options[$party.selectedIndex]||{}).text || '' }; console.log('[JOBWORK] submit payload', payload); const res = await fetchJSON(endpoint, { method:'POST', body: JSON.stringify(payload), headers:{ 'Content-Type':'application/json' } }); console.log('[JOBWORK] submit response', res); if(!res.ok || !res.json){ alert('Save failed: network or non-JSON response'); return; } const j = res.json; if(!j.ok){ alert('Save failed: '+(j.error||JSON.stringify(j))); return; } alert('Saved'); $box.value=''; $weight.value=''; loadStockPreview(); loadLast(); }); $report.addEventListener('click', ()=> window.open(endpoint + '?ajax=records','_blank')); async function initChain(){ await loadOptions('type'); await loadOptions('company'); await loadOptions('denier'); await loadOptions('color'); await loadParties(); await loadStockPreview(); await loadLast(); } // kick off initChain().catch(e=>{ console.error('initChain error', e); alert('Init failed: check console/network (see developer tools)'); }); })();