2005-09-15 02:37:03 +02:00
< ? php
/* Copyright ( C ) 2003 - 2005 Rodolphe Quiedeville < rodolphe @ quiedeville . org >
* Copyright ( C ) 2004 - 2005 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
2005-09-11 18:51:41 +02:00
require_once ( DOL_DOCUMENT_ROOT . " /product.class.php " );
2005-09-15 02:37:03 +02:00
/**
\class Commande
\brief Classe de gestion de commande
*/
class Commande
{
var $db ;
var $id ;
2006-02-09 14:12:14 +01:00
var $socidp ;
var $contactid ;
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 ;
2005-09-15 02:37:03 +02:00
// Pour board
var $nbtodo ;
var $nbtodolate ;
/**
* \brief Constructeur
* \param DB Handler d ' acc<EFBFBD> s base
*/
function Commande ( $DB )
{
global $langs ;
$langs -> load ( 'orders' );
$this -> db = $DB ;
$this -> statuts [ - 1 ] = $langs -> trans ( 'StatusOrderCanceled' );
$this -> statuts [ 0 ] = $langs -> trans ( 'StatusOrderDraft' );
$this -> statuts [ 1 ] = $langs -> trans ( 'StatusOrderValidated' );
$this -> statuts [ 2 ] = $langs -> trans ( 'StatusOrderOnProcess' );
$this -> statuts [ 3 ] = $langs -> trans ( 'StatusOrderProcessed' );
$this -> status_label_short [ - 1 ] = $langs -> trans ( 'StatusOrderCanceled' );
$this -> status_label_short [ 0 ] = $langs -> trans ( 'StatusOrderDraft' );
$this -> status_label_short [ 1 ] = $langs -> trans ( 'StatusOrderValidated' );
$this -> status_label_short [ 2 ] = $langs -> trans ( 'StatusOrderOnProcessShort' );
$this -> status_label_short [ 3 ] = $langs -> trans ( 'StatusOrderProcessed' );
$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' );
$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 ;
}
$this -> soc_id = $propal -> soc_id ;
2006-02-16 19:38:07 +01:00
$this -> cond_reglement_id = $propal -> cond_reglement_id ;
$this -> mode_reglement_id = $propal -> mode_reglement_id ;
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 ;
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 );
$num = $objMod -> commande_get_num ( $soc );
$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 ) )
{
$result = 1 ;
}
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 ;
}
/**
* \brief Cloture la commande
* \param user Objet utilisateur qui cloture
* \return int < 0 si ko , > 0 si ok
*/
function cloture ( $user )
{
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 ) )
{
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 );
}
}
}
/**
* Cr<EFBFBD> <EFBFBD> la commande
*
*/
function create ( $user )
{
2006-02-03 17:42:39 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
/* On positionne en mode brouillon la commande */
$this -> brouillon = 1 ;
if ( ! $remise )
{
$remise = 0 ;
}
if ( ! $this -> projetid )
{
$this -> projetid = 0 ;
}
2006-02-16 15:25:57 +01:00
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commande (fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note, ref_client, model_pdf, fk_cond_reglement, fk_mode_reglement) ' ;
2006-02-16 17:46:00 +01:00
$sql .= ' VALUES (' . $this -> soc_id . ', now(), ' . $user -> id . ', ' . $this -> projetid . ', ' . $this -> db -> idate ( $this -> date_commande ) . ', ' . $this -> source . ', \'' . $this -> note . '\', \'' . $this -> ref_client . '\', \'' . $this -> modelpdf . '\', \'' . $this -> cond_reglement_id . '\', \'' . $this -> mode_reglement_id . '\')' ;
2005-09-15 02:37:03 +02:00
if ( $this -> db -> query ( $sql ) )
{
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . 'commande' );
/*
* Insertion des produits dans la base
*/
for ( $i = 0 ; $i < sizeof ( $this -> products ) ; $i ++ )
{
$prod = new Product ( $this -> db , $this -> products [ $i ]);
if ( $prod -> fetch ( $this -> products [ $i ]))
{
2006-02-21 13:49:48 +01:00
$this -> soc_id ;
$client = new Societe ( $this -> db );
$client -> fetch ( $this -> soc_id );
if ( $client -> tva_assuj == " 0 " )
$tva_tx = " 0 " ;
else
$tva_tx = $prod -> tva_tx ;
2006-02-03 17:42:39 +01:00
// multiprix
if ( $conf -> global -> PRODUIT_MULTIPRICES == 1 )
{
2006-02-21 13:49:48 +01:00
2006-02-03 17:42:39 +01:00
//$prod->multiprices[$client->price_level]
$this -> insert_product_generic ( $prod -> libelle ,
2006-02-12 10:32:10 +01:00
$prod -> description ,
2006-02-03 17:42:39 +01:00
$prod -> multiprices [ $client -> price_level ],
$this -> products_qty [ $i ],
2006-02-21 13:49:48 +01:00
$tva_tx ,
2006-02-03 17:42:39 +01:00
$this -> products [ $i ],
$this -> products_remise_percent [ $i ]);
}
else
{
$this -> insert_product_generic ( $prod -> libelle ,
2006-02-12 10:32:10 +01:00
$prod -> description ,
2005-09-15 02:37:03 +02:00
$prod -> price ,
$this -> products_qty [ $i ],
2006-02-21 13:49:48 +01:00
$tva_tx ,
2005-09-15 02:37:03 +02:00
$this -> products [ $i ],
$this -> products_remise_percent [ $i ]);
2006-02-03 17:42:39 +01:00
}
2005-09-15 02:37:03 +02:00
}
}
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET ref='(PROV " . $this -> id . " )' WHERE rowid= " . $this -> id ;
if ( $this -> db -> query ( $sql ))
{
if ( $this -> id && $this -> propale_id )
{
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'co_pr (fk_commande, fk_propale) VALUES (' . $this -> id . ',' . $this -> propale_id . ')' ;
$this -> db -> query ( $sql );
}
/*
* Produits
*
*/
for ( $i = 0 ; $i < sizeof ( $this -> lines ) ; $i ++ )
{
$result_insert = $this -> insert_product_generic (
$this -> lines [ $i ] -> libelle ,
2006-02-12 10:32:10 +01:00
$this -> lines [ $i ] -> description ,
2005-09-15 02:37:03 +02:00
$this -> lines [ $i ] -> price ,
$this -> lines [ $i ] -> qty ,
$this -> lines [ $i ] -> tva_tx ,
$this -> lines [ $i ] -> product_id ,
$this -> lines [ $i ] -> remise_percent );
if ( $result_insert < 0 )
{
dolibarr_print_error ( $this -> db );
}
}
return $this -> id ;
}
else
{
return - 1 ;
}
}
else
{
dolibarr_print_error ( $this -> db );
return 0 ;
}
}
/**
* Ajoute un produit
*
*/
2006-02-12 10:32:10 +01:00
function insert_product_generic ( $p_desc , $p_product_desc , $p_price , $p_qty , $p_tva_tx = 19.6 , $p_product_id = 0 , $remise_percent = 0 )
2005-09-15 02:37:03 +02:00
{
2006-02-12 11:36:29 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
if ( $this -> statut == 0 )
{
if ( strlen ( trim ( $p_qty )) == 0 )
{
$p_qty = 1 ;
}
$p_price = ereg_replace ( ',' , '.' , $p_price );
$price = $p_price ;
$subprice = $p_price ;
if ( $remise_percent > 0 )
{
$remise = round (( $p_price * $remise_percent / 100 ), 2 );
$price = $p_price - $remise ;
}
2006-02-12 10:32:10 +01:00
2006-02-12 20:55:29 +01:00
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commandedet (fk_commande, fk_product, qty, price, tva_tx, label, description, remise_percent, subprice) VALUES ' ;
2006-02-13 17:42:11 +01:00
$sql .= " (' " . $this -> id . " ', ' $p_product_id ',' " . $p_qty . " ',' " . price2num ( $price ) . " ',' " . $p_tva_tx . " ',' " . addslashes ( $p_desc ) . " ',' " . addslashes ( $p_product_desc ) . " ', ' $remise_percent ', ' $subprice ') ; " ;
2006-02-12 20:55:29 +01:00
2006-02-13 17:42:11 +01:00
// Bugfix
/*
2006-02-12 20:55:29 +01:00
if ( $conf -> global -> CHANGE_PROD_DESC )
{
2006-02-13 15:13:44 +01:00
$sql .= " (' " . $this -> id . " ', ' $p_product_id ',' " . $p_qty . " ',' " . price2num ( $price ) . " ',' " . $p_tva_tx . " ',' " . addslashes ( $p_desc ) . " ',' " . addslashes ( $p_product_desc ) . " ', ' $remise_percent ', ' $subprice ') ; " ;
2006-02-12 20:55:29 +01:00
}
else
{
2006-02-13 17:42:11 +01:00
$sql .= " (' " . $this -> id . " ', ' $p_product_id ',' " . $p_qty . " ',' " . price2num ( $price ) . " ',' " . $p_tva_tx . " ',' " . addslashes ( $p_desc ) . " ',' " . addslashes ( $p_product_desc ) . " ', ' $remise_percent ', ' $subprice ') ; " ;
2006-02-12 20:55:29 +01:00
}
2006-02-13 17:42:11 +01:00
*/
2006-02-12 20:55:29 +01:00
2005-09-15 02:37:03 +02:00
if ( $this -> db -> query ( $sql ) )
{
if ( $this -> update_price () > 0 )
{
return 1 ;
}
else
{
return - 1 ;
}
}
else
{
dolibarr_print_error ( $this -> db );
return - 2 ;
}
}
}
/**
* Ajoute une ligne de commande
*
*/
2006-02-11 18:18:48 +01:00
function addline ( $desc , $product_desc , $pu , $qty , $txtva , $fk_product = 0 , $remise_percent = 0 )
2005-09-15 02:37:03 +02:00
{
2006-02-03 17:42:39 +01:00
global $conf ;
2005-09-15 02:37:03 +02:00
// Nettoyage parametres
$qty = ereg_replace ( ',' , '.' , $qty );
$pu = ereg_replace ( ',' , '.' , $pu );
$desc = trim ( $desc );
2006-02-11 18:53:56 +01:00
$product_desc = trim ( $product_desc );
2005-09-15 02:37:03 +02:00
if ( strlen ( trim ( $qty )) == 0 )
{
$qty = 1 ;
}
// Verifs
if ( ! $this -> brouillon ) return - 1 ;
$this -> db -> begin ();
if ( $fk_product > 0 )
{
$prod = new Product ( $this -> db , $fk_product );
if ( $prod -> fetch ( $fk_product ) > 0 )
{
2006-02-11 18:36:14 +01:00
$desc = $desc ? $desc : $prod -> libelle ;
2006-02-12 21:05:55 +01:00
$product_desc = $prod -> description ;
2006-02-21 13:49:48 +01:00
$client = new Societe ( $this -> db );
$client -> fetch ( $this -> soc_id );
if ( $client -> tva_assuj == " 0 " )
$txtva = " 0 " ;
else
$txtva = $prod -> tva_tx ;
2006-02-03 17:42:39 +01:00
// multiprix
if ( $conf -> global -> PRODUIT_MULTIPRICES == 1 )
{
$pu = $prod -> multiprices [ $client -> price_level ];
}
else
$pu = $prod -> price ;
2006-02-21 13:49:48 +01:00
2005-09-15 02:37:03 +02:00
}
}
$remise = 0 ;
$price = round ( ereg_replace ( ',' , '.' , $pu ), 2 );
$subprice = $price ;
if ( trim ( strlen ( $remise_percent )) > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commandedet (fk_commande,label,description,fk_product, price,qty,tva_tx, remise_percent, subprice, remise)' ;
2006-02-11 19:02:29 +01:00
if ( $conf -> global -> CHANGE_PROD_DESC )
{
2006-02-11 19:16:48 +01:00
$sql .= " VALUES ( $this->id , ' " . addslashes ( $desc ) . " ',' " . addslashes ( $product_desc ) . " ', $fk_product , " . price2num ( $price ) . " , ' $qty ', $txtva , $remise_percent ,' " . price2num ( $subprice ) . " ',' " . price2num ( $remise ) . " ') ; " ;
2006-02-11 19:02:29 +01:00
}
else
{
$sql .= " VALUES ( $this->id , ' " . addslashes ( $desc ) . " ',' " . addslashes ( $desc ) . " ', $fk_product , " . price2num ( $price ) . " , ' $qty ', $txtva , $remise_percent ,' " . price2num ( $subprice ) . " ',' " . price2num ( $remise ) . " ') ; " ;
}
2005-09-15 02:37:03 +02:00
if ( $this -> db -> query ( $sql ) )
{
$this -> update_price ();
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
}
2006-02-12 10:05:42 +01:00
/**
* Ajoute une ligne de commande libre
*
*/
function addline_libre ( $desc , $pu , $qty , $txtva , $fk_product = 0 , $remise_percent = 0 )
{
global $conf ;
// Nettoyage parametres
$qty = ereg_replace ( ',' , '.' , $qty );
$pu = ereg_replace ( ',' , '.' , $pu );
$desc = trim ( $desc );
if ( strlen ( trim ( $qty )) == 0 )
{
$qty = 1 ;
}
// Verifs
if ( ! $this -> brouillon ) return - 1 ;
$this -> db -> begin ();
$remise = 0 ;
$price = round ( ereg_replace ( ',' , '.' , $pu ), 2 );
$subprice = $price ;
if ( trim ( strlen ( $remise_percent )) > 0 )
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . 'commandedet (fk_commande,label,description,fk_product, price,qty,tva_tx, remise_percent, subprice, remise)' ;
2006-02-21 13:49:48 +01:00
$sql .= " VALUES ( $this->id , ' " . addslashes ( $desc ) . " ',' " . addslashes ( $desc ) . " ',' $fk_product ', " . price2num ( $price ) . " , ' $qty ', ' $txtva ', $remise_percent ,' " . price2num ( $subprice ) . " ',' " . price2num ( $remise ) . " ') ; " ;
print $sql ;
2006-02-12 10:05:42 +01:00
if ( $this -> db -> query ( $sql ) )
{
$this -> update_price ();
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> error = $this -> db -> error ();
$this -> db -> rollback ();
return - 1 ;
}
}
2005-09-15 02:37:03 +02:00
/**
* Ajoute un produit dans la commande
*
*/
function add_product ( $idproduct , $qty , $remise_percent = 0 )
{
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 ;
}
}
/**
* Lit une commande
*
*/
2006-02-09 13:49:02 +01:00
function fetch ( $id )
2005-09-15 02:37:03 +02:00
{
2006-02-16 16:36:42 +01: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' ;
2006-02-11 15:40:50 +01:00
$sql .= ', ' . $this -> db -> pdate ( 'c.date_commande' ) . ' as date_commande, c.fk_projet, c.remise_percent, c.source, c.facture, c.note, c.ref_client, c.model_pdf' ;
2005-09-15 02:37:03 +02:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
$sql .= ' WHERE c.rowid = ' . $id ;
$result = $this -> db -> query ( $sql ) ;
if ( $result )
{
$obj = $this -> db -> fetch_object ();
2006-02-16 16:36:42 +01:00
$this -> id = $obj -> rowid ;
$this -> ref = $obj -> ref ;
$this -> ref_client = $obj -> ref_client ;
$this -> soc_id = $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_percent = $obj -> remise_percent ;
$this -> source = $obj -> source ;
$this -> facturee = $obj -> facture ;
$this -> note = $obj -> note ;
$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 ;
2006-02-08 16:13:50 +01:00
2005-09-15 02:37:03 +02:00
$this -> db -> free ();
if ( $this -> statut == 0 )
$this -> brouillon = 1 ;
2006-02-08 16:13:50 +01:00
// exp pdf -----------
$this -> lignes = array ();
$sql = 'SELECT l.fk_product, l.description, l.price, l.qty, l.rowid, l.tva_tx, l.remise_percent, l.subprice,' ;
2006-02-13 18:38:21 +01:00
$sql .= ' p.label, p.description as product_desc, p.ref, p.fk_product_type, p.rowid as prodid' ;
2006-02-08 16:13:50 +01:00
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as l' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON l.fk_product=p.rowid' ;
$sql .= ' WHERE l.fk_commande = ' . $this -> id ;
$sql .= ' ORDER BY l.rowid' ;
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ( $result );
$i = 0 ;
while ( $i < $num )
{
$objp = $this -> db -> fetch_object ( $result );
$ligne = new CommandeLigne ();
$ligne -> desc = $objp -> description ; // Description ligne
$ligne -> qty = $objp -> qty ;
$ligne -> tva_tx = $objp -> tva_tx ;
$ligne -> subprice = $objp -> subprice ;
$ligne -> remise_percent = $objp -> remise_percent ;
$ligne -> price = $objp -> price ;
2006-02-12 06:23:39 +01:00
$ligne -> product_id = $objp -> fk_product ;
2006-02-08 16:13:50 +01:00
$ligne -> libelle = $objp -> label ; // Label produit
$ligne -> product_desc = $objp -> product_desc ; // Description produit
$ligne -> ref = $objp -> ref ;
$this -> lignes [ $i ] = $ligne ;
//dolibarr_syslog("1 ".$ligne->desc);
//dolibarr_syslog("2 ".$ligne->product_desc);
$i ++ ;
}
$this -> db -> free ( $result );
}
else
{
dolibarr_syslog ( " Propal::Fetch Erreur lecture des produits " );
return - 1 ;
}
// -------- exp pdf //
2005-09-15 02:37:03 +02:00
/*
* Propale associ<EFBFBD> e
*/
$sql = 'SELECT fk_propale FROM ' . MAIN_DB_PREFIX . 'co_pr WHERE 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 ;
}
}
else
{
dolibarr_print_error ( $this -> db );
return - 1 ;
}
}
2006-02-09 14:35:26 +01:00
/*
*
*
*
*/
function set_pdf_model ( $user , $modelpdf )
{
if ( $user -> rights -> commande -> creer )
{
$sql = " UPDATE " . MAIN_DB_PREFIX . " commande SET model_pdf = ' $modelpdf ' " ;
$sql .= " WHERE rowid = $this->id AND fk_statut = 0 ; " ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
return 0 ;
}
}
}
2005-09-15 02:37:03 +02:00
/**
*
*
*/
function fetch_lignes ( $only_product = 0 )
{
$this -> lignes = array ();
$sql = 'SELECT l.fk_product, l.description, l.price, l.qty, l.rowid, l.tva_tx, l.remise_percent, l.subprice' ;
if ( $only_product == 1 )
{
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commandedet as l LEFT JOIN ' . MAIN_DB_PREFIX . 'product as p ON (p.rowid = l.fk_product) WHERE l.fk_commande = ' . $this -> id . ' AND p.fk_product_type <> 1 ORDER BY l.rowid' ;
}
else
{
$sql .= ' FROM ' . MAIN_DB_PREFIX . " commandedet as l WHERE l.fk_commande = $this->id ORDER BY l.rowid " ;
}
$result = $this -> db -> query ( $sql );
if ( $result )
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$ligne = new CommandeLigne ();
$objp = $this -> db -> fetch_object ( $result );
$ligne -> id = $objp -> rowid ;
$ligne -> qty = $objp -> qty ;
$ligne -> price = $objp -> price ;
$ligne -> tva_tx = $objp -> tva_tx ;
$ligne -> subprice = $objp -> subprice ;
$ligne -> remise_percent = $objp -> remise_percent ;
$ligne -> product_id = $objp -> fk_product ;
$ligne -> description = stripslashes ( $objp -> description );
$this -> lignes [ $i ] = $ligne ;
$i ++ ;
}
$this -> db -> free ();
}
return $this -> lignes ;
}
2006-01-14 14:44:06 +01:00
/**
* \brief Renvoie un tableau avec les livraison par ligne
* \param filtre_statut Filtre sur statut
* \return int 0 si OK , < 0 si KO
*/
function livraison_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 );
$this -> livraisons [ $row [ 0 ]] = $row [ 1 ];
$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
/**
* Renvoie un tableau avec les livraison par ligne
*
*/
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 ];
}
}
/**
* \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 ;
}
}
}
/**
*
*
*/
function set_remise ( $user , $remise )
{
if ( $user -> rights -> commande -> creer )
{
$remise = ereg_replace ( ',' , '.' , $remise );
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET remise_percent = ' . $remise ;
$sql .= " WHERE rowid = $this->id AND fk_statut = 0 ; " ;
if ( $this -> db -> query ( $sql ) )
{
$this -> remise_percent = $remise ;
$this -> update_price ();
return 1 ;
}
else
{
dolibarr_syslog ( 'Commande::set_remise Erreur SQL' );
}
}
}
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
2005-09-15 02:37:03 +02:00
/**
*
*
*/
function set_note ( $user , $note )
{
if ( $user -> rights -> commande -> creer )
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . " commande SET note = ' " . addslashes ( $note ) . " ' " ;
$sql .= " WHERE rowid = $this->id AND fk_statut = 0 ; " ;
if ( $this -> db -> query ( $sql ))
{
$this -> note = $note ;
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
return 0 ;
}
}
else
{
return 0 ;
}
}
/**
* \brief Classe la facture comme factur<EFBFBD> e
* \return int < 0 si ko , > 0 si ok
*/
function classer_facturee ()
{
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande SET facture = 1' ;
$sql .= ' WHERE rowid = ' . $this -> id . ' AND fk_statut > 0 ;' ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
dolibarr_print_error ( $this -> db );
}
}
/**
* Mettre <EFBFBD> jour le prix
*
*/
function update_price ()
{
include_once DOL_DOCUMENT_ROOT . '/lib/price.lib.php' ;
/*
* Liste des produits a ajouter
*/
$sql = 'SELECT price, qty, tva_tx FROM ' . MAIN_DB_PREFIX . " commandedet WHERE fk_commande = $this->id " ;
if ( $this -> db -> query ( $sql ) )
{
$num = $this -> db -> num_rows ();
$i = 0 ;
while ( $i < $num )
{
$obj = $this -> db -> fetch_object ();
$products [ $i ][ 0 ] = $obj -> price ;
$products [ $i ][ 1 ] = $obj -> qty ;
$products [ $i ][ 2 ] = $obj -> tva_tx ;
$i ++ ;
}
}
$calculs = calcul_price ( $products , $this -> remise_percent );
$totalht = $calculs [ 0 ];
$totaltva = $calculs [ 1 ];
$totalttc = $calculs [ 2 ];
$total_remise = $calculs [ 3 ];
$this -> remise = $total_remise ;
$this -> total_ht = $totalht ;
$this -> total_tva = $totaltva ;
$this -> total_ttc = $totalttc ;
/*
*
*/
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commande set' ;
$sql .= " amount_ht =' " . ereg_replace ( ',' , '.' , $totalht ) . " ' " ;
$sql .= " , total_ht =' " . ereg_replace ( ',' , '.' , $totalht ) . " ' " ;
$sql .= " , tva =' " . ereg_replace ( ',' , '.' , $totaltva ) . " ' " ;
$sql .= " , total_ttc =' " . ereg_replace ( ',' , '.' , $totalttc ) . " ' " ;
$sql .= " , remise =' " . ereg_replace ( ',' , '.' , $total_remise ) . " ' " ;
$sql .= " WHERE rowid = $this->id " ;
if ( $this -> db -> query ( $sql ) )
{
return 1 ;
}
else
{
print 'Erreur mise <20> jour du prix<p>' . $sql ;
return - 1 ;
}
}
/**
* \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
*/
function update_line ( $rowid , $desc , $pu , $qty , $remise_percent = 0 , $tva_tx )
{
2005-10-18 21:56:29 +02:00
dolibarr_syslog ( " Commande::UpdateLine $rowid , $desc , $pu , $qty , $remise_percent =0, $tva_tx " );
2005-09-15 02:37:03 +02:00
if ( $this -> brouillon )
{
$this -> db -> begin ();
2005-10-18 21:56:29 +02:00
// Nettoyage param<61> tres
$pu = price2num ( $pu );
if ( strlen ( trim ( $qty )) == 0 ) $qty = 1 ;
2005-09-15 02:37:03 +02:00
$remise = 0 ;
2005-10-18 21:56:29 +02:00
$price = $pu ;
2005-09-15 02:37:03 +02:00
$subprice = $price ;
2005-10-18 21:56:29 +02:00
$remise_percent = trim ( $remise_percent );
if ( $remise_percent > 0 )
2005-09-15 02:37:03 +02:00
{
$remise = round (( $pu * $remise_percent / 100 ), 2 );
$price = $pu - $remise ;
}
else
{
$remise_percent = 0 ;
}
$sql = 'UPDATE ' . MAIN_DB_PREFIX . 'commandedet' ;
2006-02-13 12:22:45 +01:00
$sql .= " SET description=' " . addslashes ( $desc ) . " ',price=' " . price2num ( $price ) . " ',subprice=' " . $subprice . " ', " ;
2006-02-11 14:36:20 +01:00
$sql .= " remise=' " . $remise . " ',remise_percent=' " . $remise_percent . " ',qty=' " . $qty . " ',tva_tx=' " . $tva_tx . " ' " ;
$sql .= " WHERE rowid = ' " . $rowid . " ' " ;
2005-09-15 02:37:03 +02:00
$result = $this -> db -> query ( $sql );
if ( $result )
{
$this -> update_price ( $this -> id );
$this -> db -> commit ();
return $result ;
}
else
{
$this -> db -> rollback ();
dolibarr_print_error ( $this -> db );
return - 1 ;
}
}
else
{
return - 2 ;
}
}
/**
* Supprime la commande
*
*/
function delete ()
{
$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 ++ ;
}
if ( $err == 0 )
{
$this -> db -> commit ();
return 1 ;
}
else
{
$this -> db -> rollback ();
return - 1 ;
}
}
/**
* \brief Classer la commande dans un projet
* \param cat_id Id du projet
*/
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 ;
}
}
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 )
{
global $conf ;
$this -> nbtodo = $this -> nbtodolate = 0 ;
$sql = 'SELECT c.rowid,' . $this -> db -> pdate ( 'c.date_creation' ) . ' as datec' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'commande as c' ;
$sql .= ' WHERE c.fk_statut BETWEEN 1 AND 2' ;
if ( $user -> societe_id ) $sql .= ' AND fk_soc = ' . $user -> societe_id ;
$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 ;
}
}
2005-09-04 23:01:32 +02:00
/**
* \brief Retourne le libell<EFBFBD> du statut de la commande
* \return string Libell<EFBFBD>
*/
2005-09-15 02:37:03 +02:00
function getLibStatut ()
{
2005-09-04 23:01:32 +02:00
return $this -> LibStatut ( $this -> statut );
2005-09-15 02:37:03 +02:00
}
2005-09-04 23:01:32 +02:00
/**
* \brief Renvoi le libell<EFBFBD> d ' un statut donn<EFBFBD>
* \param statut id statut
* \return string Libell<EFBFBD>
*/
2005-09-15 02:37:03 +02:00
function LibStatut ( $statut )
{
return $this -> status_label_short [ $statut ];
}
2005-09-04 23:01:32 +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-02-08 16:13:50 +01:00
// From llx_propaldet
var $qty ;
var $tva_tx ;
var $subprice ;
var $remise_percent ;
var $price ;
var $product_id ;
var $desc ; // Description ligne
// From llx_product
var $libelle ; // Label produit
var $product_desc ; // Description produit
var $ref ;
2005-09-15 02:37:03 +02:00
function CommandeLigne ()
{
2006-02-08 16:13:50 +01:00
2005-09-15 02:37:03 +02:00
}
}
2006-02-03 17:42:39 +01:00
?>