Hooks
Folioline's actions and filters, its templates, the document data they get, and the WP-CLI commands.
Put the examples in a small custom plugin or your child theme's functions.php. Folioline's classes live in the Extendiment\Folioline namespace.
The data hooks get
A document ($document in admin, file and email hooks) is an object with id, type (invoice or credit_note), series, sequence, number, order_id, refund_id, parent_id (a credit note's invoice), issue_date (Y-m-d), currency, net_total, tax_total, total, country, vat_number, reverse_charge (bool), data, created_by and created_at.
data is the snapshot: everything the document says, frozen when it was issued. PDF and e-invoice hooks get it as an array ($document or $snapshot):
| Key | |
|---|---|
type, number, issue_at, currency, decimals, language |
The document itself. |
order |
id, number, date, paid_date, payment_method, payment_method_title, transaction_id, customer_id. |
delivery_date, due_date, paid |
due_date is null when paid. |
seller |
company, address keys, vat_id, tax_number, registration, email, phone, bank_name, iban, bic, logo_id, footer. |
buyer |
name, company, address keys, email, phone, vat_number, vat_status, vat_consultation, vat_checked, customer_id. |
shipping |
Address keys, or null. |
tax_country |
The country the VAT was charged for (the OSS report's country). A credit note has its invoice's. Not on documents issued before 1.1.2. |
reverse_charge, notices |
The legal wording printed for the tax categories. |
lines |
kind (product, shipping, fee, refund), name, sku, product_id, quantity, unit_net, net, discount, tax, gross, rate, category. |
taxes |
Per category and rate: category, rate, net, tax. |
totals |
net, tax, gross, discount, rounding. |
invoice, reason |
A credit note's invoice (id, number, date) and refund reason. |
evidence |
ip, ip_country, billing_country, or empty. |
Amounts are in the order's currency, rounded to its decimals; a credit note's amounts are positive. Tax categories are the EN 16931 codes: S taxed, Z zero-rated, E exempt, AE reverse charge, K intra-EU supply of goods, G export of goods, O outside the scope of EU VAT.
E-invoice formats are zugferd, xrechnung-cii, xrechnung-ubl and peppol; file hooks also use pdf.
Actions
| Action | When |
|---|---|
folioline_loaded |
Folioline has loaded (on plugins_loaded, with WooCommerce active). Its classes and FOLIOLINE_* constants are available. |
folioline_activated |
Folioline was activated. |
folioline_deactivated |
Folioline was deactivated. |
folioline_settings |
The settings page is built ($page, the page slug folioline): add sections and fields with the Settings API. Sections of your own show on a More tab. |
folioline_document_issued |
A document was issued and has its number ($document, $order). |
folioline_file_stored |
A document's file was made and stored ($path, $document, $format): the first time it's needed, again after it went missing, or with a new Buyer reference on the order (a new file; the earlier one is kept). |
folioline_documents_tab |
Print the contents of a tab you added to WooCommerce → Invoices ($tab). |
folioline_documents_column |
Print a cell of a column you added to the Invoices list ($column, $document). |
// Copy every new document's PDF to an archive folder.
add_action( 'folioline_file_stored', function ( $path, $document, $format ) {
if ( 'pdf' === $format ) {
copy( $path, '/mnt/archive/' . basename( $path ) ); // the stored name: a new buyer reference never overwrites an earlier file
}
}, 10, 3 );
Filters
Issuing and numbering
| Filter | What it's for |
|---|---|
folioline_wants_invoice |
Whether an order that reaches an invoice status gets its invoice automatically ($wants, $order). Staff can still issue one by hand. |
folioline_document_data |
The snapshot before it's frozen ($data, $type, $order, $refund; $refund is null for invoices). |
folioline_document_number |
The printed number ($number, $type, $sequence, $date), up to 80 characters. The series and its sequence don't change. |
folioline_tax_category |
A line's tax category ($category, $tax, $virtual, $context). $context has reverse, physical, and the countries seller, buyer (billing) and destination (where goods go: the shipping address's, the store's for local pickup, else the billing address's). |
folioline_due_date |
When an unpaid invoice is due ($due, $order, $issued; Y-m-d dates). Never before the invoice's date. Wholesaleline's orders on account use it. |
folioline_notices |
The legal wording printed on a document ($notices, $categories). |
// No automatic invoices for wholesale orders: staff issue them by hand.
add_filter( 'folioline_wants_invoice', function ( $wants, $order ) {
return $wants && ! $order->get_meta( '_is_wholesale' );
}, 10, 2 );
VAT
| Filter | What it's for |
|---|---|
folioline_vat_exempt |
Whether VAT comes off for a customer ($exempt, $number, $country, $status, $reason, $delivery). $status is valid, invalid, pending (VIES unreachable) or unchecked. $reason says why a number can't take VAT off (format, domestic, non_eu, mismatch, seller, delivered), '' when it can. $delivery is the country the goods are delivered to, '' when there are none. |
folioline_vies_result |
VIES's answer before Folioline uses and caches it ($result, $number): status (valid, invalid, unavailable), number, name, address, consultation, checked (UTC), error, cached. |
PDFs
| Filter | What it's for |
|---|---|
folioline_pdf_template |
The PHP template a PDF is made from ($template, $document): an absolute path. |
folioline_pdf_css |
The PDF's stylesheet ($css, $document), in mPDF's CSS subset. |
folioline_mpdf_config |
mPDF's configuration ($config, $document). Keep PDFA and PDFAversion as they are. |
folioline_pdf_embed_xml |
Whether PDFs carry the Factur-X XML ($embed, $document); default true. |
folioline_missing_extensions |
The PHP extensions counted as missing for PDFs ($missing). |
E-invoices
| Filter | What it's for |
|---|---|
folioline_buyer_reference |
The buyer reference, BT-10 ($reference, $snapshot, $format); default the Buyer reference typed on the order, else the order number. |
folioline_electronic_address |
A party's electronic address, BT-34 / BT-49 ($endpoint, $role, $snapshot, $format): [ 'scheme' => …, 'id' => … ]. $role is seller or buyer. Default: for Peppol, the VAT number under its country's scheme; otherwise the email address (scheme EM). |
folioline_payment_means |
Payment instructions ($payment, $snapshot, $format): code (UNCL4461), name, reference, iban, bic, account_name, terms. |
folioline_einvoice_model |
All the business terms before the XML is written ($model, $snapshot, $format). |
folioline_einvoice_problems |
What keeps a document from being written in a format ($problems, $snapshot, $format): messages for the store owner; any message stops the file. |
// A Leitweg-ID a checkout field plugin keeps on the order, when staff didn't type one.
add_filter( 'folioline_buyer_reference', function ( $reference, $snapshot ) {
$order = wc_get_order( $snapshot['order']['id'] );
if ( ! $order || '' !== $order->get_meta( '_folioline_buyer_reference' ) ) {
return $reference;
}
$id = $order->get_meta( 'leitweg_id' );
return $id ? $id : $reference;
}, 10, 2 );
// A Peppol participant ID (GLN) for the seller.
add_filter( 'folioline_electronic_address', function ( $endpoint, $role, $snapshot, $format ) {
if ( 'seller' === $role && 'peppol' === $format ) {
return array( 'scheme' => '0088', 'id' => '4035811991021' );
}
return $endpoint;
}, 10, 4 );
The buyer reference and electronic address are worked out when a file is made, so they apply to files made after you add the filter. Changing Buyer reference on an order gives its documents new files, and keeps the earlier ones.
Emails and downloads
| Filter | What it's for |
|---|---|
folioline_email_documents |
The documents attached to a WooCommerce email ($documents, $email_id, $order, $email). |
folioline_can_download |
Whether a user may download a document's files ($allowed, $document, $user_id). By default: staff who can edit orders or manage WooCommerce, and the order's own logged-in customer while My Account downloads are on. |
folioline_admin_document_formats |
The formats linked next to a document on the admin screens ($formats, $document). Default: pdf and the e-invoice format chosen for emails, or xrechnung-cii. |
Admin screens and reports
| Filter | What it's for |
|---|---|
folioline_settings_fields |
The fields on WooCommerce → Folioline ($fields). A field's key must be one Folioline's settings keep. |
folioline_documents_tabs |
The tabs on WooCommerce → Invoices ($tabs, tab => label). Print yours on folioline_documents_tab. |
folioline_documents_columns |
The columns of the Invoices list ($columns). Print yours on folioline_documents_column. |
folioline_register_row |
A row of the one-row-per-document register ($row, $document). |
folioline_oss_rows |
The OSS report's rows ($rows, $from, $to): country, rate, net, tax in euros. |
folioline_csv_delimiter |
The CSV separator ($delimiter): , by default, or ;, a tab or ` |
// Semicolon-separated CSV files for Excel in Germany, France or Italy.
add_filter( 'folioline_csv_delimiter', function () {
return ';';
} );
Templates
Copy a template into your theme to change it, as for WooCommerce's own templates:
| Template | Copy to |
|---|---|
templates/document.php: the invoice and credit note PDF. It gets $document (the snapshot) and $view (formatting helpers). Print only what's in $document, never the order, so the PDF reads the same whenever it's made. |
your-theme/folioline/document.php |
templates/myaccount/documents.php: the Documents table in My Account. |
your-theme/folioline/myaccount/documents.php |
The PDF's styles are in assets/css/document.css (filter folioline_pdf_css).
Functions
Extendiment\Folioline\Documents reads and issues documents: get( $id ), invoice_for( $order_id ), credit_note_for( $order_id, $refund_id ), for_order( $order_id ), query( $args ), issue_invoice( $order ) and issue_credit_note( $order, $refund ). The issue methods return the existing document when there is one, so they're safe to call twice. Extendiment\Folioline\Output\Files::pdf( $document ) and ::xml( $document, $format ) return a stored file's path (or a WP_Error saying why it can't be made).
WP-CLI
| Command | |
|---|---|
wp folioline issue <order>... |
Issues each order's invoice, and credit notes for its refunds, if it has no invoice yet. |
wp folioline list [--type=<type>] [--from=<Y-m-d>] [--to=<Y-m-d>] [--format=<table|csv|json>] |
Lists documents. --type is invoice or credit_note. |
wp folioline render <document>... [--format=<format>] |
Prints a document's stored file path, making it first if needed. --format: pdf (default), zugferd, xrechnung-cii, xrechnung-ubl or peppol. |