eCourt-note/docs/requirement/gap-analysis.md
DESKTOP-1R2VSQH\Lenovo ThinkPad E490 9cc38835f0
All checks were successful
Deploy eCourt Note Web to Server / Validate Database Schema (Drizzle) (push) Successful in 2s
Deploy eCourt Note Web to Server / Build Web Docker Image (push) Successful in 40s
Deploy eCourt Note Web to Server / Deploy eCourt Note Web to Server (push) Successful in 13s
Deploy eCourt Note Web to Server / Notify Deployment Status (push) Successful in 1s
popup ซ้อนกัน/ไม่ปิดตอนกดปุ่ม tool + แท็บที่คั่นหน้ากลับไม่ได้ + งานค้างใน working tree: ไฟล์รูปภาพ annotate ได้ (N3) + อัปโหลดไฟล์ (N4):
ส่วนที่ 1 — แก้ popup ตาม bug report ("กดแก้ไขแล้วไปกดที่ tool popup ของแก้ไขไม่ปิด/แสดงซ้อนกัน"):
(1) ปุ่ม tool แบบ dropdown ทั้ง 5 (highlight/draw/shape/stamp/textbox) เรียก switchTool เสมอแม้เป็น tool เดิม — เดิมกดปุ่ม tool ที่ active อยู่จะ toggle เมนูอย่างเดียวไม่เรียก switchTool (ซึ่งเป็นที่เดียวที่เคลียร์ popup บนหน้า: editor/แผง selection/popover) ผลคือ popup แก้ไขค้างเปิด + dropdown เปิดซ้อนขึ้นมาอีกชั้น — ตอนนี้จำ intent เปิด/พับเมนูไว้ก่อนเรียก (switchTool ปิดเมนูทุกตัว) แล้วเปิดคืนเฉพาะที่ตั้งใจ; toggle พับเมนูและกลไกกลืนคลิก M4 เท่าเดิม (mousedown บนปุ่ม mark อยู่แล้ว)
(2) switchTool ปิด popup bookmark ด้วย + openBookmarkComposer ปิดเมนูทั้ง 5 ก่อนเปิด popup (เดิมคีย์ลัด B ระหว่างเมนูเปิด = สอง popup ซ้อนกัน)
(3) คลิกหน้าว่าง = ปิด popover ของ comment pin + เลือกรายการอื่น/goToAnnotation ปิด popover เดิมทิ้ง (เดิมปิด popover ได้แค่กด pin เดิม/Escape/สลับ tool)
(4) COMMENT ที่เปิด popover อยู่ไม่ render กรอบ selection/แผงเครื่องมือ — bbox ของ COMMENT ครอบพื้นที่ pin พอดี แผงจะทับ popover และแถบ handle บังการคลิก (sidebar ยังตาม selectedId ไฮไลต์เหมือนเดิม)
(5) แก้แท็บ sidebar ตาม bug report ("เลือก Annotation แล้วจะกลับไป tabs bookmarks ไม่ได้"): effect เดิม dep รวม tab และบังคับ setTab ไปแท็บ annotations ทุกครั้งที่รันตราบ selectedId ไม่ null ทำให้กดแท็บที่คั่นหน้าแล้วถูกดึงกลับทันที — ใช้ ref จำ id ที่ประกาศแล้ว บังคับสลับเฉพาะตอน selectedId เพิ่งเปลี่ยน เคลียร์เป็น null ตอน deselect ให้เลือกรายการเดิมซ้ำภายหลังยังสลับแท็บให้ ส่วน scroll แถวตอนเปิดแท็บหมายเหตุคงเดิม
- sync rules/pdf-viewer.md: กติกาใหม่ popup บนหน้าเปิดได้ทีละชุดห้ามค้างเปิดซ้อนกัน (ปุ่ม dropdown เรียก switchTool เสมอ + วงจรปิด popover/แผง) และยกเว้น markMenuClosed ของคีย์ B ในกติกา M4
- verify: tsc ผ่าน, vitest 120/120, Playwright 18 เคสผ่าน (repro ตรงตามรายงาน: สร้าง textbox → แก้ไขข้อความ → กดปุ่ม tool เดิม → editor+แผงปิด+เมนูใช้ได้; popover pin ไม่ซ้อนแผง/ปิดด้วยคลิกหน้าว่าง; popup bookmark ปิดตอนสลับ tool; แท็บที่คั่นหน้ากลับได้)

