AES Class Clinic · Internal Reference

AES Class Operations Dashboard
Data Dictionary

คู่มืออธิบายแต่ละหน้า แต่ละกราฟ และแต่ละตารางของ Dashboard — แหล่งข้อมูล สูตรคำนวณ และข้อจำกัด
🌐 URL: aes-ops-dashboard.pages.dev 📅 อัปเดต: 27 มิถุนายน 2569 📝 Version: 3.0

สารบัญ

  1. ภาพรวม Architecture
  2. แหล่งข้อมูล (Data Sources)
  3. Tab 1 — รายวัน (Daily)
  4. Tab 2 — รายเดือน (Monthly)
  5. Tab 3 — YTD รายเดือน
  6. Tab 4 — Product Mix (รวม Sub-Product Margin)
  7. Tab 5 — งบกำไรขาดทุน (Exec P&L)
  8. Tab 6 — ต้นทุน & Margin (Cost)
  9. Tab 7 — ค่าใช้จ่าย (OpEx / S&M)
  10. Tab 8 — ประมาณการ (Forecast)
  11. Branch Filter
  12. Auto-Update Pipeline
  13. ข้อจำกัดและความแม่นยำ

ภาพรวม Architecture

Dashboard สร้างจาก build script Python → HTML เดี่ยว → deploy บน Cloudflare Pages
BigQuerynclinic2 / dynamics_bc
Superset MCPexecute_sql
build_full_dashboard.pyPython data + HTML template
index.htmlself-contained ~120KB
Cloudflare Pagesaes-ops-dashboard
ไฟล์หลัก
Build scriptC:\...\AES-Analytics\build_full_dashboard.py — embed Python data arrays เข้า HTML template
Output HTMLytd_pl_dashboard_2026.html + index.html (เหมือนกัน)
Daily runnerrun_daily_update.ps1 — Task Scheduler 06:27 ทุกวัน → Claude CLI → query → rebuild → deploy
Logupdate_log.txt

แหล่งข้อมูล (Data Sources)

BigQuery project: aesclass-portal
nclinic2 NClinic — ระบบ POS คลินิก (Revenue / Visit / Product)
dynamics_bc Dynamics 365 BC — บัญชี/สต็อก (COGS จริง, lag ~57 วัน)
PPTX Management Meeting Deck (seed data ประมาณการ)
Computed คำนวณใน Python/JS จากข้อมูลข้างต้น
ตาราง BigQuery ที่ใช้
TableDatasetคำอธิบายField หลัก
get_sale_account nclinic2 บันทึกรายการขาย/บริการแต่ละรายการ (หลังหักส่วนลด) sale_date, organize (สาขา), sale_acc (ยอดขาย ฿), cn (รหัสคนไข้), item_name (ชื่อสินค้า/บริการ)
get_visit nclinic2 บันทึก visit รายคนไข้ รายวัน visit_date, organize, hn (HN), come_count (1=ใหม่, >1=กลับมา), finished
item_ledger_entries dynamics_bc รายการ stock ledger จาก Dynamics 365 BC (ตัดสต็อก = COGS จริง) posting_date, entry_type, cost_amount_actual, description (item name)
⚠️ ข้อจำกัดสำคัญ
BC Lag ~57 วันข้อมูล item_ledger_entries ล่าช้า ~57 วัน — COGS เดือนปัจจุบัน = 0 (ยังไม่ interface)
entry_type COGSใช้เฉพาะ entry_type = 'Negative_x0020_Adjmt_x002E_' เท่านั้น — entry type Sale มีข้อมูลขยะ (ยอดสูงผิดปกติ 5 พันล้าน)
Product Groupingใช้ REGEXP บน item_name / description — ไม่ได้ JOIN master table → กลุ่ม "Other" อาจมี items ที่ควรจัดกลุ่มใหม่
get_receipt ลบแล้วตาราง nclinic2.get_receipt ถูกลบออกแล้ว — query ที่ JOIN ตารางนี้จะ error

