Rapoarte PDF

Cu Studio, puteți să editați rapoarte PDF existente (de exemplu, facturi, cotații etc.) sau :ref:`să creați altele noi <studio/pdf-reports/edit> `.

Aspect implicit

Aspectul implicit al rapoartelor este gestionat în afara Studio. Accesați Setări, apoi, în secțiunea Companii, faceți clic pe Configurați aspectul documentului. Setările de aspect sunt specifice companiei, dar se aplică tuturor rapoartelor.

Sfat

Puteți vedea modul în care diferitele setări afectează aspectul raportului în previzualizarea raportului din dreapta sau puteți descărca un exemplu PDF de factură făcând clic pe Descărcați previzualizarea PDF.

Utilizați următoarele setări:

  • Layout: Sunt disponibile patru aspecte:

    Exemplu de aspect de raport luminos
  • Font: Sunt disponibile șapte fonturi: Lato, Roboto, Open Sans, Montserrat, Oswald, Raleway și Tajawal (care acceptă scripturile arabe și latine). Accesați site-ul Google Fonts pentru a le previzualiza.

  • Culori: Schimbați culorile primare și secundare utilizate pentru structurarea rapoartelor. Culorile implicite sunt generate automat pe baza culorilor siglei.

  • Fond de aspect: Următoarele fundaluri sunt disponibile:

    • Blank: nimic nu este afișat.

    • Geometric: o imagine cu forme geometrice este afișată în fundal.

    • Personalizat: încărcați o imagine de fundal personalizată.

  • Sloganul companiei: Acesta este afișat în antetul rapoartele externe. Puteți adăuga mai multe rânduri de text.

  • Detalii companie: Acestea sunt afișate în antetul rapoartele externe. Puteți adăuga mai multe rânduri de text.

  • Format hârtie: pentru a defini dimensiunea implicită de hârtie a rapoartelor. Puteți selecta A4 (21 cm x 29,7 cm), US Letter (21,59 cm x 27,54 cm) sau Pagina de coduri QR. Acest lucru poate fi definit și pentru rapoarte individuale în câmpul Format hârtie din Studio.

Crearea de noi rapoarte PDF

Pentru a crea un nou raport pentru un model, accesați modelul, faceți clic pe butonul Toggle Studio, apoi faceți clic pe Rapoarte. Faceți clic pe Nou și, în fereastra pop-up care se deschide, selectați tipul de raport. Acesta este folosit numai pentru a determina ce este afișat în antet și subsol:

Odată ce ați creat raportul, puteți începe editarea lui.

Editarea rapoartelor PDF

Pentru a accesa rapoartele disponibile pentru un model, accesați modelul (de exemplu, comenzile de vânzări), faceți clic pe butonul Toggle Studio, apoi faceți clic pe Rapoarte. Selectați un raport existent pentru al deschide sau creați unul nou.

Sfat

Alternativ, puteți deschide Studio, faceți clic pe Rapoarte și căutați un anumit raport sau model.

Important

Este recomandat să duplicați raportul standard și să efectuați modificări în versiunea duplicată. Pentru a duplica un raport, plasați cursorul mouse-ului în colțul din dreapta sus al raportului, faceți clic pe pictograma elipse verticale (), apoi selectați Duplicate.

Duplicarea unui raport PDF

Opțiuni

După ce ați selectat sau creat un raport, puteți utiliza opțiunile din partea stângă a ecranului pentru a:

  • Schimbați Numele raportului. Noul nume este aplicat peste tot (în Studio, sub butonul Print și în numele fișierului PDF).

  • Modificați formatul Format hârtie. Dacă nu este selectată nicio valoare, este utilizat formatul definit în aspect implicit.

  • Show in print menu: pentru a adăuga raportul în meniul Print disponibil din înregistrare.

  • Reîncărcați din atașament: pentru a salva raportul ca atașament în înregistrare prima dată când este generat și reîncărcați versiunea originală a raportului oricând ulterior. Acest lucru este obligatoriu din punct de vedere legal pentru facturi și este utilizat în principal în acest caz.

  • Limitați vizibilitatea la grupuri: pentru a limita disponibilitatea raportului PDF la anumite grupuri de utilizatori.

  • Editați sursele: pentru a modifica raportul direct în fișierul XML.

  • Resetați raportul: pentru a renunța la toate modificările aduse raportului și a-l reseta la versiunea standard.

  • Previzualizare printare: pentru a genera și descărca o previzualizare a raportului.

Editor de rapoarte

Editorul de rapoarte vă permite să modificați formatarea și conținutul raportului.

