# Terméktáblázat és összesítő

> A termékek táblázatának oszlopai, az összesítő sorainak átrendezése és a rendelési állapotok szűrése.

A termékek táblázatát két szűrő határozza meg, és a kettőt együtt kell módosítani:

- `pdf_template_table_headings`: a táblázat fejléce (oszlopcímek).
- `pdf_template_line_output`: a tételsorok. A függvény két paramétert kap: a sorokat és a rendelés azonosítóját (`10, 2` prioritás és paraméterszám).

Ha az oszlopok száma vagy szélessége eltér a fejléc és a sorok között, a táblázat szétcsúszik, ezért a `width` értékek összege mindkét helyen 100% legyen.

## Új oszlop: cikkszám (SKU)

A példa kibővíti a táblázatot egy **SKU** oszloppal. A fejlécben a `Qty`, `SKU`, `Product`, `Price Ex`, `Total Ex.`, `Tax`, `Price Inc` és `Total Inc` oszlop van, a tételsor pedig a rendelés tételein végigmenve ugyanezeket írja ki:

```php
add_filter( 'pdf_template_table_headings', 'custom_pdf_table_headers' );
function custom_pdf_table_headers() {
    $headers = '<table class="shop_table orderdetails" width="100%">' .
        '<thead>' .
        '<tr><th colspan="7" align="left"><h2>' . esc_html__( 'Order Details', PDFLANGUAGE ) . '</h2></th></tr>' .
        '<tr>' .
        '<th width="5%" valign="top" align="right">' . __( 'Qty', PDFLANGUAGE ) . '</th>' .
        '<th width="10%" valign="top" align="left">' . __( 'SKU', PDFLANGUAGE ) . '</th>' .
        '<th width="40%" valign="top" align="left">' . __( 'Product', PDFLANGUAGE ) . '</th>' .
        '<th width="9%" valign="top" align="right">' . __( 'Price Ex', PDFLANGUAGE ) . '</th>' .
        '<th width="9%" valign="top" align="right">' . __( 'Total Ex.', PDFLANGUAGE ) . '</th>' .
        '<th width="7%" valign="top" align="right">' . __( 'Tax', PDFLANGUAGE ) . '</th>' .
        '<th width="10%" valign="top" align="right">' . __( 'Price Inc', PDFLANGUAGE ) . '</th>' .
        '<th width="10%" valign="top" align="right">' . __( 'Total Inc', PDFLANGUAGE ) . '</th>' .
        '</tr>' .
        '</thead>' .
        '</table>';

    return $headers;
}

add_filter( 'pdf_template_line_output', 'custom_pdf_lines', 10, 2 );
function custom_pdf_lines( $line, $order_id ) {
    $order          = wc_get_order( $order_id );
    $order_currency = $order->get_currency();

    $pdflines  = '<table width="100%"><tbody>';

    foreach ( $order->get_items() as $item ) {
        if ( ! $item['qty'] ) {
            continue;
        }

        $_product  = $item->get_product();
        $item_name = $item['name'];

        $meta_display = '';
        foreach ( $item->get_formatted_meta_data() as $meta ) {
            $meta_display .= '<br /><small>(' . $meta->display_key . ':' . wp_kses_post( strip_tags( $meta->display_value ) ) . ')</small>';
        }
        if ( $meta_display ) {
            $item_name .= apply_filters( 'pdf_invoice_meta_output', $meta_display );
        }

        $pdflines .= '<tr>' .
            '<td valign="top" width="5%" align="right">' . $item['qty'] . ' x</td>' .
            '<td valign="top" width="10%">' . $_product->get_sku() . '</td>' .
            '<td valign="top" width="40%">' . stripslashes( $item_name ) . '</td>' .
            '<td valign="top" width="9%" align="right">' . wc_price( $item['line_subtotal'] / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' .
            '<td valign="top" width="9%" align="right">' . wc_price( $item['line_subtotal'], array( 'currency' => $order_currency ) ) . '</td>' .
            '<td valign="top" width="7%" align="right">' . wc_price( $item['line_subtotal_tax'] / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' .
            '<td valign="top" width="10%" align="right">' . wc_price( ( $item['line_subtotal'] + $item['line_subtotal_tax'] ) / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' .
            '<td valign="top" width="10%" align="right">' . wc_price( $item['line_subtotal'] + $item['line_subtotal_tax'], array( 'currency' => $order_currency ) ) . '</td>' .
            '</tr>';
    }

    $pdflines .= '</tbody></table>';

    return $pdflines;
}
```

