2004-10-20 23:06:45 +02:00
< ? php
2005-03-15 21:25:19 +01:00
/* Copyright ( C ) 2002 - 2005 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2005-01-08 01:50:59 +01:00
* Copyright ( C ) 2004 - 2005 Laurent Destailleur < eldy @ users . sourceforge . net >
2004-09-10 11:12:00 +02:00
* Copyright ( C ) 2004 Sebastien Di Cintio < sdicintio @ ressource - toi . org >
2005-01-08 01:50:59 +01:00
* Copyright ( C ) 2004 Benoit Mortier < benoit . mortier @ opensides . be >
2002-09-25 20:36:27 +02:00
*
* 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 .
*
* $Id $
* $Source $
*
*/
2005-01-08 01:50:59 +01:00
/**
2005-04-09 16:11:36 +02:00
\file htdocs / facture . class . php
\ingroup facture
\brief Fichier de la classe des factures clients
\version $Revision $
2004-08-07 17:35:08 +02:00
*/
2005-06-26 00:54:02 +02:00
require_once ( DOL_DOCUMENT_ROOT . " /notify.class.php " );
2004-08-07 17:35:08 +02:00
2005-04-09 16:11:36 +02:00
/**
\class Facture
\brief Classe permettant la gestion des factures clients
2004-08-07 17:35:08 +02:00
*/
2004-05-17 21:53:34 +02:00
2003-06-27 18:12:36 +02:00
class Facture
{
2005-04-27 02:32:23 +02:00
var $id ;
var $db ;
var $socidp ;
var $number ;
var $author ;
var $date ;
var $ref ;
var $amount ;
var $remise ;
var $tva ;
var $total ;
var $note ;
var $paye ;
var $propalid ;
var $projetid ;
var $prefixe_facture ;
/**
* \brief Constructeur de la classe
* \param DB handler acc<EFBFBD> s base de donn<EFBFBD> es
* \param soc_idp id societe ( " " par defaut )
* \param facid id facture ( " " par defaut )
*/
function Facture ( $DB , $soc_idp = " " , $facid = " " )
2003-06-21 17:22:27 +02:00
{
2005-04-27 02:32:23 +02:00
$this -> db = $DB ;
$this -> socidp = $soc_idp ;
$this -> products = array (); // Tableau de lignes de factures
$this -> amount = 0 ;
$this -> remise = 0 ;
$this -> remise_percent = 0 ;
$this -> tva = 0 ;
$this -> total = 0 ;
$this -> propalid = 0 ;
$this -> projetid = 0 ;
$this -> id = $facid ;
$this -> prefixe_facture = '' ; // utilis<69> dans le module de num<75> rotation saturne
$this -> remise_exceptionnelle = 0 ;
}
/**
* \brief Cr<EFBFBD> ation de la facture en base
* \param user object utilisateur qui cr<EFBFBD> e
*/
function create ( $user )
2003-06-22 11:57:42 +02:00
{
2005-04-27 02:32:23 +02:00
$this -> db -> begin ();
/* On positionne en mode brouillon la facture */
$this -> brouillon = 1 ;
/* Facture r<> currente */
if ( $this -> fac_rec > 0 )
{
require_once DOL_DOCUMENT_ROOT . '/compta/facture/facture-rec.class.php' ;
$_facrec = new FactureRec ( $this -> db , $this -> fac_rec );
$_facrec -> fetch ( $this -> fac_rec );
$this -> projetid = $_facrec -> projetid ;
$this -> cond_reglement = $_facrec -> cond_reglement_id ;
$this -> amount = $_facrec -> amount ;
$this -> remise = $_facrec -> remise ;
$this -> remise_percent = $_facrec -> remise_percent ;
}
$sql = " SELECT fdm,nbjour FROM " . MAIN_DB_PREFIX . " cond_reglement WHERE rowid = $this->cond_reglement " ;
if ( $this -> db -> query ( $sql ))
{
if ( $this -> db -> num_rows ())
{
$obj = $this -> db -> fetch_object ();
$cdr_nbjour = $obj -> nbjour ;
$cdr_fdm = $obj -> fdm ;
}
$this -> db -> free ();
}
2005-06-18 16:31:03 +02:00
// Definition de la date limite
$datelim = $this -> date + ( $cdr_nbjour * 3600 * 24 );
2005-04-27 02:32:23 +02:00
if ( $cdr_fdm )
{
$mois = date ( 'm' , $datelim );
$annee = date ( 'Y' , $datelim );
$fins = array ( 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 );
$datelim = mktime ( 0 , 0 , 0 , $mois , $fins [ $mois - 1 ], $annee );
}
/*
2005-06-18 16:31:03 +02:00
* Insertion dans la base
*/
2005-04-27 02:32:23 +02:00
$socid = $this -> socidp ;
$number = $this -> number ;
$amount = $this -> amount ;
$remise = $this -> remise ;
if ( ! $remise ) $remise = 0 ;
if ( strlen ( $this -> mode_reglement ) == 0 ) $this -> mode_reglement = 0 ;
if ( ! $this -> projetid ) $this -> projetid = " NULL " ;
$totalht = ( $amount - $remise );
$tva = tva ( $totalht );
$total = $totalht + $tva ;
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " facture (facnumber, fk_soc, datec, amount, remise, remise_percent " ;
$sql .= " , datef, note, fk_user_author,fk_projet " ;
$sql .= " , fk_cond_reglement, fk_mode_reglement, date_lim_reglement) " ;
$sql .= " VALUES (' $number ',' $socid ', now(), ' $totalht ', ' $remise ' " ;
$sql .= " ,' $this->remise_percent ', " . $this -> db -> idate ( $this -> date );
$sql .= " ,' " . addslashes ( $this -> note ) . " ', $user->id , $this->projetid " ;
$sql .= " , " . $this -> cond_reglement . " , " . $this -> mode_reglement . " , " . $this -> db -> idate ( $datelim ) . " ) " ;
if ( $this -> db -> query ( $sql ) )
{
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " facture " );
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture SET facnumber='(PROV " . $this -> id . " )' WHERE rowid= " . $this -> id ;
$this -> db -> query ( $sql );
if ( $this -> id && $this -> propalid )
{
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " fa_pr (fk_facture, fk_propal) VALUES ( " . $this -> id . " , " . $this -> propalid . " ) " ;
$this -> db -> query ( $sql );
}
if ( $this -> id && $this -> commandeid )
{
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " co_fa (fk_facture, fk_commande) VALUES ( " . $this -> id . " , " . $this -> commandeid . " ) " ;
$this -> db -> query ( $sql );
}
/*
* Produits / services
*
*/
for ( $i = 0 ; $i < sizeof ( $this -> products ) ; $i ++ )
{
$prod = new Product ( $this -> db , $this -> products [ $i ]);
$prod -> fetch ( $this -> products [ $i ]);
$result_insert = $this -> addline ( $this -> id ,
$prod -> libelle ,
$prod -> price ,
$this -> products_qty [ $i ],
$prod -> tva_tx ,
$this -> products [ $i ],
$this -> products_remise_percent [ $i ],
$this -> products_date_start [ $i ],
$this -> products_date_end [ $i ]
);
if ( $result_insert < 0 )
{
dolibarr_print_error ( $this -> db );
}
}
2005-04-22 17:14:42 +02:00
2005-04-27 02:32:23 +02:00
/*
* Produits de la facture r<EFBFBD> currente
*
*/
if ( $this -> fac_rec > 0 )
{
for ( $i = 0 ; $i < sizeof ( $_facrec -> lignes ) ; $i ++ )
{
if ( $_facrec -> lignes [ $i ] -> produit_id )
{
$prod = new Product ( $this -> db , $_facrec -> lignes [ $i ] -> produit_id );
$prod -> fetch ( $_facrec -> lignes [ $i ] -> produit_id );
}
$result_insert = $this -> addline ( $this -> id ,
addslashes ( $_facrec -> lignes [ $i ] -> desc ),
$_facrec -> lignes [ $i ] -> subprice ,
$_facrec -> lignes [ $i ] -> qty ,
$_facrec -> lignes [ $i ] -> tva_taux ,
$_facrec -> lignes [ $i ] -> produit_id ,
$_facrec -> lignes [ $i ] -> remise_percent );
if ( $result_insert < 0 )
{
dolibarr_print_error ( $this -> db );
}
}
}
$this -> updateprice ( $this -> id );
$this -> db -> commit ();
return $this -> id ;
}
else
{
$this -> db -> rollback ();
dolibarr_print_error ( $this -> db );
}
}
/*
* \brief Affecte la remise exceptionnelle
*/
function _affect_remise_exceptionnelle ()
{
$error = 0 ;
2005-08-20 17:37:16 +02:00
$this -> db -> begin ();
2005-04-27 02:32:23 +02:00
if ( $this -> remise_exceptionnelle [ 1 ] > 0 )
{
2005-08-20 17:37:16 +02:00
// Calcul valeur de remise a appliquer (remise) et reliquat
2005-04-27 02:32:23 +02:00
if ( $this -> remise_exceptionnelle [ 1 ] > ( $this -> total_ht * 0.9 ))
{
$remise = floor ( $this -> total_ht * 0.9 );
$reliquat = $this -> remise_exceptionnelle [ 1 ] - $remise ;
2005-08-20 17:37:16 +02:00
}
else
{
$remise = $this -> remise_exceptionnelle [ 1 ];
$reliquat = 0 ;
}
2005-04-27 02:32:23 +02:00
2005-08-20 17:37:16 +02:00
$result_insert = $this -> addline ( $this -> id ,
addslashes ( " Remise exceptionnelle " ),
( 0 - $remise ),
1 ,
'0' ); // Une remise est un n<> gatif sur le TTC, on ne doit pas appliquer de TVA,
// sinon on impute une TVA n<> gative.
if ( $result_insert < 0 )
{
$error ++ ;
}
2005-04-27 02:32:23 +02:00
2005-08-20 17:37:16 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " societe_remise_except " ;
$sql .= " SET fk_facture = " . $this -> id ;
$sql .= " ,amount_ht = ' " . ereg_replace ( " , " , " . " , $remise ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> remise_exceptionnelle [ 0 ];
$sql .= " AND fk_soc = " . $this -> socidp ;
2005-04-27 02:32:23 +02:00
2005-08-20 17:37:16 +02:00
if ( ! $this -> db -> query ( $sql ))
{
$error ++ ;
}
2005-04-27 02:32:23 +02:00
2005-08-20 17:37:16 +02:00
if ( $reliquat > 0 )
{
2005-04-27 02:32:23 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " societe_remise_except " ;
$sql .= " (fk_soc, datec, amount_ht, fk_user) " ;
$sql .= " VALUES " ;
$sql .= " ( " . $this -> socidp ;
$sql .= " ,now() " ;
$sql .= " ,' " . ereg_replace ( " , " , " . " , $reliquat ) . " ' " ;
$sql .= " , " . $this -> remise_exceptionnelle [ 3 ];
$sql .= " ) " ;
if ( ! $this -> db -> query ( $sql ) )
{
$error ++ ;
}
}
2005-08-20 17:37:16 +02:00
}
2005-04-27 02:32:23 +02:00
2005-08-20 17:37:16 +02:00
if ( ! $error )
{
$this -> db -> commit ();
}
else
{
$this -> db -> rollback ();
2005-04-27 02:32:23 +02:00
}
return $error ;
2003-06-22 11:57:42 +02:00
}
2002-09-25 20:36:27 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Recup<EFBFBD> re l ' objet facture et ses lignes de factures
* \param rowid id de la facture a r<EFBFBD> cup<EFBFBD> rer
* \param societe_id id de societe
* \return int 1 si ok , < 0 si erreur
*/
function fetch ( $rowid , $societe_id = 0 )
2003-02-01 20:45:45 +01:00
{
2005-04-27 02:32:23 +02:00
//dolibarr_syslog("Facture::Fetch rowid : $rowid, societe_id : $societe_id");
$sql = " SELECT f.fk_soc,f.facnumber,f.amount,f.tva,f.total,f.total_ttc,f.remise,f.remise_percent " ;
$sql .= " , " . $this -> db -> pdate ( " f.datef " ) . " as df,f.fk_projet " ;
$sql .= " , " . $this -> db -> pdate ( " f.date_lim_reglement " ) . " as dlr " ;
$sql .= " , c.rowid as cond_regl_id, c.libelle, c.libelle_facture " ;
$sql .= " , f.note, f.paye, f.fk_statut, f.fk_user_author " ;
$sql .= " , f.fk_mode_reglement " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " facture as f, " . MAIN_DB_PREFIX . " cond_reglement as c " ;
$sql .= " WHERE f.rowid= $rowid AND c.rowid = f.fk_cond_reglement " ;
if ( $societe_id > 0 )
{
$sql .= " AND f.fk_soc = " . $societe_id ;
}
$result = $this -> db -> query ( $sql );
if ( $result )
{
if ( $this -> db -> num_rows ( $result ))
{
$obj = $this -> db -> fetch_object ( $result );
$this -> id = $rowid ;
$this -> datep = $obj -> dp ;
$this -> date = $obj -> df ;
$this -> ref = $obj -> facnumber ;
$this -> amount = $obj -> amount ;
$this -> remise = $obj -> remise ;
$this -> total_ht = $obj -> total ;
$this -> total_tva = $obj -> tva ;
$this -> total_ttc = $obj -> total_ttc ;
$this -> paye = $obj -> paye ;
$this -> remise_percent = $obj -> remise_percent ;
$this -> socidp = $obj -> fk_soc ;
$this -> statut = $obj -> fk_statut ;
$this -> date_lim_reglement = $obj -> dlr ;
$this -> cond_reglement_id = $obj -> cond_regl_id ;
$this -> cond_reglement = $obj -> libelle ;
$this -> cond_reglement_facture = $obj -> libelle_facture ;
$this -> projetid = $obj -> fk_projet ;
$this -> note = stripslashes ( $obj -> note );
$this -> user_author = $obj -> fk_user_author ;
$this -> lignes = array ();
$this -> mode_reglement = $obj -> fk_mode_reglement ;
if ( $this -> statut == 0 )
{
$this -> brouillon = 1 ;
}
/*
2005-08-14 03:06:45 +02:00
* Lignes
*/
2005-04-27 02:32:23 +02:00
2005-08-14 03:06:45 +02:00
$sql = " SELECT l.fk_product, l.description, l.price, l.qty, l.rowid, l.tva_taux, l.remise, l.remise_percent, l.subprice, " . $this -> db -> pdate ( " l.date_start " ) . " as date_start, " . $this -> db -> pdate ( " l.date_end " ) . " as date_end, " ;
$sql .= " p.label as label, p.description as product_desc " ;
2005-04-27 02:32:23 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " facturedet as l " ;
2005-08-14 03:06:45 +02:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p ON l.fk_product = p.rowid " ;
2005-04-27 02:32:23 +02:00
$sql .= " WHERE l.fk_facture = " . $this -> id ;
$sql .= " ORDER BY l.rang " ;
$result2 = $this -> db -> query ( $sql );
if ( $result2 )
{
$num = $this -> db -> num_rows ( $result2 );
$i = 0 ; $total = 0 ;
while ( $i < $num )
{
$objp = $this -> db -> fetch_object ( $result2 );
$faclig = new FactureLigne ( $this -> db );
2005-08-14 03:06:45 +02:00
$faclig -> desc = stripslashes ( $objp -> description ); // Description ligne
$faclig -> libelle = stripslashes ( $objp -> label ); // Label produit
$faclig -> product_desc = stripslashes ( $objp -> product_desc ); // Description produit
2005-04-27 02:32:23 +02:00
$faclig -> qty = $objp -> qty ;
$faclig -> price = $objp -> price ;
$faclig -> subprice = $objp -> subprice ;
$faclig -> tva_taux = $objp -> tva_taux ;
$faclig -> remise = $objp -> remise ;
$faclig -> remise_percent = $objp -> remise_percent ;
$faclig -> produit_id = $objp -> fk_product ;
$faclig -> date_start = $objp -> date_start ;
$faclig -> date_end = $objp -> date_end ;
$this -> lignes [ $i ] = $faclig ;
$i ++ ;
}
$this -> db -> free ( $result2 );
2005-08-14 03:06:45 +02:00
$this -> db -> free ( $result );
2005-04-27 02:32:23 +02:00
return 1 ;
}
else
{
dolibarr_syslog ( " Erreur Facture::Fetch rowid= $rowid , Erreur dans fetch des lignes " );
2005-08-14 03:06:45 +02:00
$this -> error = $this -> db -> error ();
2005-04-27 02:32:23 +02:00
return - 3 ;
}
}
else
{
dolibarr_syslog ( " Erreur Facture::Fetch rowid= $rowid numrows=0 sql= $sql " );
$this -> error = " Bill with id $rowid not found sql= $sql " ;
return - 2 ;
}
$this -> db -> free ( $result );
}
else
{
dolibarr_syslog ( " Erreur Facture::Fetch rowid= $rowid Erreur dans fetch de la facture " );
return - 1 ;
}
}
/**
* \brief Recup<EFBFBD> re l ' objet client li<EFBFBD> <EFBFBD> la facture
*
*/
function fetch_client ()
2003-04-13 16:47:05 +02:00
{
2005-04-27 02:32:23 +02:00
$client = new Societe ( $this -> db );
$client -> fetch ( $this -> socidp );
$this -> client = $client ;
}
/**
* \brief Valide la facture
* \param userid id de l ' utilisateur qui valide
*/
function valid ( $userid )
{
$error = 0 ;
if ( $this -> db -> begin ())
{
/*
* Lecture de la remise exceptionnelle
*
*/
$sql = " SELECT rowid, rc.amount_ht, fk_soc, fk_user " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " societe_remise_except as rc " ;
$sql .= " WHERE rc.fk_soc = " . $this -> socidp ;
$sql .= " AND fk_facture IS NULL " ;
$resql = $this -> db -> query ( $sql ) ;
if ( $resql )
{
$nurmx = $this -> db -> num_rows ( $resql );
if ( $nurmx > 0 )
{
$row = $this -> db -> fetch_row ( $resql );
$this -> remise_exceptionnelle = $row ;
}
$this -> db -> free ( $resql );
}
else
{
dolibarr_syslog ( " Facture::Valide Erreur lecture Remise " );
$error ++ ;
}
/*
* Affectation de la remise exceptionnelle
*/
if ( $this -> _affect_remise_exceptionnelle () <> 0 )
{
$error ++ ;
}
else
{
$this -> updateprice ( $this -> id );
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture SET fk_statut = 1, date_valid=now(), fk_user_valid= $userid " ;
$sql .= " WHERE rowid = " . $this -> id . " AND fk_statut = 0 ; " ;
if ( ! $this -> db -> query ( $sql ) )
{
$error ++ ;
dolibarr_syslog ( " Facture::Valide Erreur " );
}
}
if ( $error == 0 )
{
$this -> db -> commit ();
}
else
{
$this -> db -> rollback ();
}
}
else
{
$error ++ ;
}
if ( $error > 0 )
{
return 0 ;
}
else
{
return 1 ;
}
2003-04-13 16:47:05 +02:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
2005-07-16 01:28:38 +02:00
* \brief Classe la facture dans un projet
* \param projid Id du projet dans lequel classer la facture
*/
function classin ( $projid )
2003-02-01 20:45:45 +01:00
{
2005-07-16 01:28:38 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture " ;
if ( $projid ) $sql .= " SET fk_projet = $projid " ;
else $sql .= " SET fk_projet = NULL " ;
$sql .= " WHERE rowid = " . $this -> id ;
2005-04-27 02:32:23 +02:00
2005-07-16 01:28:38 +02:00
if ( $this -> db -> query ( $sql ))
2005-04-27 02:32:23 +02:00
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
2005-07-16 01:28:38 +02:00
return - 1 ;
2005-04-27 02:32:23 +02:00
}
2003-10-22 17:39:28 +02:00
}
2004-08-29 14:24:55 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Supprime la facture
* \param rowid id de la facture <EFBFBD> supprimer
*/
function delete ( $rowid )
2003-10-22 17:39:28 +02:00
{
2005-04-27 02:32:23 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " facture_tva_sum WHERE fk_facture = $rowid ; " ;
if ( $this -> db -> query ( $sql ) )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " fa_pr WHERE fk_facture = $rowid ; " ;
if ( $this -> db -> query ( $sql ) )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " co_fa WHERE fk_facture = $rowid ; " ;
if ( $this -> db -> query ( $sql ) )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " facturedet WHERE fk_facture = $rowid ; " ;
if ( $this -> db -> query ( $sql ) )
{
/*
* On repositionne la remise
*/
$sql = " UPDATE " . MAIN_DB_PREFIX . " societe_remise_except " ;
$sql .= " SET fk_facture = NULL WHERE fk_facture = $rowid " ;
if ( $this -> db -> query ( $sql ) )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " facture WHERE rowid = $rowid AND fk_statut = 0; " ;
$this -> db -> query ( $sql ) ;
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
2002-09-25 20:36:27 +02:00
}
2005-04-27 02:32:23 +02:00
/**
* \brief Tag la facture comme pay<EFBFBD> e compl<EFBFBD> tement
* \param rowid id de la facture <EFBFBD> modifier
*/
function set_payed ( $rowid )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture set paye=1 WHERE rowid = " . $rowid ;
$return = $this -> db -> query ( $sql );
}
/**
* \brief Tag la facture comme pay<EFBFBD> e compl<EFBFBD> tement
* \param rowid id de la facture <EFBFBD> modifier
*/
function set_unpayed ( $rowid )
2002-12-14 17:25:46 +01:00
{
2005-04-27 02:32:23 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture set paye=0 WHERE rowid = " . $rowid ;
$return = $this -> db -> query ( $sql );
}
/**
* \brief Tag la facture comme paiement commenc<EFBFBD> e
* \param rowid id de la facture <EFBFBD> modifier
*/
function set_paiement_started ( $rowid )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture set fk_statut=2 WHERE rowid = $rowid ; " ;
$return = $this -> db -> query ( $sql );
2002-12-14 17:25:46 +01:00
}
2004-03-24 15:09:33 +01:00
2005-04-27 02:32:23 +02:00
/**
* \brief Tag la facture comme abandonn<EFBFBD> e
* \param rowid id de la facture <EFBFBD> modifier
*/
function set_canceled ( $rowid )
2002-12-14 17:25:46 +01:00
{
2005-04-27 02:32:23 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture set fk_statut=3 WHERE rowid = $rowid ; " ;
$return = $this -> db -> query ( $sql );
2005-01-18 14:49:23 +01:00
}
2005-04-27 02:32:23 +02:00
/**
* \brief Tag la facture comme valid<EFBFBD> e et valide la facture
* \param rowid id de la facture <EFBFBD> valider
* \param user utilisateur qui valide la facture
* \param soc societe
* \param force_number force le num<EFBFBD> ro de facture
*/
function set_valid ( $rowid , $user , $soc , $force_number = '' )
2005-01-18 14:49:23 +01:00
{
2005-04-27 02:32:23 +02:00
global $conf ;
$error = 0 ;
if ( $this -> brouillon )
{
$action_notify = 2 ; // ne pas modifier cette valeur
if ( $force_number )
{
$numfa = $force_number ;
}
else
{
$numfa = facture_get_num ( $soc , $this -> prefixe_facture ); // d<> finit dans includes/modules/facture
}
if ( $this -> db -> begin ())
{
/*
* Lecture de la remise exceptionnelle
*
*/
$sql = " SELECT rowid, rc.amount_ht, fk_soc, fk_user " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " societe_remise_except as rc " ;
$sql .= " WHERE rc.fk_soc = " . $this -> socidp ;
$sql .= " AND fk_facture IS NULL " ;
$resql = $this -> db -> query ( $sql ) ;
if ( $resql )
{
$nurmx = $this -> db -> num_rows ( $resql );
if ( $nurmx > 0 )
{
$row = $this -> db -> fetch_row ( $resql );
$this -> remise_exceptionnelle = $row ;
}
$this -> db -> free ( $resql );
}
else
{
dolibarr_syslog ( " Facture::Valide Erreur lecture Remise " );
$error ++ ;
}
/* Affectation de la remise exceptionnelle */
if ( $this -> _affect_remise_exceptionnelle () <> 0 )
{
$error ++ ;
}
else
{
$this -> updateprice ( $this -> id );
}
/* Validation de la facture */
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture " ;
$sql .= " SET facnumber=' $numfa ', fk_statut = 1, fk_user_valid = $user->id " ;
/* Si l'option est activ<69> e on force la date de facture */
if ( defined ( " FAC_FORCE_DATE_VALIDATION " ) && FAC_FORCE_DATE_VALIDATION == " 1 " )
{
$sql .= " , datef=now() " ;
2005-08-16 16:04:36 +02:00
// du coup, il faut aussi recalculer la date limite de r<> glement
$sqltemp = " SELECT c.fdm,c.nbjour,c.rowid,f.fk_cond_reglement,f.rowid FROM " . MAIN_DB_PREFIX . " cond_reglement as c, " . MAIN_DB_PREFIX . " facture as f WHERE c.rowid=f.fk_cond_reglement AND f.rowid= $this->id " ;
if ( $this -> db -> query ( $sqltemp ))
{
if ( $this -> db -> num_rows ())
{
$obj = $this -> db -> fetch_object ();
print_r ( $obj );
$cdr_nbjour = $obj -> nbjour ;
$cdr_fdm = $obj -> fdm ;
}
}
$this -> db -> free ();
// Definition de la date limite
$datelim = time () + ( $cdr_nbjour * 3600 * 24 );
if ( $cdr_fdm )
{
$mois = date ( 'm' , $datelim );
$annee = date ( 'Y' , $datelim );
$fins = array ( 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 );
$datelim = mktime ( 0 , 0 , 0 , $mois , $fins [ $mois - 1 ], $annee );
}
$sql .= " , date_lim_reglement= " . $this -> db -> idate ( $datelim );
2005-04-27 02:32:23 +02:00
}
$sql .= " WHERE rowid = $rowid ; " ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
// Appel des triggers
include_once ( DOL_DOCUMENT_ROOT . " /interfaces.class.php " );
$interface = new Interfaces ( $this -> db );
$ret = $interface -> run_triggers ( 'BILL_VALIDATE' , $this , $user , $lang , $conf );
// Fin appel triggers
if ( $ret < 0 ) $error ++ ;
}
else
{
dolibarr_syslog ( " Facture::set_valid() Echec - 10 " );
dolibarr_print_error ( $this -> db );
$error ++ ;
}
/*
* Update Stats
*/
$sql = " SELECT fk_product FROM " . MAIN_DB_PREFIX . " facturedet WHERE fk_facture = " . $this -> id ;
$sql .= " AND fk_product > 0 " ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $resql );
$sql = " UPDATE " . MAIN_DB_PREFIX . " product SET nbvente=nbvente+1 WHERE rowid = " . $obj -> fk_product ;
$resql2 = $this -> db -> query ( $sql );
$i ++ ;
}
}
else
{
$error ++ ;
}
if ( $error == 0 )
{
$this -> db -> commit ();
/*
* Notify
*/
2005-07-16 13:10:39 +02:00
$facref = sanitize_string ( $this -> ref );
2005-04-27 02:32:23 +02:00
$filepdf = FAC_OUTPUTDIR . " / " . $facref . " / " . $facref . " .pdf " ;
$mesg = " La facture " . $this -> ref . " a <20> t<EFBFBD> valid<69> e. \n " ;
$notify = New Notify ( $this -> db );
$notify -> send ( $action_notify , $this -> socidp , $mesg , " facture " , $rowid , $filepdf );
}
else
{
$this -> db -> rollback ();
}
}
if ( $error == 0 )
{
return 1 ;
}
else
{
return 0 ;
}
}
2002-12-14 17:25:46 +01:00
}
2005-04-27 02:32:23 +02:00
/**
* \brief Ajoute un produit dans l ' objet facture
* \param idproduct
* \param qty
* \param remise_percent
* \param datestart
* \param dateend
*/
function add_product ( $idproduct , $qty , $remise_percent , $datestart = '' , $dateend = '' )
2004-03-24 15:09:33 +01:00
{
2005-04-27 02:32:23 +02:00
if ( $idproduct > 0 )
{
$i = sizeof ( $this -> products ); // On recupere nb de produit deja dans tableau products
$this -> products [ $i ] = $idproduct ; // On ajoute a la suite
if ( ! $qty )
{
$qty = 1 ;
}
$this -> products_qty [ $i ] = $qty ;
$this -> products_remise_percent [ $i ] = $remise_percent ;
if ( $datestart ) { $this -> products_date_start [ $i ] = $datestart ; }
if ( $dateend ) { $this -> products_date_end [ $i ] = $dateend ; }
}
2004-03-24 15:09:33 +01:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Ajoute une ligne de facture ( associ<EFBFBD> <EFBFBD> aucun produit / service pr<EFBFBD> d<EFBFBD> fini )
* \param facid id de la facture
* \param desc description de la ligne
* \param pu prix unitaire
* \param qty quantit
* \param txtva taux de tva
* \param fk_product id du produit / service pred<EFBFBD> fini
* \param remise_percent pourcentage de remise de la ligne
* \param datestart date de debut de validit<EFBFBD> du service
* \param dateend date de fin de validit<EFBFBD> du service
2005-05-09 13:20:47 +02:00
* \param ventil code de ventilation comptable
2005-04-27 02:32:23 +02:00
*/
2005-05-09 13:20:47 +02:00
function addline ( $facid , $desc , $pu , $qty , $txtva , $fk_product = 0 , $remise_percent = 0 , $datestart = '' , $dateend = '' , $ventil = 0 )
2004-03-24 15:09:33 +01:00
{
2005-04-27 02:32:23 +02:00
if ( $this -> brouillon )
{
/* Lecture du rang max de la facture */
$sql = " SELECT max(rang) FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE fk_facture = " . $facid ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
2005-05-09 13:20:47 +02:00
$row = $this -> db -> fetch_row ( $resql );
$rangmax = $row [ 0 ];
2005-04-27 02:32:23 +02:00
}
/* -- */
if ( strlen ( trim ( $qty )) == 0 )
{
2005-05-09 13:20:47 +02:00
$qty = 1 ;
2005-04-27 02:32:23 +02:00
}
$remise = 0 ;
$_price = $pu ;
$subprice = $pu ;
$remise_percent = trim ( $remise_percent );
if ( $this -> socidp )
{
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> socidp );
$remise_client = $soc -> remise_client ;
if ( $remise_client > $remise_percent )
{
$remise_percent = $remise_client ;
}
}
if ( $remise_percent > 0 )
{
$remise = ( $pu * $remise_percent / 100 );
$_price = ( $pu - $remise );
}
/* Formatage des prix */
$_price = ereg_replace ( " , " , " . " , $_price );
$subprice = ereg_replace ( " , " , " . " , $subprice );
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " facturedet " ;
2005-05-09 13:20:47 +02:00
$sql .= " (fk_facture,description,price,qty,tva_taux, fk_product, remise_percent, subprice, remise, date_start, date_end, fk_code_ventilation, rang) " ;
2005-04-27 02:32:23 +02:00
$sql .= " VALUES ( $facid , ' " . addslashes ( $desc ) . " ',' $_price ',' $qty ',' $txtva ', $fk_product ,' $remise_percent ',' $subprice ',' $remise ', " ;
if ( $datestart ) { $sql .= " ' $datestart ', " ; }
else { $sql .= " null, " ; }
if ( $dateend ) { $sql .= " ' $dateend ' " ; }
else { $sql .= " null " ; }
2005-05-09 13:20:47 +02:00
$sql .= " , " . $ventil ;
$sql .= " , " . ( $rangmax + 1 ) . " ) " ;
2005-04-27 02:32:23 +02:00
if ( $this -> db -> query ( $sql ) )
{
$this -> updateprice ( $facid );
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
2004-03-24 15:09:33 +01:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
2005-06-11 14:12:31 +02:00
* \brief Mets <EFBFBD> jour une ligne de facture
* \param rowid Id de la ligne de facture
* \param desc Description de la ligne
* \param pu Prix unitaire
* \param qty Quantit<EFBFBD>
* \param remise_percent Pourcentage de remise de la ligne
* \param datestart Date de debut de validit<EFBFBD> du service
* \param dateend Date de fin de validit<EFBFBD> du service
* \return int < 0 si erreur , > 0 si ok
*/
2005-04-27 02:32:23 +02:00
function updateline ( $rowid , $desc , $pu , $qty , $remise_percent = 0 , $datestart = '' , $dateend = '' )
2002-12-14 17:25:46 +01:00
{
2005-04-27 02:32:23 +02:00
//dolibarr_syslog("Facture::UpdateLine");
2005-06-11 14:12:31 +02:00
2005-04-27 02:32:23 +02:00
if ( $this -> brouillon )
{
2005-06-11 14:12:31 +02:00
$this -> db -> begin ();
2005-04-27 02:32:23 +02:00
if ( strlen ( trim ( $qty )) == 0 )
{
$qty = 1 ;
}
$remise = 0 ;
$price = ereg_replace ( " , " , " . " , $pu );
$subprice = $price ;
if ( trim ( strlen ( $remise_percent )) > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
else
{
$remise_percent = 0 ;
}
2005-06-11 14:12:31 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet set description=' " . addslashes ( $desc ) . " ' " ;
2005-04-27 02:32:23 +02:00
$sql .= " ,price=' " . ereg_replace ( " , " , " . " , $price ) . " ' " ;
$sql .= " ,subprice=' " . ereg_replace ( " , " , " . " , $subprice ) . " ' " ;
$sql .= " ,remise=' " . ereg_replace ( " , " , " . " , $remise ) . " ' " ;
$sql .= " ,remise_percent=' " . ereg_replace ( " , " , " . " , $remise_percent ) . " ' " ;
$sql .= " ,qty=' $qty ' " ;
2005-06-11 14:12:31 +02:00
2005-04-27 02:32:23 +02:00
if ( $datestart ) { $sql .= " ,date_start=' $datestart ' " ; }
else { $sql .= " ,date_start=null " ; }
if ( $dateend ) { $sql .= " ,date_end=' $dateend ' " ; }
else { $sql .= " ,date_end=null " ; }
2005-06-11 14:12:31 +02:00
2005-04-27 02:32:23 +02:00
$sql .= " WHERE rowid = $rowid ; " ;
2005-06-11 14:12:31 +02:00
2005-04-27 02:32:23 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$this -> updateprice ( $this -> id );
2005-06-11 14:12:31 +02:00
$this -> db -> commit ();
return $result ;
2005-04-27 02:32:23 +02:00
}
else
{
2005-06-11 14:12:31 +02:00
$this -> db -> rollback ();
2005-04-27 02:32:23 +02:00
dolibarr_print_error ( $this -> db );
2005-06-11 14:12:31 +02:00
return - 1 ;
2005-04-27 02:32:23 +02:00
}
2005-06-11 14:12:31 +02:00
}
else {
return - 2 ;
2005-04-27 02:32:23 +02:00
}
2003-02-01 20:45:45 +01:00
}
2004-05-17 19:07:16 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Supprime une ligne facture de la base
* \param rowid id de la ligne de facture a supprimer
*/
function deleteline ( $rowid )
2003-08-13 01:04:33 +02:00
{
2005-04-27 02:32:23 +02:00
if ( $this -> brouillon )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " facturedet WHERE rowid = $rowid ; " ;
$result = $this -> db -> query ( $sql );
$this -> updateprice ( $this -> id );
}
2003-08-13 01:04:33 +02:00
}
2004-05-17 19:07:16 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Mise <EFBFBD> jour des sommes de la facture
* \param facid id de la facture a modifier
*/
function updateprice ( $facid )
2003-02-01 20:45:45 +01:00
{
2005-04-27 02:32:23 +02:00
include_once DOL_DOCUMENT_ROOT . " /lib/price.lib.php " ;
$err = 0 ;
$sql = " SELECT price, qty, tva_taux FROM " . MAIN_DB_PREFIX . " facturedet WHERE fk_facture = $facid ; " ;
2005-04-22 17:56:13 +02:00
2005-04-27 02:32:23 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ( $result );
$products [ $i ][ 0 ] = $obj -> price ;
$products [ $i ][ 1 ] = $obj -> qty ;
$products [ $i ][ 2 ] = $obj -> tva_taux ;
$i ++ ;
}
$this -> db -> free ( $result );
/*
*
*/
$calculs = calcul_price ( $products , $this -> remise_percent );
$this -> total_remise = $calculs [ 3 ];
$this -> amount_ht = $calculs [ 4 ];
$this -> total_ht = $calculs [ 0 ];
$this -> total_tva = $calculs [ 1 ];
$this -> total_ttc = $calculs [ 2 ];
$tvas = $calculs [ 5 ];
/*
*
*/
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture " ;
$sql .= " SET amount =' " . ereg_replace ( " , " , " . " , $this -> amount_ht ) . " ' " ;
$sql .= " , remise=' " . ereg_replace ( " , " , " . " , $this -> total_remise ) . " ' " ;
$sql .= " , total=' " . ereg_replace ( " , " , " . " , $this -> total_ht ) . " ' " ;
$sql .= " , tva=' " . ereg_replace ( " , " , " . " , $this -> total_tva ) . " ' " ;
$sql .= " , total_ttc=' " . ereg_replace ( " , " , " . " , $this -> total_ttc ) . " ' " ;
$sql .= " WHERE rowid = $facid ; " ;
if ( $this -> db -> query ( $sql ) )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " facture_tva_sum WHERE fk_facture= " . $this -> id ;
if ( $this -> db -> query ( $sql ) )
{
foreach ( $tvas as $key => $value )
{
$sql_del = " DELETE FROM " . MAIN_DB_PREFIX . " facture_tva_sum where fk_facture = $this->id ; " ;
$this -> db -> query ( $sql_del );
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " facture_tva_sum (fk_facture,amount,tva_tx) values ( $this->id ,' " . ereg_replace ( " , " , " . " , $tvas [ $key ]) . " ',' " . ereg_replace ( " , " , " . " , $key ) . " '); " ;
// $sql = "REPLACE INTO ".MAIN_DB_PREFIX."facture_tva_sum SET fk_facture=".$this->id;
// $sql .= ", amount = '".$tvas[$key]."'";
// $sql .= ", tva_tx='".$key."'";
if ( ! $this -> db -> query ( $sql ) )
{
dolibarr_print_error ( $this -> db );
$err ++ ;
}
}
}
else
{
$err ++ ;
}
if ( $err == 0 )
{
return 1 ;
}
else
{
return - 3 ;
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
2003-02-01 20:45:45 +01:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Applique une remise
* \param user
* \param remise
*/
function set_remise ( $user , $remise )
2003-02-01 20:45:45 +01:00
{
2005-04-27 02:32:23 +02:00
if ( $user -> rights -> facture -> creer )
{
2003-02-01 20:45:45 +01:00
2005-04-27 02:32:23 +02:00
$this -> remise_percent = $remise ;
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture SET remise_percent = " . ereg_replace ( " , " , " . " , $remise );
$sql .= " WHERE rowid = $this->id AND fk_statut = 0 ; " ;
if ( $this -> db -> query ( $sql ) )
{
$this -> updateprice ( $this -> id );
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
2003-02-01 20:45:45 +01:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Renvoie la liste des sommes de tva
*/
function getSumTva ()
2003-09-06 02:31:41 +02:00
{
2005-04-27 02:32:23 +02:00
$sql = " SELECT amount, tva_tx FROM " . MAIN_DB_PREFIX . " facture_tva_sum WHERE fk_facture = " . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$row = $this -> db -> fetch_row ( $i );
$tvs [ $row [ 1 ]] = $row [ 0 ];
$i ++ ;
}
return $tvs ;
}
else
{
return - 1 ;
}
}
/**
* \brief Renvoie la sommes des paiements deja effectu<EFBFBD> s
* \remarks Utilis<EFBFBD> entre autre par certains mod<EFBFBD> les de factures
*/
function getSommePaiement ()
2003-07-24 13:05:38 +02:00
{
2005-04-27 02:32:23 +02:00
$sql = " SELECT sum(amount) FROM " . MAIN_DB_PREFIX . " paiement_facture WHERE fk_facture = " . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
$row = $this -> db -> fetch_row ( 0 );
return $row [ 0 ];
}
else
{
return - 1 ;
}
2003-07-24 13:05:38 +02:00
}
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Retourne le libell<EFBFBD> du statut d ' une facture ( brouillon , valid<EFBFBD> e , abandonn<EFBFBD> e , pay<EFBFBD> e )
* \return string Libell
*/
2005-03-15 18:12:46 +01:00
function getLibStatut ()
2004-10-30 14:17:26 +02:00
{
2005-04-27 02:32:23 +02:00
return $this -> LibStatut ( $this -> paye , $this -> statut );
2004-10-30 14:17:26 +02:00
}
2005-04-27 02:32:23 +02:00
/**
2005-07-12 23:40:28 +02:00
* \brief Renvoi le libell<EFBFBD> d ' un statut donn
* \param paye Etat paye
* \param statut Id statut
* \param mode 0 = libell<EFBFBD> long , 1 = libell<EFBFBD> court
* \return string Libell<EFBFBD> du statut
*/
function LibStatut ( $paye , $statut , $mode = 0 )
2004-04-22 22:11:25 +02:00
{
2004-08-29 14:24:55 +02:00
global $langs ;
$langs -> load ( " bills " );
2005-07-12 23:40:28 +02:00
$prefix = " " ;
if ( $mode == 1 ) $prefix = " Short " ;
2004-08-29 14:24:55 +02:00
if ( ! $paye )
{
2005-07-12 23:40:28 +02:00
if ( $statut == 0 ) return $langs -> trans ( " Bill ${ prefix } StatusDraft " );
if ( $statut == 3 ) return $langs -> trans ( " Bill ${ prefix } StatusCanceled " );
return $langs -> trans ( " Bill ${ prefix } StatusValidated " );
2004-08-29 14:24:55 +02:00
}
else
{
2005-07-12 23:40:28 +02:00
return $langs -> trans ( " Bill ${ prefix } StatusPayed " );
2004-08-29 14:24:55 +02:00
}
2004-04-22 22:11:25 +02:00
}
2004-07-21 17:20:37 +02:00
2005-04-27 02:32:23 +02:00
/**
2005-08-11 22:01:25 +02:00
* \brief Renvoi le libell<EFBFBD> court d ' un statut donn<EFBFBD>
2005-04-27 02:32:23 +02:00
* \param paye etat paye
* \param statut id statut
* \param amount amount already payed
* \return string Libell<EFBFBD> court du statut
*/
2005-03-15 18:12:46 +01:00
function PayedLibStatut ( $paye , $statut , $amount = 0 )
{
global $langs ;
$langs -> load ( " bills " );
if ( ! $paye )
{
if ( $statut == 0 ) return $langs -> trans ( " BillShortStatusDraft " );
if ( $statut == 3 ) return $langs -> trans ( " BillStatusCanceled " );
if ( $amount ) return $langs -> trans ( " BillStatusStarted " );
return $langs -> trans ( " BillStatusNotPayed " );
}
else
{
return $langs -> trans ( " BillStatusPayed " );
}
}
2004-07-21 17:20:37 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Mets <EFBFBD> jour les commentaires
* \param note note
* \return int < 0 si erreur , > 0 si ok
*/
function update_note ( $note )
2004-07-21 17:20:37 +02:00
{
2005-02-05 22:39:30 +01:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture SET note = ' " . addslashes ( $note ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> id ;
2005-04-27 02:32:23 +02:00
2005-02-05 22:39:30 +01:00
if ( $this -> db -> query ( $sql ) )
{
$this -> note = " $note " ;
return 1 ;
}
else
{
return - 1 ;
}
2004-07-21 17:20:37 +02:00
}
2005-08-11 22:01:25 +02:00
/**
* \brief Charge les informations d 'ordre info dans l' objet facture
* \param id Id de la facture a charger
*/
2005-04-27 02:32:23 +02:00
function info ( $id )
2004-07-21 17:35:01 +02:00
{
2005-04-27 02:32:23 +02:00
$sql = " SELECT c.rowid, " . $this -> db -> pdate ( " datec " ) . " as datec " ;
$sql .= " , fk_user_author, fk_user_valid " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " facture 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 );
}
2004-07-21 17:35:01 +02:00
}
2004-07-21 17:20:37 +02:00
2005-04-27 02:32:23 +02:00
/**
* \brief Change le mode de r<EFBFBD> glement
* \param mode nouveau mode
*/
function mode_reglement ( $mode )
2005-04-22 17:14:42 +02:00
{
2005-04-27 02:32:23 +02:00
//dolibarr_syslog("Facture::ModeReglement");
if ( $this -> statut > 0 && $this -> paye == 0 )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facture " ;
$sql .= " SET fk_mode_reglement = " . $mode ;
$sql .= " WHERE rowid= " . $this -> id ;
if ( $this -> db -> query ( $sql ) )
{
$this -> mode_reglement = $mode ;
return 0 ;
}
else
{
dolibarr_syslog ( " Facture::mode_reglement Erreur -2 " );
return - 2 ;
}
}
else
{
dolibarr_syslog ( " Facture::mode_reglement, etat facture incompatible " );
return - 3 ;
}
2005-04-22 17:14:42 +02:00
}
2005-04-27 02:32:23 +02:00
/**
* \brief Cr<EFBFBD> <EFBFBD> une demande de pr<EFBFBD> l<EFBFBD> vement
* \param user utilisateur cr<EFBFBD> ant la demande
*/
function demande_prelevement ( $user )
{
//dolibarr_syslog("Facture::DemandePrelevement");
$soc = new Societe ( $this -> db );
$soc -> id = $this -> socidp ;
$soc -> rib ();
if ( $this -> statut > 0 && $this -> paye == 0 && $this -> mode_reglement == 3 )
{
$sql = " SELECT count(*) FROM " . MAIN_DB_PREFIX . " prelevement_facture_demande " ;
$sql .= " WHERE fk_facture= " . $this -> id ;
$sql .= " AND traite = 0 " ;
if ( $this -> db -> query ( $sql ) )
{
$row = $this -> db -> fetch_row ();
if ( $row [ 0 ] == 0 )
{
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " prelevement_facture_demande " ;
$sql .= " (fk_facture, amount, date_demande, fk_user_demande, code_banque, code_guichet, number, cle_rib) " ;
$sql .= " VALUES ( " . $this -> id ;
$sql .= " ,' " . ereg_replace ( " , " , " . " , $this -> total_ttc ) . " ' " ;
$sql .= " ,now(), " . $user -> id . " " ;
$sql .= " ,' " . $soc -> bank_account -> code_banque . " ' " ;
$sql .= " ,' " . $soc -> bank_account -> code_guichet . " ' " ;
$sql .= " ,' " . $soc -> bank_account -> number . " ' " ;
$sql .= " ,' " . $soc -> bank_account -> cle_rib . " ') " ;
if ( $this -> db -> query ( $sql ) )
{
return 0 ;
}
else
{
dolibarr_syslog ( " Facture::DemandePrelevement Erreur " );
return - 1 ;
}
}
else
{
dolibarr_syslog ( " Facture::DemandePrelevement Impossible de cr<63> er une demande, demande d<> ja en cours " );
}
}
else
{
dolibarr_syslog ( " Facture::DemandePrelevement Erreur -2 " );
return - 2 ;
}
}
else
{
dolibarr_syslog ( " Facture::DemandePrelevement Impossible de cr<63> er une demande, etat facture incompatible " );
return - 3 ;
}
}
/**
* \brief Supprime une demande de pr<EFBFBD> l<EFBFBD> vement
* \param user utilisateur cr<EFBFBD> ant la demande
* \param did id de la demande a supprimer
*/
function demande_prelevement_delete ( $user , $did )
{
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " prelevement_facture_demande " ;
$sql .= " WHERE rowid = " . $did ;
$sql .= " AND traite = 0 " ;
if ( $this -> db -> query ( $sql ) )
{
return 0 ;
}
else
{
dolibarr_syslog ( " Facture::DemandePrelevement Erreur " );
return - 1 ;
}
}
/**
2005-07-10 21:39:52 +02:00
* \brief Stocke un num<EFBFBD> ro de rand pour toutes les lignes de
* detail d 'une facture qui n' en ont pas .
*/
2005-04-27 02:32:23 +02:00
function line_order ()
{
$sql = " SELECT count(rowid) FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE fk_facture= " . $this -> id ;
$sql .= " AND rang = 0 " ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
$nl = $row [ 0 ];
}
if ( $nl > 0 )
{
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE fk_facture= " . $this -> id ;
$sql .= " ORDER BY rang ASC, rowid ASC " ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$num = $this -> db -> num_rows ( $resql );
$i = 0 ;
while ( $i < $num )
{
$row = $this -> db -> fetch_row ( $resql );
$li [ $i ] = $row [ 0 ];
$i ++ ;
}
}
for ( $i = 0 ; $i < sizeof ( $li ) ; $i ++ )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet SET rang = " . ( $i + 1 );
$sql .= " WHERE rowid = " . $li [ $i ];
if ( ! $this -> db -> query ( $sql ) )
{
dolibarr_syslog ( $this -> db -> error ());
}
}
}
}
function line_up ( $rowid )
{
$this -> line_order ();
/* Lecture du rang de la ligne */
$sql = " SELECT rang FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE rowid = " . $rowid ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
$rang = $row [ 0 ];
}
if ( $rang > 1 )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet SET rang = " . $rang ;
$sql .= " WHERE fk_facture = " . $this -> id ;
$sql .= " AND rang = " . ( $rang - 1 );
if ( $this -> db -> query ( $sql ) )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet SET rang = " . ( $rang - 1 );
$sql .= " WHERE rowid = " . $rowid ;
if ( ! $this -> db -> query ( $sql ) )
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
}
function line_down ( $rowid )
{
$this -> line_order ();
/* Lecture du rang de la ligne */
$sql = " SELECT rang FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE rowid = " . $rowid ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
$rang = $row [ 0 ];
}
/* Lecture du rang max de la facture */
$sql = " SELECT max(rang) FROM " . MAIN_DB_PREFIX . " facturedet " ;
$sql .= " WHERE fk_facture = " . $this -> id ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
$max = $row [ 0 ];
}
if ( $rang < $max )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet SET rang = " . $rang ;
$sql .= " WHERE fk_facture = " . $this -> id ;
$sql .= " AND rang = " . ( $rang + 1 );
if ( $this -> db -> query ( $sql ) )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " facturedet SET rang = " . ( $rang + 1 );
$sql .= " WHERE rowid = " . $rowid ;
if ( ! $this -> db -> query ( $sql ) )
{
dolibarr_print_error ( $this -> db );
}
}
else
{
dolibarr_print_error ( $this -> db );
}
}
}
2005-08-11 22:01:25 +02:00
/**
* \brief Charge indicateurs this -> nbtodo et this -> nbtodolate de tableau de bord
* \return int < 0 si ko , > 0 si ok
*/
function load_board ()
{
global $conf ;
$this -> nbtodo = $this -> nbtodolate = 0 ;
$sql = " SELECT f.rowid, " . $this -> db -> pdate ( " f.date_lim_reglement " ) . " as datefin " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " facture as f " ;
$sql .= " WHERE f.paye=0 AND f.fk_statut = 1 " ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
$this -> nbtodo ++ ;
if ( $obj -> datefin < ( time () - $conf -> facture -> client -> warning_delay )) $this -> nbtodolate ++ ;
}
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2003-02-01 20:45:45 +01:00
}
2004-07-12 15:22:19 +02:00
2004-08-12 22:55:55 +02:00
2005-01-23 03:14:56 +01:00
/**
2005-08-11 22:01:25 +02:00
\class FactureLigne
\brief Classe permettant la gestion des lignes de factures
2004-08-12 22:55:55 +02:00
*/
2004-07-12 15:22:19 +02:00
class FactureLigne
{
2005-08-20 16:36:32 +02:00
var $subprice ; // Prix unitaire HT
var $price ; // Prix HT apres remise %
2004-08-12 22:55:55 +02:00
2005-04-27 02:32:23 +02:00
/**
2005-08-11 22:01:25 +02:00
* \brief Constructeur d ' objets ligne de facture
* \param DB handler d ' acc<EFBFBD> s base de donn<EFBFBD> e
*/
2005-04-27 02:32:23 +02:00
function FactureLigne ( $DB )
2004-07-12 15:22:19 +02:00
{
$this -> db = $DB ;
}
2005-08-11 22:01:25 +02:00
2005-04-27 02:32:23 +02:00
/**
2005-08-11 22:01:25 +02:00
* \brief Recup<EFBFBD> re l ' objet ligne de facture
* \param rowid id de la ligne de facture
* \param societe_id id de la societe
*/
2005-04-27 02:32:23 +02:00
function fetch ( $rowid , $societe_id = 0 )
2004-07-12 15:22:19 +02:00
{
2005-04-27 02:32:23 +02:00
$sql = " SELECT fk_product, description, price, qty, rowid, tva_taux, remise, remise_percent, subprice, " . $this -> db -> pdate ( " date_start " ) . " as date_start, " . $this -> db -> pdate ( " date_end " ) . " as date_end " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " facturedet WHERE rowid = " . $rowid ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$objp = $this -> db -> fetch_object ( $result );
$this -> desc = stripslashes ( $objp -> description );
$this -> qty = $objp -> qty ;
$this -> price = $objp -> price ;
2005-08-20 16:36:32 +02:00
$this -> price_ttc = $objp -> price_ttc ;
2005-04-27 02:32:23 +02:00
$this -> subprice = $objp -> subprice ;
$this -> tva_taux = $objp -> tva_taux ;
$this -> remise = $objp -> remise ;
$this -> remise_percent = $objp -> remise_percent ;
$this -> produit_id = $objp -> fk_product ;
$this -> date_start = $objp -> date_start ;
$this -> date_end = $objp -> date_end ;
$i ++ ;
$this -> db -> free ( $result );
}
else {
dolibarr_print_error ( $this -> db );
}
2005-02-05 00:05:15 +01:00
2004-07-12 15:22:19 +02:00
}
2004-07-21 17:35:01 +02:00
}
2004-07-12 15:22:19 +02:00
2002-09-25 20:36:27 +02:00
?>