2019-02-12 17:03:47 +01:00
< ? php
/* Copyright ( C ) 2007 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
*
* 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 3 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
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2019-02-12 17:03:47 +01:00
*/
/**
* \file htdocs / core / class / cunits . class . php
* \ingroup core
* \brief This file is CRUD class file ( Create / Read / Update / Delete ) for c_units dictionary
*/
/**
* Class of dictionary type of thirdparty ( used by imports )
*/
class CUnits // extends CommonObject
{
/**
2020-10-31 14:32:18 +01:00
* @ var DoliDB Database handler .
*/
public $db ;
2019-02-12 17:03:47 +01:00
/**
* @ var string Error code ( or message )
*/
2019-11-13 19:34:37 +01:00
public $error = '' ;
2019-02-12 17:03:47 +01:00
/**
* @ var string [] Error codes ( or messages )
*/
public $errors = array ();
2019-02-14 13:02:44 +01:00
public $records = array ();
2019-02-12 17:03:47 +01:00
//var $element='ctypent'; //!< Id that identify managed objects
//var $table_element='ctypent'; //!< Name of table without prefix where object is stored
2020-10-31 14:32:18 +01:00
/**
2019-02-12 17:03:47 +01:00
* @ var int ID
*/
public $id ;
public $code ;
public $label ;
public $short_label ;
2019-02-14 13:02:44 +01:00
public $unit_type ;
public $scale ;
2019-02-12 17:03:47 +01:00
public $active ;
2020-10-31 14:32:18 +01:00
/**
* Constructor
*
* @ param DoliDb $db Database handler
*/
public function __construct ( $db )
{
$this -> db = $db ;
}
2019-02-12 17:03:47 +01:00
2020-10-31 14:32:18 +01:00
/**
* Create object into database
*
* @ param User $user User that create
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , Id of created object if OK
*/
public function create ( $user , $notrigger = 0 )
{
global $conf , $langs ;
2019-11-13 19:34:37 +01:00
$error = 0 ;
2019-02-12 17:03:47 +01:00
// Clean parameters
2021-02-23 22:03:23 +01:00
if ( isset ( $this -> id )) {
$this -> id = ( int ) $this -> id ;
}
if ( isset ( $this -> code )) {
$this -> code = trim ( $this -> code );
}
if ( isset ( $this -> label )) {
$this -> libelle = trim ( $this -> label );
}
if ( isset ( $this -> short_label )) {
$this -> libelle = trim ( $this -> short_label );
}
if ( isset ( $this -> unit_type )) {
$this -> active = trim ( $this -> unit_type );
}
if ( isset ( $this -> active )) {
$this -> active = trim ( $this -> active );
}
if ( isset ( $this -> scale )) {
$this -> scale = trim ( $this -> scale );
}
2019-02-12 17:03:47 +01:00
// Check parameters
// Put here code to add control on parameters values
2020-10-31 14:32:18 +01:00
// Insert request
2019-02-12 17:03:47 +01:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " c_units( " ;
2019-11-13 19:34:37 +01:00
$sql .= " rowid, " ;
$sql .= " code, " ;
$sql .= " label, " ;
$sql .= " short_label, " ;
$sql .= " unit_type " ;
$sql .= " scale " ;
2020-10-31 14:32:18 +01:00
$sql .= " ) VALUES ( " ;
2019-11-13 19:34:37 +01:00
$sql .= " " . ( ! isset ( $this -> id ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> id ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> code ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> code ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> label ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> label ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> short_label ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> short_label ) . " ' " ) . " , " ;
$sql .= " " . ( ! isset ( $this -> unit_type ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> unit_type ) . " ' " );
$sql .= " " . ( ! isset ( $this -> scale ) ? 'NULL' : " ' " . $this -> db -> escape ( $this -> scale ) . " ' " );
$sql .= " ) " ;
2019-02-12 17:03:47 +01:00
$this -> db -> begin ();
2021-02-23 22:03:23 +01:00
dol_syslog ( get_class ( $this ) . " ::create " , LOG_DEBUG );
2020-10-31 14:32:18 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2021-02-23 22:03:23 +01:00
}
2019-02-12 17:03:47 +01:00
2021-02-23 22:03:23 +01:00
if ( ! $error ) {
2020-10-31 14:32:18 +01:00
$this -> id = $this -> db -> last_insert_id ( MAIN_DB_PREFIX . " c_units " );
}
2019-02-12 17:03:47 +01:00
2020-10-31 14:32:18 +01:00
// Commit or rollback
2021-02-23 22:03:23 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( get_class ( $this ) . " ::create " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2019-02-12 17:03:47 +01:00
}
$this -> db -> rollback ();
2019-11-13 19:34:37 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2019-02-12 17:03:47 +01:00
$this -> db -> commit ();
2020-10-31 14:32:18 +01:00
return $this -> id ;
2019-02-12 17:03:47 +01:00
}
2020-10-31 14:32:18 +01:00
}
/**
* Load object in memory from database
*
* @ param int $id Id of CUnit object to fetch ( rowid )
* @ param string $code Code
* @ param string $short_label Short Label ( 'g' , 'kg' , ... )
* @ param string $unit_type Unit type ( 'size' , 'surface' , 'volume' , 'weight' , ... )
* @ return int < 0 if KO , > 0 if OK
*/
public function fetch ( $id , $code = '' , $short_label = '' , $unit_type = '' )
{
global $langs ;
$sql = " SELECT " ;
2019-11-13 19:34:37 +01:00
$sql .= " t.rowid, " ;
$sql .= " t.code, " ;
$sql .= " t.label, " ;
$sql .= " t.short_label, " ;
$sql .= " t.scale, " ;
$sql .= " t.unit_type, " ;
$sql .= " t.scale, " ;
$sql .= " t.active " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_units as t " ;
$sql_where = array ();
2021-02-23 22:03:23 +01:00
if ( $id ) {
2021-03-14 11:48:39 +01:00
$sql_where [] = " t.rowid = " . (( int ) $id );
2021-02-23 22:03:23 +01:00
}
if ( $unit_type ) {
$sql_where [] = " t.unit_type = ' " . $this -> db -> escape ( $unit_type ) . " ' " ;
}
if ( $code ) {
$sql_where [] = " t.code = ' " . $this -> db -> escape ( $code ) . " ' " ;
}
if ( $short_label ) {
$sql_where [] = " t.short_label = ' " . $this -> db -> escape ( $short_label ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
if ( count ( $sql_where ) > 0 ) {
$sql .= ' WHERE ' . implode ( ' AND ' , $sql_where );
}
$resql = $this -> db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
if ( $this -> db -> num_rows ( $resql )) {
2020-10-31 14:32:18 +01:00
$obj = $this -> db -> fetch_object ( $resql );
$this -> id = $obj -> rowid ;
2019-02-12 17:03:47 +01:00
$this -> code = $obj -> code ;
$this -> label = $obj -> label ;
$this -> short_label = $obj -> short_label ;
2019-10-04 10:04:02 +02:00
$this -> scale = $obj -> scale ;
2019-02-14 13:02:44 +01:00
$this -> unit_type = $obj -> unit_type ;
2019-07-19 12:24:53 +02:00
$this -> scale = $obj -> scale ;
2019-02-12 17:03:47 +01:00
$this -> active = $obj -> active ;
2020-10-31 14:32:18 +01:00
}
$this -> db -> free ( $resql );
return 1 ;
} else {
2021-02-23 22:03:23 +01:00
$this -> error = " Error " . $this -> db -> lasterror ();
2020-10-31 14:32:18 +01:00
return - 1 ;
}
}
/**
* Load list of objects in memory from the database .
*
* @ param string $sortorder Sort Order
* @ param string $sortfield Sort field
* @ param int $limit limit
* @ param int $offset Offset
* @ param array $filter Filter array . Example array ( 'field' => 'valueforlike' , 'customurl' =>... )
* @ param string $filtermode Filter mode ( AND or OR )
* @ return array | int int < 0 if KO , array of pages if OK
*/
public function fetchAll ( $sortorder = '' , $sortfield = '' , $limit = 0 , $offset = 0 , array $filter = array (), $filtermode = 'AND' )
{
global $conf ;
dol_syslog ( __METHOD__ , LOG_DEBUG );
$sql = 'SELECT' ;
$sql .= " t.rowid, " ;
$sql .= " t.code, " ;
$sql .= " t.label, " ;
$sql .= " t.short_label, " ;
$sql .= " t.unit_type, " ;
$sql .= " t.scale, " ;
$sql .= " t.active " ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'c_units as t' ;
// Manage filter
$sqlwhere = array ();
if ( count ( $filter ) > 0 ) {
foreach ( $filter as $key => $value ) {
if ( $key == 't.rowid' || $key == 't.active' || $key == 't.scale' ) {
$sqlwhere [] = $key . '=' . ( int ) $value ;
} elseif ( strpos ( $key , 'date' ) !== false ) {
$sqlwhere [] = $key . ' = \'' . $this -> db -> idate ( $value ) . '\'' ;
} elseif ( $key == 't.unit_type' || $key == 't.code' || $key == 't.short_label' ) {
$sqlwhere [] = $key . ' = \'' . $this -> db -> escape ( $value ) . '\'' ;
} else {
$sqlwhere [] = $key . ' LIKE \'%' . $this -> db -> escape ( $value ) . '%\'' ;
}
}
}
if ( count ( $sqlwhere ) > 0 ) {
$sql .= ' WHERE (' . implode ( ' ' . $filtermode . ' ' , $sqlwhere ) . ')' ;
}
if ( ! empty ( $sortfield )) {
$sql .= $this -> db -> order ( $sortfield , $sortorder );
}
if ( ! empty ( $limit )) {
$sql .= ' ' . $this -> db -> plimit ( $limit , $offset );
}
$resql = $this -> db -> query ( $sql );
if ( $resql ) {
$this -> records = array ();
$num = $this -> db -> num_rows ( $resql );
if ( $num > 0 ) {
2020-11-02 11:41:07 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
2020-10-31 14:32:18 +01:00
$record = new self ( $this -> db );
$record -> id = $obj -> rowid ;
$record -> code = $obj -> code ;
$record -> label = $obj -> label ;
$record -> short_label = $obj -> short_label ;
$record -> unit_type = $obj -> unit_type ;
$record -> scale = $obj -> scale ;
$record -> active = $obj -> active ;
$this -> records [ $record -> id ] = $record ;
}
}
$this -> db -> free ( $resql );
return $this -> records ;
} else {
$this -> errors [] = 'Error ' . $this -> db -> lasterror ();
dol_syslog ( __METHOD__ . ' ' . join ( ',' , $this -> errors ), LOG_ERR );
return - 1 ;
}
}
/**
* Update object into database
*
* @ param User $user User that modify
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
public function update ( $user = null , $notrigger = 0 )
{
global $conf , $langs ;
2019-11-13 19:34:37 +01:00
$error = 0 ;
2019-02-12 17:03:47 +01:00
// Clean parameters
2021-02-23 22:03:23 +01:00
if ( isset ( $this -> code )) {
$this -> code = trim ( $this -> code );
}
if ( isset ( $this -> label )) {
$this -> libelle = trim ( $this -> label );
}
if ( isset ( $this -> short_label )) {
$this -> libelle = trim ( $this -> short_label );
}
if ( isset ( $this -> unit_type )) {
$this -> libelle = trim ( $this -> unit_type );
}
if ( isset ( $this -> scale )) {
$this -> scale = trim ( $this -> scale );
}
if ( isset ( $this -> active )) {
$this -> active = trim ( $this -> active );
}
2019-02-12 17:03:47 +01:00
// Check parameters
// Put here code to add control on parameters values
2020-10-31 14:32:18 +01:00
// Update request
$sql = " UPDATE " . MAIN_DB_PREFIX . " c_units SET " ;
2019-11-13 19:34:37 +01:00
$sql .= " code= " . ( isset ( $this -> code ) ? " ' " . $this -> db -> escape ( $this -> code ) . " ' " : " null " ) . " , " ;
$sql .= " label= " . ( isset ( $this -> label ) ? " ' " . $this -> db -> escape ( $this -> label ) . " ' " : " null " ) . " , " ;
$sql .= " short_label= " . ( isset ( $this -> short_label ) ? " ' " . $this -> db -> escape ( $this -> short_label ) . " ' " : " null " ) . " , " ;
$sql .= " unit_type= " . ( isset ( $this -> unit_type ) ? " ' " . $this -> db -> escape ( $this -> unit_type ) . " ' " : " null " ) . " , " ;
$sql .= " scale= " . ( isset ( $this -> scale ) ? " ' " . $this -> db -> escape ( $this -> scale ) . " ' " : " null " ) . " , " ;
$sql .= " active= " . ( isset ( $this -> active ) ? $this -> active : " null " );
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2019-02-12 17:03:47 +01:00
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::update " , LOG_DEBUG );
2020-10-31 14:32:18 +01:00
$resql = $this -> db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2021-02-23 22:03:23 +01:00
}
2019-02-12 17:03:47 +01:00
2020-10-31 14:32:18 +01:00
// Commit or rollback
2021-02-23 22:03:23 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( get_class ( $this ) . " ::update " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2019-02-12 17:03:47 +01:00
}
$this -> db -> rollback ();
2019-11-13 19:34:37 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2019-02-12 17:03:47 +01:00
$this -> db -> commit ();
return 1 ;
}
2020-10-31 14:32:18 +01:00
}
2019-02-12 17:03:47 +01:00
2021-02-23 22:03:23 +01:00
/**
* Delete object in database
*
* @ param User $user User that delete
* @ param int $notrigger 0 = launch triggers after , 1 = disable triggers
* @ return int < 0 if KO , > 0 if OK
*/
2019-02-27 20:45:07 +01:00
public function delete ( $user , $notrigger = 0 )
2019-02-12 17:03:47 +01:00
{
global $conf , $langs ;
2019-11-13 19:34:37 +01:00
$error = 0 ;
2019-02-12 17:03:47 +01:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " c_units " ;
2021-03-14 12:20:23 +01:00
$sql .= " WHERE rowid= " . (( int ) $this -> id );
2019-02-12 17:03:47 +01:00
$this -> db -> begin ();
dol_syslog ( get_class ( $this ) . " ::delete " , LOG_DEBUG );
$resql = $this -> db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( ! $resql ) {
2021-03-01 20:37:16 +01:00
$error ++ ;
$this -> errors [] = " Error " . $this -> db -> lasterror ();
2021-02-23 22:03:23 +01:00
}
2019-02-12 17:03:47 +01:00
2020-10-31 14:32:18 +01:00
// Commit or rollback
2021-02-23 22:03:23 +01:00
if ( $error ) {
foreach ( $this -> errors as $errmsg ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( get_class ( $this ) . " ::delete " . $errmsg , LOG_ERR );
$this -> error .= ( $this -> error ? ', ' . $errmsg : $errmsg );
2019-02-12 17:03:47 +01:00
}
$this -> db -> rollback ();
2019-11-13 19:34:37 +01:00
return - 1 * $error ;
2020-05-21 15:05:19 +02:00
} else {
2019-02-12 17:03:47 +01:00
$this -> db -> commit ();
return 1 ;
}
}
2020-04-18 16:08:26 +02:00
/**
* Get unit from code
* @ param string $code code of unit
* @ param string $mode 0 = id , short_label = Use short label as value , code = use code
* @ return int < 0 if KO , Id of code if OK
*/
public function getUnitFromCode ( $code , $mode = 'code' )
{
2020-10-31 14:32:18 +01:00
if ( $mode == 'short_label' ) {
2020-04-18 16:08:26 +02:00
return dol_getIdFromCode ( $this -> db , $code , 'c_units' , 'short_label' , 'rowid' );
2020-10-31 14:32:18 +01:00
} elseif ( $mode == 'code' ) {
2020-04-18 16:08:26 +02:00
return dol_getIdFromCode ( $this -> db , $code , 'c_units' , 'code' , 'rowid' );
}
return $code ;
}
/**
* Unit converter
* @ param double $value value to convert
* @ param int $fk_unit current unit id of value
* @ param int $fk_new_unit the id of unit to convert in
* @ return double
*/
public function unitConverter ( $value , $fk_unit , $fk_new_unit = 0 )
{
2021-05-20 09:22:55 +02:00
$value = floatval ( price2num ( $value ));
2020-04-18 16:08:26 +02:00
$fk_unit = intval ( $fk_unit );
// Calcul en unité de base
$scaleUnitPow = $this -> scaleOfUnitPow ( $fk_unit );
// convert to standard unit
2020-10-31 14:32:18 +01:00
$value = $value * $scaleUnitPow ;
if ( $fk_new_unit != 0 ) {
2020-04-18 16:08:26 +02:00
// Calcul en unité de base
$scaleUnitPow = $this -> scaleOfUnitPow ( $fk_new_unit );
2021-02-23 22:03:23 +01:00
if ( ! empty ( $scaleUnitPow )) {
2020-04-18 16:08:26 +02:00
// convert to new unit
2020-10-31 14:32:18 +01:00
$value = $value / $scaleUnitPow ;
2020-04-18 16:08:26 +02:00
}
}
return round ( $value , 2 );
}
/**
* get scale of unit factor
2020-05-21 09:07:10 +02:00
* @ param int $id id of unit in dictionary
2020-04-18 16:08:26 +02:00
* @ return float | int
*/
public function scaleOfUnitPow ( $id )
{
$base = 10 ;
// TODO : add base col into unit dictionary table
$unit = $this -> db -> getRow ( 'SELECT scale, unit_type from ' . MAIN_DB_PREFIX . 'c_units WHERE rowid = ' . intval ( $id ));
2020-05-21 09:07:10 +02:00
if ( $unit ) {
2020-04-18 16:08:26 +02:00
// TODO : if base exist in unit dictionary table remove this convertion exception and update convertion infos in database exemple time hour currently scale 3600 will become scale 2 base 60
2020-05-21 09:07:10 +02:00
if ( $unit -> unit_type == 'time' ) {
2021-05-20 09:22:55 +02:00
return floatval ( $unit -> scale );
2020-04-18 16:08:26 +02:00
}
2021-05-20 09:22:55 +02:00
return pow ( $base , floatval ( $unit -> scale ));
2020-04-18 16:08:26 +02:00
}
return 0 ;
}
2019-02-12 17:03:47 +01:00
}