## Az adó összege helyett az adókulcs

Ugyanezzel a módszerrel a **Tax** (adó) oszlop helyett adókulcsot is kiírhatsz. A fejlécben az oszlop címe `Tax Rate`, a tételsorban pedig a cella értéke az adó és az adóalap hányadosa százalékban:

```php
'<td valign="top" width="7%" align="right">' . 100 * ( $item['line_subtotal_tax'] / $item['line_subtotal'] ) . '%' . '</td>'
```

A többi rész megegyezik az előző példával (a SKU oszlop nélkül, a Termék oszlop 50%-os szélességgel).

## Kevesebb oszlop: csak bruttó árak

Ha csak a mennyiséget, a terméket, a bruttó egységárat és a bruttó összeget akarod kiírni, a fejléc négy oszlopos legyen (`Qty` 10%, `Product` 54%, `Price Inc` 18%, `Total Inc` 18%), a tételsor pedig ezt adja ki:

```php
'<td valign="top" width="10%" align="right">' . $item['qty'] . ' x</td>' .
'<td valign="top" width="54%">' . $item_name . '</td>' .
'<td valign="top" width="18%" align="right">' . wc_price( ( $item['line_subtotal'] + $item['line_tax'] ) / $item['qty'], array( 'currency' => $order_currency ) ) . '</td>' .
'<td valign="top" width="18%" align="right">' . wc_price( $item['line_subtotal'] + $item['line_tax'], array( 'currency' => $order_currency ) ) . '</td>'
```

## A termék nevének kiegészítése

A `pdf_invoice_item_name` szűrő a tétel nevét módosítja, ha nem akarod az egész sort újraírni. Paraméterei: a név, a rendelési tétel, a termék és a rendelés. Példa a termék leírásának hozzáadására:

```php
add_filter( 'pdf_invoice_item_name', 'add_product_description_pdf_invoice_item_name', 10, 4 );
function add_product_description_pdf_invoice_item_name( $item_name, $item, $product, $order ) {
    $item_name .= '<p>' . $product->get_description() . '</p>';
    return $item_name;
}
```

A tétel meta-adatainak kiírását a `pdf_invoice_meta_output` szűrő módosítja.

## Az összesítő rész

Az összesítő blokkot (`[[PDFORDERTOTALS]]`) a bővítmény egyetlen ciklussal építi fel: végigmegy a rendelés összegsorain (`get_order_item_totals()`), a fizetési módot kihagyja, és minden sort két cellás táblázatsorként ír ki. A kimenetet a `pdf_template_order_totals` szűrő módosítja:

```php
$order_item_totals = $order->get_order_item_totals();
unset( $order_item_totals['payment_method'] );

$output = '';
foreach ( $order_item_totals as $order_item_total ) {
    $output .= '<tr>' .
        '<td align="right"><strong>' . $order_item_total['label'] . '</strong></td>' .
        '<td align="right"><strong>' . $order_item_total['value'] . '</strong></td>' .
        '</tr>';
}
$output = apply_filters( 'pdf_template_order_totals', $output, $order_id );
```

Ezzel a szűrővel a sablon módosítása nélkül átrendezheted az összesítő sorait. A példa a sorrendet **Szállítás, Részösszeg, adók, Összesen** alakra állítja, a részösszeghez hozzáadja a szállítási költséget, és ha volt visszatérítés, egy extra sort ír ki a visszatérített összegről:

