Báo cáo PDF

Với Studio, bạn có thể :ref:`chỉnh sửa các báo cáo PDF hiện có<studio/pdf-reports/edit> ` (ví dụ: hóa đơn, báo giá, v.v.) hoặc :ref:`tạo hóa đơn mới<studio/pdf-reports/edit> `.

Bố cục mặc định

Bố cục mặc định của báo cáo được quản lý bên ngoài Studio. Đi tới Settings, sau đó, trong phần Companies, nhấp vào Configure Document Layout. Thiết lập bố cục dành riêng cho từng công ty nhưng áp dụng cho tất cả các báo cáo.

Mẹo

Bạn có thể xem các cài đặt khác nhau ảnh hưởng đến bố cục báo cáo như thế nào trong phần xem trước báo cáo ở bên phải hoặc tải xuống mẫu hóa đơn PDF bằng cách nhấp vào Tải xuống bản xem trước PDF.

Sử dụng các thiết lập sau:

  • Layout: Có bốn bố cục khả dụng:

    Mẫu bố cục báo cáo nhẹ
  • Font: Có bảy phông chữ: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway và Tajawal (hỗ trợ chữ viết Ả Rập và La tinh). Truy cập trang web `Google Fonts<https://fonts.google.com/> `_ để xem trước chúng.

  • Colors: Thay đổi màu chính và màu phụ được sử dụng để cấu trúc báo cáo. Màu mặc định được tự động tạo dựa trên màu của logo.

  • Bối cảnh bố cục: Có các hình nền sau:

    • Blank: không có gì được hiển thị.

    • Hình học: hình ảnh có các hình dạng hình học được hiển thị ở nền.

    • Custom: tải lên hình nền tùy chỉnh.

  • Slogan công ty: Nội dung này được hiển thị trong tiêu đề của :ref:`báo cáo bên ngoài<studio/pdf-reports/header-footer/external> `. Bạn có thể thêm nhiều dòng văn bản.

  • Chi tiết công ty: Những thông tin này được hiển thị trong tiêu đề của :ref:`báo cáo bên ngoài<studio/pdf-reports/header-footer/external> `. Bạn có thể thêm nhiều dòng văn bản.

  • Định dạng giấy: để xác định kích thước giấy mặc định của báo cáo. Bạn có thể chọn A4 (21 cm x 29,7 cm), US Letter (21,59 cm x 27,54 cm) hoặc Trang mã QR. Điều này cũng có thể được xác định cho từng báo cáo trong trường Định dạng giấy trong :ref:`Studio<studio/pdf-reports/create> `.

Tạo báo cáo PDF mới

Để tạo báo cáo mới cho một mô hình, hãy truy cập mô hình, nhấp vào nút Toggle Studio, sau đó nhấp vào Reports. Nhấp vào New và trong cửa sổ bật lên mở ra, hãy chọn loại báo cáo. Điều này chỉ được sử dụng để xác định những gì được hiển thị trong tiêu đề và chân trang:

Sau khi bạn đã tạo báo cáo, bạn có thể bắt đầu :ref:`chỉnh sửa nó<studio/pdf-reports/edit> `.

Chỉnh sửa báo cáo PDF

Để truy cập các báo cáo có sẵn cho một mô hình, hãy truy cập mô hình (ví dụ: đơn đặt hàng bán hàng), nhấp vào nút Toggle Studio, sau đó nhấp vào Reports. Chọn một báo cáo hiện có để mở hoặc :ref:`tạo báo cáo mới<studio/pdf-reports/create> `.

Mẹo

Ngoài ra, bạn cũng có thể mở Studio, nhấp vào Reports và tìm kiếm một báo cáo hoặc mô hình cụ thể.

Quan trọng

Chúng tôi đặc biệt khuyến nghị sao chép báo cáo chuẩn và thực hiện các thay đổi trong phiên bản sao chép. Để sao chép báo cáo, hãy di con trỏ chuột vào góc trên bên phải của báo cáo, nhấp vào biểu tượng dấu ba chấm dọc (), rồi chọn Sao chép.

Sao chép báo cáo PDF

Tùy chọn

