mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2026-01-24 17:53:17 +01:00
This is to be more portable, to solve problem when database server time differs from PHP server and to prepare for TZ support.
743 lines
22 KiB
PHP
743 lines
22 KiB
PHP
<?php
|
|
/* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
|
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2004 Christophe Combelles <ccomb@free.fr>
|
|
* Copyright (C) 2005 Marc Barilley / Ocebo <marc@ocebo.com>
|
|
* Copyright (C) 2005-2007 Regis Houssin <regis@dolibarr.fr>
|
|
*
|
|
* This program 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.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
/**
|
|
\file htdocs/fourn/fournisseur.facture.class.php
|
|
\ingroup fournisseur,facture
|
|
\brief Fichier de la classe des factures fournisseurs
|
|
\version $Id$
|
|
*/
|
|
|
|
include_once(DOL_DOCUMENT_ROOT."/facture.class.php");
|
|
|
|
|
|
/**
|
|
\class FactureFournisseur
|
|
\brief Classe permettant la gestion des factures fournisseurs
|
|
*/
|
|
|
|
class FactureFournisseur extends Facture
|
|
{
|
|
var $id;
|
|
var $db;
|
|
var $socid;
|
|
var $element='facture_fourn';
|
|
var $table_element='facture_fourn';
|
|
var $table_element_line='facture_fourn_det';
|
|
var $fk_element='fk_facture_fourn';
|
|
|
|
//! 0=brouillon,
|
|
//! 1=validée,
|
|
//! TODO Ce statut doit etre 2 et non 1 classée payée partiellement (close_code='discount_vat','badcustomer') ou complètement (close_code=null),
|
|
//! TODO Ce statut doit etre 2 et non 1 classée abandonnée et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
|
|
var $statut;
|
|
//! 1 si facture payée COMPLETEMENT, 0 sinon (ce champ ne devrait plus servir car insuffisant)
|
|
var $paye;
|
|
|
|
var $author;
|
|
var $libelle;
|
|
var $date;
|
|
var $date_echeance;
|
|
var $ref;
|
|
var $amount;
|
|
var $remise;
|
|
var $tva;
|
|
var $total_ht;
|
|
var $total_tva;
|
|
var $total_ttc;
|
|
var $note;
|
|
var $propalid;
|
|
var $lignes;
|
|
var $fournisseur;
|
|
|
|
/**
|
|
* \brief Constructeur de la classe
|
|
* \param DB Handler accès base de données
|
|
* \param socid Id societe ('' par defaut)
|
|
* \param facid Id facture ('' par defaut)
|
|
*/
|
|
function FactureFournisseur($DB, $socid='', $facid='')
|
|
{
|
|
$this->db = $DB ;
|
|
$this->table = 'facture_fourn';
|
|
$this->tabledetail = 'facture_fourn_det';
|
|
|
|
$this->id = $facid;
|
|
$this->socid = $socid;
|
|
|
|
$this->amount = 0;
|
|
$this->remise = 0;
|
|
$this->tva = 0;
|
|
$this->total_ht = 0;
|
|
$this->total_tva = 0;
|
|
$this->total_ttc = 0;
|
|
$this->propalid = 0;
|
|
|
|
$this->products = array();
|
|
$this->lignes = array();
|
|
}
|
|
|
|
/**
|
|
* \brief Création de la facture en base
|
|
* \param user object utilisateur qui crée
|
|
* \return int id facture si ok, < 0 si erreur
|
|
*/
|
|
function create($user)
|
|
{
|
|
global $langs;
|
|
|
|
$socid = $this->socid;
|
|
$number = $this->ref;
|
|
$amount = $this->amount;
|
|
$remise = $this->remise;
|
|
|
|
$this->db->begin();
|
|
|
|
if (! $remise) $remise = 0 ;
|
|
$totalht = ($amount - $remise);
|
|
|
|
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn (facnumber, libelle, fk_soc, datec, datef, note, fk_user_author, date_lim_reglement) ';
|
|
$sql .= " VALUES ('".addslashes($number)."','".addslashes($this->libelle)."',";
|
|
$sql .= $this->socid.", ".$this->db->idate(mktime()).",'".$this->db->idate($this->date)."','".addslashes($this->note)."', ".$user->id.",'".$this->db->idate($this->date_echeance)."');";
|
|
$resql=$this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn');
|
|
for ($i = 0 ; $i < sizeof($this->lignes) ; $i++)
|
|
{
|
|
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
|
|
$sql .= ' VALUES ('.$this->id.');';
|
|
$resql_insert=$this->db->query($sql);
|
|
if ($resql_insert)
|
|
{
|
|
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
|
|
$this->updateline($idligne,
|
|
$this->lignes[$i]->description,
|
|
$this->lignes[$i]->pu_ht,
|
|
$this->lignes[$i]->tva_taux,
|
|
$this->lignes[$i]->qty);
|
|
}
|
|
}
|
|
// Mise à jour prix
|
|
if ($this->update_price() > 0)
|
|
{
|
|
$this->db->commit();
|
|
return $this->id;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$langs->trans('FailedToUpdatePrice');
|
|
$this->db->rollback();
|
|
return -3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
|
|
{
|
|
$this->error=$langs->trans('ErrorBillRefAlreadyExists');
|
|
$this->db->rollback();
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->error();
|
|
$this->db->rollback();
|
|
return -2;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Recupére l'objet facture et ses lignes de factures
|
|
* \param rowid id de la facture a récupérer
|
|
* \return int >0 si ok, <0 si ko
|
|
*/
|
|
function fetch($rowid)
|
|
{
|
|
$sql = 'SELECT libelle, facnumber, amount, remise, '.$this->db->pdate(datef).'as df,';
|
|
$sql.= ' total_ht, total_tva, total_ttc, fk_user_author,';
|
|
$sql.= ' fk_statut, fk_projet as fk_project, paye, f.note, f.note_public,';
|
|
$sql.= ' '.$this->db->pdate('date_lim_reglement').'as de,';
|
|
$sql.= ' s.nom as socnom, s.rowid as socid';
|
|
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f,'.MAIN_DB_PREFIX.'societe as s';
|
|
$sql.= ' WHERE f.rowid='.$rowid.' AND f.fk_soc = s.rowid';
|
|
|
|
dolibarr_syslog("FactureFourn::Fetch sql=".$sql, LOG_DEBUG);
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$num=$this->db->num_rows($resql);
|
|
if ($num)
|
|
{
|
|
$obj = $this->db->fetch_object($resql);
|
|
|
|
$this->id = $rowid;
|
|
$this->ref = $this->id;
|
|
$this->ref_supplier = $obj->facnumber;
|
|
|
|
$this->datep = $obj->df;
|
|
$this->date_echeance = $obj->de;
|
|
$this->libelle = $obj->libelle;
|
|
|
|
$this->remise = $obj->remise;
|
|
$this->socid = $obj->socid;
|
|
|
|
$this->total_ht = $obj->total_ht;
|
|
$this->total_tva = $obj->total_tva;
|
|
$this->total_ttc = $obj->total_ttc;
|
|
|
|
$this->author = $obj->fk_user_author;
|
|
|
|
$this->statut = $obj->fk_statut;
|
|
$this->paye = $obj->paye;
|
|
|
|
$this->fk_project = $obj->fk_project;
|
|
|
|
$this->socnom = $obj->socnom;
|
|
$this->note = $obj->note;
|
|
$this->note_public = $obj->note_public;
|
|
|
|
$this->db->free($resql);
|
|
|
|
/*
|
|
* Lignes
|
|
*/
|
|
$result=$this->fetch_lines();
|
|
if ($result < 0)
|
|
{
|
|
$this->error=$this->db->error();
|
|
dolibarr_syslog('Facture::Fetch Error '.$this->error);
|
|
return -3;
|
|
}
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
dolibarr_syslog('FactureFournisseur::Fetch rowid='.$rowid.' numrows=0 sql='.$sql);
|
|
$this->error='Bill with id '.$rowid.' not found sql='.$sql;
|
|
dolibarr_print_error($this->db);
|
|
return -2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dolibarr_syslog('FactureFournisseur::Fetch rowid='.$rowid.' Erreur dans fetch de la facture fournisseur');
|
|
$this->error=$this->db->error();
|
|
dolibarr_print_error($this->db);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
\brief Recupére les lignes de factures dans this->lignes
|
|
\return int 1 si ok, < 0 si erreur
|
|
*/
|
|
function fetch_lines()
|
|
{
|
|
$sql = 'SELECT f.rowid, f.description, f.pu_ht, f.pu_ttc, f.qty, f.tva_taux, f.tva';
|
|
$sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type';
|
|
$sql.= ', p.ref, p.label as label, p.description as product_desc';
|
|
//$sql.= ', pf.ref_fourn';
|
|
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn_det as f';
|
|
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product as p ON f.fk_product = p.rowid';
|
|
//$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_fournisseur as pf ON f.fk_product = pf.fk_product';
|
|
$sql.= ' WHERE fk_facture_fourn='.$this->id;
|
|
|
|
dolibarr_syslog("FactureFourn::fetch_lines sql=".$sql, LOG_DEBUG);
|
|
$resql_rows = $this->db->query($sql);
|
|
if ($resql_rows)
|
|
{
|
|
$num_rows = $this->db->num_rows($resql_rows);
|
|
if ($num_rows)
|
|
{
|
|
$i = 0;
|
|
while ($i < $num_rows)
|
|
{
|
|
$obj = $this->db->fetch_object($resql_rows);
|
|
$this->lignes[$i]->rowid = $obj->rowid;
|
|
$this->lignes[$i]->description = $obj->description;
|
|
$this->lignes[$i]->ref = $obj->ref; // Reference interne du produit
|
|
//$this->lignes[$i]->ref_fourn = $obj->ref_fourn; // Reference fournisseur du produit
|
|
$this->lignes[$i]->libelle = $obj->label; // Label du produit
|
|
$this->lignes[$i]->product_desc = $obj->product_desc; // Description du produit
|
|
$this->lignes[$i]->pu_ht = $obj->pu_ht;
|
|
$this->lignes[$i]->pu_ttc = $obj->pu_ttc;
|
|
$this->lignes[$i]->tva_taux = $obj->tva_taux;
|
|
$this->lignes[$i]->qty = $obj->qty;
|
|
$this->lignes[$i]->tva = $obj->tva;
|
|
$this->lignes[$i]->total_ht = $obj->total_ht;
|
|
$this->lignes[$i]->total_tva = $obj->total_tva;
|
|
$this->lignes[$i]->total_ttc = $obj->total_ttc;
|
|
$this->lignes[$i]->fk_product = $obj->fk_product;
|
|
$this->lignes[$i]->product_type = $obj->product_type;
|
|
$i++;
|
|
}
|
|
}
|
|
$this->db->free($resql_rows);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->error();
|
|
dolibarr_syslog('FactureFournisseur::fetch_lines: Error '.$this->error,LOG_ERR);
|
|
return -3;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Recupére l'objet fournisseur lié à la facture
|
|
*
|
|
*/
|
|
function fetch_fournisseur()
|
|
{
|
|
$fournisseur = new Fournisseur($this->db);
|
|
$fournisseur->fetch($this->socid);
|
|
$this->fournisseur = $fournisseur;
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime la facture
|
|
* \param rowid id de la facture à supprimer
|
|
*/
|
|
function delete($rowid)
|
|
{
|
|
$this->db->begin();
|
|
|
|
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn_det WHERE fk_facture_fourn = '.$rowid.';';
|
|
dolibarr_syslog("FactureFournisseur sql=".$sql);
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn WHERE rowid = '.$rowid.' AND fk_statut = 0';
|
|
dolibarr_syslog("FactureFournisseur sql=".$sql);
|
|
$resql2 = $this->db->query($sql);
|
|
if ($resql2)
|
|
{
|
|
$this->db->commit();
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
$this->db->rollback();
|
|
$this->error=$this->db->lasterror();
|
|
dolibarr_syslog("FactureFournisseur::delete ".$this->error);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->db->rollback();
|
|
$this->error=$this->db->lasterror();
|
|
dolibarr_syslog("FactureFournisseur::delete ".$this->error);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Tag la facture comme payée complètement
|
|
* \param user Objet utilisateur qui modifie l'état
|
|
* \return int <0 si ko, >0 si ok
|
|
*/
|
|
function set_payed($user)
|
|
{
|
|
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture_fourn';
|
|
$sql.= ' SET paye = 1';
|
|
$sql.= ' WHERE rowid = '.$this->id;
|
|
$resql = $this->db->query($sql);
|
|
if (! $resql)
|
|
{
|
|
$this->error=$this->db->error();
|
|
dolibarr_print_error($this->db);
|
|
return -1;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Tag la facture comme validée
|
|
* \param user Objet utilisateur qui valide la facture
|
|
* \return int <0 si ko, >0 si ok
|
|
*/
|
|
function set_valid($user)
|
|
{
|
|
global $conf,$langs;
|
|
|
|
$this->db->begin();
|
|
|
|
$sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn";
|
|
$sql.= " SET fk_statut = 1, fk_user_valid = ".$user->id;
|
|
$sql.= " WHERE rowid = ".$this->id;
|
|
|
|
dolibarr_syslog("FactureFournisseur::set_valid sql=".$sql,LOG_DEBUG);
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
// Appel des triggers
|
|
include_once(DOL_DOCUMENT_ROOT . "/interfaces.class.php");
|
|
$interface=new Interfaces($this->db);
|
|
$result=$interface->run_triggers('BILL_SUPPLIER_VALIDATE',$this,$user,$langs,$conf);
|
|
if ($result < 0) { $error++; $this->errors=$interface->errors; }
|
|
// Fin appel triggers
|
|
|
|
$this->db->commit();
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->error();
|
|
$this->db->rollback();
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Ajoute une ligne de facture (associé à aucun produit/service prédéfini)
|
|
* \param desc Description de la ligne
|
|
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
|
|
* \param txtva Taux de tva forcé, sinon -1
|
|
* \param qty Quantité
|
|
* \param fk_product Id du produit/service predéfini
|
|
* \param remise_percent Pourcentage de remise de la ligne
|
|
* \param date_start Date de debut de validité du service
|
|
* \param date_end Date de fin de validité du service
|
|
* \param ventil Code de ventilation comptable
|
|
* \param info_bits Bits de type de lignes
|
|
* \param price_base_type HT ou TTC
|
|
* \remarks Les parametres sont deja censé etre juste et avec valeurs finales a l'appel
|
|
* de cette methode. Aussi, pour le taux tva, il doit deja avoir ete défini
|
|
* par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,taux_produit)
|
|
* et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue)
|
|
*/
|
|
function addline($desc, $pu, $txtva, $qty, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits='', $price_base_type='HT')
|
|
{
|
|
dolibarr_syslog("FactureFourn::Addline $desc,$pu,$qty,$txtva,$fk_product,$remise_percent,$date_start,$date_end,$ventil,$info_bits", LOG_DEBUG);
|
|
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
|
|
|
|
$this->db->begin();
|
|
|
|
// Nettoyage paramètres
|
|
if ($txtva == '') $txtva=0;
|
|
$txtva=price2num($txtva);
|
|
|
|
|
|
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
|
|
$sql .= ' VALUES ('.$this->id.');';
|
|
dolibarr_syslog("Fournisseur.facture::addline sql=".$sql);
|
|
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$idligne = $this->db->last_insert_id(MAIN_DB_PREFIX.'facture_fourn_det');
|
|
|
|
$result=$this->updateline($idligne, $desc, $pu, $txtva, $qty, $fk_product, $price_base_type);
|
|
if ($result > 0)
|
|
{
|
|
$this->db->commit();
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->error();
|
|
dolibarr_syslog("Error sql=$sql, error=".$this->error);
|
|
$this->db->rollback();
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this->error=$ligne->error;
|
|
$this->db->rollback();
|
|
return -2;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Mets à jour une ligne de facture
|
|
* \param id Id de la ligne de facture
|
|
* \param label Description de la ligne
|
|
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
|
|
* \param tauxtva Taux tva
|
|
* \param qty Quantité
|
|
* \param idproduct Id produit
|
|
* \param price_base_type HT ou TTC
|
|
* \param info_bits Miscellanous informations of line
|
|
* \return int <0 si ko, >0 si ok
|
|
*/
|
|
function updateline($id, $label, $pu, $tauxtva, $qty=1, $idproduct=0, $price_base_type='HT', $info_bits=0)
|
|
{
|
|
include_once(DOL_DOCUMENT_ROOT.'/lib/price.lib.php');
|
|
|
|
$pu = price2num($pu);
|
|
$qty = price2num($qty);
|
|
|
|
// Validation
|
|
if (! is_numeric($pu) || ! is_numeric($qty)) return -1;
|
|
|
|
// Calcul du total TTC et de la TVA pour la ligne a partir de
|
|
// qty, pu, remise_percent et txtva
|
|
// TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker
|
|
// la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva.
|
|
$tabprice = calcul_price_total($qty, $pu, 0, $tauxtva, 0, $price_base_type, $info_bits);
|
|
$total_ht = $tabprice[0];
|
|
$total_tva = $tabprice[1];
|
|
$total_ttc = $tabprice[2];
|
|
$pu_ht = $tabprice[3];
|
|
$pu_tva = $tabprice[4];
|
|
$pu_ttc = $tabprice[5];
|
|
$product_type = 0;
|
|
if ($idproduct)
|
|
{
|
|
$product=new Product($this->db);
|
|
$result=$product->fetch($idproduct);
|
|
$product_type=$product->type;
|
|
}
|
|
|
|
$sql = 'UPDATE '.MAIN_DB_PREFIX.'facture_fourn_det ';
|
|
$sql.= 'SET ';
|
|
$sql.= 'description =\''.addslashes($label).'\'';
|
|
$sql.= ', pu_ht = ' .price2num($pu_ht);
|
|
$sql.= ', pu_ttc= ' .price2num($pu_ttc);
|
|
$sql.= ', qty =' .price2num($qty);
|
|
$sql.= ', tva_taux=' .price2num($tauxtva);
|
|
$sql.= ', total_ht=' .price2num($total_ht);
|
|
$sql.= ', tva=' .price2num($total_tva);
|
|
$sql.= ', total_ttc='.price2num($total_ttc);
|
|
if ($idproduct) $sql.= ', fk_product='.$idproduct;
|
|
else $sql.= ', fk_product=null';
|
|
$sql.= ', product_type='.$product_type;
|
|
$sql.= ' WHERE rowid = '.$id;
|
|
|
|
dolibarr_syslog("Fournisseur.facture::updateline sql=".$sql);
|
|
$resql=$this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
// Mise a jour prix total facture
|
|
return $this->update_price();
|
|
}
|
|
else
|
|
{
|
|
$this->error=$this->db->error();
|
|
dolibarr_syslog("Fournisseur.facture::updateline error=".$this->error);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime une ligne facture de la base
|
|
* \param rowid id de la ligne de facture a supprimer
|
|
*/
|
|
function deleteline($rowid)
|
|
{
|
|
// Supprime ligne
|
|
$sql = 'DELETE FROM '.MAIN_DB_PREFIX.'facture_fourn_det ';
|
|
$sql .= ' WHERE rowid = '.$rowid.';';
|
|
$resql = $this->db->query($sql);
|
|
if (! $resql)
|
|
{
|
|
dolibarr_print_error($this->db);
|
|
}
|
|
// Mise a jour prix facture
|
|
$this->update_price();
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Charge les informations d'ordre info dans l'objet facture
|
|
* \param id Id de la facture a charger
|
|
*/
|
|
function info($id)
|
|
{
|
|
$sql = 'SELECT c.rowid, '.$this->db->pdate('datec').' as datec';
|
|
$sql .= ', fk_user_author, fk_user_valid';
|
|
$sql .= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as c';
|
|
$sql .= ' WHERE c.rowid = '.$id;
|
|
|
|
$result=$this->db->query($sql);
|
|
if ($result)
|
|
{
|
|
if ($this->db->num_rows($result))
|
|
{
|
|
$obj = $this->db->fetch_object($result);
|
|
$this->id = $obj->rowid;
|
|
if ($obj->fk_user_author)
|
|
{
|
|
$cuser = new User($this->db, $obj->fk_user_author);
|
|
$cuser->fetch();
|
|
$this->user_creation = $cuser;
|
|
}
|
|
if ($obj->fk_user_valid)
|
|
{
|
|
$vuser = new User($this->db, $obj->fk_user_valid);
|
|
$vuser->fetch();
|
|
$this->user_validation = $vuser;
|
|
}
|
|
$this->date_creation = $obj->datec;
|
|
//$this->date_validation = $obj->datev; \todo La date de validation n'est pas encore gérée
|
|
}
|
|
$this->db->free($result);
|
|
}
|
|
else
|
|
{
|
|
dolibarr_print_error($this->db);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Charge indicateurs this->nbtodo et this->nbtodolate de tableau de bord
|
|
* \param user Objet user
|
|
* \return int <0 si ko, >0 si ok
|
|
*/
|
|
function load_board($user)
|
|
{
|
|
global $conf, $user;
|
|
|
|
$this->nbtodo=$this->nbtodolate=0;
|
|
$sql = 'SELECT ff.rowid,'.$this->db->pdate('ff.date_lim_reglement').' as datefin';
|
|
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= ", sc.fk_soc, sc.fk_user";
|
|
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as ff';
|
|
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc";
|
|
$sql.= ' WHERE ff.paye=0 AND ff.fk_statut > 0';
|
|
if ($user->societe_id) $sql.=' AND ff.fk_soc = '.$user->societe_id;
|
|
if (!$user->rights->societe->client->voir && !$user->societe_id) $sql .= " AND ff.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id;
|
|
$resql=$this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
while ($obj=$this->db->fetch_object($resql))
|
|
{
|
|
$this->nbtodo++;
|
|
if ($obj->datefin < (time() - $conf->facture->fournisseur->warning_delay)) $this->nbtodolate++;
|
|
}
|
|
$this->db->free($resql);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
dolibarr_print_error($this->db);
|
|
$this->error=$this->db->error();
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Renvoie nom clicable (avec eventuellement le picto)
|
|
* \param withpicto 0=Pas de picto, 1=Inclut le picto dans le lien, 2=Picto seul
|
|
* \param option Sur quoi pointe le lien
|
|
* \return string Chaine avec URL
|
|
*/
|
|
function getNomUrl($withpicto=0,$option='')
|
|
{
|
|
global $langs;
|
|
|
|
$result='';
|
|
|
|
$lien = '<a href="'.DOL_URL_ROOT.'/fourn/facture/fiche.php?facid='.$this->id.'">';
|
|
$lienfin='</a>';
|
|
|
|
if ($withpicto) $result.=($lien.img_object($langs->trans("ShowInvoice"),'bill').$lienfin.' ');
|
|
$result.=$lien.$this->ref.$lienfin;
|
|
return $result;
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Initialise la facture avec valeurs fictives aléatoire
|
|
* Sert à générer une facture pour l'aperu des modèles ou demo
|
|
*/
|
|
function initAsSpecimen()
|
|
{
|
|
global $user,$langs;
|
|
|
|
// Charge tableau des id de société socids
|
|
$socids = array();
|
|
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."societe WHERE fournisseur=1 LIMIT 10";
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$num_socs = $this->db->num_rows($resql);
|
|
$i = 0;
|
|
while ($i < $num_socs)
|
|
{
|
|
$i++;
|
|
|
|
$row = $this->db->fetch_row($resql);
|
|
$socids[$i] = $row[0];
|
|
}
|
|
}
|
|
|
|
// Charge tableau des produits prodids
|
|
$prodids = array();
|
|
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."product WHERE envente=1";
|
|
$resql = $this->db->query($sql);
|
|
if ($resql)
|
|
{
|
|
$num_prods = $this->db->num_rows($resql);
|
|
$i = 0;
|
|
while ($i < $num_prods)
|
|
{
|
|
$i++;
|
|
$row = $this->db->fetch_row($resql);
|
|
$prodids[$i] = $row[0];
|
|
}
|
|
}
|
|
|
|
// Initialise paramètres
|
|
$this->id=0;
|
|
$this->ref = 'SPECIMEN';
|
|
$this->specimen=1;
|
|
$socid = rand(1, $num_socs);
|
|
$this->socid = $socids[$socid];
|
|
$this->date = time();
|
|
$this->date_lim_reglement=$this->date+3600*24*30;
|
|
$this->cond_reglement_code = 'RECEP';
|
|
$this->mode_reglement_code = 'CHQ';
|
|
$this->note_public='SPECIMEN';
|
|
$nbp = 5;
|
|
$xnbp = 0;
|
|
while ($xnbp < $nbp)
|
|
{
|
|
$ligne=new FactureLigne($this->db);
|
|
$ligne->desc=$langs->trans("Description")." ".$xnbp;
|
|
$ligne->qty=1;
|
|
$ligne->subprice=100;
|
|
$ligne->price=100;
|
|
$ligne->tva_tx=19.6;
|
|
$prodid = rand(1, $num_prods);
|
|
$ligne->produit_id=$prodids[$prodid];
|
|
$this->lignes[$xnbp]=$ligne;
|
|
$xnbp++;
|
|
}
|
|
|
|
$this->amount_ht = $xnbp*100;
|
|
$this->total_ht = $xnbp*100;
|
|
$this->total_tva = $xnbp*19.6;
|
|
$this->total_ttc = $xnbp*119.6;
|
|
}
|
|
}
|
|
?>
|