```php
add_filter( 'pdf_template_order_totals', 'custom_totals_layout_pdf_template_order_totals', 10, 2 );
function custom_totals_layout_pdf_template_order_totals( $output, $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order             = wc_get_order( $order_id );
    $order_currency    = $order->get_currency();
    $order_item_totals = $order->get_order_item_totals();

    $cart_subtotal = $order_item_totals['cart_subtotal'];
    $shipping      = $order_item_totals['shipping'];
    $order_total   = $order_item_totals['order_total'];

    // A részösszeg a szállítási költséggel együtt.
    $subtotal       = $order->get_subtotal();
    $shipping_cost  = $order->get_shipping_total();
    $new_subtotal   = wc_price( round( $subtotal + $shipping_cost, wc_get_price_decimals() ), array( 'currency' => $order_currency ) );
    $replace_subtotal = wc_price( $subtotal, array( 'currency' => $order_currency ) );
    $cart_subtotal['value'] = str_replace( $replace_subtotal, $new_subtotal, $cart_subtotal['value'] );

    // Az adók kivételével minden sort kiveszünk.
    unset( $order_item_totals['cart_subtotal'], $order_item_totals['shipping'], $order_item_totals['payment_method'], $order_item_totals['order_total'] );

    // Új sorrend.
    $new_order_item_totals['shipping']      = $shipping;
    $new_order_item_totals['cart_subtotal'] = $cart_subtotal;
    foreach ( $order_item_totals as $key => $value ) {
        $new_order_item_totals[ $key ] = $value;
    }
    $new_order_item_totals['order_total'] = $order_total;

    $output = '';
    foreach ( $new_order_item_totals as $order_item_total ) {
        $output .= '<tr>' .
            '<td align="right"><strong>' . $order_item_total['label'] . '</strong></td>' .
            '<td align="right"><strong>' . $order_item_total['value'] . '</strong></td>' .
            '</tr>';
    }

    if ( $order->get_total_refunded() > 0 ) {
        $output .= '<tr>' .
            '<td align="right"><strong>Visszatérített összeg:</strong></td>' .
            '<td align="right"><strong>' . wc_price( $order->get_total_refunded(), array( 'currency' => $order_currency ) ) . '</strong></td>' .
            '</tr>';
    }

    return $output;
}
```

Ha csak a szállítás értékét akarod a leírás nélkül, használd ezt a sort a `$order_item_totals['shipping']['value']` értékére:

```php
wc_price( round( $order->get_shipping_total(), wc_get_price_decimals() ), array( 'currency' => $order_currency ) );
```

### Az összesítő sorai külön cimkékkel

A `[[PDFORDERTOTALS]]` cimke helyett használhatod a sorok külön cimkéit is, tetszőleges sorrendben: `[[PDFORDERSUBTOTAL]]`, `[[PDFORDERSHIPPING]]`, `[[PDFORDERDISCOUNT]]`, `[[PDFORDERTAX]]`, `[[PDFORDERTOTAL]]`. Minden sor kimenetét külön szűrő módosítja (mindegyik paramétere a kimenet és a rendelés azonosítója):

```php
$output = apply_filters( 'pdf_template_order_subtotal', $output, $order_id );
$output = apply_filters( 'pdf_template_order_shipping', $output, $order_id );
$output = apply_filters( 'pdf_template_order_discount', $output, $order_id );
$output = apply_filters( 'pdf_template_order_tax',      $output, $order_id );
$output = apply_filters( 'pdf_template_order_total',    $output, $order_id );
```

A kuponok sorát a `pdf_template_order_coupons`, a megjegyzések blokkját a `pdf_template_order_notes` szűrő módosítja. A külön sorokra szóló szűrők alapból nincsenek használatban, az alapértelmezett kimenetet a `pdf_template_order_totals` adja.

Régebben az összesítő minden sorát külön függvény kezelte, ma egyetlen ciklus. Ha még a régi szűrőidet használod, és a sablont nem másoltad a témába, azok már nem működnek. Ha a sablont a témádba másoltad, a módosításaid megmaradnak.

## Rendelési állapotok, amelyeknél számla készül

A `pdf_invoice_order_status_array` szűrővel bővítheted (vagy lecserélheted) azoknak a rendelési állapotoknak a listáját, amelyeknél a bővítmény számlát készít. Példa egy saját állapot (`dispensing`) hozzáadására:

```php
add_filter( 'pdf_invoice_order_status_array', 'add_custom_order_status_to_pdf_invoice_order_status_array', 99, 2 );
function add_custom_order_status_to_pdf_invoice_order_status_array( $order_status_array ) {
    $order_status_array[] = 'dispensing';
    return $order_status_array;
}
```

Ha a teljes listát le akarod cserélni, a függvény visszatérési értéke legyen a saját tömb, például `array( 'dispensing' )`.
