Bỏ qua để đến nội dung

Tích hợp Hub (bsd_hub)

Realty Project ship sẵn API layer cho phép tích hợp với hệ thống bên ngoài qua hub bsd_hub — Next.js BFF (Backend-for-Frontend) chạy độc lập, reuse Odoo session cho auth, expose RESTful API + Webhook.

Hệ thống bên ngoài (Mobile app / Power BI / Custom dashboard)
↓ HTTPS REST
bsd_hub (Next.js BFF)
↓ Odoo XML-RPC / JSON-RPC
Realty Project (Odoo 19)
↓ ORM
PostgreSQL 16
LayerTrách nhiệm
bsd_hubSession reuse + caching + rate-limit + multi-tenant routing + type-safe API
OdooBusiness logic + DB + ACL gốc

bsd_hub KHÔNG store data — chỉ proxy + cache + format. Single source of truth vẫn ở Odoo DB.

bsd_hub reuse Odoo session cookie — user login Odoo 1 lần, mọi API call từ hệ thống bên ngoài đi qua bsd_hub đều inherit session đó.

1. User login Odoo: POST /web/session/authenticate
→ response: session_id cookie
2. App gọi bsd_hub: GET /api/projects
Headers: Cookie: session_id=xxx
3. bsd_hub verify session via Odoo /web/session/get_session_info
→ user_id, company_id, group_ids
4. bsd_hub call Odoo XML-RPC với context user_id
→ ACL của user áp dụng đầy đủ
→ return filtered data theo user role
5. bsd_hub format response (camelCase JSON cho FE convenience)

Hub support multiple Odoo instances (multi-company hoặc multi-customer):

{
"tenants": {
"customer-a.bsdinsight.com": {
"odoo_url": "https://customer-a-odoo.internal:8069",
"default_db": "prod"
},
"customer-b.bsdinsight.com": {
"odoo_url": "https://customer-b-odoo.internal:8069",
"default_db": "prod"
}
}
}

Hub route theo subdomain → đúng Odoo instance.

EndpointMethodReturn
/api/projectsGETList projects user có quyền access (filter theo ACL)
/api/projects/{id}GETDetail 1 project + nested data (subzones, structures)
/api/projects/{id}/progressGETWeighted progress + KPI tiles
/api/projects/{id}/cashflowGETForecast cash flow 12 tháng
EndpointMethodReturn
/api/contractsGETList HĐ nhà thầu với filters (project, state, NT)
/api/contracts/{id}GETDetail HĐ + BOQ + milestones + amendments
/api/contracts/{id}/bbnGETList BBN nghiệm thu
/api/contracts/{id}/invoicesGETList hóa đơn từ milestones
EndpointMethodReturn
/api/loans/notesGETList KW outstanding
/api/loans/notes/{id}/interest-scheduleGETLịch lãi chi tiết
/api/loans/bank-advice/previewPOSTUpload Excel → preview before allocate
/api/loans/bank-advice/allocatePOSTConfirm allocate giấy báo có
EndpointMethodReturn
/api/guarantees/outstandingGETBL NH outstanding theo NH × loại
/api/guarantees/{id}/lifecycleGETFull lifecycle 1 BL

Realty Project trigger webhook khi state thay đổi quan trọng — hub forward sang hệ thống đăng ký.

EventTrigger
contract.signedrp.contract.state → executing
bbn.approvedrp.progress.acceptance.state → approved
invoice.paidaccount.move.payment_state → paid
loan.note.activatedre.loan.note.state → active
bank.advice.importedre.loan.bank.advice tạo mới
guarantee.issuedre.bank.guarantee.state → issued
guarantee.forfeitedre.bank.guarantee.state → forfeited (risk alert)

Trong bsd_hub:

POST /api/webhooks/subscribe
{
"url": "https://my-app.example.com/webhook/realty",
"events": ["contract.signed", "bbn.approved"],
"secret": "xxx"
}

Hub gửi POST với HMAC-SHA256 signature trong header X-BSD-Signature.

PTDA dùng app mobile khi field check:

  • Xem tiến độ hạng mục đang thi công (API /projects/{id}/progress)
  • Chụp ảnh thực tế upload làm evidence cho BBN
  • Approve BBN ngay tại site (state proposed → approved)

CFO/CEO không login Odoo trực tiếp:

  • Power BI connect bsd_hub via REST API
  • Query cross-project KPI hourly (cron sync)
  • Render dashboard quen thuộc cho BLĐ

DevOps/PM team nhận alert real-time:

  • Webhook guarantee.forfeited → Slack channel #risk
  • Webhook loan.note.activated (giá trị lớn) → Discord channel #treasury
  • Next.js 14 (App Router) + TypeScript
  • Postgres for cache + rate-limit (shared với Odoo DB hoặc riêng)
  • Redis optional cho session cache (giảm tải Odoo)
  • Cloudflare Tunnel hoặc nginx reverse proxy
services:
bsd-hub:
image: bsdinsight/bsd-hub:latest
environment:
- ODOO_URL=http://odoo:8069
- REDIS_URL=redis://redis:6379
- JWT_SECRET=xxx
ports:
- 3000:3000
redis:
image: redis:7-alpine

Detail config tham khảo repo bsd-hub (private — liên hệ partner@bsdinsight.com).


Tiếp: Troubleshooting →

Chia sẻ: