⬅ 入口 📦 材料注文

🚚 横持ち依頼書

在庫品を倉庫間で移す依頼をかんたんに
'; const w=window.open('','_blank'); if(!w){ toast('ポップアップを許可してください'); return; } w.document.write(html); w.document.close(); setTimeout(()=>{ try{w.print();}catch(e){} },300); } /* ===== 納品書(出口・予定vs実績+ドライバー署名)===== */ function printDeliveryNote(id, shipIdx){ const o=ORDERS.find(x=>String(x.id)===String(id)); if(!o){ toast('見つかりません'); return; } var sh=shipmentsOf(o); var s=(shipIdx!=null&&sh[shipIdx])?sh[shipIdx]:null; var lines = s ? (s.lines||[]) : itemsOf(o).map(function(it){ var c=Object.assign({},it); c.planQty=it.qty; return c; }); var delivDate=s?s.date:(o.deliveredDate||''), driverName=s?s.driverName:(o.driverName||''), driverSign=s?s.driverSign:(o.driverSign||''), kaisu=s?(' ('+s.no+'回目)'):''; const wh=WAREHOUSES.find(w=>String(w.id)===String(o.whId))||{name:o.whName,whCode:o.whCode}; const fromWh=WAREHOUSES.find(w=>String(w.whCode)===String(o.fromWhCode))||{name:o.fromWhName,whCode:o.fromWhCode}; const dtop=(jdate(delivDate||o.date)||'').replace(/(\d{4})-(\d{2})-(\d{2})/,function(m,y,mo,da){return y+'年'+parseInt(mo,10)+'月'+parseInt(da,10)+'日';}); const rows=lines.map(function(l,i){ var plan=l.planQty; var aq=(l.actualQty!==''&&l.actualQty!=null)?l.actualQty:plan; var pl=shipPallet(l); var ap=(l.actualPallet!==''&&l.actualPallet!=null)?l.actualPallet:pl; var diff=(Number(aq)!==Number(plan))?' style="background:#fff6d6"':''; return ''+(i+1)+''+esc(l.itemCode)+(l.nameNo?'
№'+esc(l.nameNo)+'':'')+''+esc(l.procName||l.itemName||'')+''+esc(plan)+''+esc(aq)+''+esc(pl)+''+esc(ap)+''; }).join(''); const signImg=driverSign?'':' '; const html='横持ち納品書 '+esc(o.orderNo||'')+'
'+ '
'+esc(dtop)+' (依頼番号:'+esc(o.orderNo||('#'+o.id))+esc(kaisu)+')
'+ '
'+esc(wh.name||o.whName||'')+' 御中
'+ '
'+esc(COMPANY.name)+'
'+(COMPANY.postal?'〒'+esc(COMPANY.postal)+' ':'')+esc(COMPANY.addr)+(COMPANY.tel?'
TEL '+esc(COMPANY.tel):'')+(COMPANY.fax?' FAX '+esc(COMPANY.fax):'')+'
'+ '

横持ち納品書

'+ '
下記のとおり、横持ち(倉庫間移動)を実施いたしました'+(s?('('+esc(s.no)+'回目)'):'')+'。ご確認のうえ、ご署名をお願いいたします。
'+ '
納品日:'+esc(jdate(delivDate||''))+' / 移動元:'+(o.fromWhCode?'['+esc(o.fromWhCode)+'] ':'')+esc(fromWh.name||o.fromWhName||'')+' → 移動先:'+(o.whCode?'['+esc(o.whCode)+'] ':'')+esc(wh.name||o.whName||'')+'
'+ ''+rows+'
No品目コード加工品名予定本数実際本数予定PL実際PL
'+ '
※黄色=予定と実際の本数が異なる品目
'+ '
受領(ドライバー)署名:
'+signImg+'
ドライバー名:'+esc(driverName||'')+'
'+ '
受領日:'+esc(jdate(delivDate||''))+'
'+ '
'; const w=window.open('','_blank'); if(!w){ toast('ポップアップを許可してください'); return; } w.document.write(html); w.document.close(); setTimeout(()=>{ try{w.print();}catch(e){} },300); } /* ===== CSV(チカー「在庫移動入力(製品)」形式・将来の在庫引き=出口用)===== 横持ち1品=2行:移動元に「出庫数」/移動先に「入庫数」。列はチカーの在庫移動入力に一致させる。 */ function csvOrder(id){ const o=ORDERS.find(x=>String(x.id)===String(id)); if(!o){ toast('見つかりません'); return; } const head=['在庫移動伝票ID','移動日付','倉庫コード','倉庫名','品目コード','加工品名','入庫数','出庫数','入力担当者','タイムスタンプ','備考','規格1','規格2','規格3','規格4','規格5']; const lines=[head]; const ts=nowJST(), note=o.note||''; function pushLine(d,code,nm,qty){ lines.push(['',d,o.fromWhCode||'',o.fromWhName||'',code,nm,'',qty,'',ts,note,'','','','','']); lines.push(['',d,o.whCode||'',o.whName||'',code,nm,qty,'','',ts,note,'','','','','']); } var doneShips=shipmentsOf(o).filter(function(s){return s.status==='納品済';}); if(doneShips.length){ // 納品済の便ごとに実際本数・便の納品日で出力=実際に動いた分だけ doneShips.forEach(function(s){ var d=jdate(s.date); (s.lines||[]).forEach(function(l){ var q=(l.actualQty!==''&&l.actualQty!=null)?l.actualQty:l.planQty; if(!(Number(q)>0))return; pushLine(d,l.itemCode||'',l.procName||l.itemName||'',q); }); }); } else { // まだ納品前=予定で出力 var d=jdate(o.confirmedDate||o.date); itemsOf(o).forEach(function(it){ if(!(Number(it.qty)>0))return; pushLine(d,it.itemCode||'',it.procName||it.itemName||'',it.qty); }); } const csv=''+lines.map(r=>r.map(c=>{ const s=String(c==null?'':c); return /[",\r\n]/.test(s)?'"'+s.replace(/"/g,'""')+'"':s; }).join(',')).join('\r\n'); const blob=new Blob([csv],{type:'text/csv;charset=utf-8'}); const a=document.createElement('a'); a.href=URL.createObjectURL(blob); a.download='横持ち_在庫移動_'+(o.orderNo||o.id)+'.csv'; a.click(); setTimeout(()=>URL.revokeObjectURL(a.href),1500); } function nowJST(){ const j=new Date(Date.now()+9*3600*1000); const p=n=>('0'+n).slice(-2); return j.getUTCFullYear()+'-'+p(j.getUTCMonth()+1)+'-'+p(j.getUTCDate())+' '+p(j.getUTCHours())+':'+p(j.getUTCMinutes())+':'+p(j.getUTCSeconds()); } /* ===== utils ===== */ function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,m=>({'&':'&','<':'<','>':'>','"':'"'})[m]); } function todayStr(){ const d=new Date(new Date().getTime()+9*3600*1000); const p=n=>('0'+n).slice(-2); return d.getUTCFullYear()+'-'+p(d.getUTCMonth()+1)+'-'+p(d.getUTCDate()); } function jdate(v){ if(!v) return ''; const s=String(v); const m=s.match(/(\d{4})-(\d{2})-(\d{2})/); if(m) return m[0]; const d=new Date(v); if(isNaN(d.getTime())) return s.slice(0,10); const j=new Date(d.getTime()+9*3600*1000); const p=n=>('0'+n).slice(-2); return j.getUTCFullYear()+'-'+p(j.getUTCMonth()+1)+'-'+p(j.getUTCDate()); } function toast(m){ const t=document.getElementById('toast'); t.textContent=m; t.style.display='block'; clearTimeout(window._tt); window._tt=setTimeout(()=>t.style.display='none',2200); } document.addEventListener('click',e=>{ if(!e.target.closest('.sug')){ const b=document.getElementById('prod-suglist'); if(b) b.style.display='none'; } }); /* ===== start ===== */ if('serviceWorker' in navigator) navigator.serviceWorker.register('sw.js').catch(()=>{}); (function start(){ loadUser(); if(currentUser){ enterApp(); } else { initLogin(); } })();
処理中…