Sfat

  • Puteți Anulați sau Reface modificări folosind butoanele aferente sau comenzile rapide CTRL Z și CTRL Y.

  • Modificările sunt salvate automat când părăsiți raportul sau manual folosind butonul Salvare.

  • Puteți reseta raportul la versiunea sa standard făcând clic pe butonul Resetați raportul din partea stângă a ecranului.

Important

Editarea antetului și a subsolului unui raport afectează toate rapoartele standard și personalizate.

Blocuri condiționate

Dreptunghiurile punctate reprezintă blocuri condiționate (instrucțiuni if/else). Acestea sunt folosite pentru a afișa/ascunde conținutul în funcție de condiții specifice. Faceți clic pe bloc pentru a vedea condițiile.

Vizualizați condițiile aplicate unui bloc.

Selectați o valoare pentru a previzualiza rezultatul corespunzător și editați-o dacă este necesar.

Previzualizează rezultatul unei alte condiții.

Notă

Condițiile pot fi editate numai în XML.

Alt conținut

Există două tipuri de conținut text în rapoarte:

  • Text static, adică textul care nu este evidențiat în albastru, care poate fi modificat direct în editor.

  • Text dinamic, adică textul evidențiat cu albastru, care este înlocuit cu valorile câmpului atunci când este generat raportul, de exemplu, numărul SO sau data cotației.

Puteți adăuga conținut (de exemplu, câmpuri, liste, tabele, imagini, bannere etc.) la raport folosind comenzi. Tastați / pentru a deschide powerbox, apoi tastați numele comenzii sau selectați-o din listă.

Pentru a adăuga text static la raport, tastați textul unde doriți.

Pentru modificări mai avansate, puteți editați raportul în XML direct.

Adăugați un câmp

Pentru a adăuga un câmp, tastați / și selectați comanda Field. În lista care se deschide, selectați sau căutați câmpul; faceți clic pe săgeata dreapta de lângă numele câmpului pentru a accesa lista de câmpuri asociate, dacă este necesar. Apoi, specificați valoarea implicită și apăsați Enter.

Selectați un câmp aferent.
Adăugați un tabel de date

Tabelele de date sunt folosite pentru a afișa câmpurile relaționale. Pentru a adăuga un tabel de date, tastați /, selectați comanda Dynamic Table și selectați relația care va fi afișată în tabel.

Notă

Numai relațiile de tip one2many sau many2many pot fi afișate ca tabele de date.

Odată ce tabelul a fost adăugat, puteți adăuga coloane folosind instrumentele de tabel. Poziționați cursorul în partea de sus a coloanei, apoi faceți clic pe dreptunghiul violet și selectați o opțiune.

Adăugați o coloană într-un tabel dinamic.

Apoi puteți introduce câmpul :ref:` la alegere <studio/pdf-reports/add-field>` în coloane. Caseta de dialog care se deschide arată obiectul sursă pentru câmp (de exemplu, modelul Tag) și lista câmpurilor disponibile.

Lista câmpurilor disponibile pentru modelul Tag.

Notă

  • Rândul implicit repetă automat conținutul câmpului, generând un rând în raport pentru fiecare valoare de câmp (de exemplu, un rând pe etichetă). Puteți adăuga rânduri de conținut static deasupra sau sub rândurile generate folosind instrumentele de tabel.

  • De asemenea, puteți adăuga tabele de date prin modificând XML-ul raportului.

Formatare

Pentru a formata textul din raport, selectați-l, apoi formatați-l folosind opțiunile din Editorul de text.

Formatați textul utilizând editorul de text.

Editarea XML-ului raportului

Atenționare

Modificarea directă a XML-ului poate duce la probleme de raportare în timpul actualizărilor. Dacă se întâmplă acest lucru, pur și simplu copiați modificările din vechea bază de date în baza de date actualizată.

Pentru a edita XML-ul raportului, faceți clic pe Editați sursele în panoul din stânga.

Exemple

Uneori, tabelele nu sunt recunoscute în mod corespunzător ca atare din cauza structurilor complexe. În aceste cazuri, le puteți modifica manual în raportul XML. De exemplu, cu o comandă de vânzare, puteți găsi următoarea structură în XML (simplificată în scopuri de documentare):

<!-- 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>