Tab 1 — รายวัน (Daily)

แสดงรายได้และ KPI ประจำวัน — อัปเดตทุกเช้า 06:27 น. | ข้อมูลถึง D-1 (เมื่อวาน)
KPI Flash Row (5 การ์ด)
การ์ดสูตร / Logicแหล่งข้อมูล
Revenue D-1 (฿)SUM(sale_acc) วันล่าสุดใน daily_rowsget_sale_account
Visits D-1COUNT(DISTINCT cn) วันล่าสุดget_sale_account
Rev/Visit D-1Revenue D-1 ÷ Visits D-1Computed
14-Day TotalSUM(revenue) 14 วันล่าสุด (ทุก branch ที่เลือก)get_sale_account
14-Day Avg/Day14-Day Total ÷ 14Computed
ภาพที่ 1 — Revenue Trend Bar + Variance Strip Canvas: trendChart + trendVar
องค์ประกอบคำอธิบายสูตร
แท่ง Revenue (สี teal)Revenue รายวัน D-13 ถึง D-1 รวมทุก branch ที่เลือกSUM(revenue) per date from daily_rows
D-1 highlight (สีเข้ม)วันล่าสุดเน้นสี #123c38index === lastIndex → darker color
เส้นค่าเฉลี่ย (avg line)ค่าเฉลี่ยของ window 7 หรือ 14 วัน (toggle ด้านบน)SUM(revenue, window) / window_size
Variance Strip (สีเขียว/แดง)แถบใต้กราฟ — ∆ รายวัน vs ค่าเฉลี่ย(daily_rev - avg) / avg × 100 เป็น %
Label วันไทยจ/อ/พ/พฤ/ศ/ส/อา ใต้แกน x + แท่งวันหยุด (ส/อา) สีอ่อนJS Date → getDay() → map Thai

Avg window toggle: ปุ่ม 7วัน/14วัน — เปลี่ยน avg line + variance strip พร้อมกัน

ตารางที่ 1 — Daily Flash Table (Integrated) Element: t1body
คอลัมน์สูตรแหล่งข้อมูล
สาขาBranch name จาก BN mapStatic
D-1 Revenue (฿)Revenue เมื่อวานของสาขานั้นget_sale_account
Ranking bar (inline)Bar width = D-1 rev ÷ max D-1 rev ทุก branch × 100%Computed
Δ vs AvgVariance bar สีเขียว/แดง = (D-1 - avg) / avgComputed
Sparkline 14 วันSVG polyline revenue 14 วัน + จุดแดงที่ D-1daily_rows
รวม 14 วันSUM(revenue, 14 days) ของสาขาdaily_rows

⚠️ แถวไฮไลต์แดง + ⚠ เมื่อ D-1 ≤ −30% vs avg (alert threshold)

ภาพที่ 2 — Hero Products (Lifting machines) Canvas: heroChart
Fieldรายละเอียด
สินค้า HeroUlthera / Oligio / Thermage / Ultraformer / Morpheus
FilterREGEXP บน item_name: r'ULTHERA|ULTRAFORMER|OLIGIO|THERMAGE|MORPHEUS'
Window7 วัน / 14 วัน / 30 วัน (toggle pills)
สูตรSUM(sale_acc) per (branch, hero_brand, window) — เรียงตาม 30-day DESC
แหล่งข้อมูลget_sale_account — stored in hero_rows array
ภาพที่ 3 — New vs Returning Visits Canvas: nrChart
Fieldรายละเอียด
New Visitcome_count = 1 (visit ครั้งแรกในวันนั้น)
Returning Visitcome_count > 1
Filterfinished = 1 (เสร็จแล้ว) เท่านั้น
แหล่งข้อมูลget_visit — stored in nr_rows [date, org, tot, new, ret]
สูตร % ใหม่new_visits / total_visits × 100

