770 lines
23 KiB
PHP
770 lines
23 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=draft,
|
||
//! 1=validated,
|
||
//! TODO Ce statut doit etre 2 et non 1 classee payee partiellement (close_code='discount_vat','badcustomer') ou completement (close_code=null),
|
||
//! TODO Ce statut doit etre 2 et non 1 classee abandonnee et aucun paiement n'a eu lieu (close_code='badcustomer','abandon' ou 'replaced')
|
||
var $statut;
|
||
//! 1 si facture payee 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 Database access handler
|
||
* \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 Creation de la facture en base
|
||
* \param user object utilisateur qui cree
|
||
* \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);
|
||
}
|
||
}
|
||
// Update total price
|
||
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<75>re l'objet facture et ses lignes de factures
|
||
* \param rowid id de la facture a r<>cup<75>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<75>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<75>re l'objet fournisseur li<6C> <20> 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 <20> 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<61>e compl<70>tement
|
||
* \param user Objet utilisateur qui modifie l'<27>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 Set invoice status as validate
|
||
* \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)
|
||
{
|
||
$result=0;
|
||
|
||
// Si activé on décrémente le produit principal et ses composants à la validation de facture
|
||
if ($result >= 0 && $conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SUPPLIER_BILL)
|
||
{
|
||
require_once(DOL_DOCUMENT_ROOT."/product/stock/mouvementstock.class.php");
|
||
|
||
for ($i = 0 ; $i < sizeof($this->lignes) ; $i++)
|
||
{
|
||
if ($this->lignes[$i]->fk_product && $this->lignes[$i]->product_type == 0)
|
||
{
|
||
$mouvP = new MouvementStock($this->db);
|
||
// We increase stock for product
|
||
$entrepot_id = "1"; // TODO ajouter possibilité de choisir l'entrepot
|
||
$result=$mouvP->reception($user, $this->lignes[$i]->fk_product, $entrepot_id, $this->lignes[$i]->qty);
|
||
}
|
||
}
|
||
}
|
||
|
||
if ($result > 0)
|
||
{
|
||
// 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->db->rollback();
|
||
return -1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$this->error=$this->db->error();
|
||
$this->db->rollback();
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* \brief Ajoute une ligne de facture (associ<63> <20> aucun produit/service pr<70>d<EFBFBD>fini)
|
||
* \param desc Description de la ligne
|
||
* \param pu Prix unitaire (HT ou TTC selon price_base_type)
|
||
* \param txtva Taux de tva forc<72>, sinon -1
|
||
* \param qty Quantit<69>
|
||
* \param fk_product Id du produit/service pred<65>fini
|
||
* \param remise_percent Pourcentage de remise de la ligne
|
||
* \param date_start Date de debut de validit<69> du service
|
||
* \param date_end Date de fin de validit<69> 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<6E> 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<61>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 <20> 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<69>
|
||
* \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<EFBFBD>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<61>atoire
|
||
* Sert <20> g<>n<EFBFBD>rer une facture pour l'aperu des mod<6F>les ou demo
|
||
*/
|
||
function initAsSpecimen()
|
||
{
|
||
global $user,$langs;
|
||
|
||
// Charge tableau des id de soci<63>t<EFBFBD> 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<61>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;
|
||
}
|
||
}
|
||
?>
|