Sau khi bạn đã chọn hoặc tạo báo cáo, bạn có thể sử dụng các tùy chọn ở phần bên trái của màn hình để:

  • Thay đổi Tên báo cáo. Tên mới được áp dụng ở mọi nơi (trong Studio, bên dưới nút In và trong tên tệp PDF).

  • Sửa đổi Định dạng giấy. Nếu không có giá trị nào được chọn, định dạng được xác định trong :ref:`bố cục mặc định<studio/pdf-reports/default-layout/paper> ` được sử dụng.

  • Hiển thị trong menu in: để thêm báo cáo vào menu In có sẵn trong bản ghi.

  • Tải lại từ tệp đính kèm: để lưu báo cáo dưới dạng tệp đính kèm trên hồ sơ lần đầu tiên tạo báo cáo và tải lại phiên bản gốc của báo cáo bất kỳ lần nào sau đó. Điều này là bắt buộc về mặt pháp lý đối với hóa đơn và chủ yếu được sử dụng trong trường hợp này.

  • Giới hạn khả năng hiển thị cho các nhóm: để giới hạn khả năng hiển thị báo cáo PDF cho các nhóm người dùng &lt;../general/users/access_rights&gt; cụ thể.

  • Chỉnh sửa nguồn: để sửa đổi báo cáo trực tiếp trong tệp :ref:`XML<studio/pdf-reports/XML-editing> `.

  • Đặt lại báo cáo: để hủy bỏ mọi thay đổi đã thực hiện đối với báo cáo và đặt lại về phiên bản chuẩn.

  • Xem trước khi in: để tạo và tải xuống bản xem trước báo cáo.

Biên tập báo cáo

Trình chỉnh sửa báo cáo cho phép bạn sửa đổi định dạng và nội dung của báo cáo.

Mẹo

  • Bạn có thể Hoàn tác hoặc Làm lại các thay đổi bằng cách sử dụng các nút liên quan hoặc phím tắt CTRL ZCTRL Y.

  • Những thay đổi sẽ được lưu tự động khi bạn thoát khỏi báo cáo hoặc lưu thủ công bằng cách sử dụng nút Lưu.

  • Bạn có thể đặt lại báo cáo về phiên bản chuẩn bằng cách nhấp vào nút Đặt lại báo cáo ở phần bên trái của màn hình.

Quan trọng

Việc chỉnh sửa phần đầu trang và chân trang của báo cáo sẽ ảnh hưởng đến tất cả các báo cáo chuẩn và tùy chỉnh.

Khối có điều kiện

Các hình chữ nhật đứt nét biểu diễn các khối có điều kiện (câu lệnh if/else). Chúng được sử dụng để hiển thị/ẩn nội dung dựa trên các điều kiện cụ thể. Nhấp vào khối để xem các điều kiện.

Xem các điều kiện được áp dụng cho một khối.

Chọn một giá trị để xem trước đầu ra tương ứng và chỉnh sửa nếu cần.

Xem trước kết quả của một điều kiện khác.

Ghi chú

Điều kiện chỉ có thể được chỉnh sửa trong :ref:`XML<studio/pdf-reports/XML-editing> `.

Nội dung khác

Có hai loại nội dung văn bản trong báo cáo:

  • Văn bản tĩnh, tức là văn bản không được tô sáng màu xanh, có thể được chỉnh sửa trực tiếp trong trình soạn thảo.

  • Văn bản động, tức là văn bản được tô sáng màu xanh, được thay thế bằng các giá trị trường khi báo cáo được tạo, ví dụ: số SO hoặc ngày báo giá.

Bạn có thể thêm nội dung (ví dụ: trường, danh sách, bảng, hình ảnh, biểu ngữ, v.v.) vào báo cáo bằng lệnh. Gõ / để mở hộp :ref:`powerbox<knowledge/powerbox> `, sau đó nhập tên lệnh hoặc chọn lệnh từ danh sách.

Để thêm văn bản tĩnh vào báo cáo, hãy nhập văn bản vào nơi bạn muốn.

Đối với những thay đổi nâng cao hơn, bạn có thể :ref:`chỉnh sửa báo cáo trong XML trực tiếp<studio/pdf-reports/XML-editing> `.

Thêm một trường

Để thêm một trường, hãy nhập / và chọn lệnh Field. Trong danh sách mở ra, hãy chọn hoặc tìm kiếm trường; nhấp vào mũi tên phải bên cạnh tên trường để truy cập danh sách các trường liên quan nếu cần. Sau đó, chỉ định giá trị mặc định và nhấn Enter.