Tab 2 — รายเดือน (Monthly)

เปรียบเทียบรายได้รายเดือน 2026 vs 2025 | เลือกดูรายเดือนผ่าน pills
Month Selector Pills + KPI เดือน
องค์ประกอบLogic
Month pillsม.ค. ถึงเดือนปัจจุบัน — click → filter charts/table เป็นเดือนนั้น
Revenue (เดือน)SUM(sale_acc) ทุก branch ที่เลือก เดือนนั้น
YoY %(rev_2026 - rev_2025) / rev_2025 × 100
Visits (เดือน)COUNT DISTINCT HN per month (from BR_MO)
Rev/VisitRevenue ÷ Visits
ภาพที่ 4 — Monthly Revenue Bar (2026 vs 2025) Canvas: monthRevChart
Datasetสูตรแหล่งข้อมูล
2026 (teal)SUM(sale_acc) per (branch, month) 2026get_sale_account
2025 (gray)SUM(sale_acc) per (branch, month) 2025get_sale_account
เส้น YoY%(rev26-rev25)/rev25×100 per monthComputed

เดือน Jun MTD = ข้อมูลยังไม่ครบเดือน (ถึง D-1) — label มี * กำกับ

ตารางที่ 2 — Branch × Month Revenue Element: t2body
คอลัมน์สูตร
Rev 2026 (M฿)SUM(sale_acc) เดือนที่เลือก ปี 2026 ของสาขา
Rev 2025SUM(sale_acc) เดือนเดียวกัน ปี 2025
YoYchip สีเขียว/แดง = (26-25)/25×100
VisitsCOUNT DISTINCT HN เดือนนั้น
Rev/VisitRev ÷ Visits
สัดส่วนRev สาขา ÷ Rev รวม chain × 100%

Tab 3 — YTD รายเดือน

ภาพรวม YTD ม.ค.–พ.ค. 2026 — Revenue + COGS รายเดือน + ตาราง P&L เดือน + YTD Branch
KPI Row — YTD Summary
การ์ดสูตรแหล่งข้อมูล
Revenue YTDSUM(rev26[m]) ทุกเดือน ม.ค.–ปัจจุบันget_sale_account
YoY Revenue(sum26 - sum25) / sum25Computed
COGS YTDSUM(cogs26[m]) ทุกเดือน (COGS จาก BC)item_ledger_entries
Gross Profit YTDRevenue YTD − COGS YTDComputed
GP Margin %GP ÷ Revenue × 100Computed
ภาพที่ 5 — YTD Monthly Revenue 2026 vs 2025 Canvas: ytdRevChart
Fieldรายละเอียด
Data sourceYTD_MO.rev26[month] / YTD_MO.rev25[month]
AggregationSUM(sale_acc) per (month, year) — branch filter applied via scale ratio
Scale logicถ้าเลือกบางสาขา: ยอดจาก BR_MO (สาขาที่เลือก) ÷ รวมทุกสาขา
ภาพที่ 6 — Revenue + COGS + GP + YoY% Canvas: ytdCogsChart
Datasetสูตรหมายเหตุ
Revenue (bar teal)YTD_MO.rev26[m]ม.ค.–มิ.ย. MTD
COGS (bar red)YTD_MO.cogs26[m]จาก item_ledger_entries Negative Adjmt. — มิ.ย. = 0 (BC lag)
GP (line gray dash)Revenue − COGS per monthComputed
YoY% (line teal)(rev26-rev25)/rev25×100secondary Y-axis (right)
ตารางที่ 4 — Monthly P&L Summary Element: t4body
คอลัมน์สูตรแหล่งข้อมูล
Revenue 2026YTD_MO.rev26[m] × branch_scaleget_sale_account
Revenue 2025YTD_MO.rev25[m] × branch_scaleget_sale_account
YoY(rev26-rev25)/rev25×100Computed
COGS 2026YTD_MO.cogs26[m] × scaleitem_ledger_entries
GPRev26 − COGS26Computed
GP%GP ÷ Rev26 × 100Computed
VisitsYTD_MO.vis26[m] = COUNT DISTINCT CNget_sale_account
Rev/VisitRev26 ÷ VisitsComputed
ตารางที่ 5 — YTD Branch Revenue Element: t5body
คอลัมน์สูตร
Rev 2026 YTDBR_YTD[branch].rev26 = SUM ม.ค.–ปัจจุบัน
Rev 2025 YTDBR_YTD[branch].rev25 เดือนเดียวกัน
YoY(rev26-rev25)/rev25×100
VisitsBR_YTD[branch].vis26 = COUNT DISTINCT CN YTD
Rev/Visitrev26 ÷ vis26
สัดส่วน %rev26_branch ÷ rev26_total × 100

