2005-09-15 02:37:03 +02:00
< ? php
/* Copyright ( C ) 2003 - 2005 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
2006-06-01 01:22:52 +02:00
* Copyright ( C ) 2004 - 2006 Laurent Destailleur < eldy @ users . sourceforge . net >
2006-02-12 09:54:15 +01:00
* Copyright ( C ) 2005 - 2006 Regis Houssin < regis . houssin @ cap - networks . com >
* Copyright ( C ) 2006 Andre Cianfarani < acianfa @ free . fr >
2005-09-15 02:37:03 +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-10-18 21:56:29 +02:00
2005-09-15 02:37:03 +02:00
/**
\file htdocs / commande / commande . class . php
\ingroup commande
\brief Fichier des classes de commandes
\version $Revision $
*/
2005-10-18 21:56:29 +02:00
2006-06-18 16:18:41 +02:00
require_once ( DOL_DOCUMENT_ROOT . " /commonobject.class.php " );
2005-09-11 18:51:41 +02:00
require_once ( DOL_DOCUMENT_ROOT . " /product.class.php " );
2006-05-09 21:08:35 +02:00
require_once ( DOL_DOCUMENT_ROOT . " /contact.class.php " );
2005-09-15 02:37:03 +02:00
2006-03-20 17:57:06 +01:00
2005-09-15 02:37:03 +02:00
/**
\class Commande
\brief Classe de gestion de commande
*/
2006-06-18 16:18:41 +02:00
class Commande extends CommonObject
2005-09-15 02:37:03 +02:00
{
var $db ;
2006-06-18 16:18:41 +02:00
var $element = 'commande' ;
2005-09-15 02:37:03 +02:00
var $id ;
2006-06-09 16:38:19 +02:00
var $ref ;
2006-02-09 14:12:14 +01:00
var $socidp ;
2006-03-18 20:58:33 +01:00
var $contactid ;
2006-05-27 15:13:44 +02:00
var $projet_id ;
2006-05-20 11:19:20 +02:00
var $statut ;
var $facturee ;
2005-09-15 02:37:03 +02:00
var $brouillon ;
2006-02-16 15:25:57 +01:00
var $cond_reglement_id ;
var $cond_reglement_code ;
var $mode_reglement_id ;
var $mode_reglement_code ;
2006-04-21 17:49:50 +02:00
var $adresse_livraison_id ;
2006-04-29 17:09:44 +02:00
var $date ; // Date commande
var $date_livraison ; // Date livraison souhait<69> e
2006-06-01 01:22:52 +02:00
var $remise_percent ;
var $remise_absolue ;
2005-09-15 02:37:03 +02:00
// Pour board
var $nbtodo ;
var $nbtodolate ;
/**
* \brief Constructeur
* \param DB Handler d ' acc<EFBFBD> s base
*/
2006-05-27 13:01:04 +02:00
function Commande ( $DB , $soc_idp = " " , $commandeid = 0 )
2005-09-15 02:37:03 +02:00
{
global $langs ;
$langs -> load ( 'orders' );
$this -> db = $DB ;
2006-05-27 13:01:04 +02:00
$this -> socidp = $soc_idp ;
2006-06-01 01:22:52 +02:00
$this -> id = $commandeid ;
2006-03-18 20:58:33 +01:00
2005-09-15 02:37:03 +02:00
$this -> sources [ 0 ] = $langs -> trans ( 'OrderSource0' );
$this -> sources [ 1 ] = $langs -> trans ( 'OrderSource1' );
$this -> sources [ 2 ] = $langs -> trans ( 'OrderSource2' );
$this -> sources [ 3 ] = $langs -> trans ( 'OrderSource3' );
$this -> sources [ 4 ] = $langs -> trans ( 'OrderSource4' );
$this -> sources [ 5 ] = $langs -> trans ( 'OrderSource5' );
2006-03-18 20:58:33 +01:00
2006-04-29 17:09:44 +02:00
$this -> remise = 0 ;
$this -> remise_percent = 0 ;
2005-09-15 02:37:03 +02:00
$this -> products = array ();
}
2005-12-10 00:22:24 +01:00
/** \brief Cr<EFBFBD> <EFBFBD> la commande depuis une propale existante
\param user Utilisateur qui cr<EFBFBD> e
\param propale_id id de la propale qui sert de mod<EFBFBD> le
*/
2005-09-15 02:37:03 +02:00
function create_from_propale ( $user , $propale_id )
{
$propal = new Propal ( $this -> db );
$propal -> fetch ( $propale_id );
$this -> lines = array ();
$this -> date_commande = time ();
$this -> source = 0 ;
for ( $i = 0 ; $i < sizeof ( $propal -> lignes ) ; $i ++ )
{
$CommLigne = new CommandeLigne ();
2006-02-16 16:36:42 +01:00
$CommLigne -> libelle = $propal -> lignes [ $i ] -> libelle ;
$CommLigne -> description = $propal -> lignes [ $i ] -> desc ;
$CommLigne -> price = $propal -> lignes [ $i ] -> subprice ;
$CommLigne -> subprice = $propal -> lignes [ $i ] -> subprice ;
$CommLigne -> tva_tx = $propal -> lignes [ $i ] -> tva_tx ;
$CommLigne -> qty = $propal -> lignes [ $i ] -> qty ;
$CommLigne -> remise_percent = $propal -> lignes [ $i ] -> remise_percent ;
$CommLigne -> product_id = $propal -> lignes [ $i ] -> product_id ;
2005-09-15 02:37:03 +02:00
$this -> lines [ $i ] = $CommLigne ;
}
2006-05-26 20:07:26 +02:00
$this -> soc_id = $propal -> soc_id ;
$this -> projetid = $propal -> projetidp ;
$this -> cond_reglement_id = $propal -> cond_reglement_id ;
$this -> mode_reglement_id = $propal -> mode_reglement_id ;
$this -> date_livraison = $propal -> date_livraison ;
2006-04-24 18:00:18 +02:00
$this -> adresse_livraison_id = $propal -> adresse_livraison_id ;
2006-06-08 17:53:39 +02:00
$this -> contact_id = $propal -> contactid ;
2006-06-13 16:31:37 +02:00
$this -> ref_client = $propal -> ref_client ;
2006-02-16 19:38:07 +01:00
2005-09-15 02:37:03 +02:00
/* D<> finit la soci<63> t<EFBFBD> comme un client */
$soc = new Societe ( $this -> db );
$soc -> id = $this -> soc_id ;
$soc -> set_as_client ();
$this -> propale_id = $propal -> id ;
2005-12-10 00:22:24 +01:00
2005-09-15 02:37:03 +02:00
return $this -> create ( $user );
}
/** \brief Valide la commande
\param user Utilisateur qui valide
*/
function valid ( $user )
{
$result = 0 ;
2006-03-20 17:57:06 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
if ( $user -> rights -> commande -> valider )
{
if ( defined ( 'COMMANDE_ADDON' ))
{
if ( is_readable ( DOL_DOCUMENT_ROOT . '/includes/modules/commande/' . COMMANDE_ADDON . '.php' ))
{
require_once DOL_DOCUMENT_ROOT . '/includes/modules/commande/' . COMMANDE_ADDON . '.php' ;
// Definition du nom de module de numerotation de commande
// \todo Normer le nom des classes des modules de num<75> rotation de ref de commande avec un nom du type NumRefCommandesXxxx
//
//$list=split('_',COMMANDE_ADDON);
//$numrefname=$list[2];
//$modName = 'NumRefCommandes'.ucfirst($numrefname);
$modName = COMMANDE_ADDON ;
// Recuperation de la nouvelle reference
$objMod = new $modName ( $this -> db );
$soc = new Societe ( $this -> db );
$soc -> fetch ( $this -> soc_id );
2006-05-03 12:04:19 +02:00
// on v<> rifie si la commande est en num<75> rotation provisoire
$comref = substr ( $this -> ref , 1 , 4 );
if ( $comref == PROV )
{
$num = $objMod -> commande_get_num ( $soc );
}
else
{
2006-05-03 12:05:11 +02:00
$num = $this -> ref ;
2006-05-03 12:04:19 +02:00
}
2005-09-15 02:37:03 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET ref=' $num ', fk_statut = 1, date_valid=now(), fk_user_valid= $user->id " ;
$sql .= " WHERE rowid = $this->id AND fk_statut = 0 ; " ;
if ( $this -> db -> query ( $sql ) )
{
2006-05-31 12:33:05 +02:00
// On efface le r<> pertoire de pdf provisoire
$comref = sanitize_string ( $this -> ref );
if ( $conf -> commande -> dir_output )
{
$dir = $conf -> commande -> dir_output . " / " . $comref ;
2006-05-31 12:43:59 +02:00
$file = $conf -> commande -> dir_output . " / " . $comref . " / " . $comref . " .pdf " ;
if ( file_exists ( $file ))
2006-05-31 12:33:05 +02:00
{
2006-06-09 16:58:53 +02:00
commande_delete_preview ( $this -> db , $this -> id , $this -> ref );
2006-06-09 14:40:33 +02:00
2006-05-31 12:43:59 +02:00
if ( ! dol_delete_file ( $file ))
2006-05-31 12:33:05 +02:00
{
2006-05-31 13:41:39 +02:00
$this -> error = $langs -> trans ( " ErrorCanNotDeleteFile " , $file );
2006-05-31 12:33:05 +02:00
return 0 ;
}
}
2006-05-31 12:43:59 +02:00
if ( file_exists ( $dir ))
{
if ( ! dol_delete_dir ( $dir ))
{
$this -> error = $langs -> trans ( " ErrorCanNotDeleteDir " , $dir );
return 0 ;
}
}
}
2006-05-31 12:33:05 +02:00
$result = 1 ;
2005-09-15 02:37:03 +02:00
}
else
{
$result = - 1 ;
dolibarr_print_error ( $this -> db );
}
}
else
{
print 'Impossible de lire le module de num<75> rotation' ;
}
}
else
{
print 'Le module de num<75> rotation n\'est pas d<> fini' ;
}
}
return $result ;
}
2006-04-29 15:30:21 +02:00
/**
*
*
*/
function reopen ( $userid )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET fk_statut = 0 " ;
$sql .= " WHERE rowid = $this->id ; " ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
2005-09-15 02:37:03 +02:00
/**
* \brief Cloture la commande
* \param user Objet utilisateur qui cloture
* \return int < 0 si ko , > 0 si ok
*/
function cloture ( $user )
{
2006-03-20 17:57:06 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
if ( $user -> rights -> commande -> valider )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET fk_statut = 3,' ;
$sql .= ' fk_user_cloture = ' . $user -> id . ',' ;
$sql .= ' date_cloture = now()' ;
$sql .= " WHERE rowid = $this->id AND fk_statut > 0 ; " ;
if ( $this -> db -> query ( $sql ) )
{
2006-03-20 17:57:06 +01:00
if ( $conf -> stock -> enabled && $conf -> global -> PRODUIT_SOUSPRODUITS == 1 )
{
require_once ( DOL_DOCUMENT_ROOT . " /product/stock/mouvementstock.class.php " );
for ( $i = 0 ; $i < sizeof ( $this -> lignes ) ; $i ++ )
{
$prod = new Product ( $this -> db , $this -> lignes [ $i ] -> product_id );
$prod -> get_sousproduits_arbo ();
$prods_arbo = $prod -> get_each_prod ();
if ( sizeof ( $prods_arbo ) > 0 )
{
foreach ( $prods_arbo as $key => $value )
{
2006-03-21 10:08:35 +01:00
// on d<> compte le stock de tous les sousproduits
2006-03-20 17:57:06 +01:00
$mouvS = new MouvementStock ( $this -> db );
$entrepot_id = " 1 " ;
2006-03-21 10:08:35 +01:00
$result = $mouvS -> livraison ( $user , $value [ 1 ], $entrepot_id , $value [ 0 ]);
2006-03-20 17:57:06 +01:00
}
}
2006-03-21 11:26:12 +01:00
// on d<> compte pas le stock du produit principal, <20> a serait fait manuellement avec l'exp<78> dition
// $result=$mouvS->livraison($user, $this->lignes[$i]->product_id, $entrepot_id, $this->lignes[$i]->qty);
2006-03-20 17:57:06 +01:00
}
}
2005-09-15 02:37:03 +02:00
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
return - 1 ;
}
}
}
/**
* Annule la commande
*
*/
function cancel ( $user )
{
if ( $user -> rights -> commande -> valider )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET fk_statut = -1' ;
$sql .= " WHERE rowid = $this->id AND fk_statut = 1 ; " ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
}
2006-03-18 20:58:33 +01:00
/**
* \brief Cr<EFBFBD> <EFBFBD> la commande
2006-06-01 01:22:52 +02:00
* \param user Objet utilisateur qui cr<EFBFBD> e
2006-03-18 20:58:33 +01:00
*/
2005-09-15 02:37:03 +02:00
function create ( $user )
{
2006-06-17 01:55:20 +02:00
global $conf , $langs , $mysoc ;
// Nettoyage parametres
$this -> brouillon = 1 ; // On positionne en mode brouillon la commande
2006-03-18 20:58:33 +01:00
2006-06-17 16:13:49 +02:00
dolibarr_syslog ( " Commande.class.php::create " );
2006-03-18 20:58:33 +01:00
// V<> rification param<61> tres
if ( $this -> source < 0 )
{
$this -> error = $langs -> trans ( " ErrorFieldRequired " , $langs -> trans ( " Source " ));
2006-06-17 16:13:49 +02:00
dolibarr_syslog ( " Commande.class.php::create " . $this -> error );
2006-03-18 20:58:33 +01:00
return - 1 ;
}
2006-06-17 01:55:20 +02:00
if ( ! $remise ) $remise = 0 ;
if ( ! $this -> projetid ) $this -> projetid = 0 ;
2006-03-18 20:58:33 +01:00
2006-06-17 01:55:20 +02:00
$soc = new Societe ( $this -> db );
2006-06-17 16:13:49 +02:00
$result = $soc -> fetch ( $this -> soc_id );
if ( $result < 0 )
{
$this -> error = " Failed to fetch company " ;
dolibarr_syslog ( " Commande.class.php::create " . $this -> error );
return - 2 ;
}
2006-06-17 01:55:20 +02:00
$this -> db -> begin ();
2006-03-18 20:58:33 +01:00
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commande (' ;
2006-04-29 17:09:44 +02:00
$sql .= 'fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note, ref_client,' ;
$sql .= ' model_pdf, fk_cond_reglement, fk_mode_reglement, date_livraison, fk_adresse_livraison,' ;
$sql .= ' remise_absolue, remise_percent)' ;
2006-03-18 20:58:33 +01:00
$sql .= ' VALUES (' . $this -> soc_id . ', now(), ' . $user -> id . ', ' . $this -> projetid . ',' ;
$sql .= ' ' . $this -> db -> idate ( $this -> date_commande ) . ',' ;
$sql .= ' ' . $this -> source . ', ' ;
$sql .= " ' " . addslashes ( $this -> note ) . " ', " ;
2006-06-13 16:31:37 +02:00
$sql .= " ' " . addslashes ( $this -> ref_client ) . " ', ' " . $this -> modelpdf . '\', \'' . $this -> cond_reglement_id . '\', \'' . $this -> mode_reglement_id . '\',' ;
2006-06-01 01:22:52 +02:00
$sql .= ' ' . ( $this -> date_livraison ? $this -> db -> idate ( $this -> date_livraison ) : 'null' ) . ',' ;
2006-04-29 17:09:44 +02:00
$sql .= " ' " . $this -> adresse_livraison_id . " ', " ;
$sql .= " ' " . $this -> remise_absolue . " ', " ;
$sql .= " ' " . $this -> remise_percent . " ') " ;
2006-03-18 20:58:33 +01:00
2006-06-17 16:13:49 +02:00
dolibarr_syslog ( " Commande.class.php::create sql= " . $sql );
2006-06-17 01:55:20 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
2005-09-15 02:37:03 +02:00
{
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . 'commande' );
2006-06-17 01:55:20 +02:00
if ( $this -> id )
{
/*
* Insertion des produits dans la base
*/
for ( $i = 0 ; $i < sizeof ( $this -> products ) ; $i ++ )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
$prod = new Product ( $this -> db , $this -> products [ $i ]);
if ( $prod -> fetch ( $this -> products [ $i ]))
2006-02-03 17:42:39 +01:00
{
2006-06-17 01:55:20 +02:00
$tva_tx = get_default_tva ( $mysoc , $soc , $prod -> tva_tx );
// multiprix
if ( $conf -> global -> PRODUIT_MULTIPRICES == 1 )
$price = $prod -> multiprices [ $soc -> price_level ];
else
$price = $prod -> price ;
$resql = $this -> addline (
$this -> id ,
$prod -> description ,
$price ,
$this -> products_qty [ $i ],
$tva_tx ,
$this -> products [ $i ],
$this -> products_remise_percent [ $i ]
);
if ( $resql < 0 )
{
$this -> error = $this -> db -> error ;
dolibarr_print_error ( $this -> db );
break ;
}
2006-02-03 17:42:39 +01:00
}
2005-09-15 02:37:03 +02:00
}
2006-06-17 01:55:20 +02:00
// Mise a jour ref
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET ref='(PROV " . $this -> id . " )' WHERE rowid= " . $this -> id ;
if ( $this -> db -> query ( $sql ))
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
if ( $this -> id && $this -> propale_id )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'co_pr (fk_commande, fk_propale) VALUES (' . $this -> id . ',' . $this -> propale_id . ')' ;
$this -> db -> query ( $sql );
2005-09-15 02:37:03 +02:00
}
2006-06-17 16:13:49 +02:00
$this -> db -> commit ();
2006-06-17 01:55:20 +02:00
return $this -> id ;
2005-09-15 02:37:03 +02:00
}
else
{
2006-06-17 16:13:49 +02:00
$this -> db -> rollback ();
2005-09-15 02:37:03 +02:00
return - 1 ;
}
}
2006-06-07 23:03:19 +02:00
}
else
{
2006-06-17 01:55:20 +02:00
dolibarr_print_error ( $this -> db );
2006-06-17 16:13:49 +02:00
$this -> db -> rollback ();
return - 1 ;
2005-09-15 02:37:03 +02:00
}
}
2006-02-12 10:05:42 +01:00
2006-06-17 01:55:20 +02:00
/**
* \brief Ajout d ' un produit dans la commande , en base
* \param commandeid id de la commande
* \param desc description de la ligne
* \param pu prix unitaire
* \param qty quantit<EFBFBD>
* \param txtva taux de tva forc<EFBFBD> , sinon - 1
* \param fk_product id du produit / service pred<EFBFBD> fini
* \param remise_percent pourcentage de remise de la ligne
* \return int > 0 si ok , < 0 si ko
* \see add_product
* \remarks Les parametres sont deja cens<EFBFBD> etre juste et avec valeurs finales a l ' appel
* de cette methode . Aussi , pour le taux tva , il doit deja avoir ete d<EFBFBD> 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 ( $commandeid , $desc , $pu , $qty , $txtva , $fk_product = 0 , $remise_percent = 0 )
{
2006-06-17 16:13:49 +02:00
dolibarr_syslog ( " commande.class.php::addline this->id= $this->id , $commandeid , $desc , $pu , $qty , $txtva , $fk_product , $remise_percent " );
2006-06-17 01:55:20 +02:00
include_once ( DOL_DOCUMENT_ROOT . '/lib/price.lib.php' );
2006-02-12 10:05:42 +01:00
2006-06-17 01:55:20 +02:00
if ( $this -> statut == 0 )
{
$this -> db -> begin ();
2006-02-12 10:05:42 +01:00
2006-06-17 01:55:20 +02:00
// Nettoyage param<61> tres
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
if ( ! $qty ) $qty = 1 ;
$pu = price2num ( $pu );
$txtva = price2num ( $txtva );
// 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 , $remise_percent , $txtva );
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
// Anciens indicateurs: $price, $subprice, $remise (a ne plus utiliser)
$price = $pu ;
$subprice = $pu ;
if ( $remise_percent > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
2006-02-25 15:34:25 +01:00
2006-06-17 18:52:30 +02:00
// R<> cup<75> re rang max de la commande dans $rangmax
$sql = 'SELECT max(rang) FROM ' . MAIN_DB_PREFIX . 'commandedet' ;
$sql .= ' WHERE fk_commande =' . $commandeid ;
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$row = $this -> db -> fetch_row ( $resql );
$rangmax = $row [ 0 ];
}
else
{
dolibarr_print_error ( $this -> db );
$this -> db -> rollback ();
return - 1 ;
}
// Insertion ligne
$ligne = new CommandeLigne ( $this -> db );
$ligne -> fk_commande = $commandeid ;
$ligne -> desc = $desc ;
$ligne -> price = $price ;
$ligne -> qty = $qty ;
$ligne -> txtva = $txtva ;
$ligne -> fk_product = $fk_product ;
$ligne -> remise_percent = $remise_percent ;
$ligne -> subprice = $subprice ;
$ligne -> remise = $remise ;
$ligne -> rang = ( $rangmax + 1 );
$ligne -> info_bits = $info_bits ;
$ligne -> total_ht = $total_ht ;
$ligne -> total_tva = $total_tva ;
$ligne -> total_ttc = $total_ttc ;
$result = $ligne -> insert ();
if ( $result > 0 )
2006-06-17 01:55:20 +02:00
{
// Mise a jour informations denormalisees au niveau de la facture meme
$result = $this -> update_price ( $this -> id );
2006-02-12 10:05:42 +01:00
2006-06-17 01:55:20 +02:00
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
{
2006-06-17 18:52:30 +02:00
$this -> error = $ligne -> error ;
2006-06-17 01:55:20 +02:00
$this -> db -> rollback ();
return - 2 ;
}
}
}
2006-02-12 10:05:42 +01:00
2005-09-15 02:37:03 +02:00
/**
2006-06-17 01:55:20 +02:00
* Ajoute un produit dans la commande
*
*/
2005-09-15 02:37:03 +02:00
function add_product ( $idproduct , $qty , $remise_percent = 0 )
{
2006-03-20 16:53:57 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
if ( $idproduct > 0 )
{
$i = sizeof ( $this -> products );
$this -> products [ $i ] = $idproduct ;
if ( ! $qty )
{
$qty = 1 ;
}
$this -> products_qty [ $i ] = $qty ;
$this -> products_remise_percent [ $i ] = $remise_percent ;
2006-03-20 16:53:57 +01:00
/** POUR AJOUTER AUTOMATIQUEMENT LES SOUSPRODUITS <EFBFBD> LA COMMANDE
if ( $conf -> global -> PRODUIT_SOUSPRODUITS == 1 )
{
$prod = new Product ( $this -> db , $idproduct );
$prod -> get_sousproduits_arbo ();
$prods_arbo = $prod -> get_each_prod ();
if ( sizeof ( $prods_arbo ) > 0 )
{
foreach ( $prods_arbo as $key => $value )
{
// print "id : ".$value[1].' :qty: '.$value[0].'<br>';
if ( ! in_array ( $value [ 1 ], $this -> products ))
$this -> add_product ( $value [ 1 ], $value [ 0 ]);
}
}
}
**/
2005-09-15 02:37:03 +02:00
}
}
2006-05-27 12:14:33 +02:00
/**
* \brief Stocke un num<EFBFBD> ro de rang pour toutes les lignes de
* detail d 'une commande qui n' en ont pas .
*/
function line_order ()
{
$sql = 'SELECT count(rowid) FROM ' . MAIN_DB_PREFIX . 'commandedet' ;
$sql .= ' WHERE fk_commande=' . $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 . 'commandedet' ;
$sql .= ' WHERE fk_commande=' . $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 . 'commandedet 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 . 'commandedet' ;
$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 . 'commandedet SET rang = ' . $rang ;
$sql .= ' WHERE fk_commande = ' . $this -> id ;
$sql .= ' AND rang = ' . ( $rang - 1 );
if ( $this -> db -> query ( $sql ) )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commandedet 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 . 'commandedet' ;
$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 . 'commandedet' ;
$sql .= ' WHERE fk_commande =' . $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 . 'commandedet SET rang = ' . $rang ;
$sql .= ' WHERE fk_commande = ' . $this -> id ;
$sql .= ' AND rang = ' . ( $rang + 1 );
if ( $this -> db -> query ( $sql ) )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commandedet 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-09-15 02:37:03 +02:00
2006-06-17 16:13:49 +02:00
/**
* \brief Recup<EFBFBD> re de la base les caract<EFBFBD> ristiques d ' une commande
* \param rowid id de la commande <EFBFBD> r<EFBFBD> cup<EFBFBD> rer
*/
2006-02-09 13:49:02 +01:00
function fetch ( $id )
2005-09-15 02:37:03 +02:00
{
2006-04-29 17:09:44 +02:00
$sql = 'SELECT c.rowid, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_statut, c.amount_ht, c.total_ht, c.total_ttc, c.tva, c.fk_cond_reglement, c.fk_mode_reglement,' ;
$sql .= ' ' . $this -> db -> pdate ( 'c.date_commande' ) . ' as date_commande, ' . $this -> db -> pdate ( 'c.date_livraison' ) . ' as date_livraison,' ;
2006-05-25 22:07:09 +02:00
$sql .= ' c.fk_projet, c.remise_percent, c.remise, c.remise_absolue, c.source, c.facture as facturee, c.note, c.note_public, c.ref_client, c.model_pdf, c.fk_adresse_livraison' ;
2006-04-29 17:09:44 +02:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
$sql .= ' WHERE c.rowid = ' . $id ;
2006-06-17 16:13:49 +02:00
dolibarr_syslog ( " Commande::fetch sql= $sql " );
2005-09-15 02:37:03 +02:00
$result = $this -> db -> query ( $sql ) ;
2006-06-17 16:13:49 +02:00
if ( $result )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
$obj = $this -> db -> fetch_object ( $result );
2006-06-17 16:13:49 +02:00
if ( $obj )
2005-09-15 02:37:03 +02:00
{
2006-06-17 16:13:49 +02:00
$this -> id = $obj -> rowid ;
$this -> ref = $obj -> ref ;
$this -> ref_client = $obj -> ref_client ;
$this -> soc_id = $obj -> fk_soc ;
$this -> socidp = $obj -> fk_soc ;
$this -> statut = $obj -> fk_statut ;
$this -> user_author_id = $obj -> fk_user_author ;
$this -> total_ht = $obj -> total_ht ;
$this -> total_tva = $obj -> tva ;
$this -> total_ttc = $obj -> total_ttc ;
$this -> date = $obj -> date_commande ;
$this -> remise = $obj -> remise ;
$this -> remise_percent = $obj -> remise_percent ;
$this -> remise_absolue = $obj -> remise_absolue ;
$this -> source = $obj -> source ;
$this -> facturee = $obj -> facturee ;
$this -> note = $obj -> note ;
$this -> note_public = $obj -> note_public ;
$this -> projet_id = $obj -> fk_projet ;
$this -> modelpdf = $obj -> model_pdf ;
$this -> cond_reglement_id = $obj -> fk_cond_reglement ;
$this -> mode_reglement_id = $obj -> fk_mode_reglement ;
$this -> date_livraison = $obj -> date_livraison ;
$this -> adresse_livraison_id = $obj -> fk_adresse_livraison ;
2006-06-17 18:52:30 +02:00
if ( $this -> statut == 0 ) $this -> brouillon = 1 ;
2006-06-17 16:13:49 +02:00
$this -> db -> free ();
if ( $this -> cond_reglement_id )
{
$sql = " SELECT rowid, libelle, code " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " cond_reglement " ;
$sql .= " WHERE rowid = " . $this -> cond_reglement_id ;
$resqlcond = $this -> db -> query ( $sql );
if ( $resqlcond )
{
$objc = $this -> db -> fetch_object ( $resqlcond );
$this -> cond_reglement = $objc -> libelle ;
$this -> cond_reglement_code = $objc -> code ;
}
}
if ( $this -> user_author_id )
2005-09-15 02:37:03 +02:00
{
2006-06-17 16:13:49 +02:00
$sql = " SELECT name, firstname " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " user " ;
$sql .= " WHERE rowid = " . $this -> user_author_id ;
$resqluser = $this -> db -> query ( $sql );
if ( $resqluser )
{
$obju = $this -> db -> fetch_object ( $resqluser );
$this -> user_author_name = $obju -> name ;
$this -> user_author_firstname = $obju -> firstname ;
}
}
2006-06-17 18:52:30 +02:00
$this -> lignes = $this -> fetch_lignes ();
2006-06-17 16:13:49 +02:00
/*
* Propale associ<EFBFBD> e
*/
$sql = 'SELECT cp.fk_propale' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'co_pr as cp' ;
$sql .= ' WHERE cp.fk_commande = ' . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
if ( $this -> db -> num_rows ())
{
$obj = $this -> db -> fetch_object ();
$this -> propale_id = $obj -> fk_propale ;
}
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
return - 1 ;
2005-09-15 02:37:03 +02:00
}
}
else
{
2006-06-17 16:13:49 +02:00
$this -> error = " Order not found " ;
return - 2 ;
2005-09-15 02:37:03 +02:00
}
}
else
{
dolibarr_print_error ( $this -> db );
2006-06-17 16:13:49 +02:00
return - 3 ;
2005-09-15 02:37:03 +02:00
}
}
2006-06-17 16:13:49 +02:00
2006-02-09 14:35:26 +01:00
2006-06-17 16:13:49 +02:00
/*
*
*
*
*/
function set_pdf_model ( $user , $modelpdf )
{
2006-02-09 14:35:26 +01:00
if ( $user -> rights -> commande -> creer )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET model_pdf = ' $modelpdf ' " ;
2006-06-02 18:29:49 +02:00
$sql .= " WHERE rowid = $this->id AND fk_statut < 2 ; " ;
2006-02-09 14:35:26 +01:00
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
return 0 ;
}
}
}
2006-06-17 18:52:30 +02:00
/**
* \brief Reinitialise le tableau lignes
* \param only_product Ne renvoie que ligne li<EFBFBD> es <EFBFBD> des produits physiques
* \return array Tableau de CommandeLigne
*/
2005-09-15 02:37:03 +02:00
function fetch_lignes ( $only_product = 0 )
{
$this -> lignes = array ();
2006-06-17 18:52:30 +02:00
$sql = 'SELECT l.fk_product, l.fk_commande, l.description, l.price, l.qty, l.rowid, l.tva_tx,' ;
$sql .= ' l.remise_percent, l.subprice, l.rang, l.coef' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as l' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON (p.rowid = l.fk_product)' ;
$sql .= ' WHERE l.fk_commande = ' . $this -> id ;
if ( $only_product == 1 ) $sql .= ' AND p.fk_product_type = 0' ;
$sql .= ' ORDER BY l.rang' ;
2005-09-15 02:37:03 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$objp = $this -> db -> fetch_object ( $result );
2006-06-17 18:52:30 +02:00
$ligne = new CommandeLigne ( $this -> db );
$ligne -> rowid = $objp -> rowid ;
$ligne -> id = $objp -> rowid ; // \deprecated
$ligne -> fk_commande = $objp -> fk_commande ;
$ligne -> commande_id = $objp -> fk_commande ; // \deprecated
$ligne -> desc = $objp -> description ; // Description ligne
2005-09-15 02:37:03 +02:00
$ligne -> qty = $objp -> qty ;
$ligne -> tva_tx = $objp -> tva_tx ;
$ligne -> subprice = $objp -> subprice ;
$ligne -> remise_percent = $objp -> remise_percent ;
2006-06-17 18:52:30 +02:00
$ligne -> price = $objp -> price ;
2005-09-15 02:37:03 +02:00
$ligne -> product_id = $objp -> fk_product ;
2006-06-17 18:52:30 +02:00
$ligne -> coef = $objp -> coef ;
$ligne -> rang = $objp -> rang ;
$ligne -> libelle = $objp -> label ; // Label produit
$ligne -> product_desc = $objp -> product_desc ; // Description produit
$ligne -> ref = $objp -> ref ;
2005-09-15 02:37:03 +02:00
$this -> lignes [ $i ] = $ligne ;
$i ++ ;
}
$this -> db -> free ();
}
return $this -> lignes ;
}
2006-05-09 20:42:48 +02:00
/**
*
*
*/
2006-05-09 20:50:40 +02:00
function fetch_client ()
{
$client = new Societe ( $this -> db );
$client -> fetch ( $this -> socidp );
$this -> client = $client ;
}
/**
*
*
*/
2006-05-09 20:42:48 +02:00
function fetch_adresse_livraison ( $id )
{
$idadresse = $id ;
$adresse = new Societe ( $this -> db );
$adresse -> fetch_adresse_livraison ( $idadresse );
$this -> adresse = $adresse ;
}
/**
*
*
*/
function fetch_contact_commande ( $id )
{
$idcontact = $id ;
$contact = new Contact ( $this -> db );
$contact -> fetch ( $idcontact );
$this -> contact = $contact ;
}
2006-01-14 14:44:06 +01:00
/**
2006-05-29 15:53:20 +02:00
* \brief Renvoie un tableau avec les exp<EFBFBD> ditions par ligne
2006-01-14 14:44:06 +01:00
* \param filtre_statut Filtre sur statut
* \return int 0 si OK , < 0 si KO
*/
2006-05-29 15:53:20 +02:00
function expedition_array ( $filtre_statut =- 1 )
2005-09-15 02:37:03 +02:00
{
$this -> livraisons = array ();
$sql = 'SELECT fk_product, sum(ed.qty)' ;
2006-01-14 14:44:06 +01:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'expeditiondet as ed, ' . MAIN_DB_PREFIX . 'expedition as e, ' . MAIN_DB_PREFIX . 'commande as c, ' . MAIN_DB_PREFIX . 'commandedet as cd' ;
$sql .= ' WHERE ed.fk_expedition = e.rowid AND ed.fk_commande_ligne = cd .rowid AND cd.fk_commande = c.rowid' ;
$sql .= ' AND cd.fk_commande =' . $this -> id ;
if ( $filtre_statut >= 0 ) $sql .= ' AND e.fk_statut = ' . $filtre_statut ;
2005-09-15 02:37:03 +02:00
$sql .= ' GROUP BY fk_product ' ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$row = $this -> db -> fetch_row ( $i );
2006-05-29 15:53:20 +02:00
$this -> expeditions [ $row [ 0 ]] = $row [ 1 ];
2005-09-15 02:37:03 +02:00
$i ++ ;
}
$this -> db -> free ();
}
2006-01-14 14:44:06 +01:00
return 0 ;
2005-09-15 02:37:03 +02:00
}
2006-01-14 14:44:06 +01:00
2005-09-15 02:37:03 +02:00
/**
2006-05-29 15:53:20 +02:00
* Renvoie un tableau avec les expeditions par ligne
2005-09-15 02:37:03 +02:00
*
*/
function nb_expedition ()
{
$sql = 'SELECT count(*) FROM ' . MAIN_DB_PREFIX . 'expedition as e' ;
$sql .= " WHERE e.fk_commande = $this->id " ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$row = $this -> db -> fetch_row ( 0 );
return $row [ 0 ];
}
}
2006-05-29 15:53:20 +02:00
/**
* \brief Renvoie un tableau avec les livraisons par ligne
* \param filtre_statut Filtre sur statut
* \return int 0 si OK , < 0 si KO
*/
function livraison_array ( $filtre_statut =- 1 )
{
$this -> livraisons = array ();
$sql = 'SELECT cd.fk_product, sum(ed.qty)' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'livraisondet as ld, ' . MAIN_DB_PREFIX . 'livraison as l, ' . MAIN_DB_PREFIX . 'commande as c, ' . MAIN_DB_PREFIX . 'commandedet as cd' ;
$sql .= ' WHERE ld.fk_livraison = l.rowid AND ld.fk_commande_ligne = cd .rowid AND cd.fk_commande = c.rowid' ;
$sql .= ' AND cd.fk_commande =' . $this -> id ;
if ( $filtre_statut >= 0 ) $sql .= ' AND l.fk_statut = ' . $filtre_statut ;
$sql .= ' GROUP BY cd.fk_product ' ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$row = $this -> db -> fetch_row ( $i );
$this -> livraisons [ $row [ 0 ]] = $row [ 1 ];
$i ++ ;
}
$this -> db -> free ();
}
return 0 ;
}
2005-09-15 02:37:03 +02:00
/**
* \brief Supprime une ligne de la commande
* \param idligne Id de la ligne <EFBFBD> supprimer
* \return int > 0 si ok , < 0 si ko
*/
function delete_line ( $idligne )
{
if ( $this -> statut == 0 )
{
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commandedet WHERE rowid = $idligne " ;
if ( $this -> db -> query ( $sql ) )
{
$this -> update_price ();
return 1 ;
}
else
{
return - 1 ;
}
}
}
2006-04-29 17:09:44 +02:00
/**
* \brief Applique une remise relative
* \param user User qui positionne la remise
* \param remise
* \return int < 0 si ko , > 0 si ok
*/
2005-09-15 02:37:03 +02:00
function set_remise ( $user , $remise )
{
2006-04-29 17:09:44 +02:00
$remise = trim ( $remise ) ? trim ( $remise ) : 0 ;
2005-09-15 02:37:03 +02:00
if ( $user -> rights -> commande -> creer )
{
2006-04-29 17:09:44 +02:00
$remise = price2num ( $remise );
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET remise_percent = ' . $remise ;
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut = 0 ;' ;
if ( $this -> db -> query ( $sql ))
2005-09-15 02:37:03 +02:00
{
$this -> remise_percent = $remise ;
2006-04-29 17:09:44 +02:00
$this -> update_price ( $this -> id );
2005-09-15 02:37:03 +02:00
return 1 ;
}
else
{
2006-04-29 17:09:44 +02:00
$this -> error = $this -> db -> error ();
return - 1 ;
2005-09-15 02:37:03 +02:00
}
}
}
2006-04-29 17:09:44 +02:00
/**
* \brief Applique une remise absolue
* \param user User qui positionne la remise
* \param remise
* \return int < 0 si ko , > 0 si ok
*/
function set_remise_absolue ( $user , $remise )
{
$remise = trim ( $remise ) ? trim ( $remise ) : 0 ;
if ( $user -> rights -> commande -> creer )
{
$remise = price2num ( $remise );
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET remise_absolue = ' . $remise ;
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut = 0 ;' ;
dolibarr_syslog ( " Commande::set_remise_absolue sql= $sql " );
if ( $this -> db -> query ( $sql ))
{
$this -> remise_absolue = $remise ;
$this -> update_price ( $this -> id );
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
}
/**
2006-06-17 01:55:20 +02:00
* \brief Mets <EFBFBD> jour le prix total de la commnde
2006-04-29 17:09:44 +02:00
* \return int < 0 si ko , > 0 si ok
*/
function update_price ()
{
2006-06-17 01:55:20 +02:00
include_once ( DOL_DOCUMENT_ROOT . '/lib/price.lib.php' );
// Liste des lignes factures a sommer
$sql = " SELECT price, qty, tva_tx, total_ht, total_tva, total_ttc " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " commandedet " ;
2006-04-29 17:09:44 +02:00
$sql .= " WHERE fk_commande = " . $this -> id ;
2006-06-17 01:55:20 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
2006-04-29 17:09:44 +02:00
{
2006-06-17 01:55:20 +02:00
$this -> total_ht = 0 ;
$this -> total_tva = 0 ;
$this -> total_ttc = 0 ;
$num = $this -> db -> num_rows ( $result );
2006-04-29 17:09:44 +02:00
$i = 0 ;
while ( $i < $num )
{
2006-06-17 01:55:20 +02:00
$obj = $this -> db -> fetch_object ( $result );
$this -> total_ht += $obj -> total_ht ;
$this -> total_tva += ( $obj -> total_ttc - $obj -> total_ht );
$this -> total_ttc += $obj -> total_ttc ;
// Anciens indicateurs
$this -> amount_ht += $obj -> price * $obj -> qty ;
$this -> total_remise += 0 ; // Plus de remise globale (toute remise est sur une ligne)
/* \deprecated car simplifie par les 3 indicateurs total_ht , total_tva et total_ttc sur lignes
2006-04-29 17:09:44 +02:00
$products [ $i ][ 0 ] = $obj -> price ;
$products [ $i ][ 1 ] = $obj -> qty ;
$products [ $i ][ 2 ] = $obj -> tva_tx ;
2006-06-17 01:55:20 +02:00
*/
2006-04-29 17:09:44 +02:00
$i ++ ;
}
2006-06-17 01:55:20 +02:00
$this -> db -> free ( $result );
2006-04-29 17:09:44 +02:00
}
2006-06-17 01:55:20 +02:00
/* \deprecated car simplifie par les 3 indicateurs total_ht , total_tva et total_ttc sur lignes
2006-04-29 17:09:44 +02:00
$calculs = calcul_price ( $products , $this -> remise_percent , $this -> remise_absolue );
$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 ];
2006-06-17 01:55:20 +02:00
*/
2006-04-29 17:09:44 +02:00
// Met a jour en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET " ;
2006-06-17 01:55:20 +02:00
$sql .= " amount_ht=' " . price2num ( $this -> total_ht ) . " ' " ;
$sql .= " , total_ht=' " . price2num ( $this -> total_ht ) . " ' " ;
$sql .= " , tva=' " . price2num ( $this -> total_tva ) . " ' " ;
$sql .= " , total_ttc=' " . price2num ( $this -> total_ttc ) . " ' " ;
2006-04-29 17:09:44 +02:00
$sql .= " , remise=' " . price2num ( $this -> total_remise ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> id ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
2006-06-17 01:55:20 +02:00
dolibarr_syslog ( " Commande::update_price error= " . $this -> error );
2006-04-29 17:09:44 +02:00
return - 1 ;
}
}
2006-05-25 17:34:22 +02:00
/**
* \brief Mets <EFBFBD> jour les commentaires priv<EFBFBD> s
* \param note Commentaire
* \return int < 0 si ko , > 0 si ok
*/
function update_note ( $note )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= " SET note = ' " . addslashes ( $note ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
$this -> note = $note ;
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
/**
* \brief Mets <EFBFBD> jour les commentaires publiques
* \param note_public Commentaire
* \return int < 0 si ko , > 0 si ok
*/
function update_note_public ( $note_public )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= " SET note_public = ' " . addslashes ( $note_public ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
$this -> note_public = $note_public ;
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2006-04-29 17:09:44 +02:00
/**
2006-03-01 16:10:17 +01:00
* \brief D<EFBFBD> finit une date de livraison
2006-03-18 20:58:33 +01:00
* \param user Objet utilisateur qui modifie
* \param date_livraison Date de livraison
* \return int < 0 si ko , > 0 si ok
2006-03-01 16:10:17 +01:00
*/
function set_date_livraison ( $user , $date_livraison )
{
if ( $user -> rights -> commande -> creer )
{
2006-06-01 01:22:52 +02:00
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande " ;
2006-06-06 01:04:13 +02:00
$sql .= " SET date_livraison = " . ( $date_livraison ? $this -> db -> idate ( $date_livraison ) : 'null' );
2006-03-01 16:10:17 +01:00
$sql .= " WHERE rowid = " . $this -> id . " AND fk_statut = 0 " ;
2006-06-06 01:04:13 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
2006-03-01 16:10:17 +01:00
{
$this -> date_livraison = $date_livraison ;
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
2006-06-06 01:04:13 +02:00
dolibarr_syslog ( " Commande::set_date_livraison Erreur SQL sql= $sql " );
2006-03-01 16:10:17 +01:00
return - 1 ;
}
}
2006-06-06 01:04:13 +02:00
else
{
return - 2 ;
}
2006-03-01 16:10:17 +01:00
}
2006-04-21 18:06:44 +02:00
/**
* \brief D<EFBFBD> finit une adresse de livraison
* \param user Objet utilisateur qui modifie
* \param adresse_livraison Adresse de livraison
* \return int < 0 si ko , > 0 si ok
*/
function set_adresse_livraison ( $user , $adresse_livraison )
{
if ( $user -> rights -> commande -> creer )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET fk_adresse_livraison = ' " . $adresse_livraison . " ' " ;
$sql .= " WHERE rowid = " . $this -> id . " AND fk_statut = 0 " ;
if ( $this -> db -> query ( $sql ) )
{
$this -> adresse_livraison_id = $adresse_livraison ;
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
dolibarr_syslog ( " Commande::set_adresse_livraison Erreur SQL " );
return - 1 ;
}
}
}
2006-02-19 14:27:42 +01:00
/**
* \brief Renvoi la liste des propal ( <EFBFBD> ventuellement filtr<EFBFBD> e sur un user ) dans un tableau
* \param brouillon 0 = non brouillon , 1 = brouillon
* \param user Objet user de filtre
* \return int - 1 si erreur , tableau r<EFBFBD> sultat si ok
*/
function liste_array ( $brouillon = 0 , $user = '' )
{
$ga = array ();
$sql = " SELECT rowid, ref FROM " . MAIN_DB_PREFIX . " commande " ;
if ( $brouillon )
{
$sql .= " WHERE fk_statut = 0 " ;
if ( $user )
{
$sql .= " AND fk_user_author " . $user ;
}
}
else
{
if ( $user )
{
$sql .= " WHERE fk_user_author " . $user ;
}
}
$sql .= " ORDER BY date_commande DESC " ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$numc = $this -> db -> num_rows ( $result );
if ( $numc )
{
$i = 0 ;
while ( $i < $numc )
{
$obj = $this -> db -> fetch_object ( $result );
$ga [ $obj -> rowid ] = $obj -> ref ;
$i ++ ;
}
}
return $ga ;
}
else
{
return - 1 ;
}
}
2006-02-15 18:00:59 +01:00
/**
* \brief Change les conditions de r<EFBFBD> glement de la commande
* \param cond_reglement_id Id de la nouvelle condition de r<EFBFBD> glement
* \return int > 0 si ok , < 0 si ko
*/
function cond_reglement ( $cond_reglement_id )
{
dolibarr_syslog ( 'Commande::cond_reglement(' . $cond_reglement_id . ')' );
if ( $this -> statut >= 0 )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET fk_cond_reglement = ' . $cond_reglement_id ;
$sql .= ' WHERE rowid=' . $this -> id ;
if ( $this -> db -> query ( $sql ) )
{
$this -> cond_reglement_id = $cond_reglement_id ;
return 1 ;
}
else
{
dolibarr_syslog ( 'Commande::cond_reglement Erreur ' . $sql . ' - ' . $this -> db -> error ());
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
else
{
dolibarr_syslog ( 'Commande::cond_reglement, etat commande incompatible' );
$this -> error = 'Etat commande incompatible ' . $this -> statut ;
return - 2 ;
}
}
/**
* \brief Change le mode de r<EFBFBD> glement
* \param mode Id du nouveau mode
* \return int > 0 si ok , < 0 si ko
*/
function mode_reglement ( $mode_reglement_id )
{
dolibarr_syslog ( 'Commande::mode_reglement(' . $mode_reglement_id . ')' );
if ( $this -> statut >= 0 )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande' ;
$sql .= ' SET fk_mode_reglement = ' . $mode_reglement_id ;
$sql .= ' WHERE rowid=' . $this -> id ;
if ( $this -> db -> query ( $sql ) )
{
$this -> mode_reglement_id = $mode_reglement_id ;
return 1 ;
}
else
{
dolibarr_syslog ( 'Commande::mode_reglement Erreur ' . $sql . ' - ' . $this -> db -> error ());
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
else
{
dolibarr_syslog ( 'Commande::mode_reglement, etat facture incompatible' );
$this -> error = 'Etat commande incompatible ' . $this -> statut ;
return - 2 ;
}
}
2005-10-14 01:22:21 +02:00
/**
* \brief Positionne numero reference commande client
* \param user Utilisateur qui modifie
* \param ref_client Reference commande client
* \return int < 0 si ko , > 0 si ok
*/
2005-09-15 02:37:03 +02:00
function set_ref_client ( $user , $ref_client )
{
if ( $user -> rights -> commande -> creer )
{
2005-10-14 01:22:21 +02:00
dolibarr_syslog ( 'Commande::set_ref_client this->id=' . $this -> id . ', ref_client=' . $ref_client );
2005-09-15 02:37:03 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET ref_client = ' . ( empty ( $ref_client ) ? 'NULL' : '\'' . addslashes ( $ref_client ) . '\'' );
2005-10-14 01:22:21 +02:00
$sql .= ' WHERE rowid = ' . $this -> id ;
2005-09-15 02:37:03 +02:00
if ( $this -> db -> query ( $sql ) )
{
$this -> ref_client = $ref_client ;
return 1 ;
}
else
{
2005-10-14 01:22:21 +02:00
$this -> error = $this -> db -> error ();
dolibarr_syslog ( 'Commande::set_ref_client Erreur ' . $this -> error . ' - ' . $sql );
return - 2 ;
2005-09-15 02:37:03 +02:00
}
}
2005-10-14 01:22:21 +02:00
else
{
return - 1 ;
}
2005-09-15 02:37:03 +02:00
}
2005-10-14 01:22:21 +02:00
2006-05-25 17:34:22 +02:00
2005-09-15 02:37:03 +02:00
/**
2006-05-25 17:34:22 +02:00
* \brief Classe la commande comme factur<EFBFBD> e
* \return int < 0 si ko , > 0 si ok
2005-09-15 02:37:03 +02:00
*/
function classer_facturee ()
{
2006-06-01 17:44:30 +02:00
global $conf ;
2005-09-15 02:37:03 +02:00
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET facture = 1' ;
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut > 0 ;' ;
if ( $this -> db -> query ( $sql ) )
{
2006-06-02 10:53:03 +02:00
if (( $conf -> global -> PROPALE_CLASSIFIED_INVOICED_WITH_ORDER == 1 ) && $this -> propale_id )
2006-06-01 17:44:30 +02:00
{
$propal = new Propal ( $this -> db );
$propal -> fetch ( $this -> propale_id );
$propal -> classer_facturee ();
}
2005-09-15 02:37:03 +02:00
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
2006-04-29 17:09:44 +02:00
2005-09-15 02:37:03 +02:00
/**
* \brief Mets <EFBFBD> jour une ligne de commande
* \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 tva_tx Taux TVA
* \return int < 0 si erreur , > 0 si ok
*/
2006-06-17 01:55:20 +02:00
function update_line ( $rowid , $desc , $pu , $qty , $remise_percent = 0 , $txtva )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
dolibarr_syslog ( " Commande::UpdateLine $rowid , $desc , $pu , $qty , $remise_percent , $txtva " );
include_once ( DOL_DOCUMENT_ROOT . '/lib/price.lib.php' );
2005-09-15 02:37:03 +02:00
if ( $this -> brouillon )
{
$this -> db -> begin ();
2005-10-18 21:56:29 +02:00
2006-06-17 01:55:20 +02:00
// Nettoyage param<61> tres
$remise_percent = price2num ( $remise_percent );
$qty = price2num ( $qty );
if ( ! $qty ) $qty = 1 ;
$pu = price2num ( $pu );
$txtva = price2num ( $txtva );
// 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 , $remise_percent , $txtva );
$total_ht = $tabprice [ 0 ];
$total_tva = $tabprice [ 1 ];
$total_ttc = $tabprice [ 2 ];
// Anciens indicateurs: $price, $subprice, $remise (a ne plus utiliser)
2005-10-18 21:56:29 +02:00
$price = $pu ;
2006-06-17 01:55:20 +02:00
$subprice = $pu ;
$remise = 0 ;
2005-10-18 21:56:29 +02:00
if ( $remise_percent > 0 )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = ( $pu - $remise );
2005-09-15 02:37:03 +02:00
}
2006-06-17 01:55:20 +02:00
$price = price2num ( $price );
$subprice = price2num ( $subprice );
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " commandedet SET " ;
$sql .= " description=' " . addslashes ( $desc ) . " ' " ;
$sql .= " ,price=' " . price2num ( $price ) . " ' " ;
$sql .= " ,subprice=' " . price2num ( $subprice ) . " ' " ;
$sql .= " ,remise=' " . price2num ( $remise ) . " ' " ;
$sql .= " ,remise_percent=' " . price2num ( $remise_percent ) . " ' " ;
$sql .= " ,tva_tx=' " . price2num ( $txtva ) . " ' " ;
$sql .= " ,qty=' " . price2num ( $qty ) . " ' " ;
2006-06-17 20:12:46 +02:00
//if ($date_end) { $sql.= ",date_start='$date_end'"; }
2006-06-17 01:55:20 +02:00
//else { $sql.=',date_start=null'; }
2006-06-17 20:12:46 +02:00
//if ($date_end) { $sql.= ",date_end='$date_end'"; }
2006-06-17 01:55:20 +02:00
//else { $sql.=',date_end=null'; }
//$sql.= " info_bits=".$info_bits.",";
$sql .= " ,total_ht=' " . price2num ( $total_ht ) . " ' " ;
$sql .= " ,total_tva=' " . price2num ( $total_tva ) . " ' " ;
$sql .= " ,total_ttc=' " . price2num ( $total_ttc ) . " ' " ;
$sql .= " WHERE rowid = " . $rowid ;
$result = $this -> db -> query ( $sql );
if ( $result > 0 )
2005-09-15 02:37:03 +02:00
{
2006-06-17 01:55:20 +02:00
// Mise a jour info denormalisees au niveau facture
2005-09-15 02:37:03 +02:00
$this -> update_price ( $this -> id );
$this -> db -> commit ();
2006-06-17 01:55:20 +02:00
return $result ;
2005-09-15 02:37:03 +02:00
}
else
{
2006-06-17 01:55:20 +02:00
$this -> error = $this -> db -> error ();
2005-09-15 02:37:03 +02:00
$this -> db -> rollback ();
return - 1 ;
}
}
else
{
2006-06-17 01:55:20 +02:00
$this -> error = " Commande::updateline Order status makes operation forbidden " ;
2005-09-15 02:37:03 +02:00
return - 2 ;
}
}
2006-05-06 17:15:48 +02:00
2005-09-15 02:37:03 +02:00
/**
* Supprime la commande
*
*/
function delete ()
{
2006-06-07 21:13:45 +02:00
global $conf , $lang ;
2005-09-15 02:37:03 +02:00
$err = 0 ;
$this -> db -> begin ();
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commandedet WHERE fk_commande = $this->id ; " ;
if ( ! $this -> db -> query ( $sql ) )
{
$err ++ ;
}
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " commande WHERE rowid = $this->id ; " ;
if ( ! $this -> db -> query ( $sql ) )
{
$err ++ ;
}
$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . " co_pr WHERE fk_commande = $this->id ; " ;
if ( ! $this -> db -> query ( $sql ) )
{
$err ++ ;
}
2006-06-07 21:13:45 +02:00
// On efface le r<> pertoire de pdf provisoire
$comref = sanitize_string ( $this -> ref );
if ( $conf -> commande -> dir_output )
{
$dir = $conf -> commande -> dir_output . " / " . $comref ;
$file = $conf -> commande -> dir_output . " / " . $comref . " / " . $comref . " .pdf " ;
if ( file_exists ( $file ))
{
2006-06-09 16:38:19 +02:00
commande_delete_preview ( $this -> db , $this -> id , $this -> ref );
2006-06-09 14:45:52 +02:00
2006-06-07 21:13:45 +02:00
if ( ! dol_delete_file ( $file ))
{
$this -> error = $langs -> trans ( " ErrorCanNotDeleteFile " , $file );
return 0 ;
}
}
if ( file_exists ( $dir ))
{
if ( ! dol_delete_dir ( $dir ))
{
$this -> error = $langs -> trans ( " ErrorCanNotDeleteDir " , $dir );
return 0 ;
}
}
}
2005-09-15 02:37:03 +02:00
if ( $err == 0 )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
2006-03-18 20:58:33 +01:00
/**
* \brief Classer la commande dans un projet
* \param cat_id Id du projet
*/
2005-09-15 02:37:03 +02:00
function classin ( $cat_id )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET fk_projet = $cat_id " ;
$sql .= " WHERE rowid = $this->id ; " ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2006-03-18 20:58:33 +01:00
2005-07-15 00:29:49 +02:00
/**
2005-08-30 23:07:53 +02:00
* \brief Charge indicateurs this -> nbtodo et this -> nbtodolate de tableau de bord
* \param user Objet user
* \return int < 0 si ko , > 0 si ok
2005-07-15 00:29:49 +02:00
*/
2005-09-15 02:37:03 +02:00
function load_board ( $user )
{
2006-03-31 18:26:48 +02:00
global $conf , $user ;
2005-09-15 02:37:03 +02:00
$this -> nbtodo = $this -> nbtodolate = 0 ;
$sql = 'SELECT c.rowid,' . $this -> db -> pdate ( 'c.date_creation' ) . ' as datec' ;
2006-03-31 18:26:48 +02:00
if ( ! $user -> rights -> commercial -> client -> voir && ! $user -> societe_id ) $sql .= " , sc.fk_soc, sc.fk_user " ;
2005-09-15 02:37:03 +02:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
2006-03-31 18:26:48 +02:00
if ( ! $user -> rights -> commercial -> client -> voir && ! $user -> societe_id ) $sql .= " , " . MAIN_DB_PREFIX . " societe_commerciaux as sc " ;
2005-09-15 02:37:03 +02:00
$sql .= ' WHERE c.fk_statut BETWEEN 1 AND 2' ;
2006-03-31 18:26:48 +02:00
if ( $user -> societe_id ) $sql .= ' AND c.fk_soc = ' . $user -> societe_id ;
if ( ! $user -> rights -> commercial -> client -> voir && ! $user -> societe_id ) $sql .= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " . $user -> id ;
2005-09-15 02:37:03 +02:00
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
while ( $obj = $this -> db -> fetch_object ( $resql ))
{
$this -> nbtodo ++ ;
if ( $obj -> datec < ( time () - $conf -> commande -> traitement -> warning_delay )) $this -> nbtodolate ++ ;
}
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
return - 1 ;
}
}
2006-03-26 23:42:00 +02:00
/**
* \brief Retourne le libell<EFBFBD> du statut de la commande
* \param mode 0 = libell<EFBFBD> long , 1 = libell<EFBFBD> court , 2 = Picto + Libell<EFBFBD> court , 3 = Picto , 4 = Picto + Libell<EFBFBD> long , 5 = Libell<EFBFBD> court + Picto
* \return string Libell<EFBFBD>
*/
function getLibStatut ( $mode )
2005-09-15 02:37:03 +02:00
{
2006-05-25 22:07:09 +02:00
return $this -> LibStatut ( $this -> statut , $this -> facturee , $mode );
2005-09-15 02:37:03 +02:00
}
2005-09-04 23:01:32 +02:00
2006-03-26 23:42:00 +02:00
/**
* \brief Renvoi le libell<EFBFBD> d ' un statut donn<EFBFBD>
2006-05-20 11:19:20 +02:00
* \param statut Id statut
2006-05-20 14:16:18 +02:00
* \param facturee Si facturee
2006-03-26 23:42:00 +02:00
* \param mode 0 = libell<EFBFBD> long , 1 = libell<EFBFBD> court , 2 = Picto + Libell<EFBFBD> court , 3 = Picto , 4 = Picto + Libell<EFBFBD> long , 5 = Libell<EFBFBD> court + Picto
* \return string Libell<EFBFBD>
*/
2006-05-20 14:16:18 +02:00
function LibStatut ( $statut , $facturee , $mode )
2005-09-15 02:37:03 +02:00
{
2006-03-26 23:42:00 +02:00
global $langs ;
if ( $mode == 0 )
{
2006-05-20 11:19:20 +02:00
if ( $statut ==- 1 ) return $langs -> trans ( 'StatusOrderCanceled' );
if ( $statut == 0 ) return $langs -> trans ( 'StatusOrderDraft' );
if ( $statut == 1 ) return $langs -> trans ( 'StatusOrderValidated' );
if ( $statut == 2 ) return $langs -> trans ( 'StatusOrderOnProcess' );
if ( $statut == 3 && ! $facturee ) return $langs -> trans ( 'StatusOrderToBill' );
if ( $statut == 3 && $facturee ) return $langs -> trans ( 'StatusOrderProcessed' );
2006-03-26 23:42:00 +02:00
}
if ( $mode == 1 )
{
2006-05-20 11:19:20 +02:00
if ( $statut ==- 1 ) return $langs -> trans ( 'StatusOrderCanceledShort' );
if ( $statut == 0 ) return $langs -> trans ( 'StatusOrderDraftShort' );
if ( $statut == 1 ) return $langs -> trans ( 'StatusOrderValidatedShort' );
if ( $statut == 2 ) return $langs -> trans ( 'StatusOrderOnProcessShort' );
if ( $statut == 3 && ! $facturee ) return $langs -> trans ( 'StatusOrderToBillShort' );
if ( $statut == 3 && $facturee ) return $langs -> trans ( 'StatusOrderProcessed' );
2006-03-26 23:42:00 +02:00
}
if ( $mode == 2 )
{
2006-05-20 11:19:20 +02:00
if ( $statut ==- 1 ) return img_picto ( $langs -> trans ( 'StatusOrderCanceledShort' ), 'statut5' ) . ' ' . $langs -> trans ( 'StatusOrderCanceled' );
if ( $statut == 0 ) return img_picto ( $langs -> trans ( 'StatusOrderDraftShort' ), 'statut0' ) . ' ' . $langs -> trans ( 'StatusOrderDraft' );
if ( $statut == 1 ) return img_picto ( $langs -> trans ( 'StatusOrderValidatedShort' ), 'statut1' ) . ' ' . $langs -> trans ( 'StatusOrderValidated' );
if ( $statut == 2 ) return img_picto ( $langs -> trans ( 'StatusOrderOnProcessShort' ), 'statut3' ) . ' ' . $langs -> trans ( 'StatusOrderOnProcess' );
if ( $statut == 3 && ! $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderToBillShort' ), 'statut4' ) . ' ' . $langs -> trans ( 'StatusOrderToBill' );
if ( $statut == 3 && $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderProcessedShort' ), 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderProcessed' );
2006-03-26 23:42:00 +02:00
}
if ( $mode == 3 )
{
2006-05-01 23:53:00 +02:00
if ( $statut ==- 1 ) return img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' );
2006-03-26 23:42:00 +02:00
if ( $statut == 0 ) return img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' );
if ( $statut == 1 ) return img_picto ( $langs -> trans ( 'StatusOrderValidated' ), 'statut1' );
if ( $statut == 2 ) return img_picto ( $langs -> trans ( 'StatusOrderOnProcess' ), 'statut3' );
2006-05-20 11:19:20 +02:00
if ( $statut == 3 && ! $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' );
if ( $statut == 3 && $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderProcessed' ), 'statut6' );
2006-03-26 23:42:00 +02:00
}
if ( $mode == 4 )
{
2006-05-20 11:19:20 +02:00
if ( $statut ==- 1 ) return img_picto ( $langs -> trans ( 'StatusOrderCanceled' ), 'statut5' ) . ' ' . $langs -> trans ( 'StatusOrderCanceled' );
if ( $statut == 0 ) return img_picto ( $langs -> trans ( 'StatusOrderDraft' ), 'statut0' ) . ' ' . $langs -> trans ( 'StatusOrderDraft' );
if ( $statut == 1 ) return img_picto ( $langs -> trans ( 'StatusOrderValidated' ), 'statut1' ) . ' ' . $langs -> trans ( 'StatusOrderValidated' );
if ( $statut == 2 ) return img_picto ( $langs -> trans ( 'StatusOrderOnProcess' ), 'statut3' ) . ' ' . $langs -> trans ( 'StatusOrderOnProcess' );
if ( $statut == 3 && ! $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderToBill' ), 'statut4' ) . ' ' . $langs -> trans ( 'StatusOrderToBill' );
if ( $statut == 3 && $facturee ) return img_picto ( $langs -> trans ( 'StatusOrderProcessed' ), 'statut6' ) . ' ' . $langs -> trans ( 'StatusOrderProcessed' );
2006-03-26 23:42:00 +02:00
}
if ( $mode == 5 )
{
2006-05-20 11:19:20 +02:00
if ( $statut ==- 1 ) return $langs -> trans ( 'StatusOrderCanceledShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderCanceledShort' ), 'statut5' );
if ( $statut == 0 ) return $langs -> trans ( 'StatusOrderDraftShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderDraftShort' ), 'statut0' );
if ( $statut == 1 ) return $langs -> trans ( 'StatusOrderValidatedShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderValidatedShort' ), 'statut1' );
if ( $statut == 2 ) return $langs -> trans ( 'StatusOrderOnProcessShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderOnProcessShort' ), 'statut3' );
if ( $statut == 3 && ! $facturee ) return $langs -> trans ( 'StatusOrderToBillShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderToBillShort' ), 'statut4' );
if ( $statut == 3 && $facturee ) return $langs -> trans ( 'StatusOrderProcessedShort' ) . ' ' . img_picto ( $langs -> trans ( 'StatusOrderProcessedShort' ), 'statut6' );
2006-03-26 23:42:00 +02:00
}
2005-09-15 02:37:03 +02:00
}
2005-09-04 23:01:32 +02:00
2006-03-26 23:42:00 +02:00
2005-08-11 20:54:59 +02:00
/**
* \brief Charge les informations d 'ordre info dans l' objet commande
* \param id Id de la commande a charger
*/
2005-09-15 02:37:03 +02:00
function info ( $id )
{
$sql = 'SELECT c.rowid, ' . $this -> db -> pdate ( 'date_creation' ) . ' as datec,' ;
$sql .= ' ' . $this -> db -> pdate ( 'date_valid' ) . ' as datev,' ;
$sql .= ' ' . $this -> db -> pdate ( 'date_cloture' ) . ' as datecloture,' ;
$sql .= ' fk_user_author, fk_user_valid, fk_user_cloture' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande 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 ;
}
if ( $obj -> fk_user_cloture )
{
$cluser = new User ( $this -> db , $obj -> fk_user_cloture );
$cluser -> fetch ();
$this -> user_cloture = $cluser ;
}
$this -> date_creation = $obj -> datec ;
$this -> date_validation = $obj -> datev ;
$this -> date_cloture = $obj -> datecloture ;
}
$this -> db -> free ( $result );
}
else
{
dolibarr_print_error ( $this -> db );
}
}
}
/**
\class CommandeLigne
\brief Classe de gestion des lignes de commande
*/
class CommandeLigne
{
2006-06-17 18:52:30 +02:00
var $db ;
var $error ;
// From llx_commandedet
var $rowid ;
var $fk_facture ;
var $desc ; // Description ligne
var $product_id ; // Id produit pr<70> d<EFBFBD> fini
2006-06-16 02:33:04 +02:00
var $qty ;
var $tva_tx ;
var $subprice ;
2006-06-17 18:52:30 +02:00
var $remise ;
2006-06-16 02:33:04 +02:00
var $remise_percent ;
var $price ;
2006-06-17 18:52:30 +02:00
var $rang ;
2006-06-16 02:33:04 +02:00
var $coef ;
2006-06-17 18:52:30 +02:00
var $info_bits ; // Bit 0: 0 si TVA normal - 1 si TVA NPR
var $total_ht ; // Total HT de la ligne toute quantit<69> et incluant la remise ligne
var $total_tva ; // Total TVA de la ligne toute quantit<69> et incluant la remise ligne
var $total_ttc ; // Total TTC de la ligne toute quantit<69> et incluant la remise ligne
2006-02-08 16:13:50 +01:00
2006-06-16 02:33:04 +02:00
// From llx_product
2006-06-17 18:52:30 +02:00
var $ref ; // Reference produit
var $libelle ; // Label produit
var $product_desc ; // Description produit
2006-06-16 02:33:04 +02:00
2006-06-17 16:13:49 +02:00
/**
* \brief Constructeur d ' objets ligne de commande
* \param DB handler d ' acc<EFBFBD> s base de donn<EFBFBD> e
*/
function CommandeLigne ( $DB )
2005-09-15 02:37:03 +02:00
{
2006-06-17 16:13:49 +02:00
$this -> db = $DB ;
2005-09-15 02:37:03 +02:00
}
2006-06-17 16:13:49 +02:00
/**
* \brief Recup<EFBFBD> re l ' objet ligne de commande
* \param rowid id de la ligne de commande
*/
function fetch ( $rowid )
{
2006-06-17 20:12:46 +02:00
$sql = 'SELECT cd.rowid, cd.fk_commande, cd.fk_product, cd.description, cd.price, cd.qty, cd.tva_tx,' ;
$sql .= ' cd.label,' ;
$sql .= ' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice,' ;
$sql .= ' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_ttc, cd.coef, cd.rang,' ;
$sql .= ' p.ref as product_ref, p.label as product_libelle, p.description as product_desc' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as cd' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON cd.fk_product = p.rowid' ;
$sql .= ' WHERE cd.rowid = ' . $rowid ;
2006-06-17 16:13:49 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$objp = $this -> db -> fetch_object ( $result );
2006-06-17 20:12:46 +02:00
$this -> rowid = $objp -> rowid ;
2006-06-17 16:13:49 +02:00
$this -> fk_propal = $objp -> fk_propal ;
$this -> label = $objp -> label ;
$this -> desc = $objp -> description ;
$this -> qty = $objp -> qty ;
$this -> price = $objp -> price ;
$this -> subprice = $objp -> subprice ;
2006-06-17 20:12:46 +02:00
$this -> tva_tx = $objp -> tva_tx ;
2006-06-17 16:13:49 +02:00
$this -> remise = $objp -> remise ;
$this -> remise_percent = $objp -> remise_percent ;
$this -> fk_remise_except = $objp -> fk_remise_except ;
$this -> produit_id = $objp -> fk_product ;
$this -> info_bits = $objp -> info_bits ;
$this -> total_ht = $objp -> total_ht ;
$this -> total_tva = $objp -> total_tva ;
$this -> total_ttc = $objp -> total_ttc ;
$this -> coef = $objp -> coef ;
$this -> rang = $objp -> rang ;
2006-06-17 20:12:46 +02:00
$this -> ref = $objp -> product_ref ;
$this -> libelle = $objp -> product_libelle ;
$this -> product_desc = $objp -> product_desc ;
2006-06-17 16:13:49 +02:00
$this -> db -> free ( $result );
}
else
{
dolibarr_print_error ( $this -> db );
}
2006-06-17 18:52:30 +02:00
}
/**
* \brief Ins<EFBFBD> re l ' objet ligne de commande en base
* \return int < 0 si ko , > 0 si ok
*/
function insert ()
{
$this -> db -> begin ();
// Insertion dans base de la ligne
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commandedet' ;
$sql .= ' (fk_commande, description, price, qty, tva_tx,' ;
$sql .= ' fk_product, remise_percent, subprice, remise, fk_remise_except, ' ;
$sql .= ' rang, coef,' ;
$sql .= ' info_bits, total_ht, total_tva, total_ttc)' ;
$sql .= " VALUES ( " . $this -> fk_commande . " , " ;
$sql .= " ' " . addslashes ( $this -> desc ) . " ', " ;
$sql .= " ' " . price2num ( $this -> price ) . " ', " ;
$sql .= " ' " . price2num ( $this -> qty ) . " ', " ;
2006-06-17 20:12:46 +02:00
$sql .= " ' " . price2num ( $this -> tva_tx ) . " ', " ;
2006-06-17 18:52:30 +02:00
if ( $this -> fk_product ) { $sql .= " ' " . $this -> fk_product . " ', " ; }
else { $sql .= '0,' ; }
$sql .= " ' " . price2num ( $this -> remise_percent ) . " ', " ;
$sql .= " ' " . price2num ( $this -> subprice ) . " ', " ;
$sql .= " ' " . price2num ( $this -> remise ) . " ', " ;
if ( $this -> fk_remise_except ) $sql .= $this -> fk_remise_except . " , " ;
else $sql .= 'null,' ;
$sql .= ' ' . $this -> rang . ',' ;
if ( isset ( $this -> coef )) $sql .= ' ' . $this -> coef . ',' ;
else $sql .= ' null,' ;
$sql .= " ' " . $this -> info_bits . " ', " ;
$sql .= " ' " . price2num ( $this -> total_ht ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_tva ) . " ', " ;
$sql .= " ' " . price2num ( $this -> total_ttc ) . " ' " ;
$sql .= ')' ;
dolibarr_syslog ( " CommandeLigne::insert sql= $sql " );
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
dolibarr_syslog ( " CommandeLigne::insert Error " . $this -> error );
$this -> db -> rollback ();
return - 2 ;
}
}
/**
* \brief Mise a jour de l ' objet ligne de commande en base
* \return int < 0 si ko , > 0 si ok
*/
function update ()
{
$this -> db -> begin ();
// Mise a jour ligne en base
$sql = " UPDATE " . MAIN_DB_PREFIX . " commandedet SET " ;
$sql .= " description=' " . addslashes ( $this -> desc ) . " ' " ;
$sql .= " ,price=' " . price2num ( $this -> price ) . " ' " ;
$sql .= " ,subprice=' " . price2num ( $this -> subprice ) . " ' " ;
$sql .= " ,remise=' " . price2num ( $this -> remise ) . " ' " ;
$sql .= " ,remise_percent=' " . price2num ( $this -> remise_percent ) . " ' " ;
if ( $fk_remise_except ) $sql .= " ,fk_remise_except= " . $this -> fk_remise_except ;
else $sql .= " ,fk_remise_except=null " ;
2006-06-17 20:12:46 +02:00
$sql .= " ,tva_tx=' " . price2num ( $this -> tva_tx ) . " ' " ;
2006-06-17 18:52:30 +02:00
$sql .= " ,qty=' " . price2num ( $this -> qty ) . " ' " ;
$sql .= " ,rang=' " . $this -> rang . " ' " ;
$sql .= " ,coef=' " . $this -> coef . " ' " ;
$sql .= " ,info_bits=' " . $this -> info_bits . " ' " ;
$sql .= " ,total_ht=' " . price2num ( $this -> total_ht ) . " ' " ;
$sql .= " ,total_tva=' " . price2num ( $this -> total_tva ) . " ' " ;
$sql .= " ,total_ttc=' " . price2num ( $this -> total_ttc ) . " ' " ;
$sql .= " WHERE rowid = " . $this -> rowid ;
dolibarr_syslog ( " CommandeLigne::update sql= $sql " );
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
dolibarr_syslog ( " CommandeLigne::update Error " . $this -> error );
$this -> db -> rollback ();
return - 2 ;
}
}
2005-09-15 02:37:03 +02:00
}
2006-02-03 17:42:39 +01:00
?>