Chọn một trường liên quan.
Thêm bảng dữ liệu

Bảng dữ liệu được sử dụng để hiển thị các trường quan hệ<studio/fields/relational-fields> `. Để thêm bảng dữ liệu, hãy nhập `/, chọn lệnh Dynamic Table và chọn mối quan hệ sẽ hiển thị trong bảng.

Ghi chú

Chỉ các mối quan hệ kiểu one2many hoặc many2many mới có thể được hiển thị dưới dạng bảng dữ liệu.

Sau khi thêm bảng, bạn có thể thêm cột bằng công cụ bảng. Đặt con trỏ lên trên cùng của cột, sau đó nhấp vào hình chữ nhật màu tím và chọn một tùy chọn.

Thêm một cột vào bảng động.

Sau đó bạn có thể chèn trường :ref:` theo lựa chọn của bạn<studio/pdf-reports/add-field> ` trong các cột. Hộp thoại mở ra hiển thị đối tượng nguồn cho trường (ví dụ: mô hình Thẻ) và danh sách các trường khả dụng.

Danh sách các trường có sẵn cho mô hình Thẻ.

Ghi chú

  • Hàng mặc định tự động lặp lại nội dung của trường, tạo một hàng trên báo cáo cho mỗi giá trị trường (ví dụ: một hàng cho mỗi thẻ). Bạn có thể thêm các hàng nội dung tĩnh ở trên hoặc dưới các hàng đã tạo bằng công cụ bảng.

  • Bạn cũng có thể thêm bảng dữ liệu bằng cách :ref:`sửa đổi XML của báo cáo<studio/pdf-reports/XML-editing> `.

Định dạng

Để định dạng văn bản trong báo cáo, hãy chọn văn bản đó, sau đó định dạng bằng các tùy chọn trong Trình soạn thảo văn bản.

Định dạng văn bản bằng trình soạn thảo văn bản.

Chỉnh sửa XML của báo cáo

Cảnh báo

Việc sửa đổi XML trực tiếp có thể dẫn đến các vấn đề về báo cáo trong quá trình upgrades &lt;../../../administration/upgrade&gt;. Nếu điều này xảy ra, chỉ cần sao chép các thay đổi của bạn từ cơ sở dữ liệu cũ vào cơ sở dữ liệu đã nâng cấp.

Để chỉnh sửa XML của báo cáo, hãy nhấp vào Chỉnh sửa nguồn ở ngăn bên trái.

Ví dụ

Đôi khi, các bảng không được nhận dạng đúng như vậy do cấu trúc phức tạp. Trong những trường hợp đó, bạn vẫn có thể sửa đổi chúng theo cách thủ công trong báo cáo XML. Ví dụ, với đơn đặt hàng bán hàng, bạn có thể tìm thấy cấu trúc sau trong XML (được đơn giản hóa cho mục đích lập tài liệu):

<!-- table root element -->
<table>
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>Name</th>
            <th>Price</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="record.some_relation_ids" t-as="line">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="line.name"/>
            <td t-out="line.price"/>
        </tr>
    </tbody>
</table>

Để sửa đổi một bảng, bạn phải đảm bảo rằng mỗi hàng có cùng số ô dữ liệu. Ví dụ, trong trường hợp trên, bạn cần thêm một ô vào phần tiêu đề (ví dụ, tiêu đề cột) và một ô khác vào phần thân với nội dung trường (thường là với chỉ thị t-out hoặc t-field).

<table> <!-- table root element -->
    <thead> <!-- thead = table header, the row with column titles -->
        <tr> <!-- table row element -->
            <th>Name</th> <!-- table header element -->
            <th>Price</th>
            <th>Category</th>
        </tr>
    </thead>
    <tbody>  <!-- table body, the main content -->
        <tr t-foreach="record.some_relation_ids" t-as="line">  <!-- we create a row for each subrecord with t-foreach -->
            <td t-out="line.name"/>  <!-- for each line, we output the name and price as table cells -->
            <td t-out="line.price"/>
            <td t-out="line.category_id.display_name"/>
        </tr>
    </tbody>
</table>

Ghi chú

Các ô có thể trải dài nhiều hàng hoặc nhiều cột. Để biết thêm thông tin, hãy truy cập trang web `Mozilla Developer Network<https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Basics> `_.