Tab 4 — Product Mix (สัดส่วนสินค้า)

แบ่งรายได้เป็น 4 กลุ่มสินค้าหลัก — ม.ค.–พ.ค. 2026 | ข้อมูล: get_sale_account + D365 BC
Product Grouping Logic (REGEXP บน item_name)
กลุ่มREGEXP Patternตัวอย่าง item
LiftingULTHERA|ULTRAFORMER|OLIGIO|THERMAGE|MORPHEUS|HIFU|EXILIS|VENUS|SCULPSUREUlthera, Oligio, Thermage FLX
InjectionBOTOX|DYSPORT|XEOMIN|FILLER|JUVEDERM|RESTYLANE|SCULPTRA|RADIESSE|PROFHILO|NEURONOX|NABOTA|REVOLAX|PLINEST|MOUNJAROBotox, Filler, Mounjaro
Pico & LaserPICO|PICOCARE|LASER|FRAXEL|CO2|IPL|PICOWAY|ENLIGHTEN|TONING|PIGMENTPicoSure, CO2 Laser
Otherไม่ตรงกับ pattern ข้างต้นSkincare, Package, Consultation

⚠️ Pattern matching ไม่สมบูรณ์ 100% — items บางรายการอาจจัดกลุ่มไม่ตรง เนื่องจาก item_name ไม่ได้ standardized

ภาพที่ 7 — Product Mix รายเดือน Stacked Bar Canvas: prodStackChart
Fieldรายละเอียด
สูตรSUM(sale_acc) per (branch, product_group, month)
Data structurePROD_BR[branch][month][group] = revenue (฿)
Branch filtersum เฉพาะ branch ที่เลือก
แหล่งข้อมูลget_sale_accountprod_rows_batch1/2/...
ภาพที่ 8 — Product Mix YTD Doughnut Canvas: prodPieChart
สูตรSUM(revenue, ม.ค.–พ.ค.) per group
Label tooltipGroup name + M฿ + สัดส่วน %
ภาพที่ 9/10 — Lifting/Injection YoY เปรียบเทียบ liftYoyChart / injYoyChart
2026 (teal)byMonth[m]['Lifting'] สาขาที่เลือก
2025 (light teal)byMonth25[m]['Lifting'] — scale ตามสัดส่วน branch
2025 dataPROD_MO['2025-mm'][group] = ยอดรวม chain ปี 2025
ตารางที่ 6 — Product Mix YTD แยกสาขา Element: t6body
คอลัมน์สูตร
Lifting / Injection / Pico / Other (฿)SUM revenue per group ม.ค.–พ.ค. ของสาขา
% (สัดส่วน)group_rev ÷ branch_total × 100
รวมSUM ทุก group ของสาขา
Direct Material Margin ราย Product Group Canvas: prodMarginChart + t-margin-body
Fieldรายละเอียด
Revenue (chain)SUM ทุก branch จาก PROD_BR — ไม่ผ่าน branch filter
Direct COGS (chain)COGS_PROD['2026-mm'][group] × 1e6 — จาก item_ledger_entries Negative Adjmt.
Direct MarginRevenue − COGS per group
Margin %Margin ÷ Revenue × 100
แหล่งข้อมูล COGSitem_ledger_entries — REGEXP บน description field

