feat: implement db layout caching for parsed ocr & reprocess batch test with corrected parser alignment
This commit is contained in:
1 parent
2900eb670b
commit
095dd4cb8b
6 files changed
+1083
-206
No files matched your search
@@ -68,6 +68,29 @@ export async function POST(req: NextRequest) {
|
||||
|
||||
const b64 = fileBuffer.toString("base64");
|
||||
|
||||
// Check if we already have a parsed document in the database with the exact filename (and has valid layout_parsing_result)
|
||||
const cachedDoc = await query(
|
||||
"SELECT layout_parsing_result, processing_logs FROM documents WHERE filename = $1 AND parsed = true",
|
||||
[safeFile]
|
||||
);
|
||||
|
||||
let data: any = null;
|
||||
let tilt = 0;
|
||||
let unwarped = false;
|
||||
|
||||
if (cachedDoc.rows.length > 0 && cachedDoc.rows[0].layout_parsing_result) {
|
||||
console.log(`[Cache Hit] Found cached layout result for ${safeFile}. Skipping Pipeline API.`);
|
||||
const rawData = cachedDoc.rows[0].layout_parsing_result;
|
||||
const parsedData = typeof rawData === "string" ? JSON.parse(rawData) : rawData;
|
||||
data = parsedData.result || parsedData;
|
||||
|
||||
const procLogs = cachedDoc.rows[0].processing_logs;
|
||||
if (procLogs) {
|
||||
const parsedLogs = typeof procLogs === "string" ? JSON.parse(procLogs) : procLogs;
|
||||
tilt = parsedLogs?.pipeline_info?.tilt !== undefined ? Number(parsedLogs.pipeline_info.tilt) : 0;
|
||||
unwarped = parsedLogs?.pipeline_info?.unwarped ?? false;
|
||||
}
|
||||
} else {
|
||||
// Form payload
|
||||
const payload = {
|
||||
file: b64,
|
||||
@@ -112,11 +135,10 @@ export async function POST(req: NextRequest) {
|
||||
return NextResponse.json({ error: `Pipeline API error: ${errText}` }, { status: response.status });
|
||||
}
|
||||
|
||||
let data = await response.json();
|
||||
data = await response.json();
|
||||
|
||||
// Check if the image is not straight (tilt > 1.0 degree)
|
||||
const tilt = calculateAverageTilt(data);
|
||||
let unwarped = false;
|
||||
tilt = calculateAverageTilt(data);
|
||||
if (tilt > 1.0) {
|
||||
console.log(`Parsed document ${safeFile} is not straight (average tilt: ${tilt.toFixed(2)} deg). Re-running with unwarping and orientation classification enabled...`);
|
||||
const unwarpPayload = {
|
||||
@@ -139,6 +161,7 @@ export async function POST(req: NextRequest) {
|
||||
console.error(`Unwarping failed with status ${unwarpResponse.status}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If it was parsed from /uploads, save the JSON result on disk for fallback/compatibility
|
||||
if (isUpload) {
|
||||
|
||||
+77
-116
@@ -151,8 +151,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9427 UXT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -252,8 +252,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9723 CXS",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "AYAM HITZ HO ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -338,8 +338,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9257 JXR",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -450,8 +450,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9257 JXR",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -649,8 +649,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9715 UXU",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -704,7 +704,7 @@
|
||||
"status": "success",
|
||||
"tilt": 17.41,
|
||||
"unwarped": true,
|
||||
"rawMarkdown": "\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>CHARDEN POKPHAND INDONESIA TBK</td><td style='text-align: center; word-wrap: break-word;'>06:28:48 / 1</td><td style='text-align: center; word-wrap: break-word;'>otTanggal :</td><td style='text-align: center; word-wrap: break-word;'>30 June 2026</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>AWASAM INDUSTRI MODERN.</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. SO :</td><td style='text-align: center; word-wrap: break-word;'>1691972284</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>BANTEN</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. DO :</td><td style='text-align: center; word-wrap: break-word;'>1659990583</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. PO :</td><td style='text-align: center; word-wrap: break-word;'>PO/26/0000241302</td></tr></table>\n\n<div style=\"text-align: center;\"><img src=\"imgs/img_in_image_box_0_357_265_492.jpg\" alt=\"Image\" width=\"8%\" /></div>\n\n\n00088615\n\nKepada : Kepala Gudang\n\n## DELIVERY ORDER\n\nKepada Yth : PT.PRIMAFOOD INTERNATIONAL\n\nOrder Untuk : DKI AREA\n\nAlamat : JL. ANCOL BARAT VIII/1. ANCOL. PADEMANGAN.\n\nJAKARTA UTARA. 14430\n\n\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12010509</td><td style='text-align: center; word-wrap: break-word;'>829 Champ Crunchy Nugget 450 G</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>10 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12010512</td><td style='text-align: center; word-wrap: break-word;'>888 Champ Naget Avam Kombinasi 900 G</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>6 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12010519</td><td style='text-align: center; word-wrap: break-word;'>894 CHAMP NAGET KOMBINASI BENTUK STIK 90</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>6 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12012501</td><td style='text-align: center; word-wrap: break-word;'>600 Akumo Chicken Naget 250 Gr</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>20 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12012503</td><td style='text-align: center; word-wrap: break-word;'>602 Akumo Chicken Naget 1 Ka</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>5 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>13010116</td><td style='text-align: center; word-wrap: break-word;'>692 Fiesta Original Sausage 300 GR</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>20 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>13010514</td><td style='text-align: center; word-wrap: break-word;'>299 Champ Chicken Sausage 1 Ka FR</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>10 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>13030502</td><td style='text-align: center; word-wrap: break-word;'>298 Champ Chicken Ball 500 GR Fr</td><td style='text-align: center; word-wrap: break-word;'>1 BOX</td><td style='text-align: center; word-wrap: break-word;'>10 PAC</td></tr><tr><td colspan=\"2\">Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td rowspan=\"3\"><img src=\"imgs/img_in_image_box_101_1618_654_2051.jpg\" alt=\"Image\"\" /></td><td style='text-align: center; word-wrap: break-word;'>56 JXR</td><td colspan=\"2\">WH 01 / 01</td></tr><tr><td colspan=\"3\">HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN <img src=\"imgs/img_in_image_box_983_1753_1649_2025.jpg\" alt=\"Image\"\" /></td></tr><tr><td colspan=\"3\">Bag. Pengeluaran Barang Bagian Peniualan</td></tr></table>\n\nLembar3 : Line truncated
|
||||
"rawMarkdown": "\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>CHARDEN POKPHAND INDONESIA TBK</td><td style='text-align: center; word-wrap: break-word;'>06:28:48 / 1</td><td style='text-align: center; word-wrap: break-word;'>otTanggal :</td><td style='text-align: center; word-wrap: break-word;'>30 June 2026</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>AWASAM INDUSTRI MODERN.</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. SO :</td><td style='text-align: center; word-wrap: break-word;'>1691972284</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>BANTEN</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. DO :</td><td style='text-align: center; word-wrap: break-word;'>1659990583</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. PO :</td><td style='text-align: center; word-wrap: break-word;'>PO/26/0000241302</td></tr></table>\n\n<div style=\"text-align: center;\"><img src=\"imgs/img_in_image_box_0_357_265_492.jpg\" alt=\"Image\" width=\"8%\" /></div>\n\n\n00088615\n\nKepada : Kepala Gudang\n\n## DELIVERY ORDER\n\nKepada Yth : PT.PRIMAFOOD INTERNATIONAL\n\nOrder Untuk : DKI AREA\n\nAlamat : JL. ANCOL BARAT VIII/1. ANCOL. PADEMANGAN.\n\nJAKARTA UTARA. 14430\n\n\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>12010509\n12010512\n12010519\n12012501\n12012503\n13010116\n13010514\n13030502</td><td style='text-align: center; word-wrap: break-word;'>829 Champ Crunchy Nugget 450 G\n888 Champ Naget Avam Kombinasi 900 G\n894 CHAMP NAGET KOMBINASI BENTUK STIK 90\n600 AKumo Chicken Naget 250 Gr\n602 AKumo Chicken Naget 1 Ka\n692 Fiesta Original Sausage 300 GR\n299 Champ Chicken Sausage 1 Ka FR\n298 Champ Chicken Ball 500 GR Fr</td><td style='text-align: center; word-wrap: break-word;'>1 BOX\n1 BOX\n1 BOX\n1 BOX\n1 BOX\n1 BOX\n1 BOX</td><td style='text-align: center; word-wrap: break-word;'>10 PAC\n6 PAC\n6 PAC\n20 PAC\n5 PAC\n20 PAC\n10 PAC\n10 PAC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'><img src=\"imgs/img_in_image_box_101_1618_654_2051.jpg\" alt=\"Image\"\" /></td><td style='text-align: center; word-wrap: break-word;'><img src=\"imgs/img_in_image_box_983_1753_1649_2025.jpg\" alt=\"Image\"\" /></td><td style='text-align: center; word-wrap: break-word;'>WH 01 / 01\nHEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>\n\nLembar3 : Customer\n\n3 : Customer",
|
||||
"layer1RawRegex": {
|
||||
"vendorInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
"customerInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
@@ -768,27 +768,6 @@
|
||||
"banyak": "1 BOX",
|
||||
"jumlah": "10 PAC",
|
||||
"kodeBarangOriginal": "13030502"
|
||||
},
|
||||
{
|
||||
"kodeBarang": "",
|
||||
"namaBarang": "56 JXR",
|
||||
"banyak": "WH 01 / 01",
|
||||
"jumlah": "WH 01 / 01",
|
||||
"kodeBarangOriginal": ""
|
||||
},
|
||||
{
|
||||
"kodeBarang": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"namaBarang": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"banyak": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"jumlah": "",
|
||||
"kodeBarangOriginal": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN"
|
||||
},
|
||||
{
|
||||
"kodeBarang": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"namaBarang": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"banyak": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"jumlah": "",
|
||||
"kodeBarangOriginal": "Bag. Pengeluaran Barang Bagian Peniualan"
|
||||
}
|
||||
],
|
||||
"platTruk": ""
|
||||
@@ -821,13 +800,13 @@
|
||||
},
|
||||
{
|
||||
"kodeBarang": "12012501",
|
||||
"namaBarang": "600 Akumo Chicken Naget 250 Gr",
|
||||
"namaBarang": "600 AKumo Chicken Naget 250 Gr",
|
||||
"banyak": "1 BOX",
|
||||
"jumlah": "20 PAC"
|
||||
},
|
||||
{
|
||||
"kodeBarang": "12012503",
|
||||
"namaBarang": "602 Akumo Chicken Naget 1 Ka",
|
||||
"namaBarang": "602 AKumo Chicken Naget 1 Ka",
|
||||
"banyak": "1 BOX",
|
||||
"jumlah": "5 PAC"
|
||||
},
|
||||
@@ -848,24 +827,6 @@
|
||||
"namaBarang": "298 Champ Chicken Ball 500 GR Fr",
|
||||
"banyak": "1 BOX",
|
||||
"jumlah": "10 PAC"
|
||||
},
|
||||
{
|
||||
"kodeBarang": "",
|
||||
"namaBarang": "56 JXR",
|
||||
"banyak": "WH 01 / 01",
|
||||
"jumlah": "WH 01 / 01"
|
||||
},
|
||||
{
|
||||
"kodeBarang": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"namaBarang": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"banyak": "HEAD OFFICE ANCOL ! JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN",
|
||||
"jumlah": ""
|
||||
},
|
||||
{
|
||||
"kodeBarang": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"namaBarang": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"banyak": "Bag. Pengeluaran Barang Bagian Peniualan",
|
||||
"jumlah": ""
|
||||
}
|
||||
],
|
||||
"platTruk": ""
|
||||
@@ -936,8 +897,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1110,8 +1071,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9256 JXR",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1183,8 +1144,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1282,8 +1243,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9257 JXR",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1381,8 +1342,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PRIMA XPRESS - TOWN HALL ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN, JAKARTA UTARA, DKI JAKARTA (KANTIN CPI)"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1480,8 +1441,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1579,8 +1540,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -1599,7 +1560,7 @@
|
||||
"status": "success",
|
||||
"tilt": 0.57,
|
||||
"unwarped": false,
|
||||
"rawMarkdown": "## Purchase Order\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td rowspan=\"2\"></td><td rowspan=\"2\">Nomor P.O</td><td style='text-align: center; word-wrap: break-word;'>: PO/26/0000230199</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>: 22/06/2026</td></tr><tr><td rowspan=\"4\">KAWASAKI INDUSTRI MODERN. BANTEN</td><td rowspan=\"3\">02:56:41</td><td style='text-align: center; word-wrap: break-word;'>Tanggal :</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>No. SO : 23 June 2026</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>No. DO : 1691960321</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>DELIVERY ORDER</td><td style='text-align: center; word-wrap: break-word;'>No. PO : 1659980277</td></tr></table>\n\nKepala Gudang\n\n00169133\n\nKepada Yth :\n\nOrder Untuk : PT.PRIMAFOOD INTERNATIONAL\n\nAlamat : DKI AREA\n\nJL.ANCOL BARAT VIII/1.ANCOL.PADEMANGAN.\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>JAKARTA UTARA, 14430\\nJAKARTA UTA RA</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td rowspan=\"5\">11310014\\n11310024\\n11620056\\n11690053\\n11720055</td><td rowspan=\"5\">✓ Griller Size 2 ( 20 Ekor ) Frozen\\n✓ Griller Size A Frozen (900-1000 G) PC\\n✓ SBL Mitra 10 Kg\\n✓ SBB Mitra 10 Kg\\n✓ Full Wing Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>2</td><td style='text-align: center; word-wrap: break-word;'>KRG</td><td style='text-align: center; word-wrap: break-word;'>40 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>2</td><td style='text-align: center; word-wrap: break-word;'>KRG</td><td style='text-align: center; word-wrap: break-word;'>40 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">Truck No. B 9427 UXT\\nPX, HEAD OFFICE ANCOL ; JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">Penerima Barang Tanda Tangan Supir\\nBag. Pengeluaran Barang</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">3 : Customer Jika D.O. ini telah ditanda tangan oleh Penerima barang tanpa sanggahan, segala CLAIM atas kekurangan barang tidak dapat kami layani</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td colspan=\"2\">COPY P.O SELALU</td><td style='text-align: center; word-wrap: break-word;'>PPN</td><td style='text-align: center; word-wrap: break-word;'>254,000.00</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Total</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Menyetujui</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>",
|
||||
"rawMarkdown": "## Purchase Order\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td rowspan=\"2\"></td><td rowspan=\"2\">Nomor P.O</td><td colspan=\"2\">: PO/26/0000230199</td></tr><tr><td colspan=\"2\">: 22/06/2026</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>KAWASAKI INDUSTRI MODERN.</td><td rowspan=\"4\">02:56:41</td><td style='text-align: center; word-wrap: break-word;'>Tanggal :</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>BANTEN</td><td style='text-align: center; word-wrap: break-word;'>No. SO :</td><td style='text-align: center; word-wrap: break-word;'>23 June 2026</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. DO :</td><td style='text-align: center; word-wrap: break-word;'>1691960321</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>No. PO :</td><td style='text-align: center; word-wrap: break-word;'>1659980277</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>DELIVERY ORDER</td><td colspan=\"2\">PO/26/0000230828</td></tr></table>\n\nKepala Gudang\n\n00169133\n\nKepada Yth :\n\nOrder Untuk : PT.PRIMAFOOD INTERNATIONAL\n\nAlamat : DKI AREA\n\nJL.ANCOL BARAT VIII/1.ANCOL.PADEMANGAN.\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>JAKARTA UTARA, 14430\\nJAKARTA UTA RA</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td rowspan=\"5\">11310014\\n11310024\\n11620056\\n11690053\\n11720055</td><td rowspan=\"5\">✓ Griller Size 2 ( 20 Ekor ) Frozen\\n✓ Griller Size A Frozen (900-1000 G) PC\\n✓ SBL Mitra 10 Kg\\n✓ SBB Mitra 10 Kg\\n✓ Full Wing Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>2</td><td style='text-align: center; word-wrap: break-word;'>KRG</td><td style='text-align: center; word-wrap: break-word;'>40 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>2</td><td style='text-align: center; word-wrap: break-word;'>KRG</td><td style='text-align: center; word-wrap: break-word;'>40 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>BOX</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">Truck No. B 9427 UXT\\nPX, HEAD OFFICE ANCOL ; JL. ANCOL BARAT VIII NO. 1 JAKARTA UTARA IDN</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">Penerima Barang Tanda Tangan Supir\\nBag. Pengeluaran Barang</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td colspan=\"4\">3 : Customer Jika D.O. ini telah ditanda tangan oleh Penerima barang tanpa sanggahan, segala CLAIM atas kekurangan barang tidak dapat kami layani</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td colspan=\"2\">COPY P.O SELALU</td><td style='text-align: center; word-wrap: break-word;'>PPN</td><td style='text-align: center; word-wrap: break-word;'>254,000.00</td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Total</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>Menyetujui</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>",
|
||||
"layer1RawRegex": {
|
||||
"vendorInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
"customerInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
@@ -1797,8 +1758,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9427 UXT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -2145,8 +2106,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9948 VCC",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -2277,8 +2238,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9599 CXS",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -2403,8 +2364,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9254 SCG",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -2562,8 +2523,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9053 VCF",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -2802,8 +2763,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9260 BXT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3023,8 +2984,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9365 AI",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3296,8 +3257,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3484,8 +3445,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9683 VCF",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3729,8 +3690,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9042 VCC",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3929,8 +3890,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9260 VCF",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -3970,7 +3931,7 @@
|
||||
"status": "success",
|
||||
"tilt": 15.19,
|
||||
"unwarped": true,
|
||||
"rawMarkdown": "KAWASAN INDUSTRI MODERN.\n\nKepada : Kepala Gudang\n\n00202207\n\n## DELIVERY ORDER\n\nTanggal : 3.2019.007731\n\nNo. SO : 1691896671\n\nNo. DO : 1659921089\n\nNo. PO : PO/26/0000166510\n\nKepada Yth : PT.PRIMAFOOD INTERNATIONAL\n\nOrder Untuk : PFM-KU\n\nAlamat : JL. ANCOL BARAT VIII/1, ANCOL, PADEMANGAN, JAKARTA UTARA, 14430\n\nJAKARTA UTADA\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310014</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller Size 2 ( 20 Ekor ) Frozen</td><td style='text-align: center; word-wrap: break-word;'>5 KRG</td><td style='text-align: center; word-wrap: break-word;'>100 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310018</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller (PR) Size 1 Friz</td><td style='text-align: center; word-wrap: break-word;'>1 KRG</td><td style='text-align: center; word-wrap: break-word;'>30 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310024</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller Size A Frozen (900-1000 G) PC</td><td style='text-align: center; word-wrap: break-word;'>5 KRG</td><td style='text-align: center; word-wrap: break-word;'>100 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11640053</td><td style='text-align: center; word-wrap: break-word;'>✓ Bone In Leg ASLI</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11660050</td><td style='text-align: center; word-wrap: break-word;'>✓ Drumstick Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11710051</td><td style='text-align: center; word-wrap: break-word;'>✓ Bone In Breast Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11750050</td><td style='text-align: center; word-wrap: break-word;'>✓ fillet Mitra 10 Kg</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'>234</td><td style='text-align: center; word-wrap: break-word;'>270</td></tr><tr><td colspan=\"4\"><img src=\"imgs/img_in_seal_box_0_869_394_1150.jpg\" alt=\"Image\"\" /> ENTRA <img src=\"imgs/img_in_seal_box_501_897_785_1120.jpg\" alt=\"Image\"\" /> <img src=\"imgs/img_in_seal_box_903_867_1292_1133.jpg\" alt=\"Image\"\" /> WH 01 / 01 IL DANAU KELAPA DUA ( Bagian Penjualan</td></tr></table>\n\nembar 1: Customer\n\nJika D.O. ini telah ditanda tangan oleh Penerima barang tanpa sanggahan, segala CLAIM atas kekurangan barang tidak dapat kami layani\n\nDinindoi dengan",
|
||||
"rawMarkdown": "KAWASAN INDUSTRI MODERN.\n\nKepada : Kepala Gudang\n\n00202207\n\n## DELIVERY ORDER\n\nTanggal : 3.2019.007731\n\nNo. SO : 1691896671\n\nNo. DO : 1659921089\n\nNo. PO : PO/26/0000166510\n\nKepada Yth : PT.PRIMAFOOD INTERNATIONAL\n\nOrder Untuk : PFM-KU\n\nAlamat : JL. ANCOL BARAT VIII/1, ANCOL, PADEMANGAN, JAKARTA UTARA, 14430\n\nJAKARTA ITARA\n\n\n<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td style='text-align: center; word-wrap: break-word;'>Kode Barang</td><td style='text-align: center; word-wrap: break-word;'>Nama Barang</td><td style='text-align: center; word-wrap: break-word;'>Banyak</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310014</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller Size 2 ( 20 Ekor ) Frozen</td><td style='text-align: center; word-wrap: break-word;'>5 KRG</td><td style='text-align: center; word-wrap: break-word;'>100 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310018</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller (PR) Size 1 Friz</td><td style='text-align: center; word-wrap: break-word;'>1 KRG</td><td style='text-align: center; word-wrap: break-word;'>30 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11310024</td><td style='text-align: center; word-wrap: break-word;'>✓ Griller Size A Frozen (900-1000 G) PC</td><td style='text-align: center; word-wrap: break-word;'>5 KRG</td><td style='text-align: center; word-wrap: break-word;'>100 PC</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11640053</td><td style='text-align: center; word-wrap: break-word;'>✓ Bone In Leg ASLI</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11660050</td><td style='text-align: center; word-wrap: break-word;'>✓ Drumstick Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11710051</td><td style='text-align: center; word-wrap: break-word;'>✓ Bone In Breast Frozen Pack</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>11750050</td><td style='text-align: center; word-wrap: break-word;'>✓ fillet Mitra 10 Kg</td><td style='text-align: center; word-wrap: break-word;'>1 80X</td><td style='text-align: center; word-wrap: break-word;'>10 KG</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>Barang dikirim dalam keadaan baik</td><td style='text-align: center; word-wrap: break-word;'>Jumlah</td><td style='text-align: center; word-wrap: break-word;'>234</td><td style='text-align: center; word-wrap: break-word;'>270</td></tr><tr><td colspan=\"4\"><img src=\"imgs/img_in_seal_box_0_869_394_1150.jpg\" alt=\"Image\"\" /> ENTRA <img src=\"imgs/img_in_seal_box_501_897_785_1120.jpg\" alt=\"Image\"\" /> <img src=\"imgs/img_in_seal_box_903_867_1292_1133.jpg\" alt=\"Image\"\" /> WH 01 / 01 IL DANAU KELAPA DUA ( Bagian Penjualan</td></tr></table>\n\nembar 1: Customer\n\nJika D.O. ini telah ditanda tangan oleh Penerima barang tanpa sanggahan, segala CLAIM atas kekurangan barang tidak dapat kami layani\n\nDinindoi dengan",
|
||||
"layer1RawRegex": {
|
||||
"vendorInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
"customerInfo": "PT.PRIMAFOOD INTERNATIONAL",
|
||||
@@ -4156,8 +4117,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -4357,8 +4318,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9417 VOC",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PM PANORAMA BALI RESIDENCE BGR",
|
||||
"alamat": "PANORAMA BALI RESIDENCE B NO 16, KEL. PUTAT NUTUG, KEC. CISEENG, KAB. BOGOR 16120"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -4630,8 +4591,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9259 BCU",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -4838,8 +4799,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5024,8 +4985,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9260 BXT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5157,8 +5118,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9308 BXT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PM KAMPUNG TENGAH",
|
||||
"alamat": "JL. RAYA TENGAH RT. 004, RW. 009, KEL. TENGAH, KEC. KRAMAT JATI, JAKARTA TIMUR 13540"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5270,8 +5231,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9767 NCD",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5469,8 +5430,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5682,8 +5643,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9402 SCH",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5789,8 +5750,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -5928,8 +5889,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9726 UCT",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -6094,8 +6055,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
@@ -6207,8 +6168,8 @@
|
||||
}
|
||||
],
|
||||
"platTruk": "B 9259 BCU",
|
||||
"orderUntuk": "",
|
||||
"alamat": ""
|
||||
"orderUntuk": "PX HEAD OFFICE ANCOL",
|
||||
"alamat": "JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
|
||||
+479
-87
File diff suppressed because it is too large.
Load diff
Binary file not shown.
@@ -0,0 +1,341 @@
|
||||
# Side-by-Side Accuracy Comparison Report
|
||||
|
||||
### Summary Accuracy Metrics
|
||||
|
||||
| Field / Area | Total Checks | Matches | Mismatches | Accuracy (%) |
|
||||
|---|---|---|---|---|
|
||||
| PO Number | 14 | 11 | 3 | 78.57% |
|
||||
| SO Number | 14 | 10 | 4 | 71.43% |
|
||||
| DO Number | 14 | 10 | 4 | 71.43% |
|
||||
| Date | 14 | 11 | 3 | 78.57% |
|
||||
| Plat Nomor | 14 | 8 | 6 | 57.14% |
|
||||
| Customer Name | 14 | 14 | 0 | 100.00% |
|
||||
| Store Name | 14 | 11 | 3 | 78.57% |
|
||||
| Alamat | 14 | 12 | 2 | 85.71% |
|
||||
| Item SKU | 39 | 39 | 0 | 100.00% |
|
||||
| Item Banyak | 39 | 38 | 1 | 97.44% |
|
||||
| Item Jumlah | 39 | 39 | 0 | 100.00% |
|
||||
| **OVERALL TOTAL** | **229** | **203** | **26** | **88.65%** |
|
||||
|
||||
|
||||
## Detailed Comparison per File
|
||||
|
||||
### 📄 `1782870899198-sample_do.jpeg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000230828` | `PO/26/0000230828` | ✅ Match |
|
||||
| SO Number | `1691960321` | `1691960321` | ✅ Match |
|
||||
| DO Number | `1659980277` | `1659980277` | ✅ Match |
|
||||
| Date | `23 JUNE 2026` | `23 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9427 UXT` | `B 9427 UXT` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11310014` | `2 KRG` | `2 KRG` | ✅ Match | `40 PC` | `40 PC` | ✅ Match |
|
||||
| `11310024` | `2 KRG` | `2 KRG` | ✅ Match | `40 PC` | `40 PC` | ✅ Match |
|
||||
| `11620056` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11690053` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11720055` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782884664859-rotated_1782884661516_rotated_1782884658097_rotated_1782884654697_CAP5956452738616729026.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000178435` | `PO/26/0000178435` | ✅ Match |
|
||||
| SO Number | `1691908676` | `1691908676` | ✅ Match |
|
||||
| DO Number | `1659932080` | `1659932080` | ✅ Match |
|
||||
| Date | `15 MAY 2026` | `15 MAY 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9723 CXS` | `B 9723 CXS` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `AYAM HITZ HO ANCOL` | `AYAM HITZ HO ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `13012205` | `1 BOX` | `1 BOX` | ✅ Match | `15 PAC` | `15 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782888127716-CAP6161747431193129837.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241938` | `PO/26/0000241938` | ✅ Match |
|
||||
| SO Number | `1691972227` | `1691972227` | ✅ Match |
|
||||
| DO Number | `1659990561` | `1659990561` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9257 JXR` | `B 9257 JXR` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `21002601` | `1 BOX` | `1 BOX` | ✅ Match | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782888211457-rotated_1782888204591_rotated_1782888199962_rotated_1782888195402_CAP7202641176939787142.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241938` | `PO/26/0000241938` | ✅ Match |
|
||||
| SO Number | `1691972227` | `1691972227` | ✅ Match |
|
||||
| DO Number | `1659990561` | `1659990561` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9257 JXR` | `B 9257 JXR` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `21002601` | `1 BOX` | `1 80X` | ❌ Mismatch | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782888609885-rotated_1782888593813_1000000454.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000238723` | `PO/26/0000238723` | ✅ Match |
|
||||
| SO Number | `(empty)` | `1691969268` | ❌ Mismatch |
|
||||
| DO Number | `(empty)` | `1659987802` | ❌ Mismatch |
|
||||
| Date | `(empty)` | `27 JUNE 2026` | ❌ Mismatch |
|
||||
| Plat Nomor | `B 9715 UXU` | `B 9715 UXU` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11310014` | `3 KRG` | `3 KRG` | ✅ Match | `60 PC` | `60 PC` | ✅ Match |
|
||||
| `11310024` | `2 KRG` | `2 KRG` | ✅ Match | `40 PC` | `40 PC` | ✅ Match |
|
||||
| `11660050` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11690053` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11720055` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11750050` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782890303600-1000000465.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241302` | `PO/26/0000241302` | ✅ Match |
|
||||
| SO Number | `1691972284` | `1691972284` | ✅ Match |
|
||||
| DO Number | `1659990583` | `1659990583` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `(empty)` | `B 9256 JXR` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `12010509` | `1 BOX` | `1 BOX` | ✅ Match | `10 PAC` | `10 PAC` | ✅ Match |
|
||||
| `12010512` | `1 BOX` | `1 BOX` | ✅ Match | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
| `12010519` | `1 BOX` | `1 BOX` | ✅ Match | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
| `12012501` | `1 BOX` | `1 BOX` | ✅ Match | `20 PAC` | `20 PAC` | ✅ Match |
|
||||
| `12012503` | `1 BOX` | `1 BOX` | ✅ Match | `5 PAC` | `5 PAC` | ✅ Match |
|
||||
| `13010116` | `1 BOX` | `1 BOX` | ✅ Match | `20 PAC` | `20 PAC` | ✅ Match |
|
||||
| `13010514` | `1 BOX` | `1 BOX` | ✅ Match | `10 PAC` | `10 PAC` | ✅ Match |
|
||||
| `13030502` | `1 BOX` | `1 BOX` | ✅ Match | `10 PAC` | `10 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `1782892728794-1000000466.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241302` | `PO/26/0000241302` | ✅ Match |
|
||||
| SO Number | `1691972284` | `1691972284` | ✅ Match |
|
||||
| DO Number | `1659990583` | `1659990583` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9256 JXR` | `B 9256 JXR` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `15040101` | `1 BOX` | `1 BOX` | ✅ Match | `12 PAC` | `12 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260630_145445.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000170727` | `PO/26/0000190929` | ❌ Mismatch |
|
||||
| SO Number | `1071721209` | `1691921200` | ❌ Mismatch |
|
||||
| DO Number | `1057745004` | `1659943004` | ❌ Mismatch |
|
||||
| Date | `25 MAY 2026` | `25 MAY 2026` | ✅ Match |
|
||||
| Plat Nomor | `(empty)` | `B 9536 UCO` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PFM-KU` | ❌ Mismatch |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `13030502` | `1 BOX` | `1 BOX` | ✅ Match | `10 PAC` | `10 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134446.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `(empty)` | `PO/26/0000241938` | ❌ Mismatch |
|
||||
| SO Number | `(empty)` | `1691972227` | ❌ Mismatch |
|
||||
| DO Number | `(empty)` | `1659990561` | ❌ Mismatch |
|
||||
| Date | `(empty)` | `30 JUNE 2026` | ❌ Mismatch |
|
||||
| Plat Nomor | `B 9257 JXR` | `B 9257 JXR` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `21002601` | `1 BOX` | `1 BOX` | ✅ Match | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134504.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241303` | `PO/26/0000241303` | ✅ Match |
|
||||
| SO Number | `1691972285` | `1691972285` | ✅ Match |
|
||||
| DO Number | `1659990584` | `1659990584` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `(empty)` | `B 9256 JXR` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PRIMA XPRESS - TOWN HALL ANCOL` | `PX HEAD OFFICE ANCOL` | ❌ Mismatch |
|
||||
| Alamat | `JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN, JAKARTA UTARA, DKI JAKARTA (KANTIN CPI)` | `JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA` | ❌ Mismatch |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `21010104` | `1 BOX` | `1 BOX` | ✅ Match | `6 PAC` | `6 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134555.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241304` | `PO/26/0000241304` | ✅ Match |
|
||||
| SO Number | `2271289510` | `2271289510` | ✅ Match |
|
||||
| DO Number | `2272290022` | `2272290022` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `(empty)` | `B 9836 UCH` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11048006` | `2 BOX` | `2 BOX` | ✅ Match | `30 PAC` | `30 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134555~2.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000241304` | `PO/26/0000241304` | ✅ Match |
|
||||
| SO Number | `2271289510` | `2271289510` | ✅ Match |
|
||||
| DO Number | `2272290022` | `2272290022` | ✅ Match |
|
||||
| Date | `30 JUNE 2026` | `30 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `(empty)` | `B 9836 UCH` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11048000` | `2 BOX` | `2 BOX` | ✅ Match | `30 PAC` | `30 PAC` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134646~2.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `PO/26/0000230199` | `PO/26/0000230199` | ✅ Match |
|
||||
| SO Number | `1691960321` | `1691960321` | ✅ Match |
|
||||
| DO Number | `1659980277` | `1659980277` | ✅ Match |
|
||||
| Date | `23 JUNE 2026` | `23 JUNE 2026` | ✅ Match |
|
||||
| Plat Nomor | `B 9427 UXT` | `B 9427 UXT` | ✅ Match |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `PX HEAD OFFICE ANCOL` | `PX HEAD OFFICE ANCOL` | ✅ Match |
|
||||
| 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` | ✅ Match |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11310014` | `2 KRG` | `2 KRG` | ✅ Match | `40 PC` | `40 PC` | ✅ Match |
|
||||
| `11310024` | `2 KRG` | `2 KRG` | ✅ Match | `40 PC` | `40 PC` | ✅ Match |
|
||||
| `11620056` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11690053` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11720055` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
### 📄 `IMG_20260701_134810.jpg`
|
||||
|
||||
#### Header Fields
|
||||
| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |
|
||||
|---|---|---|---|
|
||||
| PO Number | `(empty)` | `PO/26/0000241301` | ❌ Mismatch |
|
||||
| SO Number | `(empty)` | `1691972419` | ❌ Mismatch |
|
||||
| DO Number | `(empty)` | `1659990664` | ❌ Mismatch |
|
||||
| Date | `(empty)` | `30 JUNE 2026` | ❌ Mismatch |
|
||||
| Plat Nomor | `(empty)` | `B 9256 JXR` | ❌ Mismatch |
|
||||
| Customer Name | `PT.PRIMAFOOD INTERNATIONAL` | `PT.PRIMAFOOD INTERNATIONAL` | ✅ Match |
|
||||
| Store Name | `(empty)` | `PX HEAD OFFICE ANCOL` | ❌ Mismatch |
|
||||
| Alamat | `(empty)` | `JL. ANCOL BARAT VIII/1 KEL. ANCOL, KEC. PADEMANGAN JAKARTA UTARA, DKI JAKARTA` | ❌ Mismatch |
|
||||
|
||||
#### Items List
|
||||
| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `11140062` | `1 KRG` | `1 KRG` | ✅ Match | `20 KG` | `20 KG` | ✅ Match |
|
||||
| `11150064` | `1 KRG` | `1 KRG` | ✅ Match | `20 KG` | `20 KG` | ✅ Match |
|
||||
| `11310014` | `3 KRG` | `3 KRG` | ✅ Match | `60 PC` | `60 PC` | ✅ Match |
|
||||
| `11600053` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11650053` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
| `11750050` | `1 BOX` | `1 BOX` | ✅ Match | `10 KG` | `10 KG` | ✅ Match |
|
||||
|
||||
---
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
def clean_val(val):
|
||||
if val is None:
|
||||
return ""
|
||||
s = str(val).strip().upper()
|
||||
if s in ["N/A", "NOT FOUND", "NOTFOUND", "EMPTY", "NONE", "-", "N / A"]:
|
||||
return ""
|
||||
s = " ".join(s.split())
|
||||
s = s.replace("PT. ", "PT.")
|
||||
s = s.replace("✓", "").replace("✔", "").strip()
|
||||
return s
|
||||
|
||||
def main():
|
||||
ai_file = "backend/sources/ai_results.json"
|
||||
manual_file = "backend/sources/manual_labels.json"
|
||||
output_md = "backend/sources/comparison_side_by_side.md"
|
||||
|
||||
if not os.path.exists(ai_file) or not os.path.exists(manual_file):
|
||||
print("Required files not found.")
|
||||
return
|
||||
|
||||
with open(ai_file, "r", encoding="utf-8") as f:
|
||||
ai_data = json.load(f)
|
||||
|
||||
with open(manual_file, "r", encoding="utf-8") as f:
|
||||
manual_data = json.load(f)
|
||||
|
||||
ai_dict = {item.get("filename"): item for item in ai_data if item.get("filename")}
|
||||
manual_dict = {item.get("filename"): item for item in manual_data if item.get("filename")}
|
||||
|
||||
common_filenames = sorted(list(set(ai_dict.keys()) & set(manual_dict.keys())))
|
||||
|
||||
header_fields = [
|
||||
("noPO", "noPO", "PO Number"),
|
||||
("noSO", "noSO", "SO Number"),
|
||||
("noDO", "noDO", "DO Number"),
|
||||
("tanggal", "tanggal", "Date"),
|
||||
("plat", "platTruk", "Plat Nomor"),
|
||||
("customer", "customerInfo", "Customer Name"),
|
||||
("store", "orderUntuk", "Store Name"),
|
||||
("alamat", "alamat", "Alamat")
|
||||
]
|
||||
|
||||
stats = {
|
||||
"PO Number": {"match": 0, "total": 0},
|
||||
"SO Number": {"match": 0, "total": 0},
|
||||
"DO Number": {"match": 0, "total": 0},
|
||||
"Date": {"match": 0, "total": 0},
|
||||
"Plat Nomor": {"match": 0, "total": 0},
|
||||
"Customer Name": {"match": 0, "total": 0},
|
||||
"Store Name": {"match": 0, "total": 0},
|
||||
"Alamat": {"match": 0, "total": 0},
|
||||
"Item SKU": {"match": 0, "total": 0},
|
||||
"Item Banyak": {"match": 0, "total": 0},
|
||||
"Item Jumlah": {"match": 0, "total": 0}
|
||||
}
|
||||
|
||||
md_content = []
|
||||
md_content.append("# Side-by-Side Accuracy Comparison Report\n\n")
|
||||
md_content.append("<!-- summary_placeholder -->\n\n")
|
||||
md_content.append("## Detailed Comparison per File\n\n")
|
||||
|
||||
for filename in common_filenames:
|
||||
manual = manual_dict[filename]
|
||||
ai = ai_dict[filename]
|
||||
ai_meta = ai.get("layer3Final", {})
|
||||
|
||||
md_content.append(f"### 📄 `{filename}`\n\n")
|
||||
|
||||
# Header fields table
|
||||
md_content.append("#### Header Fields\n")
|
||||
md_content.append("| Field | AI Value (OCR) | Manual Value (Ground Truth) | Status |\n")
|
||||
md_content.append("|---|---|---|---|\n")
|
||||
|
||||
for manual_key, ai_key, field_label in header_fields:
|
||||
m_val = clean_val(manual.get(manual_key))
|
||||
a_val = clean_val(ai_meta.get(ai_key))
|
||||
is_match = (m_val == a_val)
|
||||
status = "✅ Match" if is_match else "❌ Mismatch"
|
||||
|
||||
stats[field_label]["total"] += 1
|
||||
if is_match:
|
||||
stats[field_label]["match"] += 1
|
||||
|
||||
md_content.append(f"| {field_label} | `{a_val or '(empty)'}` | `{m_val or '(empty)'}` | {status} |\n")
|
||||
|
||||
md_content.append("\n")
|
||||
|
||||
# Items comparison
|
||||
m_items = manual.get("items", [])
|
||||
ai_items = ai.get("items", [])
|
||||
if not ai_items and "items" in ai_meta:
|
||||
ai_items = ai_meta.get("items", [])
|
||||
|
||||
m_items_dict = {clean_val(item.get("kodeBarang")): item for item in m_items if clean_val(item.get("kodeBarang"))}
|
||||
ai_items_dict = {clean_val(item.get("kodeBarang")): item for item in ai_items if clean_val(item.get("kodeBarang"))}
|
||||
all_skus = sorted(list(set(m_items_dict.keys()) | set(ai_items_dict.keys())))
|
||||
|
||||
md_content.append("#### Items List\n")
|
||||
md_content.append("| SKU | AI Banyak | Manual Banyak | Banyak Status | AI Jumlah | Manual Jumlah | Jumlah Status |\n")
|
||||
md_content.append("|---|---|---|---|---|---|---|\n")
|
||||
|
||||
for sku in all_skus:
|
||||
m_item = m_items_dict.get(sku)
|
||||
ai_item = ai_items_dict.get(sku)
|
||||
|
||||
sku_match = (m_item is not None) and (ai_item is not None)
|
||||
stats["Item SKU"]["total"] += 1
|
||||
if sku_match:
|
||||
stats["Item SKU"]["match"] += 1
|
||||
|
||||
m_banyak = clean_val(m_item.get("banyak")) if m_item else ""
|
||||
ai_banyak = clean_val(ai_item.get("banyak")) if ai_item else ""
|
||||
banyak_match = (m_banyak == ai_banyak)
|
||||
banyak_status = "✅ Match" if banyak_match else "❌ Mismatch"
|
||||
stats["Item Banyak"]["total"] += 1
|
||||
if banyak_match:
|
||||
stats["Item Banyak"]["match"] += 1
|
||||
|
||||
m_jumlah = clean_val(m_item.get("jumlah")) if m_item else ""
|
||||
ai_jumlah = clean_val(ai_item.get("jumlah")) if ai_item else ""
|
||||
jumlah_match = (m_jumlah == ai_jumlah)
|
||||
jumlah_status = "✅ Match" if jumlah_match else "❌ Mismatch"
|
||||
stats["Item Jumlah"]["total"] += 1
|
||||
if jumlah_match:
|
||||
stats["Item Jumlah"]["match"] += 1
|
||||
|
||||
md_content.append(f"| `{sku}` | `{ai_banyak or '(empty)'}` | `{m_banyak or '(empty)'}` | {banyak_status} | `{ai_jumlah or '(empty)'}` | `{m_jumlah or '(empty)'}` | {jumlah_status} |\n")
|
||||
|
||||
md_content.append("\n---\n\n")
|
||||
|
||||
# Generate summary block
|
||||
sum_md = []
|
||||
sum_md.append("### Summary Accuracy Metrics\n\n")
|
||||
sum_md.append("| Field / Area | Total Checks | Matches | Mismatches | Accuracy (%) |\n")
|
||||
sum_md.append("|---|---|---|---|---|\n")
|
||||
|
||||
total_matches = 0
|
||||
total_fields = 0
|
||||
for field_label, counts in stats.items():
|
||||
match_cnt = counts["match"]
|
||||
total_cnt = counts["total"]
|
||||
pct = (match_cnt / total_cnt * 100.0) if total_cnt > 0 else 100.0
|
||||
sum_md.append(f"| {field_label} | {total_cnt} | {match_cnt} | {total_cnt - match_cnt} | {pct:.2f}% |\n")
|
||||
total_matches += match_cnt
|
||||
total_fields += total_cnt
|
||||
|
||||
overall_accuracy = (total_matches / total_fields * 100.0) if total_fields > 0 else 100.0
|
||||
sum_md.append(f"| **OVERALL TOTAL** | **{total_fields}** | **{total_matches}** | **{total_fields - total_matches}** | **{overall_accuracy:.2f}%** |\n")
|
||||
|
||||
full_md = "".join(md_content).replace("<!-- summary_placeholder -->", "".join(sum_md))
|
||||
|
||||
with open(output_md, "w", encoding="utf-8") as f:
|
||||
f.write(full_md)
|
||||
print(f"Side-by-side report generated at: {output_md}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user