Troubleshoot Doc Engine
Troubleshoot Doc Engine
Phần tiêu đề “Troubleshoot Doc Engine”Common errors + fixes cho Admin / Sales rep khi Doc Engine không hoạt động.
Symptom 1: Template render báo UndefinedError
Phần tiêu đề “Symptom 1: Template render báo UndefinedError”Error message: UndefinedError: 'X' is undefined
Nguyên nhân: Placeholder tham chiếu field không tồn tại trên record.
Fix:
{{ record.customer_name }}— sai{{ record.customer_id.name }}— đúng
Verify field name trong Odoo record form.
{{ record.warehouse_id.name }}— nếu HĐ không có warehouse (chỉ có lot), field is False →.namefail
Fix trong template:
{% if record.warehouse_id %} Kho: {{ record.warehouse_id.name }}{% endif %}Hoặc:
Kho: {{ record.warehouse_id.name or 'N/A' }}- Custom field
x_special_fieldthêm qua Studio → có thể chưa được include trong_record_to_dict()
Fix: Dev mode → Cấu hình → Doc Engine → Depth → increase từ 3 → 4 để include deeper fields.
Symptom 2: .docx render giữ nguyên {{ ... }} literal
Phần tiêu đề “Symptom 2: .docx render giữ nguyên {{ ... }} literal”Error: File output vẫn có {{ record.name }} thay vì “ZC-2026-042”.
Nguyên nhân: Jinja syntax lỗi (Word tự “smart quote” → {{ biến "{{).
Fix:
- Mở
.docxtrong Word / LibreOffice - Verify
{{ record.name }}— không có nghiêng, quote khác nhau ("vs") - Word autocorrect có thể đổi:
"{{ ... }}"(straight) →"{{ ... }}"(curly) — SAI{{ ... }}(plain) →{{ ... }}(italic) — OK vẫn work
- Tắt Word autocorrect: File → Options → Proofing → AutoCorrect Options → uncheck “Smart quotes”
- Re-type placeholder → save → re-upload
Symptom 3: OnlyOffice iframe blank / infinite loading
Phần tiêu đề “Symptom 3: OnlyOffice iframe blank / infinite loading”Symptom: Click Edit inline → iframe show white screen, không render editor.
Nguyên nhân + Fix:
1. Check JWT secret mismatch
Phần tiêu đề “1. Check JWT secret mismatch”docker exec parkone-odoo bash -c 'echo $OO_JWT_SECRET'docker exec zonepro-onlyoffice cat /etc/onlyoffice/documentserver/local.json | grep secretCả 2 phải same secret. Nếu khác:
- Sửa
docker-compose.yml:OO_JWT_SECRET=<same_value> - Restart cả 2 containers
2. Check network connectivity
Phần tiêu đề “2. Check network connectivity”docker exec zonepro-onlyoffice curl http://odoo:8069/parkone/doc/test-endpointReturn 200 → network OK. Timeout / connection refused → check docker network config.
3. Check browser console
Phần tiêu đề “3. Check browser console”DevTools → Console → look for:
403 Forbidden→ JWT wrongMixed content blocked→ protocol mismatch (http vs https)CORS blocked→ OnlyOffice configAllowMetaTag: true
4. Check OnlyOffice healthy
Phần tiêu đề “4. Check OnlyOffice healthy”curl https://oo.parkone.vn/healthcheck# → "true" nếu OKSymptom 4: Save trong OnlyOffice fail
Phần tiêu đề “Symptom 4: Save trong OnlyOffice fail”Symptom: Editor OK, edit content, click Save → error “Save failed”.
Nguyên nhân: Callback URL wrong hoặc Odoo callback endpoint error.
Fix:
-
Verify callback URL config trong Odoo:
- Env
OO_CALLBACK_URL=http://parkone.bsdinsights.com:8069(docker network alias) - Hoặc
http://odoo:8069nếu cùng compose
- Env
-
Test callback endpoint:
Terminal window docker exec zonepro-onlyoffice curl -X POST \http://parkone.bsdinsights.com:8069/parkone/doc/<template_id>/callback \-H "Content-Type: application/json" \-d '{"status": 2, "url": "test"}'Expect
{"error": 0}return. -
Check Odoo log:
docker logs parkone-odoo --tail 100 | grep callback
Symptom 5: PDF convert fail
Phần tiêu đề “Symptom 5: PDF convert fail”Symptom: Click “Convert to PDF” → error “libreoffice: command not found” hoặc timeout.
Fix:
- Add vào Dockerfile:
RUN apt-get install -y libreoffice
- Rebuild image
Chi tiết: Auto-convert PDF → Setup
- Convert PDF ra dấu hỏi chấm thay tiếng Việt
- Install font:
apt-get install fonts-noto-cjk fonts-liberation
- Doc quá lớn → convert > 60s → timeout
- Increase env
LIBREOFFICE_CONVERT_TIMEOUT=180 - Hoặc dùng async convert
Symptom 6: Field picker sidebar không hiện
Phần tiêu đề “Symptom 6: Field picker sidebar không hiện”Symptom: Mở template trong OnlyOffice → sidebar bên phải trống hoặc missing.
Fix:
-
Verify plugin sidecar loaded:
- DevTools → Network → filter
oo-plugin - Should see
code.jsload with 200 status
- DevTools → Network → filter
-
Verify plugin path exists:
Terminal window docker exec parkone-odoo ls addons/parkone/static/src/oo_plugin/# Should see code.js, config.json -
Cache issue — force reload:
- Cache-buster
?v=randomphải work - Nếu vẫn stale — clear browser cache (Ctrl+Shift+Del)
- Cache-buster
-
JWT mismatch — plugin không load nếu JWT invalid. Xem Symptom 3.
Symptom 7: Click field không insert
Phần tiêu đề “Symptom 7: Click field không insert”Symptom: Click field trong sidebar → no reaction, snippet không xuất hiện.
Fix:
-
Verify hello-ACK completed:
- DevTools → Console → filter
[Parkone] - Should see
Plugin ACK received - Nếu không → plugin không load, quay lại Symptom 6
- DevTools → Console → filter
-
Verify cursor active trong editor:
- Click vào doc content trước khi click field
- Không click từ sidebar mà editor không focus
-
Verify insert command dispatched:
- Console:
Insert command dispatched: <snippet> - Nếu không → sidebar handler broken, contact BSD support
- Console:
Symptom 8: Placeholder render Vietnamese sai encoding
Phần tiêu đề “Symptom 8: Placeholder render Vietnamese sai encoding”Symptom: {{ record.customer_id.name }} render “Cong ty TNHH Hoa Biet” (không dấu) hoặc “Cty ??? Hoa Bi???t” (mojibake).
Nguyên nhân: docxtpl encoding issue hoặc font missing.
Fix:
-
Verify template
.docxencoding UTF-8:- Word default UTF-8, không cần fix
- LibreOffice save as .docx: File → Save As → chọn “Word 2007-365 (.docx)”
-
Verify Odoo Python encoding:
- Container should have
LANG=C.UTF-8env docker exec parkone-odoo locale | grep LANG
- Container should have
-
Verify record data có dấu:
SELECT name FROM res_partner WHERE id = 42;- Nếu DB show “Cong ty” without dấu → data nhập sai, sửa data không phải template
Symptom 9: Multiple placeholders render same value
Phần tiêu đề “Symptom 9: Multiple placeholders render same value”Symptom: Template có 2 placeholders khác nhau {{ record.name }} và {{ record.customer_id.name }} — render ra cùng value.
Nguyên nhân: docxtpl context confused hoặc Word autoformat merged placeholders.
Fix:
-
Verify template raw XML:
- Unzip
.docx→ openword/document.xml - Search
record.name— should appear đúng 1 lần - Nếu appear 2 lần → Word merged placeholders, need re-type
- Unzip
-
Recreate placeholder từng cái:
- Delete existing placeholder
- Ctrl+Enter (paragraph break)
- Type new:
{{ record.customer_id.name }}
Symptom 10: Wizard render batch fail giữa chừng
Phần tiêu đề “Symptom 10: Wizard render batch fail giữa chừng”Symptom: Bulk render 20 HĐ → render được 5 → error → abort.
Fix:
- Xem log Odoo — identify record thứ 6 fail
- Xem lỗi cụ thể:
- Missing field → fix record data
- Template invalid → fix template
- Timeout → docsx quá phức tạp
- Skip record đó, re-run batch:
- Menu Action → Bulk Render → uncheck failed record
- Continue
Debug tools
Phần tiêu đề “Debug tools”1. Test render standalone
Phần tiêu đề “1. Test render standalone”docker exec parkone-odoo python3 << 'EOF'from docxtpl import DocxTemplateimport io
tpl = DocxTemplate('/mnt/extra-addons/parkone/data/templates/hd_thue_dat.docx')context = { 'record': { 'name': 'ZC-TEST-001', 'customer_id': {'name': 'Test KH', 'vat': '123'}, }, 'company': {'name': 'Test Co'},}tpl.render(context)out = io.BytesIO()tpl.save(out)print("OK, output size:", len(out.getvalue()))EOFNếu OK → template + docxtpl work. Vấn đề ở Odoo integration.
2. Enable verbose logging
Phần tiêu đề “2. Enable verbose logging”docker exec parkone-odoo bash -c \ 'echo "log_level = debug_rpc" >> /etc/odoo/odoo.conf'docker restart parkone-odooLog verbose: mọi WOPI request, JWT verify, callback log full. Tắt sau khi debug xong (log spam).
3. Postman test WOPI endpoints
Phần tiêu đề “3. Postman test WOPI endpoints”GET /parkone/doc/<template_id>/download?token=<jwt>— should return .docx binaryPOST /parkone/doc/<template_id>/callback— should accept JSON with{status, url}
Verify endpoints reachable từ OnlyOffice container network.
Emergency fallback
Phần tiêu đề “Emergency fallback”Nếu OnlyOffice hoàn toàn broken:
- Sales rep vẫn có thể download template từ Parkone → mở Word manual → edit → upload lại
- Skip OnlyOffice hoàn toàn → dùng Doc Engine v1 flow (render → download → upload signed)
- Follow-up với BSD support để fix OnlyOffice
Contact support
Phần tiêu đề “Contact support”Nếu debug không ra:
- Email: support@bsdinsight.com
- Attach: screenshot error + container logs (
docker logs parkone-odoo --tail 200) - Response time: 24h business hours