Bunch of changes including mpdf library for creating pdf of invoices. It now attaches a PDF invoice when marked sent. Don't mark invoice_status sent if it partial or paid, removed green text from balance under clients only use red if the client has a balance and some other cleanups were done
This commit is contained in:
+99
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of FPDI
|
||||
*
|
||||
* @package setasign\Fpdi
|
||||
* @copyright Copyright (c) 2019 Setasign - Jan Slabon (https://www.setasign.com)
|
||||
* @license http://opensource.org/licenses/mit-license The MIT License
|
||||
*/
|
||||
|
||||
namespace setasign\Fpdi\Tfpdf;
|
||||
|
||||
use setasign\Fpdi\FpdfTplTrait;
|
||||
|
||||
/**
|
||||
* Class FpdfTpl
|
||||
*
|
||||
* We need to change some access levels and implement the setPageFormat() method to bring back compatibility to tFPDF.
|
||||
*
|
||||
* @package setasign\Fpdi\Tfpdf
|
||||
*/
|
||||
class FpdfTpl extends \tFPDF
|
||||
{
|
||||
use FpdfTplTrait {
|
||||
_putimages as _protectedPutimages;
|
||||
_putxobjectdict as _protectedPutxobjectdict;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the method public as in tFPDF.
|
||||
*/
|
||||
public function _putimages()
|
||||
{
|
||||
$this->_protectedPutimages();
|
||||
}
|
||||
|
||||
/**
|
||||
* Make the method public as in tFPDF.
|
||||
*/
|
||||
public function _putxobjectdict()
|
||||
{
|
||||
$this->_protectedPutxobjectdict();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the page format of the current page.
|
||||
*
|
||||
* @param array $size An array with two values defining the size.
|
||||
* @param string $orientation "L" for landscape, "P" for portrait.
|
||||
* @throws \BadMethodCallException
|
||||
*/
|
||||
public function setPageFormat($size, $orientation)
|
||||
{
|
||||
if ($this->currentTemplateId !== null) {
|
||||
throw new \BadMethodCallException('The page format cannot be changed when writing to a template.');
|
||||
}
|
||||
|
||||
if (!\in_array($orientation, ['P', 'L'], true)) {
|
||||
throw new \InvalidArgumentException(\sprintf(
|
||||
'Invalid page orientation "%s"! Only "P" and "L" are allowed!',
|
||||
$orientation
|
||||
));
|
||||
}
|
||||
|
||||
$size = $this->_getpagesize($size);
|
||||
|
||||
if ($orientation != $this->CurOrientation
|
||||
|| $size[0] != $this->CurPageSize[0]
|
||||
|| $size[1] != $this->CurPageSize[1]
|
||||
) {
|
||||
// New size or orientation
|
||||
if ($orientation === 'P') {
|
||||
$this->w = $size[0];
|
||||
$this->h = $size[1];
|
||||
} else {
|
||||
$this->w = $size[1];
|
||||
$this->h = $size[0];
|
||||
}
|
||||
$this->wPt = $this->w * $this->k;
|
||||
$this->hPt = $this->h * $this->k;
|
||||
$this->PageBreakTrigger = $this->h - $this->bMargin;
|
||||
$this->CurOrientation = $orientation;
|
||||
$this->CurPageSize = $size;
|
||||
|
||||
$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function _put($s, $newLine = true)
|
||||
{
|
||||
if ($newLine) {
|
||||
$this->buffer .= $s . "\n";
|
||||
} else {
|
||||
$this->buffer .= $s;
|
||||
}
|
||||
}
|
||||
}
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is part of FPDI
|
||||
*
|
||||
* @package setasign\Fpdi
|
||||
* @copyright Copyright (c) 2019 Setasign - Jan Slabon (https://www.setasign.com)
|
||||
* @license http://opensource.org/licenses/mit-license The MIT License
|
||||
*/
|
||||
|
||||
namespace setasign\Fpdi\Tfpdf;
|
||||
|
||||
use setasign\Fpdi\FpdiTrait;
|
||||
use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException;
|
||||
use setasign\Fpdi\PdfParser\PdfParserException;
|
||||
use setasign\Fpdi\PdfParser\Type\PdfIndirectObject;
|
||||
use setasign\Fpdi\PdfParser\Type\PdfNull;
|
||||
|
||||
/**
|
||||
* Class Fpdi
|
||||
*
|
||||
* This class let you import pages of existing PDF documents into a reusable structure for tFPDF.
|
||||
*
|
||||
* @package setasign\Fpdi
|
||||
*/
|
||||
class Fpdi extends FpdfTpl
|
||||
{
|
||||
use FpdiTrait;
|
||||
|
||||
/**
|
||||
* FPDI version
|
||||
*
|
||||
* @string
|
||||
*/
|
||||
const VERSION = '2.2.0';
|
||||
|
||||
public function _enddoc()
|
||||
{
|
||||
parent::_enddoc();
|
||||
$this->cleanUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws an imported page or a template onto the page or another template.
|
||||
*
|
||||
* Give only one of the size parameters (width, height) to calculate the other one automatically in view to the
|
||||
* aspect ratio.
|
||||
*
|
||||
* @param mixed $tpl The template id
|
||||
* @param float|int|array $x The abscissa of upper-left corner. Alternatively you could use an assoc array
|
||||
* with the keys "x", "y", "width", "height", "adjustPageSize".
|
||||
* @param float|int $y The ordinate of upper-left corner.
|
||||
* @param float|int|null $width The width.
|
||||
* @param float|int|null $height The height.
|
||||
* @param bool $adjustPageSize
|
||||
* @return array The size
|
||||
* @see Fpdi::getTemplateSize()
|
||||
*/
|
||||
public function useTemplate($tpl, $x = 0, $y = 0, $width = null, $height = null, $adjustPageSize = false)
|
||||
{
|
||||
if (isset($this->importedPages[$tpl])) {
|
||||
$size = $this->useImportedPage($tpl, $x, $y, $width, $height, $adjustPageSize);
|
||||
if ($this->currentTemplateId !== null) {
|
||||
$this->templates[$this->currentTemplateId]['resources']['templates']['importedPages'][$tpl] = $tpl;
|
||||
}
|
||||
return $size;
|
||||
}
|
||||
|
||||
return parent::useTemplate($tpl, $x, $y, $width, $height, $adjustPageSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of an imported page or template.
|
||||
*
|
||||
* Give only one of the size parameters (width, height) to calculate the other one automatically in view to the
|
||||
* aspect ratio.
|
||||
*
|
||||
* @param mixed $tpl The template id
|
||||
* @param float|int|null $width The width.
|
||||
* @param float|int|null $height The height.
|
||||
* @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P)
|
||||
*/
|
||||
public function getTemplateSize($tpl, $width = null, $height = null)
|
||||
{
|
||||
$size = parent::getTemplateSize($tpl, $width, $height);
|
||||
if ($size === false) {
|
||||
return $this->getImportedPageSize($tpl, $width, $height);
|
||||
}
|
||||
|
||||
return $size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
* @throws CrossReferenceException
|
||||
* @throws PdfParserException
|
||||
*/
|
||||
public function _putimages()
|
||||
{
|
||||
$this->currentReaderId = null;
|
||||
parent::_putimages();
|
||||
|
||||
foreach ($this->importedPages as $key => $pageData) {
|
||||
$this->_newobj();
|
||||
$this->importedPages[$key]['objectNumber'] = $this->n;
|
||||
$this->currentReaderId = $pageData['readerId'];
|
||||
$this->writePdfType($pageData['stream']);
|
||||
$this->_put('endobj');
|
||||
}
|
||||
|
||||
foreach (\array_keys($this->readers) as $readerId) {
|
||||
$parser = $this->getPdfReader($readerId)->getParser();
|
||||
$this->currentReaderId = $readerId;
|
||||
|
||||
while (($objectNumber = \array_pop($this->objectsToCopy[$readerId])) !== null) {
|
||||
try {
|
||||
$object = $parser->getIndirectObject($objectNumber);
|
||||
|
||||
} catch (CrossReferenceException $e) {
|
||||
if ($e->getCode() === CrossReferenceException::OBJECT_NOT_FOUND) {
|
||||
$object = PdfIndirectObject::create($objectNumber, 0, new PdfNull());
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
$this->writePdfType($object);
|
||||
}
|
||||
}
|
||||
|
||||
$this->currentReaderId = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function _putxobjectdict()
|
||||
{
|
||||
foreach ($this->importedPages as $key => $pageData) {
|
||||
$this->_put('/' . $pageData['id'] . ' ' . $pageData['objectNumber'] . ' 0 R');
|
||||
}
|
||||
|
||||
parent::_putxobjectdict();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function _newobj($n = null)
|
||||
{
|
||||
// Begin a new object
|
||||
if($n === null)
|
||||
$n = ++$this->n;
|
||||
$this->offsets[$n] = $this->_getoffset();
|
||||
$this->_put($n.' 0 obj');
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
protected function _getoffset()
|
||||
{
|
||||
return strlen($this->buffer);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user