⚠️ Direct Material Margin ≠ Gross Profit — ไม่รวม Doctor Fee / Med Staff / Rental / Overhead
มิ.ย. COGS = 0 / N/A เนื่องจาก BC lag ~57 วัน

ตารางที่ 7 — Direct Material Margin ราย Sub-Product Element: t-sub-body ประมาณการ ~85%

แสดง Revenue / COGS / Margin แยกย่อยระดับ sub-product ภายในแต่ละกลุ่มใหญ่ (Jan–May 2026 เท่ากัน)

Fieldรายละเอียด
Data blobSUB_PROD_ROWS — [sub_product, major_group, rev_M, cogs_M]
Revenuenclinic2.get_sale_account · REGEXP บน item_name · Jan–May 2026
COGSdynamics_bc.item_ledger_entries · REGEXP บน description · Jan–May 2026
Margin %(Revenue − COGS) ÷ Revenue × 100 · color badge: ≥80% teal / 60–79% เขียว / 40–59% orange / <40% red
Revenue %Revenue sub-product ÷ Revenue รวมทุกกลุ่ม × 100
Branch filter❌ ไม่ filter — Revenue ใช้ chain-level (COGS ไม่มี branch dimension)
Sub-productMajor GroupRev 5M (M฿)COGS 5M (M฿)Margin%ความแม่นยำ
UltheraLifting36.7216.3255.6%🟢 สูง
OligioLifting22.523.2085.8%🟢 สูง
ThermageLifting11.534.1364.2%🟢 สูง
UltraformerLifting9.312.5672.5%🟢 สูง
MorpheusLifting2.120.3881.9%🟢 สูง
NeurotoxinInjection17.017.2057.7%🟡 ปานกลาง
FillerInjection14.435.9458.8%🟡 ปานกลาง
BiostimulatorInjection11.636.2146.6%🟡 ปานกลาง
Pico LaserPico & Laser10.370.6094.3%🟢 สูง
CO2/FractionalPico & Laser3.940.00~100%🔴 COGS=0 (อาจ uncategorized)
Other (Laser)Pico & Laser3.470.00~100%🔴 COGS=0
OtherOther36.749.3374.6%🟠 Bucket ใหญ่ ไม่ classified

⚠️ ข้อจำกัดความแม่นยำ:
• Revenue regex ใช้ item_name (NClinic) ≠ COGS regex ใช้ description (BC) — อาจ misclassify บางรายการ
• CO2/Fractional & HIFU COGS = 0 — consumable อาจบันทึกภายใต้ชื่ออื่นใน BC
• Other bucket (36.7M) ขนาดใหญ่ — อาจมีผลิตภัณฑ์ที่ควรจัดกลุ่มได้หลุดเข้ามา
• ควรใช้เป็น "ประมาณการ" เท่านั้น ไม่ใช่ตัวเลข certified financial

Tab 5 — งบกำไรขาดทุน (Exec P&L)

