shop-old/core/output/invoicepdf.class.php
2026-04-20 01:03:43 +02:00

591 lines
19 KiB
PHP

<?php
/*
* @version $Id: index.php 10381 2008-06-01 03:35:53Z $
* @package Carteasy
* @copyright Copyright (C) 2005 - 2011 Wlanium
* @license proprietary
* @author Thomas Bartelt
* Carteasy is a web shop system
*/
include_once './libs/tcpdf/tcpdf.php';
include_once './core/config.class.php';
include_once './core/money.class.php';
class InvoicePDF extends TCPDF {
private $_image_path;
// fill color for header
private $_fill_r = 102;
private $_fill_g = 102;
private $_fill_b = 102;
// table border color
private $_border_r = 0;
private $_border_g = 0;
private $_border_b = 0;
// stripe color for items list
private $_stripe_r = 249;
private $_stripe_g = 249;
private $_stripe_b = 249;
// normal text color
private $_text_r = 0;
private $_text_g = 0;
private $_text_b = 0;
// light text color
private $_light_text_r = 128;
private $_light_text_g = 128;
private $_light_text_b = 128;
private $_line_width = 0.2;
// new page
private $new_page_lines = 260;
// header image
private $header_image_x = 5;
private $header_image_y = 5;
// footer image
private $footer_image_x = 5;
private $footer_image_y = 260;
// invoice data
private $invoice_data_y = 53;
private $total;
public function __construct() {
parent::__construct(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$this->_image_path = ROOT_DIR.'web/'.SHOP_SYSTEM.'/documents/';
$this->SetMargins(15, 5, 5);
$this->total = false;
if (Config::has_key('bill_new_page_lines')) {
$this->new_page_lines = Config::get_value('bill_new_page_lines');
}
if (Config::has_key('bill_invoice_data_y')) {
$this->invoice_data_y = Config::get_value('bill_invoice_data_y');
}
if (Config::has_key('bill_header_image_x')) {
$this->header_image_x = Config::get_value('bill_header_image_x');
}
if (Config::has_key('bill_header_image_y')) {
$this->header_image_y = Config::get_value('bill_header_image_y');
}
if (Config::has_key('bill_footer_image_x')) {
$this->footer_image_x = Config::get_value('bill_footer_image_x');
}
if (Config::has_key('bill_footer_image_y')) {
$this->footer_image_y = Config::get_value('bill_footer_image_y');
}
}
public function Header() {
if (Config::has_key('bill_header_image')) {
$header_image = (string)Config::get_value('bill_header_image');
if ($header_image != '') {
$this->Image($this->_image_path.$header_image, $this->header_image_x, $this->header_image_y, 200, 0);
}
}
if (Config::has_key('bill_header_text_window')) {
$this->SetXY(16, 50);
$this->SetFont('', '', 6);
$this->Cell(50, 0, Config::get_value('bill_header_text_window'), 0, 0, 'L', 0);
}
if (Config::has_key('bill_header_text_address')) {
$address = Config::get_value('bill_header_text_address');
if (Config::has_key('bill_header_alignment_address')) {
$alignment = $this->_getAlignment(Config::get_value('bill_header_alignment_address'));
} else {
$alignment = 'L';
}
$this->SetXY(125, 50);
$this->SetFont('', '', 7);
$this->MultiCell(70, 20, $address, 0, $alignment);
}
$this->setTopMargin(60 + 5);
}
public function Footer() {
$this->SetFont('', '', 8);
if (Config::has_key('bill_footer_image')) {
$footer_image = (string)Config::get_value('bill_footer_image');
if ($footer_image != '') {
$this->Image($this->_image_path.$footer_image, $this->footer_image_x, $this->footer_image_y, 200, 0);
}
}
$footer_position_y = -25;
if (Config::has_key('bill_footer_text_margin_bottom')) {
$footer_position_y = (int)Config::get_value('bill_footer_text_margin_bottom');
}
// left
if (Config::has_key('bill_footer_text_left')) {
$footer_left_text = (string)Config::get_value('bill_footer_text_left');
if ($footer_left_text != '') {
if (Config::has_key('bill_footer_alignment_left')) {
$alignment = $this->_getAlignment(Config::get_value('bill_footer_alignment_left'));
} else {
$alignment = 'L';
}
$this->SetXY(15, $footer_position_y);
$this->MultiCell(67, 20, $footer_left_text, 0, $alignment);
}
}
// center
if (Config::has_key('bill_footer_text_center')) {
$footer_center_text = (string)Config::get_value('bill_footer_text_center');
if ($footer_center_text != '') {
if (Config::has_key('bill_footer_alignment_center')) {
$alignment = $this->_getAlignment(Config::get_value('bill_footer_alignment_center'));
} else {
$alignment = 'L';
}
$this->SetXY(70, $footer_position_y);
$this->MultiCell(66, 20, $footer_center_text, 0, $alignment);
}
}
// right
if (Config::has_key('bill_footer_text_right')) {
$footer_right_text = (string)Config::get_value('bill_footer_text_right');
if ($footer_right_text != '') {
if (Config::has_key('bill_footer_alignment_right')) {
$alignment = $this->_getAlignment(Config::get_value('bill_footer_alignment_right'));
} else {
$alignment = 'R';
}
$this->SetXY(140, $footer_position_y);
$this->MultiCell(67, 20, $footer_right_text, 0, $alignment);
}
}
}
public function PrintCustomerAddress($data) {
$this->SetX(5);
$this->SetY(53);
$this->SetFont('', '', 10);
$this->MultiCell(80,35, $data, 0, 'L');
}
public function PrintInvoiceData($data) {
$this->SetFont('', '', 10);
$key_string = '';
$value_string = '';
foreach ($data as $key => $value) {
if ($key_string == '') {
$key_string = $key;
$value_string = $value;
} else {
$key_string .= "\n".$key;
$value_string .= "\n".$value;
}
}
$this->SetXY(125, $this->invoice_data_y);
$this->MultiCell(40, 35, $key_string, 0, 'L');
$this->SetXY(165, $this->invoice_data_y);
$this->MultiCell(40, 35, $value_string, 0, 'R');
}
private function checkForNewPage($lines = false) {
if ($lines && ($this->GetY() + $lines * 3.52778) > $this->new_page_lines) {
$this->addPage('', '', true, true);
} else if ($this->GetY() > $this->new_page_lines) {
$this->addPage('', '', true, true);
}
}
public function PrintInvoiceOrder($data) {
$this->SetFont('', 'B', 18);
$this->Cell(120, 0, "Rechnung", '', 0, 'L');
$this->Ln();
$this->SetX(5);
$this->SetY($this->tMargin + 40);
$this->SetFont('', '', 8);
// conf header
$this->SetFillColor($this->_fill_r, $this->_fill_g, $this->_fill_b);
$this->SetTextColor(255);
$this->SetDrawColor($this->_border_r, $this->_border_g, $this->_border_b);
$this->SetLineWidth($this->_line_width);
$this->SetFont('', 'B');
$header_width = array(15, 10, 90, 20, 30, 25);
$length = count($header_width);
// draw header
$this->Cell($header_width[0], 0, 'Pos.', 'LTB', 0, 'C', 1); // Pos.
$this->Cell($header_width[1], 0, 'St.', 'TB', 0, 'C', 1); // St.
$this->Cell($header_width[2], 0, 'Beschreibung/Art-Nr.', 'TB', 0, 'L', 1); // Art-Nr./Beschreibung
if ($data['header']->is_eu_order == 1) {
$this->Cell($header_width[3], 0, '', 'TB', 0, 'R', 1); // no mwst .. eu bill
} else {
$this->Cell($header_width[3], 0, 'MwSt.', 'TB', 0, 'R', 1); // mwst
}
$this->Cell($header_width[4], 0, $this->_stringCleaner('Stückpreis'), 'TB', 0, 'R', 1); // Stueckpreis
$this->Cell($header_width[5], 0, 'Gesamtpreis', 'RTB', 0, 'R', 1); // Gesamtpreis
$this->Ln();
// conf data
$this->SetFillColor($this->_stripe_r, $this->_stripe_g, $this->_stripe_b);
$this->SetTextColor(0);
$this->SetFont('');
$fill = 0;
// draw data
$i = 1;
$sum = 0.0;
$taxsum = 0.0;
foreach ($data['items'] as $row) {
$this->checkForNewPage();
// first row
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell($header_width[0], 0, $i, 'L', 0, 'C', $fill); // Pos.
$this->Cell($header_width[1], 0, $row->amount, 0, 0, 'C', $fill); // St.
if (strlen($row->item_name) > 70) {
$this->Cell($header_width[2], 0, $this->_stringCleaner(substr($row->item_name,0,71)), 0, 0, 'L', $fill); // Beschreibung
$this->Ln();
$this->Cell($header_width[0], 0, '', 'L', 0, 'C', $fill); // Pos.
$this->Cell($header_width[1], 0, '', 0, 0, 'C', $fill); // St.
$this->Cell($header_width[2], 0, $this->_stringCleaner(substr($row->item_name,70)), 0, 0, 'L', $fill); // Beschreibung
} else {
$this->Cell($header_width[2], 0, $this->_stringCleaner($row->item_name), 0, 0, 'L', $fill); // Beschreibung
}
if ($data['header']->is_eu_order == 1) {
$this->Cell($header_width[3], 0, '', 0, 0, 'R', $fill); // no mwst .. eu bill
} else {
$this->Cell($header_width[3], 0, $this->_stringCleaner(number_format($row->tax_rate, 2, ',', ' ').' %'), 0, 0, 'R', $fill); // mwst
}
$sum += $row->shown_total;
$item_taxes = $row->taxes * $row->amount;
$taxes[$row->tax_rate] += $item_taxes;
$taxsum += $item_taxes;
$this->Cell($header_width[4], 0, $this->_stringCleaner(number_format($row->shown_amount, 2, ',', ' ').' €'), 0, 0, 'R', $fill); // Stückpreis
$this->Cell($header_width[5], 0, $this->_stringCleaner(number_format($row->shown_total, 2, ',', ' ').' €'), 'R', 0, 'R', $fill); // Gesamtpreis
$this->Ln();
// middle row
$this->Cell($header_width[0], 0, '', 'L', 0, 'C', $fill);
$this->Cell($header_width[1], 0, '', 0, 0, 'R', $fill);
$this->Cell($header_width[2], 0, 'Art-Nr.: '.$row->item_number, 0, 0, 'L', $fill); // Art-Nr.
$this->Cell($header_width[3], 0, '', 0, 0, 'R', $fill);
$this->Cell($header_width[4], 0, '', 0, 0, 'R', $fill);
$this->Cell($header_width[5], 0, '', 'R', 0, 'R', $fill);
$this->Ln();
// last row
if ($row->item_status) {
$this->Cell($header_width[0] + $header_width[1], 0, '', 'L', 0, 'C', $fill);
$text = '';
if ($row->item_status == 1) {
// nicht lieferbar
if ($row->item_status_text) {
$text = $row->item_status_text;
} else {
$text = 'nicht lieferbar';
}
} else if ($row->item_status == 2) {
// nachliefern
if ($row->backorder_quantity) {
$text .= $row->backorder_quantity;
}
if ($text == '' && $row->item_status_text) {
$text .= $row->item_status_text;
} else if ($row->item_status_text) {
$text .= ' '.$row->item_status_text;
} else {
$text .= ' nachliefern';
}
if ($row->delivery_date) {
if ($text != '') {
$date = explode(' ', $row->delivery_date);
$text .= ' - '.$date[2].'.'.$date[1].'.'.$date[0];
}
}
} else if ($row->item_status == 3) {
// nachliefern
if ($row->backorder_quantity) {
$text .= $row->backorder_quantity;
}
if ($text == '' && $row->item_status_text) {
$text .= $row->item_status_text;
} else if ($row->item_status_text) {
$text .= ' '.$row->item_status_text;
} else {
$text .= ' info';
}
if ($row->delivery_date) {
if ($text != '') {
$date = explode(' ', $row->delivery_date);
$text .= ' - '.$date[2].'.'.$date[1].'.'.$date[0];
}
}
}
$this->Cell($header_width[2] + $header_width[3] + $header_width[4], 0, $this->_stringCleaner($text), 0, 0, 'L', $fill);
$this->Cell($header_width[5], 0, '', 'R', 0, 'L', $fill);
$this->Ln();
}
$fill = !$fill;
$i++;
}
// conf footer
$this->SetTextColor(0);
$this->SetFont('');
// draw footer
// total sum
$this->checkForNewPage();
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, 'Summe aller Artikel', 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format($sum, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
// payment method cost
$this->checkForNewPage();
$fill = !$fill;
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('Zahlungsgebühren'), 0, 0, 'L', $fill);
$method_charges_gross = $data['header']->payment_method_charges;
$method_charges_net = $data['header']->payment_method_charges / 119.0 * 100.0;
$method_charges_vat = $data['header']->payment_method_charges / 119.0 * 19.0;
if ($data['header']->cg_show_taxes) {
$this->Cell(60, 0, $this->_stringCleaner(number_format($method_charges_gross, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
} else {
$this->Cell(60, 0, $this->_stringCleaner(number_format($method_charges_net, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
}
$this->Ln();
// delivery cost
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, 'Versandkosten', 0, 0, 'L', $fill);
$shipping_charges_gross = $data['header']->shipping_charges;
$shipping_charges_net = $data['header']->shipping_charges / 119.0 * 100.0;
$shipping_charges_vat = $data['header']->shipping_charges / 119.0 * 19.0;
if ($data['header']->cg_show_taxes) {
$this->Cell(60, 0, $this->_stringCleaner(number_format($shipping_charges_gross, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
} else {
$this->Cell(60, 0, $this->_stringCleaner(number_format($shipping_charges_net, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
}
$this->Ln();
if ($data['header']->is_eu_order && !$data['header']->cg_show_taxes) {
$this->checkForNewPage();
//$subtotal = $sum + $net_shipping_charges + $net_method_charges;
$subtotal = $sum + $shipping_charges_net + $method_charges_net;
if (isset($data['footer']->gift_certificate_id)) {
$subtotal -= $data['footer']->gift_certificate_total;
}
// TODO: HACK HACK HACK
$this->total = $subtotal;
$fill = !$fill;
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('Bruttosumme'), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format($subtotal, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', 'B', 8);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('zu zahlender Betrag'), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format($subtotal, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
// line
$this->Cell(array_sum($header_width), 0, '', 'T');
$this->Ln();
} else {
if (!$data['footer']->taxes['19.00'] && ($method_charges_vat || $shipping_charges_vat)) {
$data['footer']->taxes['19.00'] = 0;
}
foreach ($data['footer']->taxes as $key => $value) {
if ($key == '19.00') {
$value += ($method_charges_vat + $shipping_charges_vat);
}
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
if ($data['header']->cg_show_taxes) {
$this->Cell(40, 0, $this->_stringCleaner('darin enthaltene Mwst. '.number_format($key, 2, ',', ' ').' %'), 0, 0, 'L', $fill);
} else {
// richard hack!!! muss geprüft werden!
$taxsum .= $value;
/*echo "taxsum: $taxsum <br>value: $value <br>sum: $sum <br>";
echo "shipping: ".$data['header']->shipping_charges;
echo "<br>payment: ".$data['header']->payment_method_charges;
exit();*/
$this->Cell(40, 0, $this->_stringCleaner('zzgl. '.number_format($key, 2, ',', ' ').' % Mwst.'), 0, 0, 'L', $fill);
}
$this->Cell(60, 0, $this->_stringCleaner(number_format($value, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
}
// invoice total fat
if ($data['header']->cg_show_taxes) {
$total = $sum + $data['header']->shipping_charges + $data['header']->payment_method_charges;
} else {
// rk update hack!!!
//$total = $sum + $shipping_charges_net + $method_charges_net + $taxsum;
//$total = $sum + $data['header']->shipping_charges + $data['header']->payment_method_charges + $taxsum;
$total = $data['footer']->order_total_with_tax;
}
// gift certificate
if (isset($data['footer']->gift_certificate_id)) {
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', 'B', 8);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('Zwischen Betrag'), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format($total, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
$this->checkForNewPage();
$gift_certificate_text = 'abzgl. Gutschein '.$data['footer']->gift_certificate_code;
$fill = !$fill;
$this->SetFont('', '', 8);
$this->SetTextColor($this->_text_r, $this->_text_g, $this->_text_b);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner($gift_certificate_text), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format(-$data['footer']->gift_certificate_total, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', 'B', 8);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('zu zahlender Betrag'), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format(($total - $data['footer']->gift_certificate_total), 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
// line
$this->Cell(array_sum($header_width), 0, '', 'T');
$this->Ln();
$this->total = $total - $data['footer']->gift_certificate_total;
} else {
$this->checkForNewPage();
$fill = !$fill;
$this->SetFont('', 'B', 8);
$this->Cell(90, 0, '', 'L', 0, 'C', $fill);
$this->Cell(40, 0, $this->_stringCleaner('zu zahlender Betrag'), 0, 0, 'L', $fill);
$this->Cell(60, 0, $this->_stringCleaner(number_format($total, 2, ',', ' ').' €'), 'R', 0, 'R', $fill);
$this->Ln();
// line
$this->Cell(array_sum($header_width), 0, '', 'T');
$this->Ln();
$this->total = $total;
}
}
}
public function PrintEarlyPaymentRebate($rebate) {
$earlyPayersRebate = $this->total * $rebate;
$text = 'Bei Bezahlung innerhalb von 14 Tagen gewähren wir '.
(int)($rebate * 100).' % Skonto ('.number_format(($this->total - $earlyPayersRebate), 2, ',', '.').
' anstelle von '.number_format(($this->total), 2, ',', '.').
', eine Ersparnis von '.number_format(($earlyPayersRebate), 2, ',', '.').' €)';
$this->PrintNotice('Zahlungshinweis', $text);
} // end PrintEarlyPaymentRebate
public function PrintNotice($title, $notice) {
$this->checkForNewPage(substr_count($notice, "\n") + 1);
$this->SetFillColor($this->_fill_r, $this->_fill_g, $this->_fill_b);
$this->SetTextColor(255);
$this->SetDrawColor($this->_border_r, $this->_border_g, $this->_border_b);
$this->SetLineWidth($this->_line_width);
$this->SetFont('', 'B');
$this->Cell(190, 1, $title, 1, 0, 'L', 1);
$this->Ln();
$this->SetTextColor(0);
$this->SetFont('');
$this->MultiCell(190, 1, $notice, 'LRB', 'L', 0);
$this->Ln(4);
}
protected function _getAlignment($num) {
if ($num == 0) {
return 'L';
} else if ($num == 1) {
return 'C';
} else if ($num == 2) {
return 'R';
}
return 'C';
}
protected function _stringCleaner($sting) {
$search = array('€', 'ß', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü');
$replace = array($this->unichr(8364), $this->unichr(223), $this->unichr(228), $this->unichr(246), $this->unichr(252), $this->unichr(196), $this->unichr(214), $this->unichr(220));
return str_replace($search, $replace, $sting);
}
}