{{ toast.text }}
📋 ใบชั่ง
กำลังสร้างใบชั่ง...
NS SCRAP
NS Solutions Thailand · โรงงานรีไซเคิลโลหะ
{{ slipDataJob.process_type === 'LOAD' ? 'ใบส่งสินค้า' : 'ใบรับสินค้า' }}
ใบชั่งน้ำหนัก
เลขที่: {{ slipDataJob.job_no }}
วันที่: {{ slipDate }}
ลูกค้า: {{ slipDataJob.partner_name || '-' }}
โกดัง: {{ getWhName(slipDataJob.warehouse_id) }}
ทะเบียนรถ: {{ slipPlate }}
# สินค้า ก่อนหัก หัก สุทธิ (กก.)
{{ idx+1 }}
{{ it.product_name }}
(เจือปน {{ fmt(it.impurity_kg) }} กก.)
{{ fmt(it.gross_kg || it.weight_kg) }} -{{ fmt((it.tare_kg||0) + (it.impurity_kg||0)) }} {{ fmt(it.weight_kg) }}
น้ำหนักก่อนหักรวม {{ fmt(slipGrossTotal) }} -{{ fmt(slipDeductTotal) }}
น้ำหนักสุทธิรวม / TOTAL: {{ fmt(slipTotal) }}
ผู้ชั่ง / Weigher
ลูกค้า / Customer
พิมพ์เมื่อ: {{ slipPrintedAt }}
🏭
รายงานการผลิต
โรงงานรีไซเคิลโลหะ · NS Solutions Thailand
📅 {{ reportDateLabel }}
🕐 {{ reportStartTime }} → {{ reportEndTime }}
⬇️
จำนวนสินค้าเข้า
{{ receiveCount }}
รายการ
⬆️
จำนวนสินค้าออก
{{ loadCount }}
รายการ
⚙️
งานผลิต
{{ productionCount }}
รายการ
📊
ผลรวม
{{ jobsOfSelectedDate.length }}
รายการ
🏢 {{ w.name }}
เข้า{{ w.receiveJobs || '-' }}
ออก{{ w.loadJobs || '-' }}
ผลิต{{ (w.baleJobs + w.sortJobs) || '-' }}
รวม {{ w.jobCount }}
📅 รายละเอียดการผลิต
โกดัง รายละเอียดข้อนงาน Text รายละเอียด / สินค้า เวลาเริ่ม เวลาจบ ระยะเวลา ผลผลิตจริง / กก. ประสิทธิภาพ %
รวมทั้งหมด {{ jobsOfSelectedDate.length }} {{ fmt(totalReportKg) }}
📋 รายงานพร้อมส่ง
ตรวจรูปก่อนยืนยันส่งเข้า LINE
Report preview
⏳ กำลังสร้างรูป...
💾 ดาวน์โหลดรูป
NS
NS Production
กำลังโหลดข้อมูล...
NS
📊 ภาพรวมวันนี้
{{ dateLabel }} · {{ dateShort }}
{{ jobsOfSelectedDate.filter(j=>j.status==='in_progress').length }} กำลังทำ
{{ jobsOfSelectedDate.length }}
งานทั้งหมด
{{ jobsOfSelectedDate.filter(j=>j.status==='completed').length }}
เสร็จแล้ว
{{ uniquePartnersOfDay }}
ลูกค้า
งานวันนี้ตามประเภท
{{ dailySummaryVisible.length }} ประเภท
📭
ยังไม่มีงานในวันนี้
กด ➕ ด้านล่างเพื่อเปิดงานใหม่
{{ ptype(row.type).icon }}
{{ row.jobs }} งาน
{{ ptype(row.type).name }}
{{ row.partnerCount }} ลูกค้า
รับ {{ fmtShort(row.output) }} กก.
{{ row.jobs }} งานออก
ส่ง {{ fmtShort(row.output) }} กก. · {{ row.partnerCount }} ตู้/เจ้า
{{ row.bales }} ก้อน
{{ fmtShort(row.output) }} กก.
{{ fmtShort(row.output) }} กก.
{{ row.jobs }} รอบ
{{ Math.round(row.totalMinutes) }}' / {{ row.targetMinutes }}' {{ row.timePct <= 100 ? '✅' : row.timePct <= 130 ? '⚠️' : '🔴' }}
⏱ ใช้เวลารวม {{ Math.round(row.totalMinutes) }}'
📋
รายงานสรุป
{{ dateShort }}
🏢 รวมทั้งโรง

