<?php
/**
 * AgileBill - Open Billing Software
 *
 * This body of work is free software; you can redistribute it and/or
 * modify it under the terms of the Open AgileBill License
 * License as published at http://www.agileco.com/agilebill/license1-4.txt
 *
 * Originally authored by Joseph Benden
 * Modifications by Tony Landis, AgileBill LLC
 *
 * Recent modifications by Deon George
 *
 * @author Deon George <deonATleenooksDOTnet>
 * @copyright 2009 Deon George
 * @link http://osb.leenooks.net
 *
 * @link http://www.agileco.com/
 * @copyright 2004-2008 Agileco, LLC.
 * @license http://www.agileco.com/agilebill/license1-4.txt
 * @author Tony Landis <tony@agileco.com>
 * @package AgileBill
 * @subpackage Module:Invoice
 */

define('FPDF_FONTPATH',PATH_INCLUDES.'tcpdf/fonts/');
require_once(PATH_INCLUDES.'tcpdf/tcpdf.php');

/**
 * PDF Invoice Base
 *
 * @package AgileBill
 * @subpackage Module:Invoice
 */
abstract class pdf_invoice_base extends TCPDF {
	protected $billToCompany = true;
	protected $itemsSummaryMax = 16;
	protected $itemsPreviousMax = 5;
	protected $news = '';
	protected $pageType = 'blank';
	protected $show_itemized = true;
	protected $show_service_range = false;
	private $invoiceCurrency = '$';
	private $invoiceDecimals = 2;

	# Store previous invoices due
	private $itemsPrevious = array();
	# Stores the invoice items
	protected $invoice;
	protected $itemsFull;
	protected $account;
	# Iteration of drawing the items on the invoice
	protected $iteration;
	# Store the date range, that the invoice covers
	protected $dateRange;

	public function __construct($inv) {
		parent::__construct();

		$this->SetCreator('Open Source Billing');
		$this->SetAuthor($inv->print['site']['NAME']);
		$this->SetTitle(sprintf('%s Invoice',$inv->print['site']['NAME']));
		$this->SetSubject(sprintf('Invoice #%06s',$inv->getInvoiceNum()));
		$this->SetKeywords($inv->getInvoiceID());
		$this->SetAutoPageBreak(TRUE,25);
		$this->SetHeaderMargin(1);
		$this->SetFooterMargin(10);
		$this->SetDisplayMode('fullwidth');
		#$this->setHeaderFont(array('helvetica','',8));
		$this->setFooterFont(array('helvetica','',8));

		return $this;
	}

	public function load_setup(&$rs) {
		if (! $rs) {
			$db =& DB();
			$rs = $db->Execute(sqlSelect($db,'setup_invoice','*',''));
		}

		$this->billToCompany = $rs->fields['bill_to_company'];
		$this->invoiceCurrency = $rs->fields['invoice_currency'];
		$this->invoiceDecimals = $rs->fields['invoice_decimals'];
		$this->itemsSummaryMax = $rs->fields['items_summary_max'];
		$this->news = $rs->fields['news'];
		$this->pageType = $rs->fields['page_type'];
		$this->show_itemized = $rs->fields['invoice_show_itemized'];
		$this->show_service_range = $rs->fields['invoice_show_service_dates'];
	}

	abstract public function drawCompanyLogo();
	abstract public function drawCompanyAddress($inv);
	abstract public function drawInvoiceHeader($inv);

	/**
	 * Enable re-iteration of the invoices items, so that they can be displayed many ways
	 */
	abstract public function drawLineItems_pre($iteration);

	/**
	 * This is called for each line item.
	 */
	abstract public function drawLineItems($db,$line,$invnum);

	/**
	 * Draws the summary on the first page
	 */
	abstract public function drawSummaryLineItems($inv);
	abstract public function drawPaymentMethods($inv);

	public function drawRemittenceStub() {}
	public function drawCustom() {}
	public function drawInvoiceDueNotice() {}
	public function drawInvoicePaidNotice() {}
	public function setLateFeeNotice() {}

	/**
	 * Get a blank invoice template
	 */
	public function getTemplate() {
		return false;
	}

	/**
	 * Assigns the invoice fields to this object.
	 */
	public function setInvoiceFields($flds) {
		$this->invoice = $flds;
	}

	/**
	 * Assigns the account fields to this object.
	 */
	public function setAccountFields($flds) {
		$this->account = $flds;
	}

	public function setItemsFull($items) {
		$this->itemsFull = $items;
	}

	public function setItemsPrevious($items) {
		$this->itemsPrevious = $items;
	}

	public function setDateRange($periodStart,$periodEnd) {
		$this->dateRange = sprintf('%s - %s',date(UNIX_DATE_FORMAT,$periodStart),date(UNIX_DATE_FORMAT,$periodEnd));
	}

	public function setCurrency($currency) {
		$this->invoiceCurrency = $currency;
	}

	public function setDecimals($decimals) {
		$this->invoiceDecimals = $decimals;
	}

	/**
	 * Render an amount into a currency display
	 */
	protected function _currency($num) {
		global $C_list;

		if ($this->invoiceDecimals>3)
			return $this->invoiceCurrency.number_format($num,$this->invoiceDecimals);
		else
			return $C_list->format_currency_num($num,$this->invoice['actual_billed_currency_id']);
	}

	/**
	 * Add a watermark to the PDF
	 */
	public function addWaterMark($text) {
		$this->SetFont('helvetica','B',50);
		$this->SetTextColor(203,203,203);
		$this->Rotate(0);
		$this->Text(10,50,$text);
		$this->Rotate(0);
		$this->SetTextColor(0,0,0);
	}
}
?>