altocompta/include/class/invoice_pdf.class.php

332 lines
12 KiB
PHP

<?php
namespace Noalyss;
/*
* This file is part of NOALYSS.
*
* NOALYSS is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* NOALYSS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NOALYSS; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// Copyright Author Dany De Bontridder danydb@aevalys.eu 22/10/23
/**
* @file
* @brief create a standard invoice
*/
/**
* @class Invoice PDF
* @brief create a standard invoice
*/
class Invoice_PDF extends \PDF
{
private $data; //!< $data (array) see Acc_Ledger_Purchases
function __construct(
\Database $cn
, private $dirname //!< folder where to save file
, private $filename //!< filename to use
)
{
parent::__construct($cn);
}
public function get_dirname()
{
return $this->dirname;
}
public function get_filename()
{
return $this->filename;
}
public function set_dirname($dirname)
{
$this->dirname = $dirname;
return $this;
}
public function set_filename($filename)
{
$this->filename = $filename;
return $this;
}
function set_data($array)
{
$this->data = $array;
return $this;
}
function get_data()
{
return $this->data;
}
function footer()
{
//Position at 1 cm from bottom
$this->SetY(-10);
//Arial italic 8
$this->SetFont('Arial', '', 8);
//Page number
parent::Cell(0, 8, " Page " . $this->PageNo() . '/{nb}', 0, 0, 'C');
parent::Ln(3);
}
function header()
{
global $g_parameter;
$this->setY(15);
$this->SetFont('DejaVu', '', 6);
$colsize = 90;
$this->write_multi($colsize, 3, $g_parameter->MY_NAME);
$this->write_multi($colsize, 3, $this->data['e_date'], border: '', align: 'R');
$this->line_new();
$this->write_multi($colsize, 3,
sprintf("%s %s "
, $g_parameter->MY_STREET
, $g_parameter->MY_NUMBER));
$this->line_new();
$this->write_multi($colsize, 3, $g_parameter->MY_POSTCODE
. " " . $g_parameter->MY_CITY
. " " . $g_parameter->MY_COUNTRY
);
$this->line_new();
$this->write_multi($colsize, 3, $g_parameter->MY_TVA);
$this->line_new();
$email_company = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['INVOICE_EMAIL_COMPANY']);
$site = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['WEB_COMPANY']);
// for FRANCE , the SIREN and SIRET must be given
$siren = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['SIREN']);
$siret = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['SIRET']);
$iban = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['COMPANY_BANK_IBAN']);
$bic = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['COMPANY_BANK_BIC']);
if ($siret != "")
{
$this->write_multi($colsize, 3, "SIRET $siret");
$this->line_new();
}
if ($siren != "")
{
$this->write_multi($colsize, 3, "SIREN $siren");
$this->line_new();
}
if ($iban != "")
{
$this->write_multi($colsize, 3, "IBAN $iban BIC $bic");
$this->line_new();
}
if ($g_parameter->MY_PHONE != "")
{
$this->write_multi($colsize, 3, sprintf(_("Tel %s "),
$g_parameter->MY_PHONE
));
$this->line_new();
}
if ($email_company != "")
{
$this->write_multi($colsize, 3, sprintf(_("email %s "),
$email_company));
$this->line_new();
}
if ($site != "")
{
$this->write_multi($colsize, 3, sprintf(_("site %s"),
$site
));
$this->line_new();
}
$this->setFont("DejaVu", 'B', 14);
$this->write_multi(40, 10, "");
$this->write_multi(100, 10, _("Facture") . " " . $this->data['e_pj'], border: 1, align: 'C');
$this->write_multi(40, 10, "");
$this->line_new(10);
$this->ln(5);
}
//!
//@brief make the invoice
function export()
{
$this->SetAuthor('NOALYSS');
$this->AliasNbPages();
$this->AddPage();
$this->SetAutoPageBreak(true, $this->bMargin*1);
$this->setTitle($this->filename, true);
// $customer (Fiche) retrieve card of the customer
$customer = new \Fiche($this->cn);
$customer->get_by_qcode(trim($this->data['e_client']));
$this->setFont("DejaVu", '', 7);
$this->write_cell(50, 4, "");
$this->write_cell(60, 4, sprintf(_("Echéance %s"), $this->data['e_ech']));
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(100, 4, _("Client"), 'B', 'R');
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(110, 4, $customer->get_attribute(ATTR_DEF_NAME)
. " " . $customer->get_attribute(ATTR_DEF_FIRST_NAME, 0));
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(110, 4, $customer->get_attribute(ATTR_DEF_ADRESS, 0));
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(110, 4, $customer->get_attribute(ATTR_DEF_POSTCODE, 0)
. " " . $customer->get_attribute(ATTR_DEF_CITY, 0)
);
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(110, 4, $customer->get_attribute(ATTR_DEF_COUNTRY, 0));
$this->line_new();
$this->write_cell(50, 4, "");
$this->write_cell(110, 4, $customer->get_attribute(ATTR_DEF_NUMTVA, 0));
$this->line_new();
$a_tva_amount = [];
$a_tva_code = [];
$col = array(
"quick_code" => 30,
"label" => 80,
"quantity" => 25,
"price" => 25,
"vat_code" => 20
);
$this->SetFont("DejaVu", "B", 12);
$this->write_multi(50, 20, "");
$this->write_multi(50, 20, _("Détails"));
$this->line_new();
$this->SetFont("DejaVuCond", "", 7);
$currency = new \Acc_Currency($this->cn, $this->data['p_currency_code']);
$this->write_multi(60, 4, sprintf(_("Les montants sont en %s taux %s")
, $currency->get_code()
, $this->data['p_currency_rate']));
$this->line_new(4);
if ($this->data["bon_comm"] != "")
{
$this->write_multi(120, 4, sprintf(_("Bon de commande / référence %s")
, $this->data["bon_comm"]));
$this->line_new(4);
}
$this->line_new(4);
$this->SetFont("DejaVu", "", 7);
$this->write_multi($col['quick_code'], 4, _("Article"), 1);
$this->write_multi($col['label'], 4, _("Description"), 1);
$this->write_multi($col['quantity'], 4, _("Quantité"), 1);
$this->write_multi($col['price'], 4, _("Prix"), 1);
$this->write_multi($col['vat_code'], 4, _("TVA"), 1);
$this->line_new();
///@var $tot_amount (float) total amount without VAT
///@var $tot_vat (float) total VAT
///@var $line (int) line printed
$tot_amount = $tot_vat = $line =0;
for ($i = 0; $i < $this->data['nb_item']; $i++)
{
$item = new \Fiche($this->cn);
if (!isset($this->data['e_march' . $i]) || $this->data['e_march' . $i] == "")
{
continue;
}
$line++;
$item->get_by_qcode(trim($this->data['e_march' . $i]));
$fill = $this->is_fill($line);
$this->write_multi($col['quick_code'], 4, $item->get_attribute(ATTR_DEF_QUICKCODE),'','',$fill);
$this->write_multi($col['label'], 4, $this->data['e_march' . $i . '_label'],fill:$fill);
$this->write_multi($col['quantity'], 4, nbm($this->data['e_quant' . $i]), '', 'R',fill:$fill);
$this->write_multi($col['price'], 4, nbm($this->data['e_march' . $i . '_price']), '', 'R',fill:$fill);
$this->write_multi($col['vat_code'], 4, $this->data['e_march' . $i . '_tva_id'], '', 'C',fill:$fill);
$x = $this->data['e_march' . $i . '_tva_id'];
if (!isset($a_tva_amount[$x]))
{
$a_tva_amount[$x] = 0;
}
$a_tva_amount[$x] = bcadd($a_tva_amount[$x], $this->data["e_march" . $i . "_tva_amount"], 2);
$tot_amount = bcadd($tot_amount
, bcmul($this->data['e_march' . $i . '_price']
, $this->data['e_quant' . $i]
, 2
)
, 2);
$tot_vat = bcadd($tot_vat
, $this->data['e_march' . $i . '_tva_amount']
, 2);
$this->line_new(4);
if ($this->GetY()>250) {
$this->AddPage();
}
}
$this->line_new(10);
$this->SetFont("DejaVu", "B", 9);
$this->write_multi(30, 4, _("TVA"));
$this->line_new(5);
$this->SetFont("DejaVu", "", 7);
foreach ($a_tva_amount as $tva_id => $tva_amount)
{
$tva = \Acc_Tva::build($this->cn, $tva_id);
$this->write_multi(20, 4, "");
$this->write_multi(80, 4, $tva->tva_id
. " / " . $tva->tva_code
. " / " . $tva->tva_label
. " / " . $tva->tva_rate * 100
);
$this->write_multi(50, 4, $tva_amount);
$this->line_new();
}
$this->ln(20);
$this->SetFont("DejaVu", "B", 9);
$this->write_multi(30, 4, _("TOTAUX"));
$this->line_new();
$this->SetFont("DejaVu", "", 7);
$this->write_multi(60, 4, _("Total Hors TVA "));
$this->write_multi(60, 4, nbm($tot_amount), '', 'R');
$this->line_new();
$this->write_multi(60, 4, _("Total TVA "));
$this->write_multi(60, 4, nbm($tot_vat), '', 'R');
$this->line_new();
$this->write_multi(60, 4, _("Total "));
$this->write_multi(60, 4, nbm(bcadd($tot_amount, $tot_vat, 2),2), '', 'R');
$this->line_new();
$iban = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['COMPANY_BANK_IBAN']);
if ($this->data['e_ech'] != "" && $iban != "")
{
$info = ($this->data["other_info"] == "") ? $this->data["e_pj"] : $this->data["other_info"];
$bic = $this->cn->get_value("select pe_value from parameter_extra where pe_code=$1",
['COMPANY_BANK_IBAN']);
$this->write_multi(150, 4,
sprintf(_("Paiement avant le %s sur le compte %s (BIC %s) avec comme message %s"),
$this->data['e_ech']
, $iban
, $bic
, $this->data["other_info"]
)
);
$this->line_new();
}
$this->Output($this->dirname . DIRECTORY_SEPARATOR . $this->filename, "F");
}
}