วันนี้มีงาน {{ jobsOfSelectedDate.length }} งาน ใน {{ activeWhCount }} โกดัง กับลูกค้า {{ uniquePartnersOfDay }} เจ้า

  • 📥 รับสินค้าจาก {{ receivePartnersCount }} ลูกค้า · {{ fmtShort(receiveTotalKg) }} กก.
  • 🚛 ขึ้นออก {{ loadCount }} งาน · {{ loadPartnersCount }} ลูกค้า · {{ fmtShort(loadTotalKg) }} กก.
  • 📦 อัดก้อน {{ baleTotalCount }} ก้อน · {{ fmtShort(baleTotalKg) }} กก.
  • 🔀 คัดแยก {{ fmtShort(sortTotalKg) }} กก. · {{ sortCount }} รอบ
🏗 แยกรายโกดัง
— ไม่มีโกดังทำงาน —
🏗
{{ w.name }}
{{ w.code }} · {{ w.in_charge || '—' }}
{{ w.jobCount }} งาน
  • 📥 รับ {{ w.receivePartnerCount }} ลูกค้า · {{ fmtShort(w.receiveKg) }} กก.
  • 🚛 ขึ้น {{ w.loadJobs }} งาน · {{ w.loadPartnerCount }} ลูกค้า · {{ fmtShort(w.loadKg) }} กก.
  • 📦 อัดได้ {{ w.baleCount }} ก้อน · {{ fmtShort(w.baleKg) }} กก.
  • 🔀 คัดแยก {{ fmtShort(w.sortKg) }} กก.
