<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cà Phê &amp; Code — Odoo</title>
    <link>https://coffeecode.vn/categories/odoo</link>
    <description>Cà Phê &amp; Code là blog dành cho những người yêu công nghệ và lập trình. Nơi chia sẻ kiến thức coding, công cụ hữu ích, xu hướng công nghệ, kinh nghiệm phát triển phần mềm và những câu chuyện phía sau màn hình — tất cả được kể theo cách gần gũi, dễ hiểu, như một cuộc trò chuyện bên tách cà phê.</description>
    <language>vi</language>
    <atom:link href="https://coffeecode.vn/categories/odoo/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Đưa SCSS vào bản in Odoo đúng chuẩn — rồi phát hiện style không ăn: chuyện bundle report và wkhtmltopdf</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-113-report-css-style</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-113-report-css-style</guid>
      <description>Odoo có bundle web.report_assets_common để nạp CSS/SCSS cho mọi report. Nhưng nó vào PDF qua link ngoài mà wkhtmltopdf phải fetch — với workers=0 thì style rơi mất. Cách chắc ăn và giới hạn WebKit, đo trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Cron chờ đồng hồ, Automated Action chờ sự kiện: hai cơ chế tự động của Odoo khác nhau chỗ nào</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-119-automated-action-vs-cron</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-119-automated-action-vs-cron</guid>
      <description>Cron chạy theo lịch định kỳ; Automated Action chạy ngay khi một bản ghi được tạo/sửa/xoá. Dựng một quy tắc on_create thật và đo nó bắn tức thì, so với cron phải chờ nextcall. Trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Viết thẳng Python vào ô Mã của cron: những biến Odoo đưa sẵn cho bạn, và thứ sandbox chặn</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-118-cron-thuc-thi-code-python</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-118-cron-thuc-thi-code-python</guid>
      <description>state=&apos;code&apos; cho phép cron chạy đoạn Python nhiều dòng. Odoo cấp sẵn env, model, log, datetime, Command, UserError... nhưng không có &apos;fields&apos; và chặn import. Danh sách biến đo thật và một ví dụ chạy được trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Một mẫu in, ba khuôn mặt: dùng t-if/t-elif/t-else để report tự đổi theo trạng thái bản ghi</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-112-report-dieu-kien-hien-thi</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-112-report-dieu-kien-hien-thi</guid>
      <description>QWeb chọn nhánh hiển thị bằng t-if, t-elif, t-else — mỗi trạng thái thẻ ra một banner khác. Và t-if đơn giúp bỏ hẳn phần rỗng thay vì in khoảng trắng. Xem ba thẻ thật in ra ba kiểu trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Vì sao lệnh của bạn hiện trong menu Tác vụ còn report thì nằm ở nút In: ba trường binding</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-116-bindings-action-vao-menu-ngu-canh</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-116-bindings-action-vao-menu-ngu-canh</guid>
      <description>binding_model_id, binding_type, binding_view_types quyết định action của bạn xuất hiện ở đâu trong menu ngữ cảnh. Server action vào Tác vụ, report vào In — cùng một cơ chế. Soi registry get_bindings thật trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Vì sao đổi số điện thoại công ty mà chân trang PDF vẫn không đổi? Header/footer report đọc từ đâu</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-107-report-header-footer-cong-ty</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-107-report-header-footer-cong-ty</guid>
      <description>Mọi report của Odoo dùng chung một header/footer qua web.external_layout, nội dung lấy từ res.company. Nhưng dòng chân trang KHÔNG đọc trường phone — nó đọc report_footer. Xem nguồn thật và một phép thử trước/sau trên PDF Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Khi cần một câu trả lời trước khi đi tiếp: dialog service mở hộp thoại chặn ngay giữa màn hình Odoo</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-144-dialog-service-hop-thoai</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-144-dialog-service-hop-thoai</guid>
      <description>dialog service mở một hộp thoại chặn màn hình cho tới khi người dùng chọn xong. ConfirmationDialog là mẫu có sẵn với title, body và callback confirm/cancel. Dựng thật một hộp xác nhận xoá trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Nhét mã QR quét được vào thẻ PDF của Odoo — và vì sao cách &apos;đúng sách&apos; lại ra ô trống</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-108-report-barcode-qr</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-108-report-barcode-qr</guid>
      <description>Odoo sinh QR, Code128, EAN13... qua ir.actions.report.barcode(). Nhưng nhúng bằng URL /report/barcode trong PDF có thể ra ô rỗng khi workers=0. Cách chắc ăn: sinh ảnh thành Binary rồi image_data_uri. Đo thật trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>In 4 thẻ một lần lại ra 5 trang: cách QWeb gộp nhiều bản ghi vào một file PDF</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-110-report-nhieu-ban-ghi-mot-file</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-110-report-nhieu-ban-ghi-mot-file</guid>
      <description>Chọn nhiều bản ghi rồi in là ra một file PDF gộp — nhờ t-foreach docs và class page trong QWeb. Nhưng số trang không bằng số bản ghi: bản ghi dài tự tràn trang. Đo bằng PyPDF2 trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Bảng sao kê có cộng dồn theo tháng và một dòng TỔNG CỘNG: kỹ thuật t-set tích luỹ trong QWeb</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-111-report-bang-va-tong</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-111-report-bang-va-tong</guid>
      <description>QWeb không có hàm SUM. Muốn cộng dồn, gộp nhóm, ra subtotal và tổng cuối, bạn dùng một biến t-set tích luỹ qua vòng lặp. Dựng bảng sao kê điểm nhóm theo tháng, đo số khớp trên PDF thật Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Menu mở ra đã lọc sẵn, bấm Mới là điền sẵn: bí mật nằm ở domain và context của action</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-114-action-context-va-domain</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-114-action-context-va-domain</guid>
      <description>ir.actions.act_window có hai trường quyền lực: domain lọc trước danh sách, context với default_X điền sẵn field và search_default_X bật sẵn bộ lọc. Dựng một action lọc-và-điền thật rồi soi kết quả trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Tick 4 thẻ, bấm một lần, cả 4 cùng cộng điểm: action chạy trên nhiều bản ghi qua active_ids</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-115-action-multi-ban-ghi</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-115-action-multi-ban-ghi</guid>
      <description>Chọn nhiều dòng rồi vào menu Tác vụ là chạy một action trên cả lô. Bí mật là active_ids biến lựa chọn thành một recordset, và code chỉ việc lặp records. Đo thật một server action cộng điểm hàng loạt trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Code JS của bạn im lặng không chạy, không một dòng lỗi? Rất có thể bạn khai nhầm asset bundle</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-145-assets-bundle-them-js</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-145-assets-bundle-them-js</guid>
      <description>Odoo gom JS/CSS/template thành các bundle, mỗi trang chỉ nạp bundle của nó. web.assets_backend cho web client, web.assets_frontend cho website. Đặt nhầm bundle là code chết lặng lẽ — chứng minh thật trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Ba loại QWeb dễ nhầm làm một: dựng một trang web công khai bằng template QWeb và controller website</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-147-qweb-website-template</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-147-qweb-website-template</guid>
      <description>QWeb website render HTML phía server cho trang công khai, khác QWeb của OWL (trình duyệt) và của report (PDF). Dựng thật một trang bảng điểm công khai với controller website=True và t-foreach trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>t-out trong OWL không render HTML như bạn tưởng: chuyện escape, markup và XSS</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-127-owl-template-t-esc-t-out</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-127-owl-template-t-esc-t-out</guid>
      <description>Trong template OWL, t-esc luôn escape. Nhưng t-out với một chuỗi thường CŨNG escape — khác hẳn report QWeb. Muốn render HTML phải bọc markup(). Dựng demo thật trong dashboard OWL trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Đổ một mảng thẻ ra bảng trong OWL: t-foreach, và vì sao t-key không phải trang trí</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-128-owl-t-foreach-danh-sach</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-128-owl-t-foreach-danh-sach</guid>
      <description>t-foreach lặp qua mảng để dựng danh sách trong OWL. Nhưng t-key là bắt buộc — và dùng id thay vì chỉ số quyết định OWL tái dùng DOM đúng khi danh sách đổi. Dựng bảng thẻ thật trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Đổi một dòng SCSS, cả form đổi màu theo: biến Sass và cách ghi đè biến theme của Odoo</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-146-scss-bien-va-theme</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-146-scss-bien-va-theme</guid>
      <description>Odoo viết style bằng SCSS. Biến $ khai một lần dùng khắp nơi, nesting gom selector, và ghi đè biến theme để đổi màu toàn hệ thống. Xem một biến đổi màu cả form qua ảnh thật trước và sau trên Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Sửa một mẫu in của Odoo mà không đụng một dòng nào của bản gốc: inherit_id + xpath</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-106-report-inherit-sua-mau-co-san</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-106-report-inherit-sua-mau-co-san</guid>
      <description>Report trong Odoo cũng là QWeb template, nên kế thừa được y như view. Khai inherit_id trỏ tới mẫu gốc rồi dùng xpath position=after/before/attributes để chèn và sửa — bản gốc giữ nguyên. Xem trước/sau trên PDF thật của Odoo 19.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Hỏi người dùng trước khi in: dựng một wizard chọn tham số rồi mới xuất PDF trong Odoo</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-109-report-tu-wizard</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-109-report-tu-wizard</guid>
      <description>Một wizard TransientModel thu tham số rồi trả về report_action(records, data). Nhưng data KHÔNG vào QWeb dưới tên data — các khoá của nó trải thành biến rời. Dựng wizard In thẻ theo hạng thật trên Odoo 19 và xem data điều khiển nội dung PDF.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
    <item>
      <title>Một mẫu email điền sẵn tên khách và số điểm: khai mail.template bằng XML, dùng {{ }} và t-out</title>
      <link>https://coffeecode.vn/posts/odoo-19-adv-120-mail-template-trong-code</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/odoo-19-adv-120-mail-template-trong-code</guid>
      <description>mail.template là email có chỗ trống điền động. Subject và địa chỉ dùng {{ }}, còn body_html dùng QWeb t-out. Khai bằng XML trong module rồi render thật cho một thẻ trên Odoo 19 — chưa gửi, chỉ xem.</description>
      <pubDate>Fri, 18 Sep 2026 00:00:00 +0700</pubDate>
      <category>Odoo</category>
    </item>
  </channel>
</rss>