Pentru a modifica un tabel, trebuie să vă asigurați că fiecare rând are același număr de celule de date. De exemplu, în cazul de mai sus, trebuie să adăugați o celulă în secțiunea antet (cu, de exemplu, titlul coloanei) și o altă celulă în secțiunea de corp cu conținutul câmpului (de obicei, cu un t-out sau t directiva -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>

Notă

Celulele se pot întinde pe mai multe rânduri sau coloane. Pentru mai multe informații, accesați site-ul web Mozilla Developer Network.

De exemplu, puteți modifica raportul Cotație/Comandă pentru a adăuga o coloană pentru a afișa categoria de produse în tabelul principal:

<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">
Adăugați o coloană Categorie de produs într-un SO.

Pentru a adăuga un tabel în XML, trebuie să cunoașteți numele câmpurilor și obiectelor pe care doriți să le accesați și să le afișați. De exemplu, să adăugăm un tabel care detaliază etichetele dintr-o comandă de vânzare:

<!-- 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>
Adăugați un tabel de date în XML

Notă

Când adăugați tabelele manual, stilați-le folosind Bootstrap classs, ca clasa table inclusă în exemplul de mai sus.

Dacă doriți să afișați/ascundeți conținut pe baza unor condiții specifice, puteți adăuga manual instrucțiuni de control if/else în raportul XML.

De exemplu, dacă doriți să ascundeți un tabel de date personalizat dacă nu există etichete, puteți utiliza atributul t-if pentru a defini condiția, care este apoi evaluată ca True sau False. Tabelul nu va fi afișat dacă nu există etichete în oferta.

<!-- 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>

Dacă doriți să afișați un alt bloc în cazul în care instrucțiunea t-if este evaluată ca False, îl puteți specifica folosind instrucțiunea t-else. Blocul t-else trebuie să urmeze direct blocul t-if din structura documentului. Nu este nevoie să specificați nicio condiție în atributul t-else. De exemplu, să arătăm un mesaj rapid care explică că nu există etichete pe citat:

<!-- 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>

Folosind notația „t-if/t-else”, editorul de rapoarte recunoaște că aceste secțiuni se exclud reciproc și ar trebui să fie afișate ca blocuri condiționate:

Previzualizare de ieșire dacă există etichete.

Puteți schimba condițiile folosind editorul pentru a previzualiza rezultatele lor:

Previzualizare de ieșire dacă nu există etichete.

Dacă doriți să aveți mai multe opțiuni, puteți utiliza și directivele t-elif pentru a adăuga condiții intermediare. De exemplu, așa se modifică titlul rapoartelor comenzilor de vânzare în funcție de starea documentului de bază.

<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>

Titlul Factură Pro-Forma este folosit în funcție de unele condiții contextuale. Dacă aceste condiții nu sunt îndeplinite și starea documentului este fie „schiță” fie „trimis”, atunci se folosește Citat. Dacă niciuna dintre aceste condiții nu este îndeplinită, titlul raportului este Comandă.

Lucrul cu imagini dintr-un raport poate fi o provocare, deoarece controlul precis asupra dimensiunii și comportamentului imaginii nu este întotdeauna evident. Puteți insera câmpuri de imagine folosind editorul de rapoarte (folosind comanda /Field), dar inserându-le în XML folosind directiva t-field și ` însoțitoare. Atributele t-options oferă un control mai bun al dimensionării și al poziționării.

De exemplu, următorul cod scoate câmpul „image_128” al produsului liniei ca o imagine de 64 de pixeli (cu o înălțime automată bazată pe raportul de aspect al imaginii).

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

Următoarele opțiuni sunt disponibile pentru widget-urile de imagine:

  • width: lățimea imaginii, de obicei în pixeli sau unități de lungime CSS (de exemplu, rem) (lăsați necompletat pentru lățime automată).

  • height: înălțimea imaginii, de obicei în pixeli sau unități de lungime CSS (de exemplu, rem) (lăsați necompletat pentru auto-înălțime).

  • class: clase CSS aplicate pe eticheta img; Clasele Bootstrap sunt disponibile.

  • alt: text alternativ al imaginii

  • style: atribut de stil; vă permite să suprascrieți stilurile mai liber decât cu Clasele Bootstrap.

Aceste atribute trebuie să conțină șiruri de caractere, adică text cuprins între ghilimele, de exemplu, t-options-width="'64px'" (sau, alternativ, o expresie Python validă).

Notă

Widgetul de imagine nu poate fi utilizat pe o etichetă „img”. În schimb, setați directiva t-field pe un nod span (pentru conținut inline) sau div (pentru conținut bloc).

De exemplu, să adăugăm o coloană cu imaginea produsului în tabelul de oferte:

<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"/>

Atributul t-options-width restricționează lățimea imaginii la 64 de pixeli, iar clasele Bootstrap utilizate în t-options-class creează un chenar asemănător unei miniaturi cu colțuri rotunjite și o umbră.

Adăugați o coloană cu imaginea produsului în tabelul de cotații.