รายโกดัง
{{ warehouses.length }} แห่ง · {{ activeWhCount }} ทำงาน
📊 Timeline งาน
รับ คัด อัด ขึ้น บด
{{ h }}:00
{{ w.code }}
{{ ptype(j.process_type).icon }}
⚡ Efficiency แต่ละโกดัง
{{ w.code }}
{{ effPct(w.id).toFixed(0) }}%
{{ effLabel(w.id) }}
📊 % = เวลาเป้า ÷ เวลาจริง × 100 (≥100% = เสร็จเร็วกว่าเป้า)
🚛 คิวรถเข้าส่ง
รถที่มาถึงแล้ว
{{ bookingConnected ? 'Live' : 'Offline' }}
📭
ยังไม่มีคิวในสถานะนี้
คิวจะ sync มาจากระบบจองอัตโนมัติ
โกดัง {{ b.warehouse_id }} ⏰ {{ b.arrived_at || b.scheduled_time || '-' }}
{{ bookingStatusLabel(b.status) }}
👤 {{ b.customer_name || '-' }}
🚚 {{ b.vehicle_type || '-' }} · {{ b.vehicle_plate || '-' }}
👨‍💼 {{ b.sale_name || '-' }} ⚖️ {{ fmt(b.total_qty) }} กก. 💰 ฿{{ fmt(b.total_value) }}
♻️ {{ i.product_name }} · {{ i.category }} {{ fmt(i.estimated_qty) }} {{ i.unit || 'กก.' }}
+ อีก {{ b.booking_data.items.length - 3 }} รายการ
📝 {{ b.note }}
🔗 Link job: #{{ b._linkedJob.job_no }} {{ statusLabel(b._linkedJob.status) }}
📭
ไม่มีงานในวันที่เลือก
กด ➕ เพื่อเปิดงานใหม่
{{ ptype(j.process_type).icon }}
{{ ptype(j.process_type).name }} {{ statusLabel(j.status) }}
{{ jobLabel(j) }}
🤝 {{ j.partner_name }}
{{ getWhName(j.warehouse_id) }} · {{ j.supervisor_name }}
{{ j.process_type==='BALE' ? j.bale_count : fmtShort(j.output_kg) }}
{{ j.process_type==='BALE' ? 'ก้อน' : 'กก.' }}
⏱ {{ Math.round(liveElapsed(j)/60) }}'/{{ j.target_minutes }}'
⏱ {{ Math.round(liveElapsed(j)/60) }}'
{{ detailWh.code }}
{{ detailWh.name }}
หัวหน้า: {{ detailWh.in_charge || '—' }}
ไม่มีงานในโกดังนี้สำหรับวันที่เลือก
{{ ptype(row.type).icon }}
{{ ptype(row.type).name }}
{{ row.jobs }} งาน · {{ row.partnerCount }} เจ้า
{{ Math.round(row.totalMinutes) }}' / เป้า {{ row.totalTargetMinutes }}' {{ row.totalMinutes <= row.totalTargetMinutes ? '✅ ทันเวลา' : '🔴 ช้า' }}
⏱ ใช้เวลารวม {{ Math.round(row.totalMinutes) }}'
📜 รายการงาน ({{ jobsInWh(detailWhId).length }})
— ไม่มีงาน —
เลือกวันที่ดูรายงาน
🌐 รวมทั้งหมด
รวมทุกโกดัง ทุกวัน ({{ allTimeSummary.totalDays }} วัน · {{ allTimeSummary.totalJobs }} งาน)
📥 รับสินค้า
รวมน้ำหนัก
{{ fmtShort(allTimeSummary.totalReceiveKg) }}กก.
🔀 คัดแยก
รวมน้ำหนัก
{{ fmtShort(allTimeSummary.totalSortKg) }}กก.
📦 อัดก้อน
รวมจำนวน
{{ fmt(allTimeSummary.totalBales) }}ก้อน
🚛 ขึ้นสินค้า
รวมน้ำหนัก
{{ fmtShort(allTimeSummary.totalLoadKg) }}กก.
🤝 ผู้ส่ง/ลูกค้า
ไม่ซ้ำเจ้า
{{ allTimeSummary.uniquePartners }}เจ้า
NS
ติดตั้งแอป NS Scrap
เปิดเร็วกว่า ไม่ต้องเปิด browser
📱 สำหรับ iPhone / iPad
ทำตาม 3 ขั้นตอนนี้ที่ Safari:
1
กดปุ่ม ⬆️ Share ที่แถบล่าง
รูปสี่เหลี่ยมมีลูกศรชี้ขึ้น — อยู่กลางจอด้านล่าง
2
เลื่อนลงหา ➕ Add to Home Screen
"เพิ่มไปยังหน้าจอโฮม" — อยู่ในรายการเมนู
3
กด Add มุมขวาบน
Icon NS เขียวจะปรากฏที่หน้าจอโฮม — กดเปิดได้เลย
⚠️ ต้องใช้ Safari เท่านั้น — Chrome/Firefox บน iOS ติดตั้งไม่ได้
📱 สำหรับ Android
ปกติจะมี popup ติดตั้งโผล่ขึ้นมา — ถ้าไม่มี:
1
กดเมนู มุมขวาบน Chrome
2
เลือก Install app หรือ Add to Home screen
3
กด Install
💻 บน Desktop (Chrome/Edge)
กด icon ⬇️ ที่แถบ URL ขวาสุด แล้วเลือก Install
💡 แนะนำเปิดบนมือถือเพื่อใช้งานเต็มที่
💾 ดาวน์โหลด Icon
⚙️ ตั้งค่า
ติดตั้งแอปแล้ว — เปิดจาก Home Screen ได้เลย
⏱ เป้าเวลามาตรฐาน /งาน
เฉพาะรับสินค้า + ขึ้นสินค้า (คัดแยก/อัดก้อนไม่จำกัดเวลา)
{{ pt.icon }}
{{ pt.name }}
นาที
🏗 โกดัง ({{ warehouses.length }})
⚙️ เครื่องจักร ({{ machines.length }})
📦 สินค้า ({{ products.length }})
🔗 การเชื่อมต่อ
📤
Push ข้อมูลเข้า Google Sheet
ทุกการชั่ง + สรุปงาน → Sheet อัตโนมัติ
{{ sheetSyncResult }}
📖 วิธีตั้ง Apps Script
  1. สร้าง Google Sheet ใหม่
  2. Extensions → Apps Script → paste โค้ดจาก google_apps_script_sync.js
  3. Deploy → New deployment → Web app
  4. Execute as: Me · Who has access: Anyone
  5. Copy URL (ลงท้าย /exec) → paste ในช่องด้านบน → ทดสอบ
