Generate a report as raw HTML body content via SSE.
Same ReAct loop for data gathering, but Writer outputs HTML instead of JSON.
"""
asyncdefevent_stream():
start_time=time.time()
try:
logger.info("📝 HTML Report Agent: %s",req.question[:100])
all_tool_results:dict[str,Any]={}
cycle=0
MAX_REFLECT_CYCLES=4
tool_counter=0
# --- Handle Follow-up Context ---
parent_context=""
is_followup=bool(req.parent_report_id)
ifis_followup:
sql="SELECT prompt, tools_used FROM public.ai_reports WHERE id = $1"
pool=awaitPostgresReadonly._get_pool()
asyncwithpool.acquire()asconn:
row=awaitconn.fetchrow(sql,req.parent_report_id)
ifrow:
parent_context=f"THIS IS A FOLLOW-UP QUERY to a previous report.\nPrevious Report Topic: {row['prompt']}\nTools already used: {row['tools_used']}\n\nYou must focus ONLY on answering the follow-up question by querying new data if needed.\n\n"
logger.info("Context loaded for Follow-up to Report #%s",req.parent_report_id)
# ── THINK ──
yield_sse({"type":"thinking","step":"🧠 Đang phân tích yêu cầu..."})
think_input=(
f"{parent_context}"
f"User request: {req.question}\n\n"
f"## INSTRUCTION:\nBreak down this request into sub_tasks and provide the FIRST set of tools to run.\n"
f"RESPOND WITH RAW JSON ONLY (no markdown blocks)."
yield_sse({"type":"thinking","step":"✍️ Đang viết báo cáo HTML từ dữ liệu thật..."})
data_context=_summarize_results(all_tool_results)
writer_input=(
f"{parent_context}"
f"User request: {req.question}\n\n"
f"## REAL DATA FROM TOOLS ({tool_counter} queries, {cycle} cycles):\n{data_context}\n\n"
f"## DATA FORMAT:\n"
f"Data is provided as tab-separated tables. To create Chart.js charts:\n"
f"- First column = labels[] array (x-axis: dates, categories, names)\n"
f"- Other columns = data[] arrays (y-axis: numbers, counts, amounts)\n"
f"- Example: if data shows 'ngay\\tdoanh_thu', use labels=['2024-01','2024-02',...] and data=[120M, 150M,...]\n\n"
f"Generate the FULL report HTML body using the data above.\n"
f"CRITICAL: You MUST generate AT LEAST 6 pages (6 `.page` divs). Include: Cover page, TOC + Executive Summary + KPIs, "
f"2-3 analysis pages with charts and tables, and a Conclusion + Recommendations page. "
f"Do NOT skip pages or abbreviate. Each content page MUST have .rh header and .pf footer."
)
ifis_followup:
writer_input+=" OVERRIDE: Since this is a follow-up, DO NOT generate a full HTML page. ONLY generate a `<div class='followup-section'>...</div>` containing the answer to the follow-up question, styled using the existing report_template.css classes (e.g. .section, .kpi-grid). Output RAW HTML ONLY."
- ✅ GOOD: `SELECT DATE(created_at) as ngay, SUM(amount) as doanh_thu, COUNT(*) as so_don FROM orders GROUP BY ngay ORDER BY ngay`
2. **LIMIT all queries to 20 rows max**: `LIMIT 20` at end of every query
3. **Pre-compute metrics in SQL** — don't send raw data:
- ❌ BAD: `SELECT * FROM traces` → AI Writer gets 500 rows of raw data
- ✅ GOOD: `SELECT model_name, COUNT(*) as traces, AVG(trace_latency) as avg_latency, SUM(total_cost) as total_cost FROM ... GROUP BY model_name`
4. **For time-series charts**: Group by DAY/WEEK/MONTH, not individual timestamps
- ✅ `SELECT DATE(traced_at) as ngay, COUNT(*) as so_luong FROM ... GROUP BY ngay ORDER BY ngay LIMIT 20`
5. **For distributions/rankings**: Use TOP N with ORDER BY
- ✅ `SELECT category, COUNT(*) as cnt FROM ... GROUP BY category ORDER BY cnt DESC LIMIT 10`
6. **For comparisons**: Compute ratios/percentages IN the SQL
- ✅ `SELECT model_name, COUNT(*) as total, SUM(CASE WHEN total_obs_error > 0 THEN 1 ELSE 0 END) as errors, ROUND(SUM(CASE WHEN total_obs_error > 0 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) as error_pct FROM ... GROUP BY model_name`
## DEEP REASONING RULES:
1. **First cycle**: Start with 3-5 diverse overview queries (aggregates, schema checks, recent samples)
2. **Reflect deeply**: After getting results, ALWAYS ask:
- "What patterns do I see?" → Find anomalies, spikes, drops
- "WHY did this happen?" → Create drill-down sub-tasks
- "What's MISSING from a senior analyst's perspective?" → Cross-reference
3. **Second cycle**: Drill-down queries based on patterns discovered
- If a day has unusually high latency → query traces for that specific day
- If a model has more errors → compare with other models
- If chat logs show escalation patterns → analyze which intents trigger escalation
## CHART.JS BOILERPLATE (always include at bottom):
```javascript
const F = {family:"'Inter',sans-serif",size:9}
const TIP = {backgroundColor:"#0F2044",titleColor:"#93C5FD",bodyColor:"#F1F5F9",padding:11,cornerRadius:6,titleFont:{...F,size:9},bodyFont:{...F,size:11,weight:"700"}}
const TIP = {backgroundColor:"#0F2044",titleColor:"#93C5FD",bodyColor:"#F1F5F9",padding:11,cornerRadius:6,titleFont:{...F,size:9},bodyFont:{...F,size:11,weight:"700"}}
<pstyle={{fontSize:13.5,color:"#475569",lineHeight:1.7,marginBottom:14}}>AIReportAgentsửdụngkiếntrúc<b>ReAct(Reasoning+Acting)</b> với cơ chế <b>Reflect Loop</b>.Thayvìchạycứngmộtpipeline,Agenttựsuynghĩ,querydữliệu,đánhgiáxemđãđủchưa,vàtựquyếtđịnhkhinàodừnglạiđểviếtbáocáo.</p>
<prestyle={{fontFamily:"'Inter',system-ui",fontSize:12.5,color:"#475569",lineHeight:2.1,whiteSpace:"pre-wrap"}}>{` 📝 User nhập yêu cầu báo cáo
↓
🧠 THINK — Agent phân tích, chọn tools + viết SQL
↓
🔧 ACT — Execute tools song song (asyncio.gather)
↓
👁️ OBSERVE — Thu thập kết quả từ các tools
↓
🔍 REFLECT — LLM tự đánh giá:
│ • Dữ liệu đã đủ chưa?
│ • Chất lượng data có ổn không?
│ • Còn thiếu góc nhìn nào?
│
├── ❌ Chưa đủ → Quay lại THINK (max 3 vòng)
└── ✅ Đủ rồi → Tiếp tục xuống
↓
✍️ WRITE — LLM viết báo cáo hoàn chỉnh từ data thật
↓
📄 Stream sections lên frontend
↓
🏁 DONE!`}</pre>
</div>
<FlowStepicon="🧠"bg="linear-gradient(135deg,#EEF2FF,#E0E7FF)"border="#C7D2FE"title="Phase 1: THINK — Phân tích & Lên kế hoạch"desc="Agent nhận yêu cầu từ user, phân tích cần data gì, tạo SQL queries phù hợp. Chọn 2-4 tools đa dạng cho batch đầu."tags={[{text:"LLM Call #1",bg:"#EEF2FF",color:"#4338CA"}]}/>
<FlowStepicon="🔧"bg="linear-gradient(135deg,#FEF3C7,#FDE68A)"border="#FCD34D"title="Phase 2: ACT — Execute Tools Song Song"desc="Tất cả tools trong batch được execute đồng thời bằng asyncio.gather(). Nhanh gấp 3-4x so với tuần tự."tags={[{text:"Parallel I/O",bg:"#ECFDF5",color:"#059669"}]}/>
<FlowStepicon="🔍"bg="linear-gradient(135deg,#FFF7ED,#FFEDD5)"border="#FDBA74"title="Phase 3: REFLECT — Tự đánh giá dữ liệu"desc="LLM xem lại toàn bộ data đã thu thập. Nếu thiếu → tạo thêm queries. Nếu đủ → chuyển sang viết."tags={[{text:"LLM Call #2",bg:"#FEF3C7",color:"#D97706"},{text:"Max 3 vòng",bg:"#FFF1F2",color:"#E11D48"}]}/>
<FlowStepicon="✍️"bg="linear-gradient(135deg,#ECFDF5,#D1FAE5)"border="#6EE7B7"title="Phase 4: WRITE — Viết báo cáo hoàn chỉnh"desc="LLM nhận toàn bộ data thật → viết báo cáo JSON: executive summary, highlights, 4-6 sections (chart/table), conclusion, recommendations."tags={[{text:"LLM Call #3",bg:"#ECFDF5",color:"#059669"}]}/>
<Cardicon="📊"bg="#EEF2FF"border="#E0E7FF"title="sql_langfuse"desc="Query bảng analytic.chatbot_rsa_trace_event_detail — traces, latency, costs, models, errors."sub="👉 Hiệu suất chatbot, chi phí LLM, user analytics"/>
<Cardicon="🏷️"bg="#FEF3C7"border="#FDE68A"title="sql_starrocks"desc="Query bảng sản phẩm — tên, giá, số lượng bán, màu, chất liệu, mùa."sub="👉 Phân tích sản phẩm, doanh thu, thống kê catalog"/>
<Cardicon="💬"bg="#ECFDF5"border="#A7F3D0"title="sql_postgres"desc="Query chat histories — tin nhắn user, bot, timestamp, identity."sub="👉 Phân tích hội thoại, volume chat, engagement"/>
<Cardicon="🧮"bg="#FFF1F2"border="#FECDD3"title="calculator"desc="Tính toán math: cộng, trừ, nhân, chia, phần trăm. Chỉ nhận digits + operators."sub="👉 Tỉ lệ tăng trưởng, % thay đổi, trung bình"/>
<pstyle={{fontSize:13.5,color:"#475569",marginBottom:14}}>Bảng<codestyle={{background:"#F1F5F9",padding:"2px 6px",borderRadius:4,fontSize:11,color:"#6366F1"}}>analytic.chatbot_rsa_trace_event_detail</code> — chứa toàn bộ traces từ Langfuse.</p>
<Cardicon="⚡"bg="#F8FAFC"border="#E2E8F0"title="Backend"desc="FastAPI + StreamingResponse (SSE). Async tools via asyncio.gather(). POST /api/report-agent"/>
// ─── MAIN ─────────────────────────────────────────────────────────────────────
constSMIN=52,SDEF=340,SMAX=500
functionReportAI(){
const[messages,setMessages]=useState([{role:"assistant",content:"👋 Xin chào!\n\nTôi là AI Report Agent — tạo báo cáo từ dữ liệu thật:\n\n• 📊 Query Langfuse: traces, scores, costs\n• 🗄️ Query StarRocks: sản phẩm, doanh thu\n• 💬 Query Postgres: lịch sử chat\n• 📈 Tạo biểu đồ + bảng số liệu\n\nChọn gợi ý bên phải hoặc nhập chủ đề →"}])
const[steps,setSteps]=useState([])// Agent steps for sidebar
<divstyle={{width:44,height:44,borderRadius:"50%",border:"3px solid #DBEAFE",borderTopColor:"#2563EB",animation:"spin .8s linear infinite",margin:"0 auto 16px"}}/>
<divstyle="width:64px;height:64px;border-radius:18px;background:linear-gradient(135deg,#EEF2FF,#F5F3FF);border:1px solid #E0E7FF;display:flex;align-items:center;justify-content:center;font-size:28px;margin:0 auto 20px">📋</div>
<h1>AI Report Generator</h1>
<p>Chọn template mẫu hoặc nhập yêu cầu của bạn để hệ thống AI Query<br>data từ Langfuse, StarRocks, Postgres & Sinh báo cáo HTML A4</p>
<divclass="templates-grid">
<divclass="template-card"onclick="selectTemplate('Phân tích chi phí sử dụng LLM, usage tokens và hiệu suất agent 30 ngày qua (tập trung vào tối ưu chi phí)')">
<divclass="tc-header">
<divclass="tc-icon">💰</div>
<divclass="tc-title">Báo cáo Chi phí LLM</div>
</div>
<divclass="tc-desc">Phân tích token usage, cost/user, latency và đề xuất tối ưu.</div>
</div>
<divclass="template-card"onclick="selectTemplate('Báo cáo hiệu suất chatbot AI Canifa tháng 3/2026: user engagement, success rate, và lỗi thường gặp')">
<divclass="tc-header">
<divclass="tc-icon">⚡</div>
<divclass="tc-title">Hiệu suất Chatbot</div>
</div>
<divclass="tc-desc">Đánh giá tương tác user, tỷ lệ thành công và các bottleneck.</div>
</div>
<divclass="template-card"onclick="selectTemplate('Phân tích chất lượng câu trả lời của AI dựa trên feedback của user (Score, Like/Dislike, Complaints) 30 ngày qua')">
<divclass="tc-header">
<divclass="tc-icon">⭐</div>
<divclass="tc-title">Chất lượng Feedback</div>
</div>
<divclass="tc-desc">Deep-dive vào user ratings, complaints và độ chính xác (RAG).</div>
</div>
<divclass="template-card"onclick="selectTemplate('Phân tích top sản phẩm bán chạy nhất trên StarRocks và xu hướng quan tâm của user qua chatbot')">
<divclass="tc-desc">Phân tích top sales map với intent tìm kiếm của khách hàng.</div>
</div>
</div>
<divclass="input-box">
<textareaid="input"rows="2"placeholder="Hoặc mô tả yêu cầu báo cáo tự do (vd: Phân tích nhóm khách hàng xài bot nhiều nhất)..."onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();submitQuery()}"></textarea>
<inputtype="text"id="followupInput"placeholder="Hỏi thêm về báo cáo này (VD: Phân tích chi tiết lỗi Timeout...)"onkeydown="if(event.key==='Enter') submitQuery(null, currentReportId)">
<buttononclick="submitQuery(null, currentReportId)">Hỏi tiếp ↵</button>
<spanclass="cover-metalabel">Ngày phát hành</span>
<spanclass="cover-metaval">15 tháng 4, 2025</span>
</div>
<divclass="cover-metaitem">
<spanclass="cover-metalabel">Người lập</span>
<spanclass="cover-metaval">Ban Phân tích Dữ liệu</span>
</div>
<divclass="cover-metaitem">
<spanclass="cover-metalabel">Phê duyệt</span>
<spanclass="cover-metaval">Tổng Giám đốc</span>
</div>
</div>
</div>
<divclass="cover-footer">
<spanclass="cover-footer-note">Tài liệu chứa thông tin kinh doanh nhạy cảm. Chỉ lưu hành nội bộ theo danh sách phân phối được phê duyệt.</span>
<spanclass="cover-stamp">Bảo mật nội bộ</span>
</div>
</div>
</div>
</div>
<!-- ═══ TRANG 2 — MỤC LỤC + TÓM TẮT ═══ -->
<divclass="page cp">
<divclass="rh">
<spanclass="rh-left"><spanclass="rh-dot"></span>Báo cáo Kết quả Kinh doanh Q1/2025 — TTVN</span>
<spanclass="rh-right">Trang 2 / 5</span>
</div>
<h1>Mục Lục</h1>
<divstyle="margin:5mm 0 8mm">
<divclass="toc-item"><spanclass="toc-num">1.</span><spanclass="toc-text">Tóm tắt Điều hành</span><spanclass="toc-dots"></span><spanclass="toc-pg">3</span></div>
<divclass="toc-item"><spanclass="toc-num">2.</span><spanclass="toc-text">Tổng quan Kết quả Kinh doanh</span><spanclass="toc-dots"></span><spanclass="toc-pg">3</span></div>
<divclass="toc-item toc-sub"><spanclass="toc-num">2.1</span><spanclass="toc-text">Diễn biến doanh thu hàng tháng</span><spanclass="toc-dots"></span><spanclass="toc-pg">3</span></div>
<divclass="toc-item toc-sub"><spanclass="toc-num">2.2</span><spanclass="toc-text">Các chỉ số vận hành cốt lõi</span><spanclass="toc-dots"></span><spanclass="toc-pg">3</span></div>
<divclass="toc-item"><spanclass="toc-num">3.</span><spanclass="toc-text">Phân tích Doanh thu theo Danh mục Sản phẩm</span><spanclass="toc-dots"></span><spanclass="toc-pg">4</span></div>
<divclass="toc-item"><spanclass="toc-num">4.</span><spanclass="toc-text">Hiệu quả Kênh Phân phối</span><spanclass="toc-dots"></span><spanclass="toc-pg">4</span></div>
<divclass="toc-item"><spanclass="toc-num">5.</span><spanclass="toc-text">Phân tích Chi phí & Lợi nhuận</span><spanclass="toc-dots"></span><spanclass="toc-pg">5</span></div>
<divclass="toc-item"><spanclass="toc-num">6.</span><spanclass="toc-text">Xu hướng & Dự báo Q2/2025</span><spanclass="toc-dots"></span><spanclass="toc-pg">5</span></div>
<divclass="toc-item"><spanclass="toc-num">7.</span><spanclass="toc-text">Kết luận & Khuyến nghị Chiến lược</span><spanclass="toc-dots"></span><spanclass="toc-pg">5</span></div>
<p>Quý I năm 2025, Công ty Cổ phần Thương mại Thời trang Việt ghi nhận tổng doanh thu đạt <strong>142,6 tỷ đồng</strong>, tăng trưởng <strong>18,4%</strong> so với cùng kỳ năm 2024 và vượt kế hoạch đề ra <strong>6,2%</strong>. Đây là mức tăng trưởng cao nhất trong vòng sáu quý gần đây, phản ánh hiệu quả của chiến lược mở rộng kênh thương mại điện tử và tái định vị thương hiệu phân khúc cao cấp triển khai từ Q3/2024.</p>
<p>Lợi nhuận gộp đạt <strong>61,3 tỷ đồng</strong>, biên lợi nhuận gộp cải thiện từ 38,7% lên <strong>43,0%</strong>, chủ yếu nhờ tối ưu hóa chuỗi cung ứng và gia tăng tỷ trọng sản phẩm tự thiết kế. Kênh thương mại điện tử lần đầu tiên vượt kênh bán lẻ truyền thống, chiếm <strong>52,3%</strong> tổng doanh thu — cột mốc chiến lược quan trọng trong lộ trình chuyển đổi số của công ty.</p>
<p>Chi phí vận hành tăng 22,1% do mở thêm ba showroom mới và đầu tư hạ tầng công nghệ. Ban lãnh đạo đánh giá đây là khoản đầu tư chiến lược, dự kiến hoàn vốn trong 4–6 quý tới. Lợi nhuận trước thuế đạt <strong>16,2 tỷ đồng</strong>, tăng 40,9% YoY.</p>
<spanclass="pf-left">Công ty CP Thương mại Thời trang Việt · Bảo mật nội bộ</span>
<spanclass="pf-center">TTVN-BC-2025-Q1-001</span>
<spanclass="pf-right">2 / 5</span>
</div>
</div>
<!-- ═══ TRANG 3 — TỔNG QUAN + SẢN PHẨM ═══ -->
<divclass="page cp">
<divclass="rh">
<spanclass="rh-left"><spanclass="rh-dot"></span>Báo cáo Kết quả Kinh doanh Q1/2025 — TTVN</span>
<spanclass="rh-right">Trang 3 / 5</span>
</div>
<h2data-n="2">Tổng quan Kết quả Kinh doanh</h2>
<pclass="lead">Quý I/2025 đánh dấu bước chuyển biến tích cực với tăng trưởng vượt dự báo và cải thiện đồng đều trên hầu hết các chỉ số hoạt động cốt lõi.</p>
<p>Doanh thu tháng 3 đạt đỉnh <strong>54,8 tỷ đồng</strong>, tăng 31,2% so với tháng 1 cùng quý, phản ánh xu hướng tiêu dùng theo mùa vụ với nhu cầu mua sắm dịp Quốc tế Phụ nữ 8/3 và mùa hè đến sớm tại các tỉnh miền Nam. Hiệu ứng này mạnh hơn kỳ vọng khoảng 15%, cho thấy các chiến dịch truyền thông tập trung đã phát huy hiệu quả tích cực. Số lượng khách hàng mới đạt <strong>18.640 người</strong>, tăng 28,4% YoY, trong khi tỷ lệ giữ chân khách hàng cải thiện đáng kể từ 41,2% lên 47,8%.</p>
<divclass="fig">
<divclass="fig-header">
<spanclass="fig-num">Hình 2.1</span>
<spanclass="fig-title">Doanh thu hàng tháng Q1/2025 so với Q1/2024 (tỷ đồng)</span>
<divclass="fig-cap"><strong>Nguồn:</strong> Hệ thống quản lý bán hàng POS & ERP nội bộ. Số liệu chưa bao gồm doanh thu từ nhượng quyền thương hiệu.</div>
</div>
<divclass="note info">
<divclass="note-icon">i</div>
<p><strong>Lưu ý:</strong> Tăng đột biến tháng 3 chịu ảnh hưởng yếu tố mùa vụ. Tăng trưởng hữu cơ (loại trừ lễ hội) ước tính 14–16% YoY, phù hợp tốc độ tăng trưởng bền vững dài hạn của thị trường.</p>
</div>
<h2data-n="3">Phân tích Doanh thu theo Danh mục Sản phẩm</h2>
<p><strong>Thời trang Nữ</strong> tiếp tục dẫn đầu với 47,3% tổng doanh thu (67,5 tỷ đồng), tăng 21,7% YoY. Nhóm sản phẩm cao cấp (trên 1,5 triệu đồng) tăng 38,2% — vượt xa nhóm phổ thông (9,4%), khẳng định chiến lược premium đúng hướng. <strong>Phụ kiện & Túi xách</strong> là danh mục tăng trưởng nhanh nhất với 29,4% YoY và biên lợi nhuận gộp cao nhất ở mức 52,7%.</p>
<spanclass="pf-left">Công ty CP Thương mại Thời trang Việt · Bảo mật nội bộ</span>
<spanclass="pf-center">TTVN-BC-2025-Q1-001</span>
<spanclass="pf-right">3 / 5</span>
</div>
</div>
<!-- ═══ TRANG 4 — KÊNH + CHI PHÍ ═══ -->
<divclass="page cp">
<divclass="rh">
<spanclass="rh-left"><spanclass="rh-dot"></span>Báo cáo Kết quả Kinh doanh Q1/2025 — TTVN</span>
<spanclass="rh-right">Trang 4 / 5</span>
</div>
<h2data-n="4">Hiệu quả Kênh Phân phối</h2>
<p>Cấu trúc kênh phân phối bước qua cột mốc lịch sử trong Q1/2025 khi <strong>kênh thương mại điện tử lần đầu tiên vượt kênh bán lẻ truyền thống</strong>, chiếm 52,3% tổng doanh thu. Kênh TMĐT tự vận hành (owned) tăng 79,4% YoY nhờ đầu tư mạnh vào UX/UI website và chiến lược livestream bán hàng. Kênh bán lẻ trực tiếp với 23 showroom ghi nhận doanh thu 47,8 tỷ đồng, năng suất bình quân mỗi điểm bán tăng từ 1,87 lên <strong>2,08 tỷ đồng/quý</strong>.</p>
<divclass="fig">
<divclass="fig-header">
<spanclass="fig-num">Hình 4.1</span>
<spanclass="fig-title">Doanh thu theo Kênh Phân phối — So sánh Q1/2025 vs Q1/2024 (tỷ đồng)</span>
<divclass="fig-cap"><strong>Nguồn:</strong> Hệ thống ERP và báo cáo sàn TMĐT. *Kênh Đối tác bao gồm đại lý bán buôn khu vực và đối tác B2B doanh nghiệp.</div>
</div>
<divclass="note warn">
<divclass="note-icon">!</div>
<p><strong>Cảnh báo chiến lược:</strong> Sự dịch chuyển nhanh sang kênh số tiềm ẩn rủi ro xói mòn trải nghiệm thương hiệu cao cấp. Cần triển khai chuẩn hóa trải nghiệm omnichannel trong Q2/2025.</p>
</div>
<h2data-n="5">Phân tích Chi phí & Biên Lợi nhuận</h2>
<p>Tổng chi phí hoạt động đạt <strong>126,4 tỷ đồng</strong>, tăng 14,1% — thấp hơn tốc độ tăng doanh thu (18,4%), cho thấy đòn bẩy hoạt động đang phát huy tích cực. Giá vốn hàng bán giảm từ 61,3% xuống còn <strong>57,0% doanh thu</strong> nhờ cải thiện điều khoản với nhà cung cấp và tăng tỷ trọng hàng tự sản xuất lên 28%.</p>
<tr><td>Chi phí bán hàng & MKT</td><tdclass="r">(18,7)</td><tdclass="r">(14,8)</td><tdclass="r"><spanclass="badge dn">↑ 26,4%</span></td><tdclass="r">13,1%</td></tr>
<tr><td>Chi phí quản lý DN</td><tdclass="r">(9,8)</td><tdclass="r">(8,5)</td><tdclass="r"><spanclass="badge dn">↑ 15,3%</span></td><tdclass="r">6,9%</td></tr>
<tr><td>Chi phí tài chính (ròng)</td><tdclass="r">(16,6)</td><tdclass="r">(11,8)</td><tdclass="r"><spanclass="badge dn">↑ 40,7%</span></td><tdclass="r">11,6%</td></tr>
<trclass="trow-total"><td>Lợi nhuận trước thuế (EBT)</td><tdclass="r">16,2</td><tdclass="r">11,5</td><tdclass="r">↑ 40,9%</td><tdclass="r">11,4%</td></tr>
</tbody>
</table>
</div>
<divclass="pf">
<spanclass="pf-left">Công ty CP Thương mại Thời trang Việt · Bảo mật nội bộ</span>
<spanclass="pf-center">TTVN-BC-2025-Q1-001</span>
<spanclass="pf-right">4 / 5</span>
</div>
</div>
<!-- ═══ TRANG 5 — DỰ BÁO + KẾT LUẬN ═══ -->
<divclass="page cp">
<divclass="rh">
<spanclass="rh-left"><spanclass="rh-dot"></span>Báo cáo Kết quả Kinh doanh Q1/2025 — TTVN</span>
<spanclass="rh-right">Trang 5 / 5</span>
</div>
<h2data-n="6">Xu hướng & Dự báo Q2/2025</h2>
<p>Dựa trên dữ liệu đơn hàng tháng 4/2025 và mô hình phân tích nội bộ, doanh thu Q2/2025 ước đạt <strong>148–155 tỷ đồng</strong> (kịch bản cơ sở: <strong>151,5 tỷ</strong>, +17,4% YoY). Các động lực tăng trưởng chính gồm mùa hè cao điểm, ba showroom mới đạt hiệu quả bình thường, và bộ sưu tập Hè 2025 được phản hồi tích cực trong đợt xem trước VIP.</p>
<divclass="fig">
<divclass="fig-header">
<spanclass="fig-num">Hình 6.1</span>
<spanclass="fig-title">Dự báo Doanh thu Q2–Q4/2025 theo kịch bản (tỷ đồng)</span>
<divclass="fig-cap"><strong>Ghi chú:</strong> Đường liền = thực tế; đường đứt nét = dự báo kịch bản cơ sở. Kịch bản lạc quan giả định doanh thu TMĐT tăng thêm 8%; kịch bản xấu giả định tỷ giá tăng 5% và chi phí logistics tăng 8%.</div>
</div>
<divclass="note success">
<divclass="note-icon">✓</div>
<p><strong>Tín hiệu tích cực:</strong> Tỷ lệ đơn hàng lặp lại trong tháng 4 đạt 51,3% — cao nhất lịch sử công ty — cho thấy chương trình khách hàng thân thiết Style Club đang tạo ra nền tảng doanh thu ổn định và có thể dự đoán.</p>
<h2data-n="7">Kết luận & Khuyến nghị Chiến lược</h2>
<h3>7.1 Kết luận</h3>
<p>Quý I/2025 xác nhận đà phục hồi mạnh và bền vững của Thời trang Việt sau giai đoạn tái cơ cấu. Các chỉ số cốt lõi đều vượt kế hoạch, với điểm nhấn là cải thiện biên lợi nhuận gộp (+4,3 điểm phần trăm) và cột mốc kênh thương mại điện tử trở thành kênh chủ đạo. Nền tảng kinh doanh đủ vững chắc để hỗ trợ mục tiêu tăng trưởng doanh thu <strong>20% cho cả năm 2025</strong>.</p>
<h3>7.2 Khuyến nghị</h3>
<divstyle="margin-top:3mm">
<divclass="rec-item"><spanclass="rec-n">1</span><spanclass="rec-text">Tăng ngân sách marketing digital thêm 20% trong Q2/2025, tập trung TikTok Shop và chiến dịch livestream để duy trì đà tăng trưởng kênh TMĐT trước mùa hè cao điểm.</span></div>
<divclass="rec-item"><spanclass="rec-n">2</span><spanclass="rec-text">Đẩy nhanh lộ trình tăng tỷ trọng hàng tự thiết kế lên 35% trong Q3/2025, nhằm cải thiện thêm biên lợi nhuận gộp và giảm phụ thuộc nhà cung cấp nước ngoài.</span></div>
<divclass="rec-item"><spanclass="rec-n">3</span><spanclass="rec-text">Triển khai chính sách hedging tỷ giá cho 60–70% lượng nhập khẩu theo hợp đồng kỳ hạn 3–6 tháng, giảm thiểu rủi ro biến động chi phí trong Q2–Q3/2025.</span></div>
<divclass="rec-item"><spanclass="rec-n">4</span><spanclass="rec-text">Tạm dừng mở rộng showroom trong Q2/2025, tập trung nâng cao năng suất 3 điểm mới đạt mức hòa vốn trong vòng 2 quý, trước khi xem xét mở rộng tiếp.</span></div>
<divclass="rec-item"><spanclass="rec-n">5</span><spanclass="rec-text">Mở rộng chương trình Style Club cho phân khúc B2B (đồng phục doanh nghiệp, đối tác phân phối) nhằm tạo nguồn doanh thu ổn định và nâng tỷ lệ giữ chân lên mục tiêu 55%.</span></div>
</div>
<hrclass="fn-rule">
<pclass="fn">¹ Số liệu trong báo cáo này là số liệu quản trị chưa qua kiểm toán. Báo cáo tài chính kiểm toán chính thức sẽ được công bố ngày 30/4/2025.</p>
<pclass="fn">² Tốc độ tăng trưởng YoY so sánh Q1/2025 với Q1/2024. Số liệu Q1/2024 được điều chỉnh theo chuẩn mực kế toán mới áp dụng từ 01/01/2025.</p>
<divclass="sigblock">
<divclass="sig-item">
<divclass="sig-label">Người lập báo cáo</div>
<divclass="sig-line"style="height:14mm"></div>
<divclass="sig-name">Nguyễn Minh Khoa</div>
<divclass="sig-role">Trưởng phòng Phân tích Dữ liệu</div>
</div>
<divclass="sig-item">
<divclass="sig-label">Người kiểm tra</div>
<divclass="sig-line"style="height:14mm"></div>
<divclass="sig-name">Trần Thị Thu Hà</div>
<divclass="sig-role">Giám đốc Tài chính (CFO)</div>
</div>
<divclass="sig-item">
<divclass="sig-label">Phê duyệt</div>
<divclass="sig-line"style="height:14mm"></div>
<divclass="sig-name">Lê Văn Đức</div>
<divclass="sig-role">Tổng Giám đốc (CEO)</div>
</div>
</div>
<divclass="pf"style="margin-top:6mm">
<spanclass="pf-left">Công ty CP Thương mại Thời trang Việt · Bảo mật nội bộ</span>