P&L ระดับเครือ | 2024/2025 = ทั้งปี · 2026 YTD 5M · Forecast 12M | ข้อมูลไม่แยกสาขา
แหล่งข้อมูล P&L
รายการแหล่งข้อมูลหมายเหตุ
รายได้ (Revenue) 2026 YTDget_sale_account actual179.96M ม.ค.–พ.ค. 2026
ต้นทุนสินค้า (Inventory) 2026 YTDitem_ledger_entries actual55.86M Negative Adjmt. ม.ค.–พ.ค. 2026
ต้นทุนแพทย์ / Med Staff / Overhead / Rental 2026PPTX slide 24 ประมาณการscaled จาก % 4M PPTX × revenue 5M จริง
S&M / Admin / D&A / Finance cost 2026PPTX slide 24 ประมาณการscaled ×(179.96/148.00)
ปี 2024 / 2025 (ทั้งปี)PPTX slide 24 actualboard-approved figures
Forecast 2026FPPTX slide 25 Case 13 scenarios
KPI Cards (4 การ์ด)
Revenue YTDFIN.pnl[0].v[2] = 179.96M
GP + GP%FIN.pnl[7].v[2] = 53.96M · FIN.pnl_pct.gp[2] = 30.0%
EBITDA + %FIN.pnl[12].v[2] = 6.00M · FIN.pnl_pct.ebitda[2] = 3.3%
Net Profit/(Loss)FIN.pnl[17].v[2] = −8.44M
ภาพ P&L Bridge (Waterfall) Canvas: pnlWaterfall
Stepสูตร
รายได้FIN.pnl[0].v[2] = 179.96M
− ต้นทุนบริการrev − total_cost = 179.96 − 126.00
กำไรขั้นต้น= 53.96M
− S&Mgp − sm
− Admin
+ อื่นๆasset gain + other income
EBITDA= 6.00M
ตาราง P&L เปรียบเทียบ 4 คอลัมน์ Element: pnl-body

แสดง FIN.pnl array ทุก row — คอลัมน์ highlight = i26=2 (YTD 2026 5M)

แถว % (cost%/GP%/EBITDA%) = FIN.pnl_pct object

Tab 6 — ต้นทุน & Margin (Cost)

เปรียบเทียบต้นทุนขายและบริการ YTD ม.ค.–พ.ค. ทุกปี | 2024/2025 = scaled ×5/4 จาก PPTX
แหล่งข้อมูลและ Period
คอลัมน์Periodแหล่งข้อมูลหมายเหตุ
YTD 2024 (5M)ม.ค.–พ.ค. 2567PPTX slide 16 ×5/4ประมาณการ (scaled)
YTD 2025 (5M)ม.ค.–พ.ค. 2568PPTX slide 16 ×5/4ประมาณการ (scaled)
YTD 2026 (5M)ม.ค.–พ.ค. 2569Inventory: BC actual / อื่น: PPTX ประมาณการInventory = ข้อมูลจริง
ตารางต้นทุน — รายหมวด + % Element: cost-body
บรรทัดค่า 2026 5Mแหล่งข้อมูล
ต้นทุนสินค้า (Inventory)55.86Mitem_ledger_entries Negative Adjmt. actual
ต้นทุนแพทย์ (Doctor Fee)36.13MPPTX ประมาณการ
ต้นทุนบุคลากรการแพทย์10.37MPPTX ประมาณการ
ค่าใช้จ่ายโสหุ้ยอื่น0.13MPPTX slide 16
ค่าเช่า (Rental)21.86MPPTX ประมาณการ
รวมต้นทุนบริการ126.00MComputed sum
% ต่อรายได้70.0%126.00 ÷ 179.96 × 100
KPI Cards — Computed YoY

YoY % ทุกการ์ดคำนวณ อัตโนมัติ จากข้อมูลจริงใน FIN.cost_total / FIN.cost:

Total cost YoY(tot[2]/tot[1]-1)×100 = (126.00/116.75-1)×100 = +7.9%
Inventory YoY(C[0].v[2]/C[0].v[1]-1)×100 = (55.86/48.34-1)×100 = +15.6%
Doctor YoY(C[1].v[2]/C[1].v[1]-1)×100 = (36.13/32.86-1)×100 = +9.9%

Tab 7 — ค่าใช้จ่าย S&M (OpEx)

Selling & Marketing แยกประเภท YTD ม.ค.–พ.ค. | 2024/2025 = scaled ×5/4
แหล่งข้อมูล S&M

ข้อมูลทั้งหมดจาก PPTX slide 20 — ยังไม่มีการ reconcile กับ GL จริง

2024/2025 scaled ×5/4 จาก Jan-Apr | 2026 scaled ×(179.96/148.00) จาก 4M PPTX