📊
Sync สินค้าจาก Google Sheet
Auto ทุก 6 ชม. · {{ lastSyncProducts ? 'ล่าสุด: ' + fmtAgo(lastSyncProducts) : 'ยังไม่เคย sync' }}
{{ syncResult }}
📖 วิธีตั้งค่า Google Sheet
  1. สร้าง Google Sheet — column: name, category, active
  2. File → Share → Publish to web → Comma-separated values (.csv) → Publish
  3. Copy URL (ลงท้าย /pub?output=csv)
  4. Terminal: echo "URL" | npx wrangler@latest secret put PRODUCTS_SHEET_CSV_URL
  5. กด "Sync ตอนนี้" หรือรอ cron ทุก 6 ชม.
{{ whEditorIsNew ? '+ โกดังใหม่' : '✏️ แก้ไขโกดัง' }}
🎯 เป้าน้ำหนัก/ก้อน /วัน
เฉพาะคัดแยก + อัดก้อน (รับ/ขึ้น เทียบเฉพาะเวลา)
{{ mcEditorIsNew ? '+ เครื่องใหม่' : '✏️ แก้ไขเครื่อง' }}
{{ pdEditorIsNew ? '+ สินค้าใหม่' : '✏️ แก้ไขสินค้า' }}
📦
📲 LINE Notifications
เด้งเข้ากลุ่ม LINE เมื่อเปิด/ปิดงาน
⚠️ Token เก็บใน Cloudflare Worker — ไม่ใส่ใน frontend
📖 วิธีตั้งค่า
  1. สร้าง LINE Bot ที่ developers.line.biz
  2. หา Group ID ผ่าน webhook.site
  3. Deploy Cloudflare Worker (ใส่ LINE_TOKEN + LINE_GROUP_ID ใน Variables)
  4. วาง URL Worker ในช่องด้านบน
  5. กดทดสอบส่งข้อความ