ส่วนที่ 2 — งานที่ค้างใน working tree ก่อนหน้า (ตามแผน docs/PLAN-IMAGE.md):
- N3 รองรับไฟล์รูปภาพ jpg/jpeg/png/tif เป็นเอกสาร annotate ได้ครบทุกชนิด (viewer render img แทน canvas ไม่มี textLayer, scale contract เดียวกับ export) + TIFF หลายเฟรม = หลายหน้า (decode ผ่าน utif2 dynamic import → PNG blob URL ต่อเฟรม ฝั่ง client) + export PDF ฝังรูป (utils/image-to-pdf.ts: embedJpg/embedPng + EXIF rotate) + utils/file-kind.ts derive ชนิดไฟล์ + tests ของทั้งสอง utils
- N4 อัปโหลดไฟล์ PDF/รูป ≤100MB ผ่านหน้ารายการ (components/UploadFileForm.tsx + app/actions/files.ts: validate + เขียนไฟล์ใหม่ที่ public/uploads/ เท่านั้น — invariant #1)
- เอกสาร: docs/PLAN-IMAGE.md เพิ่มใหม่ + sync PLAN.md/PLAN-FEAT.md/CLAUDE.md/README/gap-analysis/data-layer rule

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-15 14:12:51 +07:00

20 KiB
Raw Blame History

รายงานเทียบ Requirement กับโปรเจกต์ (Gap Analysis)

  • วันที่ตรวจสอบ: 2026-09-14
  • อัปเดตล่าสุด: 2026-09-15 — แก้ไขข้อความข้อ 5.3.18–5.3.25 ตามที่เจ้าของเอกสารยืนยันใหม่
  • เอกสาร requirement ต้นทาง: docs/requirement/1.png, docs/requirement/2.png (ข้อกำหนดระบบบันทึกความเห็นของกรรมการ — Judges' Notes System)
  • โค้ดที่ใช้เทียบ: branch forgejo-dev ณ commit b3b884c (implement ครบตาม PLAN.md + PLAN-FEAT.md แล้ว ยกเว้น F11 ที่ถูกถอดออก)
  • ช่วงเลขข้อ (ยืนยันโดยเจ้าของเอกสาร): ภาพที่ 1 = ข้อ 5.3.1–5.3.6 / ภาพที่ 2 = ข้อ 5.3.7–5.3.25

⚠️ หมายเหตุการอ่าน requirement: สำนวนภาษาไทยบางคำอาจคลาดเคลื่อนเล็กน้อยจากต้นฉบับ แต่สาระของทุกข้อชัดเจน — การอ่านครั้งแรกสับสนเพราะเลขข้อเป็นเลขอารบิก (5.3.X) ที่ OCR อ่านเป็นอักษรไทย ช่วงเลขข้อได้รับยืนยันจากเจ้าของเอกสารแล้ว และการตรวจซ้ำด้วยการสแกนตำแหน่งบรรทัด + อ่านเลขข้อรายบรรทัดยืนยันว่า จำนวนข้อ map ตรง 1:1 ครบทั้ง 19 ข้อ (10 ข้อครึ่งบน + 9 ข้อครึ่งล่าง รวม 5.3.7–5.3.25) — การจับคู่เลข ↔ เนื้อหาในตารางจึงเป็นที่ยืนยันแล้วทั้งหมด จนถึงฉบับแก้ไข 2026-09-15 ที่เจ้าของเอกสารให้ข้อความข้อ 5.3.18–5.3.25 ฉบับถูกต้อง: HTML5 แยกจากข้อ Tablet/iPad ออกเป็นข้อ 5.3.19 ของตัวเอง (ข้อถัดมาเลื่อนลง 1 ลำดับ), เพิ่มข้อสิทธิการใช้งานตามระบบปกครอง (5.3.23) และเชื่อมโยงกับระบบปกครอง (5.3.25) — ข้อเดิมเรื่อง API ระบบอื่น, มาตรฐานความมั่นคงปลอดภัย และ Availability 99.5% ไม่ปรากฏในฉบับแก้ไข

สรุปผล

โปรเจกต์ judes-note ตอบแกน functional ของ requirement ได้ค่อนข้างเต็ม — การ annotate บนเอกสาร PDF, bookmark ต่อหน้าเอกสาร, Text Box + Freehand Drawing, ลบ/แก้ไขความเห็น, แสดงผลรายการ, ใช้งานหลายคนพร้อมกันแบบ realtime, responsive และรองรับ tablet/iPad

แต่ requirement ฉบับนี้เขียนสำหรับระบบ production เต็มรูปแบบ ขณะที่ judes-note เป็น MVP เฟสแรกตามขอบเขตใน CLAUDE.md / docs/PLAN.md — ข้อที่ขาดส่วนใหญ่จึงแบ่งได้เป็น 2 กลุ่ม: (1) ของที่ตั้งใจไม่ทำในเฟสแรก (auth, API, integration) และ (2) ของที่เกือบมีแต่ต่างรายละเอียด (ค้นหาไม่ครอบ bookmark, ลบ bookmark ทีละรายการ) รวมถึง (3) ของใหม่ที่ไม่เคยอยู่ในแผน (รองรับไฟล์รูปภาพ)

สถานะ ความหมาย
✅ มีและตรงตาม requirement
⚠️ มีบางส่วน / ใกล้เคียงแต่ต่างรายละเอียด
❌ ไม่มีในโปรเจกต์

1. ภาพที่ 1 — ข้อ 5.3.1–5.3.6 (คุณลักษณะหลักของระบบ)

5.3 พัฒนาระบบบันทึกความเห็นของกรรมการ (Judges' Notes System) มีคุณลักษณะดังต่อไปนี้

Requirement สถานะ รายละเอียดในโปรเจกต์
5.3.1 เรียกดูเอกสารที่เกี่ยวข้องและตรวจสอบจากระบบงานคดีปกครองได้โดยตรง ⚠️ ตัว viewer แสดงไฟล์ PDF ที่ระบุใน DB ได้ แต่ไม่มีการเชื่อมต่อระบบงานคดีปกครอง (ไม่มี integration/API ดึงเอกสารโดยตรง) และไม่มีหน้า upload — หน้า / อ่านรายการจาก DB เท่านั้น (sample data seed ด้วย SQL) — ผูกกับ gap 5.3.14 (API) และ 5.3.16 (integrate)
5.3.2 ระบบต้องไม่สามารถแก้ไขไฟล์ต้นฉบับได้ (Non-Destructive) ✅ เป็น invariant หลักของโปรเจกต์ (CLAUDE.md ข้อ 1): annotation เก็บใน DB เป็นพิกัด % เท่านั้น, ไฟล์ PDF ใน public/ ถูกอ่านอย่างเดียวผ่าน path guard (lib/server-pdf.ts), export PDF (F8) สร้างไฟล์ใหม่จากสำเนาในหน่วยความจำ (pdf-lib load แล้ว save คืน bytes ใหม่) — ไม่เขียนทับต้นฉบับเด็ดขาด
5.3.3 จัดเก็บข้อมูล Bookmark แยกจากเอกสารโดยเก็บไว้ในฐานข้อมูล และสามารถนำข้อมูลดังกล่าวมาแสดงได้ ✅ เป็นสถาปัตยกรรมแกนกลางของโปรเจกต์ (invariant #1–2): bookmark เก็บใน PostgreSQL ตาราง bookmarks เป็นพิกัด/ข้อมูลล้วน (pageIndex, ชื่อ, โครงสร้าง parent_id) แยกจากไฟล์ PDF ใน public/ — นำกลับมาแสดงได้ทั้งแท็บ Bookmarks ใน sidebar (scroll ไปหน้านั้น), หน้าสรุป F15 และ export
5.3.4 รูปแบบเอกสารที่รองรับได้ — ไฟล์เอกสาร PDF และไฟล์รูปภาพ (jpg, jpeg, png, tif) เป็นอย่างน้อย ✅ รองรับครบทุกนามสกุลแล้ว (N3 — แผน docs/PLAN-IMAGE.md, 2026-09-15): รูปคือ "หน้าเอกสาร" แสดง <img> แทน canvas + annotate ครบทุกชนิด + bookmark + realtime + export PDF ฝังรูป/CSV; TIFF รองรับทั้งหลายเฟรม (decode ด้วย utif2) และ EXIF orientation ตอน export; อัปโหลดไฟล์ PDF/รูปผ่านหน้ารายการได้ (N4)
5.3.5 บันทึกความเห็น (Bookmark) ทั้งแบบกรอกข้อความ (Text Box) และเขียนด้วยมือ (Freehand Drawing) ✅ TEXTBOX (F17) + DRAW freehand ดินสอ/ไฮไลต์เตอร์ + รองรับสไตลัส pressure (F7)
5.3.6 เพิ่ม ลบ แก้ไขความเห็นในกล่องข้อความได้ ✅ TEXTBOX (F17): สร้างกล่องข้อความ + แก้ไขข้อความในกล่องโดยตรง (editor รองรับตัวหนาบางส่วน — rich text) + ลบ/ย้าย/ปรับขนาด ของตัวเอง (F1, F13)

2. ภาพที่ 2 — ข้อ 5.3.7–5.3.25 (รายละเอียด bookmark + ข้อกำหนดระบบ)

Requirement สถานะ รายละเอียดในโปรเจกต์
5.3.7 เพิ่ม แก้ไข ลบ ข้อความที่เขียนหรือวาดได้ เช่น สีหรือขนาด ✅ ครบทั้งวงจร: สร้าง annotation ทุกชนิด (HIGHLIGHT/DRAW/SHAPE/TEXTBOX/STAMP) + แก้ไขสี/ความหนา/ขนาด ผ่านแผง selection (F1 — AnnotationSelectionLayer: แถบสี + ความหนา, TEXTBOX ปรับ fontSize ได้) + ย้าย/ปรับขนาด + F13 แก้ไขข้อความ + ลบของตัวเอง + F19 version history
5.3.8 ข้อมูลบันทึก bookmark ต้องอ้างถึงไฟล์เอกสาร หน้าเอกสาร วันที่บันทึก และผู้บันทึก ✅ ตาราง bookmarks มีครบทั้ง 4: file_id (FK → ไฟล์เอกสาร), page_index (หน้าเอกสาร), created_at (วันที่บันทึก), user_id (ผู้บันทึก) — นำมาแสดงในแท็บ Bookmarks, หน้าสรุป F15 และ export
5.3.9 กำหนดความเป็นส่วนตัวของ bookmark: ส่วนบุคคล (Private) / กลุ่ม (Group) ❌ ไม่มี Private/Group visibility — ทุกคนเห็นทุกรายการ (ไม่มี auth/roles โดยเจตนา)
5.3.10 แสดง bookmark ของเอกสารแต่ละไฟล์ หรือชุดของเอกสารได้ ⚠️ รายไฟล์ ✅ — แท็บ Bookmarks ใน sidebar แสดง bookmark ทั้งหมดของไฟล์ที่เปิด (ผูก file_id) + หน้าสรุป F15 / แต่ชุดของเอกสาร ❌ — ไม่มี concept การจัดกลุ่มไฟล์ (document set) และไม่มีหน้าแสดง bookmark รวมข้ามหลายไฟล์
5.3.11 แสดง bookmark ตามลำดับหน้าได้ ⚠️ แท็บ Bookmarks แสดงเลขหน้าต่อรายการ ("หน้า N") แต่เรียงตามเวลาสร้าง ไม่ใช่ลำดับหน้า (AnnotationSidebar.tsx:753 — root เรียงตามเวลาสร้าง) และหน้าสรุป F15 ไม่มี bookmark — แก้ง่าย: sort roots ของต้นไม้ตาม pageIndex
5.3.12 สามารถกำหนดเงื่อนไขการค้นหา bookmarks ได้ ❌ ช่องค้นหา (F14) ครอบเฉพาะ annotations เท่านั้น (searchAnnotations query ตาราง annotations) — ค้นหา bookmark ยังไม่ได้เลย ยิ่งไม่มีการกำหนดเงื่อนไข (เช่น ตามหน้า/ผู้บันทึก/ช่วงวันที่)
5.3.13 แสดงผลรายการหน้าของเอกสารที่ bookmark ไว้ ✅ แท็บ Bookmarks ใน sidebar + หน้าสรุป (F15)
5.3.14 จัดทำชุด API ดึงข้อมูล bookmark สำหรับเชื่อมต่อระบบอื่น ❌ ไม่มี REST API ภายนอก — มีเฉพาะ SSE stream ภายใน + export routes สำหรับผู้ใช้ (F11 export/import JSON ถูกถอดออกจากโค้ดแล้ว)
5.3.15 ส่งออก (Export) รายการ bookmark เป็น PDF ⚠️ ใกล้เคียง: export PDF ฝัง annotation + bookmark เป็น PDF outline (F8 — app/api/annotations/export/route.ts) + export CSV สรุปรายการ (F16) — แต่ไม่ใช่ "รายงานรายการ bookmark" แบบเอกสาร PDF ตรง ๆ
5.3.16 หน้าจอเชื่อมต่อกับระบบอื่น (Integrate) เป็น modal หรือ iframe ❌ เป็น standalone Next.js app — ไม่มีโหมด embed
5.3.17 รองรับ Web Browser: Google Chrome, Microsoft Edge, Safari ✅ Web app มาตรฐาน — ทดสอบ desktop + iOS/Android แล้ว
5.3.18 ใช้งานบน Tablet, iPad ✅ Touch support เต็มรูปแบบ: ไฮไลต์ด้วย custom selection ลาก→ปล่อย=สร้างทันที (hooks/useCustomSelection.ts — แทนปุ่มลอยของ commit b3b884c ที่ถอดออกแล้ว), ลาก handles, วาดด้วยนิ้ว
5.3.19 รองรับการพัฒนาโปรแกรมแบบ Web Application ที่สนับสนุนเทคโนโลยี HTML5 หรือดีกว่า ✅ เป็น Web Application (Next.js 14) สร้างบนเทคโนโลยี HTML5 ทั้งหมด: Canvas 2D (render PDF ผ่าน pdfjs), SVG (InkLayer), Server-Sent Events/EventSource (realtime), Web Storage (anonymous identity), Pointer Events + pressure (สไตลัส) — ไม่พึ่ง plugin เดิม เช่น Flash/Java Applet
5.3.20 Responsive รองรับแสดงผลได้ทุกความละเอียดหน้าจอ ✅ sidebar จอกลาง/จอเล็ก, PDF fit จอเล็ก, ปุ่มขนาด touch-44px (commit 1c2f4c8)
5.3.21 ใช้งานหลายผู้ใช้พร้อมกัน (Multi-user) จากหลายเครื่อง ✅ Realtime sync ผ่าน SSE (hooks/useAnnotationRealtime.ts) — แก้ไข/ลบ ของใครของมันบนไฟล์เดียวกันได้พร้อมกัน
5.3.22 การรับรองตัวผู้ใช้งาน (Authentication) ❌ ไม่มีระบบ auth — anonymous identity จาก localStorage โดยเจตนา (out of scope ตามแผน)
5.3.23 สิทธิการใช้งานเป็นไปตามระบบปกครอง ❌ ไม่มีระบบสิทธิ์ (roles/permissions) — ไม่มี login จึงกำหนดสิทธิ์ตามระบบปกครองไม่ได้ (ต้องทำ 5.3.22 ก่อน)
5.3.24 ติดตั้ง On-Premise บน Server ภายใน หรือ Cloud ⚠️ สถาปัตยกรรม Next.js + PostgreSQL deploy ได้ทั้งสองรูปแบบทางเทคนิค แต่ไม่มีข้อกำหนด/packaging พิเศษ (หมายเหตุ: SSE pub/sub เป็น in-memory — รันหลาย instance ต้องเพิ่ม Redis/LISTEN-NOTIFY ก่อน)
5.3.25 ระบบที่พัฒนาสามารถเชื่อมโยงกับระบบปกครองได้ ❌ เป็น standalone Next.js app — ยังไม่มี integration/API เชื่อมกับระบบงานคดีปกครอง (ผูกกับ gap 5.3.1 เรียกเอกสารโดยตรง และ 5.3.14 ชุด API)

3. สรุป Gap รายกลุ่ม

กลุ่ม A — ของที่ out of scope โดยเจตนาตามแผนเฟสแรก

ข้อที่ต้องเปลี่ยนขอบเขตโปรเจกต์ + ออกแบบเพิ่มก่อน implement:

  • Authentication ผู้ใช้งาน + สิทธิการใช้งานตามระบบปกครอง (5.3.22, 5.3.23)
  • Private/Group visibility ของ bookmark (5.3.9)
  • ชุด API สำหรับระบบภายนอก (5.3.14)
  • โหมด Integrate แบบ modal/iframe (5.3.16)
  • เชื่อมโยงกับระบบงานคดีปกครอง — ทั้งเรียกเอกสารโดยตรงและเชื่อมต่อระบบ (5.3.1, 5.3.25)

กลุ่ม B — ฟังก์ชันที่มีอยู่แล้ว ต่อยอดเล็กน้อยได้เลย

งานขนาดเล็ก–กลาง ไม่กระทบสถาปัตยกรรม:

  • ค้นหา bookmark พร้อมเงื่อนไข (5.3.12) — เพิ่มการค้นหาตาราง bookmarks (ชื่อ/โน้ต) + รองรับเงื่อนไขเช่นหน้าเอกสาร/ผู้บันทึก/ช่วงวันที่
  • เรียง bookmark ตามลำดับหน้า (5.3.11) — sort roots ของต้นไม้ bookmark ตาม pageIndex แทนเวลาสร้าง
  • รายงานรายการ bookmark เป็น PDF (5.3.15) — ต่อจากหน้าสรุป F15 หรือ export route เดิม

กลุ่ม C — ของใหม่ที่ไม่เคยอยู่ในแผน

  • รองรับไฟล์รูปภาพ jpg/jpeg/png/tif (5.3.4) — ทำแล้ว (2026-09-15, N3 + N4 ตามแผน docs/PLAN-IMAGE.md): รูปคือ "หน้าเอกสาร" (layers เดิมซ้อนบน <img> พิกัด % ใช้ของเดิมได้ทันที) + TIFF หลายเฟรม + EXIF orientation + export PDF ฝังรูป + อัปโหลดผ่านหน้ารายการ
  • ชุดของเอกสาร (document set) + แสดง bookmark รวมหลายไฟล์ (5.3.10) — ต้องเพิ่ม data model จัดกลุ่มไฟล์ + หน้ารวม bookmark ข้ามไฟล์ (ตอนนี้ไฟล์เป็นลิสต์แบนหน้าเดียว)

กลุ่ม D — infrastructure (ระยะยาว)

  • On-Premise/Cloud packaging (5.3.24) — รวมถึงเตรียม multi-instance สำหรับ SSE

4. ข้อเสนอแนะลำดับความสำคัญ

  1. ทำกลุ่ม B ก่อน — คุ้มค่าต่อแรง เห็นผลไว เสริมฟีเจอร์ bookmark ให้ครบ requirement โดยไม่แตะสถาปัตยกรรม
  2. ตัดสินใจเรื่องรูปภาพ (กลุ่ม C) — ตัดสินใจและทำเสร็จแล้ว (2026-09-15): 5.3.4 ครบทุกนามสกุลตาม N3 + อัปโหลดไฟล์ (N4)
  3. กลุ่ม A ตามด้วย D — ต้องอัปเดต docs/PLAN.md ขยายขอบเขตอย่างเป็นทางการก่อน implement ตามกระบวนการของโปรเจกต์