ตาราง S&M แยกประเภท Element: sm-body
บรรทัดค่า 2026 5M
Commission พนักงาน15.48M
Digital Marketing6.01M
Credit Card Fee5.56M
อื่นๆ (Advertising/Event/Agent)3.03M
S&M รวม30.08M (16.7% ของ revenue)
ภาพ % S&M ต่อรายได้ Canvas: opexPctChart
สูตรsm_total[i] / rev_ytd[i] × 100
202418.31 ÷ 145.46 = 12.6%
202519.49 ÷ 156.69 = 12.4%
202630.08 ÷ 179.96 = 16.7%

Tab 8 — ประมาณการ (Forecast)

3 Scenarios ทั้งปี 2026 | ข้อมูลจาก PPTX slide 25 — board-approved
3 Scenarios
ScenarioสมมติฐานRevenueEBITDANet
Case 1โครงสร้างต้นทุนเท่า YTD 2026438.29M5.82M−30.39M
Case 2ลดงบการตลาด 30M408.29M−0.12M−36.33M
Case 3ต้นทุนเท่า YTD + เพิ่ม treatment revenue521.79M36.26M+0.05M

แหล่งข้อมูล: PPTX slide 25 — ค่าเหล่านี้ไม่ได้อัปเดตอัตโนมัติ

Branch Filter Logic

Pills ด้านบน — เลือก/ยกเลิก branch ที่ต้องการ
การทำงานของ Branch Filter
TabFilter ทำงานไหม?Logic
Daily, Monthly, YTD, Product Mix✅ ทำงานfilter sel set → aggregate เฉพาะ branch ที่เลือก
Exec P&L, Cost, OpEx, Forecast❌ ไม่ทำงาน (hidden)ข้อมูลเป็น chain-level ไม่มี branch dimension
Direct Material Margin❌ ไม่ filterCOGS จาก BC ไม่มี branch dimension — Revenue ใช้ chain-level เสมอ

Auto-Update Pipeline

ขั้นตอนอัปเดตอัตโนมัติ (run_daily_update.ps1)
StepQueryอัปเดต array ใน build script
1Daily Revenue 14 วัน (get_sale_account)daily_rows
2Product Mix by Branch × Month YTD 2026 (get_sale_account)prod_rows_batch*
3YTD Branch Revenue 2026 vs 2025 (get_sale_account)branch_ytd_rows
4Hero Products 7/14/30 วัน (get_sale_account)hero_rows
5COGS by Product Group รายเดือน (item_ledger_entries Negative Adjmt.)cogs_prod_rows + fin_data P&L cascade
6— (no query)python build_full_dashboard.py → rebuild HTML → wrangler deploy

ข้อมูลที่ไม่อัปเดต: New/Returning (nr_rows), fin_data Doctor/MedStaff/Rental/S&M/Admin, Forecast scenarios

ข้อจำกัดและความแม่นยำ

สรุประดับความน่าเชื่อถือ
ข้อมูลระดับหมายเหตุ
Revenue (รายได้)🟢 High — actualReconcile กับ PPTX ±1.9%, realtime
Inventory COGS (ต้นทุนสินค้า)🟡 Medium — actual แต่ lagD365 BC Negative Adjmt., lag ~57 วัน, reconcile ±2.9%
Doctor / MedStaff / Rental🟠 EstimateScale จาก % PPTX × revenue จริง
S&M / Admin / D&A🟠 EstimateScale จาก % PPTX × revenue จริง
2024/2025 cost (YTD 5M)🔴 Rough estimatePPTX 4M ×5/4 linear scaling — ไม่คำนึงถึง seasonality
Forecast scenarios🔵 Projectionจาก board deck — ไม่อัปเดตอัตโนมัติ

พิมพ์เป็น PDF: กด Ctrl+P → Save as PDF

ตั้งค่า: Margins = None, Scale = 90%, Headers & Footers = off