Files
old-experiments/backend/wordpress/wp-content/plugins/woocommerce-jetpack/includes/classes/class-wcj-pdf-invoice.php
2018-07-09 12:34:06 +02:00

266 lines
9.9 KiB
PHP

<?php
/**
* Booster for WooCommerce PDF Invoice
*
* @version 3.6.0
* @author Algoritmika Ltd.
*/
if ( ! defined( 'ABSPATH' ) ) exit;
if ( ! class_exists( 'WCJ_PDF_Invoice' ) ) :
class WCJ_PDF_Invoice extends WCJ_Invoice {
/**
* Constructor.
*/
function __construct( $order_id, $invoice_type ) {
parent::__construct( $order_id, $invoice_type );
}
/**
* prepare_pdf.
*
* @version 3.4.3
* @todo check `addTTFfont()`
* @todo clean up
* @todo (maybe) option to set different font in footer (and maybe also header)
*/
function prepare_pdf() {
wcj_check_and_maybe_download_tcpdf_fonts();
$invoice_type = $this->invoice_type;
$page_format = get_option( 'wcj_invoicing_' . $invoice_type . '_page_format', 'A4' );
if ( 'custom' === $page_format ) {
$page_format = array(
get_option( 'wcj_invoicing_' . $invoice_type . '_page_format_custom_width', 0 ),
get_option( 'wcj_invoicing_' . $invoice_type . '_page_format_custom_height', 0 )
);
}
// Create new PDF document
require_once( wcj_plugin_path() . '/includes/classes/class-wcj-tcpdf.php' );
$pdf = new WCJ_TCPDF(
get_option( 'wcj_invoicing_' . $invoice_type . '_page_orientation', 'P' ),
PDF_UNIT,
$page_format,
true,
'UTF-8',
false
);
$pdf->set_invoice_type( $invoice_type );
// Set document information
$pdf->SetCreator( PDF_CREATOR );
// $pdf->SetAuthor( 'Booster for WooCommerce' );
$invoice_title = $invoice_type;
$invoice_types = /* ( 'yes' === get_option( 'wcj_invoicing_hide_disabled_docs_settings', 'no' ) ) ? wcj_get_enabled_invoice_types() : */ wcj_get_invoice_types();
foreach ( $invoice_types as $invoice_type_data ) {
if ( $invoice_type === $invoice_type_data['id'] ) {
$invoice_title = $invoice_type_data['title'];
break;
}
}
$pdf->SetTitle( $invoice_title );
$pdf->SetSubject( 'Invoice PDF' );
$pdf->SetKeywords( 'invoice, PDF' );
// Header - set default header data
if ( 'yes' === get_option( 'wcj_invoicing_' . $invoice_type . '_header_enabled', 'yes' ) ) {
$the_logo = '';
$the_logo_width_mm = 0;
if ( '' != ( $header_image = do_shortcode( get_option( 'wcj_invoicing_' . $invoice_type . '_header_image', '' ) ) ) ) {
$the_logo = parse_url( $header_image, PHP_URL_PATH );
$the_logo_width_mm = get_option( 'wcj_invoicing_' . $invoice_type . '_header_image_width_mm', 50 );
if ( ! file_exists( K_PATH_IMAGES . $the_logo ) ) {
$the_logo = '';
$the_logo_width_mm = 0;
}
}
$pdf->SetHeaderData(
$the_logo,
$the_logo_width_mm,
do_shortcode( get_option( 'wcj_invoicing_' . $invoice_type . '_header_title_text', $invoice_title ) ),
do_shortcode( get_option( 'wcj_invoicing_' . $invoice_type . '_header_text', __( 'Company Name', 'woocommerce-jetpack' ) ) ),
wcj_hex2rgb( get_option( 'wcj_invoicing_' . $invoice_type . '_header_text_color', '#cccccc' ) ),
wcj_hex2rgb( get_option( 'wcj_invoicing_' . $invoice_type . '_header_line_color', '#cccccc' ) ) );
} else {
$pdf->SetPrintHeader( false );
}
// Footer
if ( 'yes' === get_option( 'wcj_invoicing_' . $invoice_type . '_footer_enabled', 'yes' ) ) {
$pdf->setFooterData(
wcj_hex2rgb( get_option( 'wcj_invoicing_' . $invoice_type . '_footer_text_color', '#cccccc' ) ),
wcj_hex2rgb( get_option( 'wcj_invoicing_' . $invoice_type . '_footer_line_color', '#cccccc' ) )
);
} else {
$pdf->SetPrintFooter( false );
}
$tcpdf_font = wcj_get_tcpdf_font( $invoice_type );
// Set Header and Footer fonts
$pdf->setHeaderFont( array( /* PDF_FONT_NAME_MAIN */ $tcpdf_font, '', PDF_FONT_SIZE_MAIN ) );
$pdf->setFooterFont( array( /* PDF_FONT_NAME_DATA */ $tcpdf_font, '', PDF_FONT_SIZE_DATA ) );
// Set default monospaced font
$pdf->SetDefaultMonospacedFont( PDF_FONT_MONOSPACED );
// Set margins
$pdf->SetMargins(
get_option( 'wcj_invoicing_' . $invoice_type . '_margin_left', 15 ),
get_option( 'wcj_invoicing_' . $invoice_type . '_margin_top', 27 ),
get_option( 'wcj_invoicing_' . $invoice_type . '_margin_right', 15 )
);
$pdf->SetHeaderMargin( get_option( 'wcj_invoicing_' . $invoice_type . '_margin_header', 10 ) );
$pdf->SetFooterMargin( get_option( 'wcj_invoicing_' . $invoice_type . '_margin_footer', 10 ) );
// Set auto page breaks
$pdf->SetAutoPageBreak( true, get_option( 'wcj_invoicing_' . $invoice_type . '_margin_bottom', 0 ) );
// Set image scale factor
$pdf->setImageScale( PDF_IMAGE_SCALE_RATIO );
/*// Set some language-dependent strings (optional)
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
require_once(dirname(__FILE__).'/lang/eng.php');
$pdf->setLanguageArray($l);
}*/
// Set default font subsetting mode
$pdf->setFontSubsetting( true );
// Set font
$pdf->SetFont( $tcpdf_font, '', get_option( 'wcj_invoicing_' . $invoice_type . '_general_font_size', 8 ), '', true );
// Add a page
$pdf->AddPage();
// Set text shadow effect
if ( 'yes' === get_option( 'wcj_invoicing_' . $invoice_type . '_general_font_shadowed', 'no' ) ) {
$pdf->setTextShadow( array( 'enabled' => true, 'depth_w' => 0.2, 'depth_h' => 0.2, 'color' => array( 196, 196, 196 ), 'opacity' => 1, 'blend_mode' => 'Normal' ) );
}
// Background image
if ( '' != ( $background_image = do_shortcode( get_option( 'wcj_invoicing_' . $invoice_type . '_background_image', '' ) ) ) ) {
$background_image = parse_url( $background_image, PHP_URL_PATH );
if ( file_exists( K_PATH_IMAGES . $background_image ) ) {
$pdf->Image( $background_image, 0, 0, $pdf->getPageWidth(), $pdf->getPageHeight() );
}
}
return $pdf;
}
/**
* maybe_replace_tcpdf_method_params.
*
* @version 3.6.0
* @since 3.6.0
*/
function maybe_replace_tcpdf_method_params( $html, $pdf ) {
$start_str = 'wcj_tcpdf_method_params_start';
$end_str = 'wcj_tcpdf_method_params_end';
$start_str_length = strlen( $start_str );
$end_str_length = strlen( $end_str );
while ( false !== ( $start = strpos( $html, $start_str ) ) ) {
$params_start = $start + $start_str_length;
$params_length = strpos( $html, $end_str ) - $params_start;
$params = $pdf->serializeTCPDFtagParameters( unserialize( substr( $html, $params_start, $params_length ) ) );
$html = substr_replace( $html, 'params="' . $params . '"', $start, $start_str_length + $params_length + $end_str_length );
}
return $html;
}
/**
* get_html.
*
* Gets invoice content HTML.
*
* @version 3.6.0
* @since 3.5.0
* @todo pass other params (billing_country, payment_method) as global (same as user_id) instead of $_GET
* @todo `force_balance_tags()` - there are some bugs and performance issues, see http://wordpress.stackexchange.com/questions/89121/why-doesnt-default-wordpress-page-view-use-force-balance-tags
*/
function get_html( $order_id, $pdf ) {
$_GET['order_id'] = $order_id;
$the_order = wc_get_order( $order_id );
if ( ! isset( $_GET['billing_country'] ) ) {
$_GET['billing_country'] = ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_order->billing_country : $the_order->get_billing_country() );
}
if ( ! isset( $_GET['payment_method'] ) ) {
$_GET['payment_method'] = wcj_order_get_payment_method( $the_order );
}
global $wcj_pdf_invoice_data;
if ( ! isset( $wcj_pdf_invoice_data['user_id'] ) ) {
$wcj_pdf_invoice_data['user_id'] = ( WCJ_IS_WC_VERSION_BELOW_3 ? $the_order->customer_user : $the_order->get_customer_id() );
}
$html = do_shortcode( get_option( 'wcj_invoicing_' . $this->invoice_type . '_template',
WCJ()->modules['pdf_invoicing_templates']->get_default_template( $this->invoice_type ) ) );
$html = $this->maybe_replace_tcpdf_method_params( $html, $pdf );
return force_balance_tags( $html );
}
/**
* get_pdf.
*
* @version 3.6.0
* @todo (maybe) `die()` on success
*/
function get_pdf( $dest ) {
$pdf = $this->prepare_pdf();
$html = $this->get_html( $this->order_id, $pdf );
$styling = '<style>' . get_option( 'wcj_invoicing_' . $this->invoice_type . '_css',
WCJ()->modules['pdf_invoicing_styling']->get_default_css_template( $this->invoice_type ) ) . '</style>';
$pdf->writeHTMLCell( 0, 0, '', '', $styling . $html, 0, 1, 0, true, '', true );
$result_pdf = $pdf->Output( '', 'S' );
$file_name = $this->get_file_name();
if ( 'F' === $dest ) {
$file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
if ( ! file_put_contents( $file_path, $result_pdf ) ) {
return null;
}
return $file_path;
} elseif ( 'D' === $dest || 'I' === $dest ) {
if ( 'D' === $dest ) {
header( "Content-Type: application/octet-stream" );
header( "Content-Disposition: attachment; filename=" . urlencode( $file_name ) );
header( "Content-Type: application/octet-stream" );
header( "Content-Type: application/download" );
header( "Content-Description: File Transfer" );
} elseif ( 'I' === $dest ) {
header( "Content-type: application/pdf" );
header( "Content-Disposition: inline; filename=" . urlencode( $file_name ) );
}
if ( wcj_is_module_enabled( 'general' ) && 'yes' === get_option( 'wcj_general_advanced_disable_save_sys_temp_dir', 'no' ) ) {
header( "Content-Length: " . strlen( $result_pdf ) );
echo $result_pdf;
} else {
$file_path = wcj_get_invoicing_temp_dir() . '/' . $file_name;
if ( ! file_put_contents( $file_path, $result_pdf ) ) {
return null;
}
header( "Content-Length: " . filesize( $file_path ) );
flush(); // this doesn't really matter.
if ( false !== ( $fp = fopen( $file_path, "r" ) ) ) {
while ( ! feof( $fp ) ) {
echo fread( $fp, 65536 );
flush(); // this is essential for large downloads
}
fclose( $fp );
} else {
die( __( 'Unexpected error', 'woocommerce-jetpack' ) );
}
}
}
return null;
}
}
endif;