Files
pfm-ocr/backend/sources/comparison_side_by_side.html
T
Rafhan Mazaya FathurrahmanandClaude Sonnet 5 e60ab63154 Adopt agents-settings kit, ship Product/SKU scan models, harden auth, verify OCR accuracy
Backend (app-pfm-ocr-v2/backend):
- Product/SKU scan feature complete: trained DINOv2 index (118 reference
  photos, 16 SKU classes) and YOLO classifier (83.3% top-1 val accuracy),
  fixed scripts/install-pipeline.sh (was missing ultralytics/torch), fully
  browser-verified end-to-end on /scan-pfm. Mobile m-scan-pfm page cancelled
  (Flutter app handles mobile; web UI is desktop-only for pipeline testing).
- Fixed a real data-loss bug: Save Ground Truth (scan-pfm and the DO-flow's
  manual-label) was silently writing into the pfm-web-app container's
  ephemeral filesystem instead of the host, because /sources wasn't
  bind-mounted in docker-compose.yml. Added the mount, recovered an
  orphaned entry.
- accounts.password is now bcrypt-hashed (bcryptjs, idempotent migration
  in db/init.ts) instead of plaintext; login route compares hashes.
- /api/v1/documents/* (list, PUT, upload) now enforces real 401 auth,
  matching what the Flutter client already sends. The "classic" routes
  deliberately stay open — they're dev-only web UI with no login flow and
  won't exist in production.
- OCR accuracy investigated end-to-end: real baseline is 95.10% overall
  (target met; accuracy_report.md was stale at 75.04%, now flagged). Fixed
  one genuine parser.ts bug (SO/DO field duplication in the global fallback
  regex); remaining gaps are OCR/layout-model limitations, not parser bugs.
- Adopted a standalone copy of the fhanyuh/agents-settings e/n workflow
  scoped to backend/ (AGENTS.md Part A/B split, SKILLS.md, plans/, docs/),
  independent of the root copy which now covers Flutter only.
- next-implementation.md deleted; content folded into
  backend/plans/next-enhancements.md for traceability.

Root:
- Adopted fhanyuh/agents-settings kit (AGENTS.md, SKILLS.md, plans/,
  docs/feature-list.md), scoped to the Flutter app only.
- Pending documents queue now persists to Hive (lib/core/storage) instead
  of memory-only, surviving an app kill mid-upload.

Removed backend_backup/ (stale Express/Prisma prototype, superseded by
pfm-web-app) and the completed plans/next-enhancement-plan.md checklist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 11:56:32 +07:00

4161 lines
83 KiB
HTML

<title>Manifest Audit — AI OCR vs Ground Truth</title>
<style>
:root {
--paper: #F4F6F1;
--band: #E2EBDF;
--card: #FFFFFF;
--line: #C9D3C4;
--ink: #1E2622;
--ink-dim: #56635A;
--accent: #2B4C7E;
--accent-dim: #4A6A9C;
--good: #2F7D4F;
--good-bg: #E4F1E8;
--bad: #B23A32;
--bad-bg: #FBE8E6;
--warn: #B9791F;
--warn-bg: #FBF0DE;
--focus: #2B4C7E;
}
@media (prefers-color-scheme: dark) {
:root {
--paper: #121815;
--band: #1A2320;
--card: #171F1B;
--line: #33403A;
--ink: #E7EDE7;
--ink-dim: #9CAB9F;
--accent: #7FA6D9;
--accent-dim: #6089BE;
--good: #5FBE86;
--good-bg: #16301F;
--bad: #E2726A;
--bad-bg: #391B19;
--warn: #E0AA55;
--warn-bg: #362809;
--focus: #7FA6D9;
}
}
:root[data-theme="dark"] {
--paper: #121815;
--band: #1A2320;
--card: #171F1B;
--line: #33403A;
--ink: #E7EDE7;
--ink-dim: #9CAB9F;
--accent: #7FA6D9;
--accent-dim: #6089BE;
--good: #5FBE86;
--good-bg: #16301F;
--bad: #E2726A;
--bad-bg: #391B19;
--warn: #E0AA55;
--warn-bg: #362809;
--focus: #7FA6D9;
}
:root[data-theme="light"] {
--paper: #F4F6F1;
--band: #E2EBDF;
--card: #FFFFFF;
--line: #C9D3C4;
--ink: #1E2622;
--ink-dim: #56635A;
--accent: #2B4C7E;
--accent-dim: #4A6A9C;
--good: #2F7D4F;
--good-bg: #E4F1E8;
--bad: #B23A32;
--bad-bg: #FBE8E6;
--warn: #B9791F;
--warn-bg: #FBF0DE;
--focus: #2B4C7E;
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--paper);
color: var(--ink);
font-family: ui-sans-serif, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
line-height: 1.45;
-webkit-font-smoothing: antialiased;
}
.mono {
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, "Roboto Mono", monospace;
font-variant-numeric: tabular-nums;
}
a { color: var(--accent); }
:focus-visible {
outline: 2px solid var(--focus);
outline-offset: 2px;
}
.wrap {
max-width: 960px;
margin: 0 auto;
padding: 28px 20px 80px;
}
header.top {
padding-bottom: 20px;
border-bottom: 1px solid var(--line);
margin-bottom: 24px;
}
.eyebrow {
font-size: 11.5px;
font-weight: 600;
letter-spacing: 0.09em;
text-transform: uppercase;
color: var(--accent-dim);
margin: 0 0 8px;
}
h1 {
font-size: 27px;
font-weight: 700;
letter-spacing: -0.01em;
margin: 0 0 8px;
text-wrap: balance;
}
.lede {
color: var(--ink-dim);
font-size: 14.5px;
max-width: 62ch;
margin: 0;
}
.lede code {
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
background: var(--band);
padding: 1px 5px;
border-radius: 3px;
font-size: 0.92em;
}
/* ---- Summary strip ---- */
.summary {
display: grid;
grid-template-columns: auto 1fr;
gap: 24px;
background: var(--card);
border: 1px solid var(--line);
border-radius: 10px;
padding: 22px 24px;
margin-bottom: 28px;
}
.headline-stat {
display: flex;
flex-direction: column;
justify-content: center;
padding-right: 24px;
border-right: 1px solid var(--line);
min-width: 132px;
}
.headline-stat .num {
font-size: 44px;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1;
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
}
.headline-stat .label {
font-size: 12px;
color: var(--ink-dim);
margin-top: 6px;
}
.headline-stat .sub {
font-size: 12px;
color: var(--ink-dim);
margin-top: 2px;
}
.field-bars {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 10px 20px;
align-content: center;
}
.field-bar-row {
display: grid;
grid-template-columns: 78px 1fr 46px;
align-items: center;
gap: 8px;
font-size: 12.5px;
}
.field-bar-row .fname {
color: var(--ink-dim);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.field-bar-row .track {
height: 6px;
background: var(--band);
border-radius: 3px;
overflow: hidden;
}
.field-bar-row .fill {
height: 100%;
border-radius: 3px;
}
.field-bar-row .pct {
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
text-align: right;
font-weight: 600;
}
.sev-good .fill { background: var(--good); }
.sev-good .pct { color: var(--good); }
.sev-warn .fill { background: var(--warn); }
.sev-warn .pct { color: var(--warn); }
.sev-bad .fill { background: var(--bad); }
.sev-bad .pct { color: var(--bad); }
/* ---- Toolbar ---- */
.toolbar {
position: sticky;
top: 0;
z-index: 5;
display: flex;
gap: 10px;
align-items: center;
background: var(--paper);
padding: 10px 0;
margin-bottom: 4px;
border-bottom: 1px solid var(--line);
}
.search {
flex: 1;
display: flex;
align-items: center;
gap: 8px;
background: var(--card);
border: 1px solid var(--line);
border-radius: 7px;
padding: 8px 12px;
}
.search svg { flex: none; color: var(--ink-dim); }
.search input {
border: none;
background: transparent;
color: var(--ink);
font-size: 13.5px;
width: 100%;
outline: none;
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
}
.search input::placeholder { color: var(--ink-dim); }
.toggle {
display: flex;
align-items: center;
gap: 7px;
background: var(--card);
border: 1px solid var(--line);
border-radius: 7px;
padding: 8px 12px;
font-size: 13px;
cursor: pointer;
user-select: none;
color: var(--ink);
white-space: nowrap;
}
.toggle input { accent-color: var(--accent); width: 14px; height: 14px; }
.count {
font-size: 12px;
color: var(--ink-dim);
white-space: nowrap;
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
}
/* ---- File cards ---- */
.files { margin-top: 18px; display: flex; flex-direction: column; gap: 10px; }
details.card {
background: var(--card);
border: 1px solid var(--line);
border-radius: 9px;
overflow: hidden;
}
details.card[open] summary { border-bottom: 1px solid var(--line); }
summary {
list-style: none;
cursor: pointer;
padding: 13px 16px;
display: flex;
align-items: center;
gap: 12px;
}
summary::-webkit-details-marker { display: none; }
summary .chevron {
flex: none;
color: var(--ink-dim);
transition: transform 0.15s ease;
}
details[open] summary .chevron { transform: rotate(90deg); }
summary .fname {
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
.pill {
flex: none;
font-size: 11px;
font-weight: 600;
padding: 3px 9px;
border-radius: 99px;
white-space: nowrap;
}
.pill-good { background: var(--good-bg); color: var(--good); }
.pill-bad { background: var(--bad-bg); color: var(--bad); }
.card-body { padding: 4px 16px 18px; }
.subhead {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--ink-dim);
margin: 14px 0 8px;
}
.table-scroll { overflow-x: auto; }
table {
width: 100%;
border-collapse: collapse;
font-size: 12.8px;
}
th {
text-align: left;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--ink-dim);
padding: 6px 10px;
border-bottom: 1px solid var(--line);
white-space: nowrap;
}
td {
padding: 7px 10px;
font-family: ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
white-space: nowrap;
max-width: 260px;
overflow: hidden;
text-overflow: ellipsis;
}
td.wrap-cell { white-space: normal; }
td.label-cell {
font-family: ui-sans-serif, "Segoe UI", Arial, sans-serif;
color: var(--ink-dim);
font-size: 12.3px;
}
tr.band-row { background: var(--band); }
tr.mismatch td.val-cell { color: var(--bad); }
.status-icon { font-size: 12px; }
.empty-val { color: var(--ink-dim); font-style: italic; }
footer {
margin-top: 32px;
padding-top: 16px;
border-top: 1px solid var(--line);
font-size: 12px;
color: var(--ink-dim);
}
.no-results {
text-align: center;
padding: 40px 0;
color: var(--ink-dim);
font-size: 13.5px;
display: none;
}
@media (max-width: 640px) {
.summary { grid-template-columns: 1fr; }
.headline-stat { border-right: none; border-bottom: 1px solid var(--line); padding-right: 0; padding-bottom: 16px; }
}
</style>
<div class="wrap">
<header class="top">
<p class="eyebrow">Manifest Audit &middot; Delivery Order OCR</p>
<h1>AI Extraction vs. Ground Truth — Side-by-Side</h1>
<p class="lede">37 delivery-order photos, field-by-field, generated live from <code>scripts/accuracy-check.mts --dump-json</code> (Layer 3 Final vs manual ground truth). Supersedes the old 14-image <code>comparison_side_by_side.md</code> run.</p>
</header>
<section class="summary">
<div class="headline-stat">
<span class="num">95.1%</span>
<span class="label">overall match rate</span>
<span class="sub">perfect on Customer, Store & Alamat (account-assigned, not OCR)</span>
</div>
<div class="field-bars" id="fieldBars"></div>
</section>
<div class="toolbar">
<div class="search">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>
<input id="searchBox" type="text" placeholder="Cari nama file..." aria-label="Cari nama file" />
</div>
<label class="toggle">
<input type="checkbox" id="onlyIssues" />
Hanya file bermasalah
</label>
<span class="count" id="resultCount"></span>
</div>
<div class="files" id="fileList"></div>
<p class="no-results" id="noResults">Tidak ada file yang cocok.</p>
<footer>
Sumber: <code class="mono">scripts/accuracy-check.mts --dump-json</code> terhadap 37 foto di <code class="mono">test-images/</code>, dijalankan live pada commit terkini. Store &amp; Alamat kini di-assign per akun (<code class="mono">accounts.kode_toko → store_master</code>), bukan hasil OCR — lihat <code class="mono">accuracy_report.md</code> untuk detail arsitekturnya.
</footer>
</div>
<script>
const FIELD_STATS = [["PO Number",34,37],["SO Number",32,37],["DO Number",34,37],["Date",33,37],["Customer Name",37,37],["Plat Nomor",25,37],["Store Name",37,37],["Alamat",37,37],["Item kodeBarang",125,126],["Item namaBarang",120,126],["Item banyak",123,126],["Item jumlah",122,126]];
function severity(pct) {
if (pct >= 90) return "good";
if (pct >= 70) return "warn";
return "bad";
}
const barsEl = document.getElementById("fieldBars");
FIELD_STATS.forEach(([name, match, total]) => {
const pct = (match / total) * 100;
const sev = severity(pct);
const row = document.createElement("div");
row.className = "field-bar-row sev-" + sev;
row.innerHTML = `
<span class="fname">${name}</span>
<span class="track"><span class="fill" style="width:${pct}%"></span></span>
<span class="pct">${pct.toFixed(0)}%</span>
`;
barsEl.appendChild(row);
});
// field format: [label, aiValue, manualValue, match]
// item format: [sku, aiBanyak, manualBanyak, banyakMatch, aiJumlah, manualJumlah, jumlahMatch, aiNama, manualNama, namaMatch]
const FILES = [
{
"name": "do-001.jpg",
"fields": [
[
"PO Number",
"PO/26/0000230828",
"PO/26/0000230828",
true
],
[
"SO Number",
"1691960321",
"1691960321",
true
],
[
"DO Number",
"1659980277",
"1659980277",
true
],
[
"Date",
"23 June 2026",
"23 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9427 UXT",
"B 9427 UXT",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11310014",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11620056",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBL (FILLET PAHA) 1 KG(*)",
"SBL (FILLET PAHA) 1 KG(*)",
true
],
[
"11690053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBB (FILLET DADA )1 KG(*)",
"SBB (FILLET DADA )1 KG(*)",
true
],
[
"11720055",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FULL WING FROZ PACK 1 KG(*)",
"FULL WING FROZ PACK 1 KG(*)",
true
]
]
},
{
"name": "do-002.jpg",
"fields": [
[
"PO Number",
"PO/26/0000178435",
"PO/26/0000178435",
true
],
[
"SO Number",
"1691908676",
"1691908676",
true
],
[
"DO Number",
"1659932080",
"1659932080",
true
],
[
"Date",
"15 May 2026",
"15 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9723 CXS",
"B 9723 CXS",
true
],
[
"Store Name",
"PM TAKTAKAN SERANG",
"PM TAKTAKAN SERANG",
true
],
[
"Alamat",
"JL. RAYA TAKTAKAN NO. 1 G, KEL. LONTAR BARU, KEC. SERANG, SERANG",
"JL. RAYA TAKTAKAN NO. 1 G, KEL. LONTAR BARU, KEC. SERANG, SERANG",
true
]
],
"items": [
[
"13012205",
"1 BOX",
"1 BOX",
true,
"15 PAC",
"15 PAC",
true,
"ASIMO SOSIS AYAM KOMBINASI 375 GR (PAC)",
"ASIMO SOSIS AYAM KOMBINASI 375 GR (PAC)",
true
]
]
},
{
"name": "do-003.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241938",
"PO/26/0000241938",
true
],
[
"SO Number",
"1691972227",
"1691972227",
true
],
[
"DO Number",
"1659990561",
"1659990561",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9257 JXR",
"B 9257 JXR",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"21002601",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"Prima Nasi Spicy Chick Sambal Geprek COPY",
"",
false
]
]
},
{
"name": "do-004.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241938",
"PO/26/0000241938",
true
],
[
"SO Number",
"1691972227",
"1691972227",
true
],
[
"DO Number",
"1659990561",
"1659990561",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9257 JXR",
"B 9257 JXR",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"21002601",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"Prima Nasi Spicy Chick Sambal Geprek COPY",
"",
false
]
]
},
{
"name": "do-005.jpg",
"fields": [
[
"PO Number",
"PO/26/0000238723",
"PO/26/0000238723",
true
],
[
"SO Number",
"Not Found",
"1691969268",
false
],
[
"DO Number",
"Not Found",
"1659987802",
false
],
[
"Date",
"Not Found",
"27 June 2026",
false
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9715 UXU",
"B 9715 UXU",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11310014",
"3 KRG",
"3 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11660050",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
],
[
"11690053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBB (FILLET DADA )1 KG(*)",
"SBB (FILLET DADA )1 KG(*)",
true
],
[
"11720055",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FULL WING FROZ PACK 1 KG(*)",
"FULL WING FROZ PACK 1 KG(*)",
true
],
[
"11750050",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FILLET MITRA 1 KG(*)",
"FILLET MITRA 1 KG(*)",
true
]
]
},
{
"name": "do-006.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241302",
"PO/26/0000241302",
true
],
[
"SO Number",
"1691972284",
"1691972284",
true
],
[
"DO Number",
"1659990583",
"1659990583",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9256 JXR",
false
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"12010509",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
true
],
[
"12010512",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"CHAMP NUGGET AYAM 900 GR/PAC",
"CHAMP NUGGET AYAM 900 GR/PAC",
true
],
[
"12010519",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"CHAMP NUGGET STICK 900 GR/PAC",
"CHAMP NUGGET STICK 900 GR/PAC",
true
],
[
"12012501",
"1 BOX",
"1 BOX",
true,
"20 PAC",
"20 PAC",
true,
"AKUMO CHICKEN NAGET 250 GR",
"AKUMO CHICKEN NAGET 250 GR",
true
],
[
"12012503",
"1 BOX",
"1 BOX",
true,
"5 PAC",
"5 PAC",
true,
"AKUMO CHICKEN NUGGET 1000 GR",
"AKUMO CHICKEN NUGGET 1000 GR",
true
],
[
"13010116",
"1 BOX",
"1 BOX",
true,
"20 PAC",
"20 PAC",
true,
"FIESTA SSG ORIGINAL 300 GR",
"FIESTA SSG ORIGINAL 300 GR",
true
],
[
"13010514",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CHICK SSG 1000 GR",
"CHAMP CHICK SSG 1000 GR",
true
],
[
"13030502",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CHICK MEATBALL 500 GR",
"CHAMP CHICK MEATBALL 500 GR",
true
]
]
},
{
"name": "do-007.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241302",
"PO/26/0000241302",
true
],
[
"SO Number",
"1691972284",
"1691972284",
true
],
[
"DO Number",
"1659990583",
"1659990583",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9256 JXR",
"B 9256 JXR",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"15040101",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA BATTER COATED 500 GR",
"FIESTA BATTER COATED 500 GR",
true
]
]
},
{
"name": "do-008.jpg",
"fields": [
[
"PO Number",
"PO/26/0000170727",
"PO/26/0000190929",
false
],
[
"SO Number",
"1071721209",
"1691921200",
false
],
[
"DO Number",
"1057745004",
"1659943004",
false
],
[
"Date",
"25 May 2026",
"25 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9536 UCO",
false
],
[
"Store Name",
"PM MUSTIKA MEDIA",
"PM MUSTIKA MEDIA",
true
],
[
"Alamat",
"RUKO GRAHA MUSTIKA MEDIA, JL. KP LUBANG BUAYA, RT.001, RW.003, KEL. LUBANG BUAYA, KEC. SETU, BEKASI 17320",
"RUKO GRAHA MUSTIKA MEDIA, JL. KP LUBANG BUAYA, RT.001, RW.003, KEL. LUBANG BUAYA, KEC. SETU, BEKASI 17320",
true
]
],
"items": [
[
"13030502",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CHICK MEATBALL 500 GR",
"CHAMP CHICK MEATBALL 500 GR",
true
]
]
},
{
"name": "do-009.jpg",
"fields": [
[
"PO Number",
"Not Found",
"PO/26/0000241938",
false
],
[
"SO Number",
"Not Found",
"1691972227",
false
],
[
"DO Number",
"Not Found",
"1659990561",
false
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9257 JXR",
"B 9257 JXR",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"21002601",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"Prima Nasi Spicy Chick Sambal Geprek COPY",
"",
false
]
]
},
{
"name": "do-010.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241303",
"PO/26/0000241303",
true
],
[
"SO Number",
"1691972285",
"1691972285",
true
],
[
"DO Number",
"1659990584",
"1659990584",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9256 JXR",
false
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"21010104",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"NEW FIESTA BEEF RENDANG W RICE 320GR (PAC)",
"NEW FIESTA BEEF RENDANG W RICE 320GR (PAC)",
true
]
]
},
{
"name": "do-011.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241304",
"PO/26/0000241304",
true
],
[
"SO Number",
"2271289510",
"2271289510",
true
],
[
"DO Number",
"2272290022",
"2272290022",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9836 UCH",
false
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11048006",
"2 BOX",
"2 BOX",
true,
"30 PAC",
"30 PAC",
true,
"BEBEK PARTING-NEW(*)",
"",
false
]
]
},
{
"name": "do-012.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241304",
"PO/26/0000241304",
true
],
[
"SO Number",
"2271289510",
"2271289510",
true
],
[
"DO Number",
"2272290022",
"2272290022",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9836 UCH",
false
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11048000",
"2 BOX",
"2 BOX",
true,
"30 PAC",
"30 PAC",
true,
"PARTING 150 - 160 GR FRZ PACK",
"",
false
]
]
},
{
"name": "do-013.jpg",
"fields": [
[
"PO Number",
"PO/26/0000230199",
"PO/26/0000230199",
true
],
[
"SO Number",
"1691960321",
"1691960321",
true
],
[
"DO Number",
"1659980277",
"1659980277",
true
],
[
"Date",
"23 June 2026",
"23 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9427 UXT",
"B 9427 UXT",
true
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11310014",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11620056",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBL (FILLET PAHA) 1 KG(*)",
"SBL (FILLET PAHA) 1 KG(*)",
true
],
[
"11690053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBB (FILLET DADA )1 KG(*)",
"SBB (FILLET DADA )1 KG(*)",
true
],
[
"11720055",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FULL WING FROZ PACK 1 KG(*)",
"FULL WING FROZ PACK 1 KG(*)",
true
]
]
},
{
"name": "do-014.jpg",
"fields": [
[
"PO Number",
"PO/26/0000241301",
"PO/26/0000241301",
true
],
[
"SO Number",
"1691972419",
"1691972419",
true
],
[
"DO Number",
"1659990664",
"1659990664",
true
],
[
"Date",
"30 June 2026",
"30 June 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9256 JXR",
false
],
[
"Store Name",
"PX HEAD OFFICE ANCOL",
"PX HEAD OFFICE ANCOL",
true
],
[
"Alamat",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
"JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA",
true
]
],
"items": [
[
"11140062",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11150064",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310014",
"3 KRG",
"3 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11600053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"BONELESS LEG FROZEN 1 KG(*)",
"BONELESS LEG FROZEN 1 KG(*)",
true
],
[
"11650053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"PAHA ATAS 1 KG(*)",
"PAHA ATAS 1 KG(*)",
true
],
[
"11750050",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FILLET MITRA 1 KG(*)",
"FILLET MITRA 1 KG(*)",
true
]
]
},
{
"name": "do-015.jpg",
"fields": [
[
"PO Number",
"PO/26/0000150175",
"PO/26/0000150175",
true
],
[
"SO Number",
"1691879196",
"1691879196",
true
],
[
"DO Number",
"1659905109",
"1659905109",
true
],
[
"Date",
"23 April 2026",
"23 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9948 VCC",
"B 9948 VCC",
true
],
[
"Store Name",
"PM PANDU RAYA",
"PM PANDU RAYA",
true
],
[
"Alamat",
"JL. PANDU RAYA/ H. ACHMAD ADNAWIJAYA NO. 68, RT. 001, RW. 015, KEL. TEGALGUNDIL, KEC. BOGOR UTARA, BOGOR",
"JL. PANDU RAYA/ H. ACHMAD ADNAWIJAYA NO. 68, RT. 001, RW. 015, KEL. TEGALGUNDIL, KEC. BOGOR UTARA, BOGOR",
true
]
],
"items": [
[
"17210109",
"1 BOX",
"1 BOX",
true,
"8 PAC",
"8 PAC",
true,
"FIESTA RTS B/BULGOGI 300GR/PAC",
"FIESTA RTS B/BULGOGI 300GR/PAC",
true
]
]
},
{
"name": "do-016.jpg",
"fields": [
[
"PO Number",
"PO/26/0000142266",
"PO/26/0000142266",
true
],
[
"SO Number",
"1691871022",
"1691871022",
true
],
[
"DO Number",
"1659897809",
"1659897809",
true
],
[
"Date",
"17 April 2026",
"17 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9599 CXS",
"B 9599 CXS",
true
],
[
"Store Name",
"PM NEW BINTARO SEKTOR 5",
"PM NEW BINTARO SEKTOR 5",
true
],
[
"Alamat",
"JL. BINTARO UTAMA RAYA 5 BLOK EA NO 17, RT.001, RW.011, KEL. JURANGMANGGU TIMUR, KEC. PONDOK AREN, KOTA TANGERANG SELATAN 15222",
"JL. BINTARO UTAMA RAYA 5 BLOK EA NO 17, RT.001, RW.011, KEL. JURANGMANGGU TIMUR, KEC. PONDOK AREN, KOTA TANGERANG SELATAN 15222",
true
]
],
"items": [
[
"11110074",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310021",
"1 KRG",
"1 KRG",
true,
"20 PC",
"20 PC",
true,
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
true
]
]
},
{
"name": "do-017.jpg",
"fields": [
[
"PO Number",
"PO/26/0000142693",
"PO/26/0000142693",
true
],
[
"SO Number",
"1691870689",
"1691870689",
true
],
[
"DO Number",
"1659897396",
"1659897396",
true
],
[
"Date",
"Not Found",
"17 April 2026",
false
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9254 SCG",
"B 9254 SCG",
true
],
[
"Store Name",
"PM TAMAN DUTA CIBODAS",
"PM TAMAN DUTA CIBODAS",
true
],
[
"Alamat",
"PERUM TAMAN CIBODAS, JL. DUTA RAYA BLOK K1 NO. 20, RT. 007, RW. 006, KEL. SANGIANG JAYA, KEC. PERIUK, TANGERANG",
"PERUM TAMAN CIBODAS, JL. DUTA RAYA BLOK K1 NO. 20, RT. 007, RW. 006, KEL. SANGIANG JAYA, KEC. PERIUK, TANGERANG",
true
]
],
"items": [
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11640053",
"10 BOX",
"10 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA UTUH (1 KG)(*)",
"PAHA UTUH (1 KG)(*)",
true
]
]
},
{
"name": "do-018.jpg",
"fields": [
[
"PO Number",
"PO/26/0000137547",
"PO/26/0000137547",
true
],
[
"SO Number",
"1691865548",
"1691865548",
true
],
[
"DO Number",
"1659892421",
"1659892421",
true
],
[
"Date",
"14 April 2026",
"14 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9053 VCF",
"B 9053 VCF",
true
],
[
"Store Name",
"PM SASMITA",
"PM SASMITA",
true
],
[
"Alamat",
"JL. KENAIBAN RT. 002, RW. 002, KEL. PABUARAN, KEC. KARAWACI, TANGERANG",
"JL. KENAIBAN RT. 002, RW. 002, KEL. PABUARAN, KEC. KARAWACI, TANGERANG",
true
]
],
"items": [
[
"11310014",
"3 KRG",
"3 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"7 KRG",
"7 KRG",
true,
"140 PC",
"140 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11710051",
"10 BOX",
"10 BOX",
true,
"10 KG",
"10 KG",
true,
"DADA UTUH (1 KG)(*)",
"DADA UTUH (1 KG)(*)",
true
]
]
},
{
"name": "do-019.jpg",
"fields": [
[
"PO Number",
"PO/26/0000131178",
"PO/26/0000131178",
true
],
[
"SO Number",
"1691859106",
"1691859106",
true
],
[
"DO Number",
"1659886692",
"1659886692",
true
],
[
"Date",
"09 April 2026",
"09 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9260 BXT",
"B 9260 BXT",
true
],
[
"Store Name",
"PM SALAM RAYA",
"PM SALAM RAYA",
true
],
[
"Alamat",
"JL.SALAM RAYA, RT.005, RW.003, KEL. SUKABUMI UTARA, KEC. KEBON JERUK, JAKARTA BARAT 11540",
"JL.SALAM RAYA, RT.005, RW.003, KEL. SUKABUMI UTARA, KEC. KEBON JERUK, JAKARTA BARAT 11540",
true
]
],
"items": [
[
"12010112",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CHICKEN NUGGET 400 GR/PAC",
"FIESTA CHICKEN NUGGET 400 GR/PAC",
true
],
[
"12010124",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CHEESY CHIC W/BROCCOLI 400 GR/PAC",
"FIESTA CHEESY CHIC W/BROCCOLI 400 GR/PAC",
true
],
[
"12010509",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
true
],
[
"12010521",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"CHAMP NUGGET HOTZZ LEVEL 5 450 GR/PAC",
"CHAMP NUGGET HOTZZ LEVEL 5 450 GR/PAC",
true
],
[
"12010606",
"1 BOX",
"1 BOX",
true,
"25 PAC",
"25 PAC",
true,
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
true
],
[
"12030101",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA STIKIE 400 GR/PAC",
"FIESTA STIKIE 400 GR/PAC",
true
],
[
"13010514",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CHICK SSG 1000 GR",
"CHAMP CHICK SSG 1000 GR",
true
],
[
"13070502",
"1 BOX",
"1 BOX",
true,
"24 PAC",
"24 PAC",
true,
"CHAMP BEEF SSG SERBAGUNA 375GR",
"CHAMP BEEF SSG SERBAGUNA 375GR",
true
]
]
},
{
"name": "do-020.jpg",
"fields": [
[
"PO Number",
"PO/26/0000140625",
"PO/26/0000140625",
true
],
[
"SO Number",
"1691868563",
"1691868563",
true
],
[
"DO Number",
"1659895333",
"1659895333",
true
],
[
"Date",
"16 April 2026",
"16 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9365 AI",
"B 9365 AI",
true
],
[
"Store Name",
"PM REMPOA",
"PM REMPOA",
true
],
[
"Alamat",
"JL. REMPOA RAYA NO. 08, RT. 004, RW. 013, KEL. BINTARO, KEC. PESANGGRAHAN, JAKARTA SELATAN",
"JL. REMPOA RAYA NO. 08, RT. 004, RW. 013, KEL. BINTARO, KEC. PESANGGRAHAN, JAKARTA SELATAN",
true
]
],
"items": [
[
"11140062",
"20 KRG",
"20 KRG",
true,
"20 PAC",
"20 PAC",
true,
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310014",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11660050",
"10 BOX",
"10 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
]
]
},
{
"name": "do-021.jpg",
"fields": [
[
"PO Number",
"PO/26/0000140731",
"PO/26/0000140731",
true
],
[
"SO Number",
"1691869400",
"1691869400",
true
],
[
"DO Number",
"1659896184",
"1659896184",
true
],
[
"Date",
"16 April 2026",
"16 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9310 BXT",
false
],
[
"Store Name",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
true
],
[
"Alamat",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
true
]
],
"items": [
[
"12010111",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CRISPY BUBBLE 400 GR/PAC",
"FIESTA CRISPY BUBBLE 400 GR/PAC",
true
],
[
"12010509",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
"CHAMP CRUNCHY NUGGET 450 GR/PAC",
true
],
[
"12010511",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"CHAMP NUGGET AYAM 450 GR/PAC",
"CHAMP NUGGET AYAM 450 GR/PAC",
true
],
[
"12010512",
"1 BOX",
"1 BOX",
true,
"6 PAC",
"6 PAC",
true,
"CHAMP NUGGET AYAM 900 GR/PAC",
"CHAMP NUGGET AYAM 900 GR/PAC",
true
],
[
"12010606",
"1 BOX",
"1 BOX",
true,
"25 PAC",
"25 PAC",
true,
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
true
],
[
"12012202",
"1 BOX",
"1 BOX",
true,
"5 PAC",
"5 PAC",
true,
"ASIMO NUGGET KOMBINASI 1 KG/PAC",
"ASIMO NUGGET KOMBINASI 1 KG/PAC",
true
],
[
"12030101",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA STIKIE 400 GR/PAC",
"FIESTA STIKIE 400 GR/PAC",
true
],
[
"12060104",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA KARAGE 400 GR/PAC",
"FIESTA KARAGE 400 GR/PAC",
true
]
]
},
{
"name": "do-022.jpg",
"fields": [
[
"PO Number",
"PO/26/0000172403",
"PO/26/0000172403",
true
],
[
"SO Number",
"1691903313",
"1691903313",
true
],
[
"DO Number",
"1659927197",
"1659927197",
true
],
[
"Date",
"11 May 2026",
"11 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9683 VCF",
"B 9683 VCF",
true
],
[
"Store Name",
"PM RAWA BUNTU",
"PM RAWA BUNTU",
true
],
[
"Alamat",
"JL. RAWA BUNTU UTARA BLOK UA NO. 16, RT. 002, RW. 006, KEL. RAWA BUNTU, KEC. SERPONG, TANGERANG SELATAN",
"JL. RAWA BUNTU UTARA BLOK UA NO. 16, RT. 002, RW. 006, KEL. RAWA BUNTU, KEC. SERPONG, TANGERANG SELATAN",
true
]
],
"items": [
[
"12012501",
"1 BOX",
"1 BOX",
true,
"20 PAC",
"20 PAC",
true,
"AKUMO CHICKEN NAGET 250 GR",
"AKUMO CHICKEN NAGET 250 GR",
true
],
[
"12030403",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"GOLDEN FIESTA STIKIE W/ SWEET CHILLI SAUCE 500GR",
"GOLDEN FIESTA STIKIE W/ SWEET CHILLI SAUCE 500GR",
true
],
[
"15010101",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA SHOESTRING 500 GR",
"FIESTA SHOESTRING 500 GR",
true
]
]
},
{
"name": "do-023.jpg",
"fields": [
[
"PO Number",
"PO/26/0000164942",
"PO/26/0000164942",
true
],
[
"SO Number",
"1691895167",
"1691895167",
true
],
[
"DO Number",
"1659919748",
"1659919748",
true
],
[
"Date",
"05 May 2026",
"05 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9042 VCC",
"B 9042 VCC",
true
],
[
"Store Name",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
true
],
[
"Alamat",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
true
]
],
"items": [
[
"12010111",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CRISPY BUBBLE 400 GR/PAC",
"FIESTA CRISPY BUBBLE 400 GR/PAC",
true
],
[
"12010129",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CHEESY BOMBS CHICKEN NUGGET 400 GR",
"FIESTA CHEESY BOMBS CHICKEN NUGGET 400 GR",
true
],
[
"12010606",
"1 BOX",
"1 BOX",
true,
"25 PAC",
"25 PAC",
true,
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
"CHAMP CRUNCHY NUGGET 225 GR/PAC",
true
],
[
"12060104",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA KARAGE 400 GR/PAC",
"FIESTA KARAGE 400 GR/PAC",
true
],
[
"15040102",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA BATTER COATED 1000 GR",
"FIESTA BATTER COATED 1000 GR",
true
]
]
},
{
"name": "do-024.jpg",
"fields": [
[
"PO Number",
"PO/26/0000166040",
"PO/26/0000166040",
true
],
[
"SO Number",
"1691895765",
"1691895765",
true
],
[
"DO Number",
"1659920402",
"1659920402",
true
],
[
"Date",
"06 May 2026",
"06 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9260 VCF",
"B 9260 VCF",
true
],
[
"Store Name",
"PM PASAR PARUNG BOGOR",
"PM PASAR PARUNG BOGOR",
true
],
[
"Alamat",
"JL. TULANG KUNING - PASAR PARUNG DESA WANO, RT.001, RW.005, KEL. WARU, KEC. PARUNG, BOGOR 16330",
"JL. TULANG KUNING - PASAR PARUNG DESA WANO, RT.001, RW.005, KEL. WARU, KEC. PARUNG, BOGOR 16330",
true
]
],
"items": [
[
"11310013",
"3 KRG",
"3 KRG",
true,
"90 PC",
"90 PC",
true,
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
true
],
[
"11310014",
"3 KRG",
"3 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310021",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
true
],
[
"11310024",
"10 KRG",
"10 KRG",
true,
"200 PC",
"200 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
]
]
},
{
"name": "do-025.jpg",
"fields": [
[
"PO Number",
"PO/26/0000166510",
"PO/26/0000166510",
true
],
[
"SO Number",
"1691896671",
"1691896671",
true
],
[
"DO Number",
"1659921089",
"1659921089",
true
],
[
"Date",
"Not Found",
"06 May 2026",
false
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9899 CXR",
false
],
[
"Store Name",
"PM KELAPA DUA KARAWACI",
"PM KELAPA DUA KARAWACI",
true
],
[
"Alamat",
"RUKO SENTRA NIAGA KELAPA II / R 9, KEL. KELAPA DUA, KEC. KELAPA DUA, TANGERANG",
"RUKO SENTRA NIAGA KELAPA II / R 9, KEL. KELAPA DUA, KEC. KELAPA DUA, TANGERANG",
true
]
],
"items": [
[
"11310014",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310018",
"1 KRG",
"1 KRG",
true,
"30 PC",
"30 PC",
true,
"AYAM SIZE 1 PR FROZEN(*)",
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
false
],
[
"11310024",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11640053",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA UTUH (1 KG)(*)",
"PAHA UTUH (1 KG)(*)",
true
],
[
"11660050",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
],
[
"11710051",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"DADA UTUH (1 KG)(*)",
"DADA UTUH (1 KG)(*)",
true
],
[
"11750050",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FILLET MITRA 1 KG(*)",
"FILLET MITRA 1 KG(*)",
true
]
]
},
{
"name": "do-026.jpg",
"fields": [
[
"PO Number",
"PO/26/0000166127",
"PO/26/0000166127",
true
],
[
"SO Number",
"1659920441",
"1691895813",
false
],
[
"DO Number",
"1659920441",
"1659920441",
true
],
[
"Date",
"Not Found",
"06 May 2026",
false
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9417 VOC",
"B 9417 VCC",
false
],
[
"Store Name",
"PM PANORAMA BALI RESIDENCE BGR",
"PM PANORAMA BALI RESIDENCE BGR",
true
],
[
"Alamat",
"PANORAMA BALI RESIDENCE B NO 16, KEL. PUTAT NUTUG, KEC. CISEENG, KAB. BOGOR 16120",
"PANORAMA BALI RESIDENCE B NO 16, KEL. PUTAT NUTUG, KEC. CISEENG, KAB. BOGOR 16120",
true
]
],
"items": [
[
"11140062",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310014",
"4 KRG",
"4 KRG",
true,
"80 PC",
"80 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"20 KRG",
"20 KRG",
true,
"400 PC",
"400 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11660050",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
]
]
},
{
"name": "do-027.jpg",
"fields": [
[
"PO Number",
"PO/26/0000168198",
"PO/26/0000168198",
true
],
[
"SO Number",
"1691898090",
"1691898090",
true
],
[
"DO Number",
"1659922449",
"1659922449",
true
],
[
"Date",
"07 May 2026",
"07 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9259 BCU",
"B 9259 BCU",
true
],
[
"Store Name",
"PM KARANG BOLONG SERANG",
"PM KARANG BOLONG SERANG",
true
],
[
"Alamat",
"JL. RAYA KARANG BOLONG BANDULU (KP SEMPUR) NO.22, RT.004, RW.001, KEL. BANDULU, KEC. ANYAR, KAB. SERANG 42166",
"JL. RAYA KARANG BOLONG BANDULU (KP SEMPUR) NO.22, RT.004, RW.001, KEL. BANDULU, KEC. ANYAR, KAB. SERANG 42166",
true
]
],
"items": [
[
"11310013",
"1 KRG",
"1 KRG",
true,
"30 PC",
"30 PC",
true,
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
true
],
[
"11310014",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
"AYAM SIZE 2 FROZEN (0.8-0.9)KG(*)",
true
],
[
"11310024",
"5 KRG",
"5 KRG",
true,
"100 PC",
"100 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11650053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"PAHA ATAS 1 KG(*)",
"PAHA ATAS 1 KG(*)",
true
],
[
"11660050",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
],
[
"11690053",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"SBB (FILLET DADA )1 KG(*)",
"SBB (FILLET DADA )1 KG(*)",
true
],
[
"11710051",
"1 BOX",
"2 BOX",
false,
"10 KG",
"20 KG",
false,
"DADA UTUH (1 KG)(*)",
"DADA UTUH (1 KG)(*)",
true
],
[
"11720055",
"2 BOX",
"1 BOX",
false,
"20 KG",
"10 KG",
false,
"FULL WING FROZ PACK 1 KG(*)",
"FULL WING FROZ PACK 1 KG(*)",
true
]
]
},
{
"name": "do-028.jpg",
"fields": [
[
"PO Number",
"PO/26/0000125459",
"PO/26/0000125459",
true
],
[
"SO Number",
"1691853079",
"1691853079",
true
],
[
"DO Number",
"1659881372",
"1659881372",
true
],
[
"Date",
"06 April 2026",
"06 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9260 BXT",
false
],
[
"Store Name",
"PM HAJI MUHI",
"PM HAJI MUHI",
true
],
[
"Alamat",
"JL. H. MUHI NO. 14, RT. 001, RW. 004, KEL. PONDOK PINANG, KEC. KEBAYORAN LAMA, JAKARTA SELATAN",
"JL. H. MUHI NO. 14, RT. 001, RW. 004, KEL. PONDOK PINANG, KEC. KEBAYORAN LAMA, JAKARTA SELATAN",
true
]
],
"items": [
[
"12010515",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"CHAMP KOIN KOMBINASI 450 GR/PAC",
"CHAMP KOIN KOMBINASI 450 GR/PAC",
true
],
[
"12012502",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"AKUMO CHICKEN NUGGET 500 GR",
"AKUMO CHICKEN NUGGET 500 GR",
true
],
[
"12240102",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA CHEESY ITALIAN R/BITES 400 GR/PAC",
"FIESTA CHEESY ITALIAN R/BITES 400 GR/PAC",
true
],
[
"12240103",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA YAKINIKU R/BITES 400 GR/PAC",
"FIESTA YAKINIKU R/BITES 400 GR/PAC",
true
]
]
},
{
"name": "do-029.jpg",
"fields": [
[
"PO Number",
"PO/26/0000120972",
"PO/26/0000120972",
true
],
[
"SO Number",
"1691848409",
"1691848409",
true
],
[
"DO Number",
"1659876922",
"1659876922",
true
],
[
"Date",
"02 April 2026",
"02 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9260 BXT",
"B 9260 BXT",
true
],
[
"Store Name",
"PM TANAH KUSIR",
"PM TANAH KUSIR",
true
],
[
"Alamat",
"JL. RC VETERAN NO. 17, RT. 04, RW. 012, KEL. BINTARO, KEC. PESANGGRAHAN, JAKARTA SELATAN",
"JL. RC VETERAN NO. 17, RT. 04, RW. 012, KEL. BINTARO, KEC. PESANGGRAHAN, JAKARTA SELATAN",
true
]
],
"items": [
[
"11110074",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11620056",
"10 BOX",
"10 BOX",
true,
"10 KG",
"10 KG",
true,
"SBL (FILLET PAHA) 1 KG(*)",
"SBL (FILLET PAHA) 1 KG(*)",
true
],
[
"11690053",
"10 BOX",
"10 BOX",
true,
"10 KG",
"10 KG",
true,
"SBB (FILLET DADA )1 KG(*)",
"SBB (FILLET DADA )1 KG(*)",
true
]
]
},
{
"name": "do-030.jpg",
"fields": [
[
"PO Number",
"PO/26/0000122470",
"PO/26/0000122470",
true
],
[
"SO Number",
"1691850584",
"1691850584",
true
],
[
"DO Number",
"1659878594",
"1659878594",
true
],
[
"Date",
"03 April 2026",
"03 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9308 BXT",
"B 9308 BXT",
true
],
[
"Store Name",
"PM KAMPUNG TENGAH",
"PM KAMPUNG TENGAH",
true
],
[
"Alamat",
"JL. RAYA TENGAH RT. 004, RW. 009, KEL. TENGAH, KEC. KRAMAT JATI, JAKARTA TIMUR 13540",
"JL. RAYA TENGAH RT. 004, RW. 009, KEL. TENGAH, KEC. KRAMAT JATI, JAKARTA TIMUR 13540",
true
]
],
"items": [
[
"17210106",
"1 BOX",
"1 BOX",
true,
"BOX",
"8 PAC",
false,
"FIESTA RTS B/YAKINIKU 300GR/PAC",
"FIESTA RTS B/YAKINIKU 300GR/PAC",
true
],
[
"21200107",
"1 BOX",
"1 BOX",
true,
"BOX",
"6 PAC",
false,
"NEW FIESTA SPAGHETTI CARBONARA 300GR (PAC)",
"NEW FIESTA SPAGHETTI CARBONARA 300GR (PAC)",
true
]
]
},
{
"name": "do-031.jpg",
"fields": [
[
"PO Number",
"PO/26/0000121957",
"PO/26/0000121957",
true
],
[
"SO Number",
"191848878",
"1691848878",
false
],
[
"DO Number",
"1659877509",
"1659877509",
true
],
[
"Date",
"02 April 2026",
"02 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9767 NCD",
"B 9767 NCD",
true
],
[
"Store Name",
"PM CIPETE RAYA",
"PM CIPETE RAYA",
true
],
[
"Alamat",
"JL. CIPETE RAYA NO. 15 F, RT. 006, RW. 003, KEL. CIPETE SELATAN, KEC. CILANDAK, JAKARTA SELATAN",
"JL. CIPETE RAYA NO. 15 F, RT. 006, RW. 003, KEL. CIPETE SELATAN, KEC. CILANDAK, JAKARTA SELATAN",
true
]
],
"items": [
[
"11310013",
"4 KRG",
"4 KRG",
true,
"120 PC",
"120 PC",
true,
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
true
],
[
"11310024",
"10 KRG",
"10 KRG",
true,
"200 PC",
"200 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
]
]
},
{
"name": "do-032.jpg",
"fields": [
[
"PO Number",
"PO/26/0000145236",
"PO/26/0000143236",
false
],
[
"SO Number",
"1691872559",
"1691872559",
true
],
[
"DO Number",
"1659898844",
"1659898844",
true
],
[
"Date",
"18 April 2026",
"18 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9255 JXR",
"B 9255 JXR",
true
],
[
"Store Name",
"KU - DANAU SINGKARAK DEPOK",
"KU - DANAU SINGKARAK DEPOK",
true
],
[
"Alamat",
"JL. DANAU SINGKARAK, RT.001, RW.008, KEL. SUKAMAJU, KEC. CILODONG, DEPOK 16415",
"JL. DANAU SINGKARAK, RT.001, RW.008, KEL. SUKAMAJU, KEC. CILODONG, DEPOK 16415",
true
]
],
"items": [
[
"11150064",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310018",
"1 KRG",
"1 KRG",
true,
"30 PC",
"30 PC",
true,
"AYAM SIZE 1 PR FROZEN(*)",
"AYAM SIZE 1 PR FROZEN(*)",
true
],
[
"11310019",
"3 KRG",
"3 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE 2 PR FROZEN(*)",
"AYAM SIZE 2 PR FROZEN(*)",
true
],
[
"11310024",
"7 KRG",
"4 KRG",
false,
"80 PC",
"80 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11660050",
"20 BOX",
"20 BOX",
true,
"20 PAC",
"20 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
]
]
},
{
"name": "do-033.jpg",
"fields": [
[
"PO Number",
"PO/26/0000124386",
"PO/26/0000124386",
true
],
[
"SO Number",
"1691852095",
"1691852095",
true
],
[
"DO Number",
"1659880471",
"1659880471",
true
],
[
"Date",
"04 April 2026",
"04 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9402 SCH",
"B 9402 SCH",
true
],
[
"Store Name",
"PM KAMPUNG SAWAH 2",
"PM KAMPUNG SAWAH 2",
true
],
[
"Alamat",
"JL. KI HAJAR DEWANTARA KAV. 12 A, RT. 001, RW. 004, KEL. SAWAH, KEC. CIPUTAT, TANGERANG SELATAN 15413",
"JL. KI HAJAR DEWANTARA KAV. 12 A, RT. 001, RW. 004, KEL. SAWAH, KEC. CIPUTAT, TANGERANG SELATAN 15413",
true
]
],
"items": [
[
"11140062",
"20 KRG",
"20 KRG",
true,
"20 PAC",
"20 PAC",
true,
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
"AMPELA 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11150064",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
"HATI 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310024",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
"AYAM SIZE A FROZEN (0.9-1)KG/PC(*)",
true
],
[
"11660050",
"10 BOX",
"10 BOX",
true,
"10 PAC",
"10 PAC",
true,
"PAHA BAWAH (1 KG)(*)",
"PAHA BAWAH (1 KG)(*)",
true
]
]
},
{
"name": "do-034.jpg",
"fields": [
[
"PO Number",
"PO/26/0000135032",
"PO/26/0000135032",
true
],
[
"SO Number",
"1691863154",
"1691863154",
true
],
[
"DO Number",
"1659889989",
"1659889989",
true
],
[
"Date",
"11 April 2026",
"11 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9372 BXT",
false
],
[
"Store Name",
"PM GRAND CIKARANG CITY 2",
"PM GRAND CIKARANG CITY 2",
true
],
[
"Alamat",
"JL. BOULEVARD CINITY BLOK D12R -26, KEL. KARANG RAHARJA, KEC. CIKARANG UTARA, KAB. BEKASI 17534",
"JL. BOULEVARD CINITY BLOK D12R -26, KEL. KARANG RAHARJA, KEC. CIKARANG UTARA, KAB. BEKASI 17534",
true
]
],
"items": [
[
"11310013",
"2 KRG",
"2 KRG",
true,
"60 PC",
"60 PC",
true,
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
"AYAM SIZE1 FROZEN (0.75-0.8) KG(*)",
true
]
]
},
{
"name": "do-035.jpg",
"fields": [
[
"PO Number",
"PO/26/0000121086",
"PO/26/0000121086",
true
],
[
"SO Number",
"1691848523",
"1691848523",
true
],
[
"DO Number",
"1659877015",
"1659877015",
true
],
[
"Date",
"02 April 2026",
"02 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9726 UCT",
"B 9726 UCT",
true
],
[
"Store Name",
"PM TIMBUL",
"PM TIMBUL",
true
],
[
"Alamat",
"JL. TIMBUL NO. 01, RT. 007, RW. 004, KEL. CIPEDAK, KEC. JAGAKARSA, JAKARTA SELATAN",
"JL. TIMBUL NO. 01, RT. 007, RW. 004, KEL. CIPEDAK, KEC. JAGAKARSA, JAKARTA SELATAN",
true
]
],
"items": [
[
"11110074",
"1 KRG",
"1 KRG",
true,
"20 PAC",
"20 PAC",
true,
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
"CEKER 1 KG FROZEN (20 PAC/KARUNG)(*)",
true
],
[
"11310021",
"2 KRG",
"2 KRG",
true,
"40 PC",
"40 PC",
true,
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
"AYAM SIZE BESAR (B) FROZ (1-1.1)KG/PC(*)",
true
],
[
"11720055",
"10 BOX",
"10 BOX",
true,
"10 KG",
"10 KG",
true,
"FULL WING FROZ PACK 1 KG(*)",
"FULL WING FROZ PACK 1 KG(*)",
true
]
]
},
{
"name": "do-036.jpg",
"fields": [
[
"PO Number",
"PO/26/0000140731",
"PO/26/0000140731",
true
],
[
"SO Number",
"1691869400",
"1691869400",
true
],
[
"DO Number",
"1659896184",
"1659896184",
true
],
[
"Date",
"16 April 2026",
"16 April 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"(empty)",
"B 9310 BXT",
false
],
[
"Store Name",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
"MOTHER STORE - PM WARUNG JATI TIMUR RAYA",
true
],
[
"Alamat",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
"JL. WARUNG JATI TIMUR NO.26, RT.007, RW.004, KEL. KALIBATA, KEC. PANCORAN, JAKARTA SELATAN 12740",
true
]
],
"items": [
[
"12080101",
"1 BOX",
"1 BOX",
true,
"12 PAC",
"12 PAC",
true,
"FIESTA SPICY CHICK 400 GR/PAC",
"FIESTA SPICY CHICK 400 GR/PAC",
true
],
[
"13010513",
"1 BOX",
"1 BOX",
true,
"15 PAC",
"15 PAC",
true,
"CHAMP CHICK SSG 375 GR",
"CHAMP CHICK SSG 375 GR",
true
],
[
"13030502",
"1 BOX",
"1 BOX",
true,
"10 PAC",
"10 PAC",
true,
"CHAMP CHICK MEATBALL 500 GR",
"CHAMP CHICK MEATBALL 500 GR",
true
]
]
},
{
"name": "do-037.jpg",
"fields": [
[
"PO Number",
"PO/26/0000168198",
"PO/26/0000168198",
true
],
[
"SO Number",
"1691898090",
"1691898090",
true
],
[
"DO Number",
"1659922449",
"1659922449",
true
],
[
"Date",
"07 May 2026",
"07 May 2026",
true
],
[
"Customer Name",
"PT. PRIMAFOOD INTERNATIONAL",
"PT. PRIMAFOOD INTERNATIONAL",
true
],
[
"Plat Nomor",
"B 9259 BCU",
"B 9259 BCU",
true
],
[
"Store Name",
"PM KARANG BOLONG SERANG",
"PM KARANG BOLONG SERANG",
true
],
[
"Alamat",
"JL. RAYA KARANG BOLONG BANDULU (KP SEMPUR) NO.22, RT.004, RW.001, KEL. BANDULU, KEC. ANYAR, KAB. SERANG 42166",
"JL. RAYA KARANG BOLONG BANDULU (KP SEMPUR) NO.22, RT.004, RW.001, KEL. BANDULU, KEC. ANYAR, KAB. SERANG 42166",
true
]
],
"items": [
[
"11750050",
"1 BOX",
"1 BOX",
true,
"10 KG",
"10 KG",
true,
"FILLET MITRA 1 KG(*)",
"FILLET MITRA 1 KG(*)",
true
]
]
}
];
function countMismatches(file) {
let n = 0;
file.fields.forEach(f => { if (!f[3]) n++; });
file.items.forEach(it => { if (!it[3]) n++; if (!it[6]) n++; if (!it[9]) n++; });
return n;
}
FILES.forEach(f => { f.mismatches = countMismatches(f); });
FILES.sort((a, b) => b.mismatches - a.mismatches);
function escapeHtml(s) {
return String(s).replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]));
}
function valCell(v, match) {
const isEmpty = v === "(empty)";
const cls = isEmpty ? "empty-val" : "";
return `<td class="val-cell ${cls}">${escapeHtml(v)}</td>`;
}
function renderCard(file) {
const ok = file.mismatches === 0;
const pill = ok
? `<span class="pill pill-good">✓ semua cocok</span>`
: `<span class="pill pill-bad">${file.mismatches} tidak cocok</span>`;
const fieldRows = file.fields.map((f, i) => {
const [label, ai, manual, match] = f;
const band = i % 2 === 1 ? "band-row" : "";
const rowCls = !match ? "mismatch " + band : band;
const icon = match ? `<span class="status-icon">✅</span>` : `<span class="status-icon">❌</span>`;
return `<tr class="${rowCls}">
<td class="label-cell">${escapeHtml(label)}</td>
${valCell(ai, match)}
${valCell(manual, match)}
<td>${icon}</td>
</tr>`;
}).join("");
const itemRows = file.items.map((it, i) => {
const [sku, aiB, manB, bMatch, aiJ, manJ, jMatch, aiN, manN, nMatch] = it;
const band = i % 2 === 1 ? "band-row" : "";
const rowMismatch = (!bMatch || !jMatch || !nMatch);
const rowCls = rowMismatch ? "mismatch " + band : band;
const bIcon = bMatch ? "✅" : "❌";
const jIcon = jMatch ? "✅" : "❌";
const nIcon = nMatch ? "✅" : "❌";
return `<tr class="${rowCls}">
<td class="label-cell">${escapeHtml(sku)}</td>
<td class="val-cell wrap-cell">${escapeHtml(aiN)}</td>
<td class="val-cell wrap-cell">${escapeHtml(manN)}</td>
<td>${nIcon}</td>
<td class="val-cell">${escapeHtml(aiB)}</td>
<td class="val-cell">${escapeHtml(manB)}</td>
<td>${bIcon}</td>
<td class="val-cell">${escapeHtml(aiJ)}</td>
<td class="val-cell">${escapeHtml(manJ)}</td>
<td>${jIcon}</td>
</tr>`;
}).join("");
const el = document.createElement("details");
el.className = "card";
el.dataset.name = file.name.toLowerCase();
el.dataset.mismatches = file.mismatches;
if (!ok) el.setAttribute("open", "");
el.innerHTML = `
<summary>
<svg class="chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M9 18l6-6-6-6"/></svg>
<span class="fname">${escapeHtml(file.name)}</span>
${pill}
</summary>
<div class="card-body">
<p class="subhead">Header fields</p>
<div class="table-scroll">
<table>
<thead><tr><th>Field</th><th>AI (Layer 3 Final)</th><th>Manual (ground truth)</th><th>Status</th></tr></thead>
<tbody>${fieldRows}</tbody>
</table>
</div>
<p class="subhead">Items</p>
<div class="table-scroll">
<table>
<thead><tr><th>SKU</th><th>AI Nama Barang</th><th>Manual Nama Barang</th><th></th><th>AI Banyak</th><th>Manual Banyak</th><th></th><th>AI Jumlah</th><th>Manual Jumlah</th><th></th></tr></thead>
<tbody>${itemRows}</tbody>
</table>
</div>
</div>
`;
return el;
}
const listEl = document.getElementById("fileList");
FILES.forEach(f => listEl.appendChild(renderCard(f)));
const searchBox = document.getElementById("searchBox");
const onlyIssues = document.getElementById("onlyIssues");
const resultCount = document.getElementById("resultCount");
const noResults = document.getElementById("noResults");
const cards = Array.from(document.querySelectorAll("details.card"));
function applyFilter() {
const q = searchBox.value.trim().toLowerCase();
const issuesOnly = onlyIssues.checked;
let shown = 0;
cards.forEach(c => {
const matchesSearch = !q || c.dataset.name.includes(q);
const matchesIssue = !issuesOnly || Number(c.dataset.mismatches) > 0;
const visible = matchesSearch && matchesIssue;
c.style.display = visible ? "" : "none";
if (visible) shown++;
});
resultCount.textContent = shown + " / " + cards.length + " file";
noResults.style.display = shown === 0 ? "block" : "none";
}
searchBox.addEventListener("input", applyFilter);
onlyIssues.addEventListener("change", applyFilter);
applyFilter();
</script>