📄 ดูคู่มือเต็มใน LINE_SETUP_GUIDE.md
💬 ประวัติข้อความล่าสุด {{ lineMessages.length }} ข้อความ
ยังไม่มีข้อความ — เปิด/ปิด JOB หรือกดทดสอบ
NS
{{ lineConfig.groupName }}
{{ msg.text }}
{{ msg.time }}
✓ ส่งแล้ว ⏳ กำลังส่ง ✗ ส่งไม่ได้ ⊘ ปิดอยู่
{{ msg.error }}
✏️ แก้ไขผลผลิต ✅ ปิดงาน — กรอกผลผลิต
{{ ptype(finishJob_data.process_type).icon }} {{ jobLabel(finishJob_data) }}
ใช้เวลา {{ Math.round((finishJob_data._elapsed_snapshot||0)/60) }} นาที
{{ jobEditor.id ? 'แก้ไขงาน' : 'งานใหม่' }}
ประเภทงาน
{{ jobEditor.worker_count || 1 }} คน
default {{ ptype(jobEditor.process_type)?.default_minutes }}'
+ หมายเหตุ (เลือก)
+ เพิ่มสินค้าใหม่ในระบบ
📦
บันทึกแล้ว!
{{ savedConfirmText }}
กก.
เลือกสินค้า
{{ addItemData.product_category || 'อื่นๆ' }}
✓ {{ addItemData.product_name }}
ไม่มีสินค้าในหมวดนี้ — กด "+ เพิ่มสินค้าใหม่"
น้ำหนัก
กก.
กก.
{{ addItemData.impurity_mode==='pct' ? '%' : 'กก.' }}
= {{ addItemImpurityKg.toFixed(2) }} กก. ({{ addItemData.impurity_input }}% ของ {{ fmt(addItemData.gross_kg||0) }})
น้ำหนักสุทธิ
{{ addItemNetKg.toFixed(2) }}
กก.
{{ fmt(addItemData.gross_kg||0) }} - {{ fmt((addItemData.tare_kg||0) + (addItemData.impurity_kg||0)) }}
📷 รูปสินค้า ({{ addItemData._previewPhotos.length }})
⏳ {{ addItemUploadStatus }}
{{ photoViewerIndex + 1 }} / {{ jobPhotos.length }}
{{ photoViewerData.kind==='arrival' ? '📥 รับสินค้า' : photoViewerData.kind==='loading' ? '🚛 ขาออก' : '📄 อื่นๆ' }} {{ new Date(photoViewerData.taken_at).toLocaleString('th-TH', { day:'numeric', month:'short', hour:'2-digit', minute:'2-digit' }) }} {{ photoViewerData.taken_by || '-' }}
{{ jobDetail.job_no }}
{{ ptype(jobDetail.process_type).icon }} {{ ptype(jobDetail.process_type).name }}
{{ jobLabel(jobDetail) }}
{{ getWhName(jobDetail.warehouse_id) }} · {{ jobDetail.supervisor_name }}
🤝 {{ jobDetail.partner_name }}
เวลาที่ใช้
{{ formatDuration(liveElapsed(jobDetail)) }}
เป้า {{ jobDetail.target_minutes }} นาที {{ jobTimePct(jobDetail).toFixed(0) }}%
สถานะ: {{ statusLabel(jobDetail.status) }}
ผลผลิต
{{ fmt(jobDetail.bale_count) }} ก้อน · {{ fmt(jobDetail.output_kg) }} กก.
{{ fmt(jobDetail.output_kg) }} กก. คัดแยก
{{ fmt(jobDetail.output_kg) }} กก.
📦 รายการสินค้า ({{ regularItems(jobDetail).length }})
รวม {{ fmt(outputItemsTotal(jobDetail)) }} กก.
ยังไม่มีสินค้า — กด "+ เพิ่มสินค้า"
{{ item.product_name }}
รวม {{ fmt(item.gross_kg) }} · หัก {{ fmt(item.tare_kg) }} · เจือปน {{ fmt(item.impurity_kg) }}
{{ fmt(item.weight_kg) }}
กก.
🚫 สิ่งเจือปนรวม
{{ fmt(impurityTotalKg(jobDetail)) }} กก.
🚫 {{ item.product_name }}
{{ fmt(item.weight_kg) }}
กก.
หักจากสินค้า: {{ fmt(impuritySumFromItems(jobDetail)) }} กก.
(impurity ในรายการสินค้า ถูกหักออกจาก net แล้ว)
หมายเหตุ
{{ jobDetail.notes }}
📷 รูปภาพ ({{ jobPhotos.length }})
รับ {{ jobPhotos.filter(p=>p.kind==='arrival').length }} · ส่ง {{ jobPhotos.filter(p=>p.kind==='loading').length }} · อื่นๆ {{ jobPhotos.filter(p=>p.kind==='other').length }}
📥รับสินค้า
🚛ขาออก
📄อื่นๆ
{{ photoUploadStatus }}
ยังไม่มีรูป — กดปุ่มด้านบนเพื่อถ่าย
{{ p.kind==='arrival' ? '📥' : p.kind==='loading' ? '🚛' : '📄' }}
{{ new Date(p.taken_at).toLocaleTimeString('en-GB',{hour:'2-digit',minute:'2-digit'}) }}
ชื่ออัลบั้ม
{{ albumTitle(jobDetail) }}
✓ ส่ง album แล้ว · {{ fmtAgo(jobDetail.album_sent_at) }}
✓ ส่ง PDF แล้ว · {{ fmtAgo(jobDetail.pdf_sent_at) }}
💡 หลังส่ง LINE: เลือกรูปทุกใบในกลุ่ม → "บันทึก" → "เพิ่มในอัลบั้ม"