Ví dụ: bạn có thể sửa đổi báo cáo Báo giá/Đơn hàng để thêm một cột nhằm hiển thị danh mục sản phẩm trong bảng chính:

<table class="table table-sm o_main_table table-borderless mt-4">
    <!-- In case we want to repeat the header, remove "display: table-row-group" -->
    <thead style="display: table-row-group">
        <tr>
            <th name="th_description" class="text-start">Description</th>
            <th>Product Category</th>
            <th name="th_quantity" class="text-end">Quantity</th>
            <th name="th_priceunit" class="text-end">Unit Price</th>
[...]
            <tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
                <t t-if="not line.display_type">
                    <td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
                    <td t-out="line.product_id.categ_id.display_name"/>
                    <td name="td_quantity" class="text-end">
                        <span t-field="line.product_uom_qty">3</span>
                        <span t-field="line.product_uom">units</span>
                        <span t-if="line.product_packaging_id">
Thêm cột Danh mục sản phẩm vào SO.

Để thêm một bảng trong XML, bạn cần biết tên của các trường và đối tượng mà bạn muốn truy cập và hiển thị. Ví dụ, hãy thêm một bảng chi tiết các thẻ trên đơn đặt hàng bán hàng:

<!-- table root element -->
<table class="table">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>
Thêm bảng dữ liệu vào XML

Ghi chú

Khi thêm bảng theo cách thủ công, hãy định dạng chúng bằng cách sử dụng Các lớp Bootstrap<https://getbootstrap.com/docs/5.1/content/tables> `_, giống như lớp `table có trong ví dụ trên.

Nếu bạn muốn hiển thị/ẩn nội dung dựa trên các điều kiện cụ thể, bạn có thể thêm thủ công các câu lệnh điều khiển if/else vào XML báo cáo.

Ví dụ, nếu bạn muốn ẩn một bảng dữ liệu tùy chỉnh nếu không có thẻ, bạn có thể sử dụng thuộc tính t-if để xác định điều kiện, sau đó được đánh giá là True hoặc False. Bảng sẽ không được hiển thị nếu không có thẻ trong dấu ngoặc kép.

<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>

Nếu bạn muốn hiển thị một khối khác trong trường hợp câu lệnh t-if được đánh giá là False, bạn có thể chỉ định khối đó bằng câu lệnh t-else. Khối t-else phải theo sau trực tiếp khối t-if trong cấu trúc tài liệu. Không cần chỉ định bất kỳ điều kiện nào trong thuộc tính t-else. Ví dụ, hãy hiển thị một thông báo nhanh giải thích rằng không có thẻ nào trong trích dẫn:

<!-- table root element -->
<table class="table" t-if="len(doc.tag_ids) > 0">
    <!-- thead = table header, the row with column titles -->
    <thead>
        <!-- table row element -->
        <tr>
            <!-- table header element -->
            <th>ID</th>
            <th>Name</th>
        </tr>
    </thead>
    <!-- table body, the main content -->
    <tbody>
        <!-- we create a row for each subrecord with t-foreach -->
        <tr t-foreach="doc.tag_ids" t-as="tag">
            <!-- for each line, we output the name and price as table cells -->
            <td t-out="tag.id"/>
            <td t-out="tag.name"/>
        </tr>
    </tbody>
</table>
<div class="text-muted" t-else="">No tag present on this document.</div>

Bằng cách sử dụng ký hiệu t-if/t-else, trình soạn thảo báo cáo nhận ra rằng các phần này loại trừ lẫn nhau và nên được hiển thị dưới dạng các khối có điều kiện:

Xem trước đầu ra nếu có thẻ.

Bạn có thể chuyển đổi các điều kiện bằng trình soạn thảo để xem trước kết quả:

Xem trước đầu ra nếu không có thẻ.

Nếu bạn muốn có nhiều tùy chọn, bạn cũng có thể sử dụng lệnh t-elif để thêm các điều kiện trung gian. Ví dụ, đây là cách tiêu đề của báo cáo đơn đặt hàng bán hàng thay đổi dựa trên điều kiện của tài liệu cơ bản.

<h2 class="mt-4">
    <span t-if="env.context.get('proforma', False) or is_pro_forma">Pro-Forma Invoice # </span>
    <span t-elif="doc.state in ['draft','sent']">Quotation # </span>
    <span t-else="">Order # </span>
    <span t-field="doc.name">SO0000</span>
</h2>

Tiêu đề Hóa đơn Pro-Forma được sử dụng tùy thuộc vào một số điều kiện ngữ cảnh. Nếu các điều kiện này không được đáp ứng và trạng thái của tài liệu là bản nháp hoặc đã gửi, thì Báo giá được sử dụng. Nếu không đáp ứng được bất kỳ điều kiện nào trong số đó, tiêu đề của báo cáo là Đơn hàng.

Làm việc với hình ảnh trong báo cáo có thể là một thách thức, vì việc kiểm soát chính xác kích thước và hành vi của hình ảnh không phải lúc nào cũng rõ ràng. Bạn có thể chèn các trường hình ảnh bằng trình chỉnh sửa báo cáo (bằng cách sử dụng lệnh /Field<studio/pdf-reports/add-field> `), nhưng việc chèn chúng vào XML bằng cách sử dụng chỉ thị `t-field và các thuộc tính t-options đi kèm sẽ cung cấp khả năng kiểm soát kích thước và vị trí tốt hơn.

Ví dụ, đoạn mã sau đây xuất ra trường image_128 của tích dòng dưới dạng hình ảnh rộng 64px (với chiều cao tự động dựa trên tỷ lệ khung hình của hình ảnh).

<span t-field="line.product_id.image_128" t-options-widget="image" t-options-width="64px"/>

Các tùy chọn sau đây có sẵn cho tiện ích hình ảnh:

  • width: chiều rộng của hình ảnh, thường tính bằng pixel hoặc đơn vị chiều dài CSS (ví dụ: rem) (để trống để tự động điều chỉnh chiều rộng).

  • height: chiều cao của hình ảnh, thường tính bằng pixel hoặc đơn vị chiều dài CSS (ví dụ: rem) (để trống để tự động thiết lập chiều cao).

  • class: Các lớp CSS được áp dụng trên thẻ img; `Các lớp Bootstrap<https://getbootstrap.com/docs/5.1/content/tables> `_ có sẵn.

  • alt: văn bản thay thế của hình ảnh

  • style: thuộc tính style; nó cho phép bạn ghi đè các kiểu tự do hơn so với `lớp Bootstrap<https://getbootstrap.com/docs/5.1/content/tables> `_.

Các thuộc tính này phải chứa chuỗi, tức là văn bản được đặt trong dấu ngoặc kép bên trong dấu ngoặc kép, ví dụ: t-options-width=&quot;&#39;64px&#39;&quot; (hoặc một biểu thức Python hợp lệ).

Ghi chú

Tiện ích hình ảnh không thể được sử dụng trên thẻ img. Thay vào đó, hãy đặt chỉ thị t-field trên nút span (cho nội dung nội tuyến) hoặc div (cho nội dung khối).

Ví dụ, hãy thêm một cột có hình ảnh sản phẩm vào bảng báo giá:

<table class="table table-sm o_main_table table-borderless mt-4">
    <thead style="display: table-row-group">
        <tr>
            <th>Image</th>
            <th name="th_description" class="text-start">Description</th>
            <th>Product Category</th>
            <th name="th_quantity" class="text-end">Quantity</th>
            <th name="th_priceunit" class="text-end">Unit Price</th>
[...]
        <t t-foreach="lines_to_report" t-as="line">
            <t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal"/>
            <tr t-att-class="'bg-200 fw-bold o_line_section' if line.display_type == 'line_section' else 'fst-italic o_line_note' if line.display_type == 'line_note' else ''">
                <t t-if="not line.display_type">
                   <td>
                       <span t-field="line.product_template_id.image_128"
                             t-options-widget="'image'"
                             t-options-width="'64px'"
                             t-options-class="'rounded-3 shadow img-thumbnail'"
                           />
                   </td>
                    <td name="td_name"><span t-field="line.name">Bacon Burger</span></td>
                    <td t-out="line.product_id.categ_id.display_name"/>

Thuộc tính t-options-width giới hạn chiều rộng của hình ảnh ở mức 64 pixel và các lớp Bootstrap được sử dụng trong t-options-class tạo ra đường viền giống hình thu nhỏ với các góc bo tròn và bóng đổ.

Thêm một cột có hình ảnh sản phẩm vào bảng báo giá.