2019-01-16 18:38:22 +01:00
< ? php
2019-01-16 14:03:21 +01:00
/* Copyright ( C ) 2016 Xebax Christy < xebax @ wanadoo . fr >
* Copyright ( C ) 2016 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2017 Regis Houssin < regis . houssin @ inodbox . com >
* Copyright ( C ) 2017 Neil Orley < neil . orley @ oeris . fr >
* Copyright ( C ) 2018 Frédéric France < frederic . france @ netlogic . fr >
2019-06-20 03:56:29 +02:00
* Copyright ( C ) 2018 - 2019 Thibault FOUCART < support @ ptibogxiv . net >
2019-01-16 14:03:21 +01: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 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-01-16 14:03:21 +01:00
*/
use Luracast\Restler\RestException ;
require_once DOL_DOCUMENT_ROOT . '/main.inc.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/ccountry.class.php' ;
/**
* API class for dictionaries
*
* @ access protected
* @ class DolibarrApiAccess { @ requires user , external }
*/
class Setup extends DolibarrApi
{
private $translations = null ;
/**
* Constructor
*/
2019-02-25 20:35:59 +01:00
public function __construct ()
2019-01-16 14:03:21 +01:00
{
global $db ;
$this -> db = $db ;
}
/**
* Get the list of payments types .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number { @ min 0 }
* @ param int $active Payment type is active or not { @ min 0 } { @ max 1 }
* @ param string $sqlfilters SQL criteria to filter with . Syntax example " (t.code:=:'CHQ') "
*
* @ url GET dictionary / payment_types
*
* @ return array [ List of payment types ]
*
* @ throws 400 RestException
* @ throws 200 OK
*/
2019-02-25 20:35:59 +01:00
public function getPaymentTypes ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT id, code, type, libelle as label, module " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_paiement as t " ;
$sql .= " WHERE t.entity IN ( " . getEntity ( 'c_paiement' ) . " ) " ;
$sql .= " AND t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 400 , 'error when validating parameter sqlfilters ' . $sqlfilters );
}
2019-02-25 20:35:59 +01:00
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
2019-01-16 14:03:21 +01:00
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 400 , $this -> db -> lasterror ());
}
return $list ;
}
/**
* Get the list of countries .
*
* The names of the countries will be translated to the given language if
* the $lang parameter is provided . The value of $lang must be a language
* code supported by Dolibarr , for example 'en_US' or 'fr_FR' .
* The returned list is sorted by country ID .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param string $filter To filter the countries by name
* @ param string $lang Code of the language the label of the countries must be translated to
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
* @ return array List of countries
*
* @ url GET dictionary / countries
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getListOfCountries ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $filter = '' , $lang = '' , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
// Note: The filter is not applied in the SQL request because it must
// be applied to the translated names, not to the names in database.
$sql = " SELECT rowid FROM " . MAIN_DB_PREFIX . " c_country as t " ;
$sql .= " WHERE 1 = 1 " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$obj = $this -> db -> fetch_object ( $result );
$country = new Ccountry ( $this -> db );
if ( $country -> fetch ( $obj -> rowid ) > 0 ) {
// Translate the name of the country if needed
// and then apply the filter if there is one.
$this -> translateLabel ( $country , $lang );
if ( empty ( $filter ) || stripos ( $country -> label , $filter ) !== false ) {
$list [] = $this -> _cleanObjectDatas ( $country );
}
}
}
} else {
2019-09-01 22:02:48 +02:00
throw new RestException ( 503 , 'Error when retrieving list of countries' );
2019-01-16 14:03:21 +01:00
}
return $list ;
}
/**
* Get country by ID .
*
* @ param int $id ID of country
* @ param string $lang Code of the language the name of the
* country must be translated to
* @ return array Array of cleaned object properties
*
* @ url GET dictionary / countries / { id }
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getCountryByID ( $id , $lang = '' )
2019-01-16 14:03:21 +01:00
{
$country = new Ccountry ( $this -> db );
if ( $country -> fetch ( $id ) < 0 ) {
throw new RestException ( 503 , 'Error when retrieving country : ' . $country -> error );
}
2019-01-27 10:49:34 +01:00
elseif ( $country -> fetch ( $id ) == 0 ) {
2019-01-16 14:03:21 +01:00
throw new RestException ( 404 , 'country not found' );
}
$this -> translateLabel ( $country , $lang );
return $this -> _cleanObjectDatas ( $country );
}
/**
* Get the list of delivery times .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number { @ min 0 }
* @ param int $active Delivery times is active or not { @ min 0 } { @ max 1 }
* @ param string $sqlfilters SQL criteria to filter with .
*
* @ url GET dictionary / availability
*
* @ return array [ List of availability ]
*
* @ throws 400 RestException
* @ throws 200 OK
*/
2019-02-25 20:35:59 +01:00
public function getAvailability ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid, code, label " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_availability as t " ;
$sql .= " WHERE t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 400 , 'error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 400 , $this -> db -> lasterror ());
}
return $list ;
}
2019-03-04 19:57:46 +01:00
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
2019-01-16 14:03:21 +01:00
/**
* Clean sensible object datas
*
* @ param object $object Object to clean
* @ return array Array of cleaned object properties
*/
2019-03-04 19:57:46 +01:00
protected function _cleanObjectDatas ( $object )
2019-01-16 14:03:21 +01:00
{
2019-03-04 19:57:46 +01:00
// phpcs:enable
2019-01-16 14:03:21 +01:00
$object = parent :: _cleanObjectDatas ( $object );
unset ( $object -> error );
unset ( $object -> errors );
return $object ;
}
/**
* Translate the name of the country to the given language .
*
* @ param Ccountry $country Country
* @ param string $lang Code of the language the name of the
* country must be translated to
* @ return void
*/
private function translateLabel ( $country , $lang )
{
if ( ! empty ( $lang )) {
// Load the translations if this is a new language.
if ( $this -> translations == null || $this -> translations -> getDefaultLang () !== $lang ) {
global $conf ;
$this -> translations = new Translate ( '' , $conf );
$this -> translations -> setDefaultLang ( $lang );
$this -> translations -> load ( 'dict' );
}
if ( $country -> code ) {
$key = 'Country' . $country -> code ;
$translation = $this -> translations -> trans ( $key );
if ( $translation != $key ) {
$country -> label = html_entity_decode ( $translation );
}
}
}
}
/**
* Get the list of events types .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param string $type To filter on type of event
* @ param string $module To filter on module events
2019-10-10 14:23:18 +02:00
* @ param int $active Event ' s type is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of events types
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / event_types
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getListOfEventTypes ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $type = '' , $module = '' , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT id, code, type, libelle as label, module " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_actioncomm as t " ;
$sql .= " WHERE t.active = " . $active ;
if ( $type ) $sql .= " AND t.type LIKE '% " . $this -> db -> escape ( $type ) . " %' " ;
if ( $module ) $sql .= " AND t.module LIKE '% " . $this -> db -> escape ( $module ) . " %' " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
2019-10-10 13:07:19 +02:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of events types : ' . $this -> db -> lasterror ());
}
return $list ;
}
/**
* Get the list of contacts types .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param string $type To filter on type of contact
* @ param string $module To filter on module contacts
2019-10-10 14:23:18 +02:00
* @ param int $active Contact ' s type is active or not { @ min 0 } { @ max 1 }
2019-10-10 13:07:19 +02:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
* @ return array List of Contacts types
*
* @ url GET dictionary / contact_types
*
* @ throws RestException
*/
public function getListOfContactTypes ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $type = '' , $module = '' , $active = 1 , $sqlfilters = '' )
{
$list = array ();
$sql = " SELECT rowid, code, element as type, libelle as label, source, module, position " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_type_contact as t " ;
$sql .= " WHERE t.active = " . $active ;
if ( $type ) $sql .= " AND type LIKE '% " . $this -> db -> escape ( $type ) . " %' " ;
if ( $module ) $sql .= " AND t.module LIKE '% " . $this -> db -> escape ( $module ) . " %' " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
2019-01-16 14:03:21 +01:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
2019-10-10 15:56:36 +02:00
throw new RestException ( 503 , 'Error when retrieving list of contacts types : ' . $this -> db -> lasterror ());
2019-01-16 14:03:21 +01:00
}
return $list ;
}
/**
* Get the list of civilities .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param string $module To filter on module events
2019-10-10 14:23:18 +02:00
* @ param int $active Civility is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-10-10 13:07:19 +02:00
* @ return array List of civility types
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / civilities
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getListOfCivilities ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $module = '' , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid, code, label, module " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_civility as t " ;
$sql .= " WHERE t.active = " . $active ;
if ( $module ) $sql .= " AND t.module LIKE '% " . $this -> db -> escape ( $module ) . " %' " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of civility : ' . $this -> db -> lasterror ());
}
return $list ;
}
2019-02-25 20:35:59 +01:00
2019-01-16 14:03:21 +01:00
/**
* Get the list of currencies .
*
2019-05-08 02:05:03 +02:00
* @ param int $multicurrency Multicurrency rates ( 0 : no multicurrency , 1 : last rate , 2 : all rates ) { @ min 0 } { @ max 2 }
2019-01-16 14:03:21 +01:00
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
2019-01-16 18:59:18 +01:00
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of currencies
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / currencies
*
* @ throws RestException
*/
2019-05-06 10:27:13 +02:00
public function getListOfCurrencies ( $multicurrency = 0 , $sortfield = " code_iso " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
2019-01-16 18:59:18 +01:00
$sql = " SELECT t.code_iso, t.label, t.unicode " ;
2019-05-06 10:27:13 +02:00
if ( ! empty ( $multicurrency )) $sql .= " , cr.date_sync, cr.rate " ;
2019-01-16 14:03:21 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " c_currencies as t " ;
2019-05-06 10:27:13 +02:00
if ( ! empty ( $multicurrency )) {
$sql .= " JOIN " . MAIN_DB_PREFIX . " multicurrency as m ON m.code=t.code_iso " ;
$sql .= " JOIN " . MAIN_DB_PREFIX . " multicurrency_rate as cr ON (m.rowid = cr.fk_multicurrency) " ;
}
2019-01-16 14:03:21 +01:00
$sql .= " WHERE t.active = " . $active ;
2019-05-06 10:27:13 +02:00
if ( ! empty ( $multicurrency )) {
$sql .= " AND m.entity IN ( " . getEntity ( 'multicurrency' ) . " ) " ;
2019-05-06 12:37:55 +02:00
if ( ! empty ( $multicurrency ) && $multicurrency != 2 ) $sql .= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM " . MAIN_DB_PREFIX . " multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid) " ;
2019-05-06 10:55:11 +02:00
}
2019-09-01 22:02:48 +02:00
2019-01-16 14:03:21 +01:00
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of currency : ' . $this -> db -> lasterror ());
}
return $list ;
2019-01-16 20:16:33 +01:00
}
2019-01-16 14:03:21 +01:00
/**
* Get the list of extra fields .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param string $type Type of element ( 'adherent' , 'commande' , 'thirdparty' , 'facture' , 'propal' , 'product' , ... )
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.label:like:'SO-%') "
2019-09-01 22:02:48 +02:00
* @ return array List of extra fields
2019-01-16 14:03:21 +01:00
*
* @ url GET extrafields
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getListOfExtrafields ( $sortfield = " t.pos " , $sortorder = 'ASC' , $type = '' , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
if ( $type == 'thirdparty' ) $type = 'societe' ;
if ( $type == 'contact' ) $type = 'socpeople' ;
$sql = " SELECT t.rowid, t.name, t.label, t.type, t.size, t.elementtype, t.fieldunique, t.fieldrequired, t.param, t.pos, t.alwayseditable, t.perms, t.list, t.fielddefault, t.fieldcomputed " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " extrafields as t " ;
$sql .= " WHERE t.entity IN ( " . getEntity ( 'extrafields' ) . " ) " ;
if ( ! empty ( $type )) $sql .= " AND t.elementtype = ' " . $this -> db -> escape ( $type ) . " ' " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
$resql = $this -> db -> query ( $sql );
if ( $resql )
{
if ( $this -> db -> num_rows ( $resql ))
{
while ( $tab = $this -> db -> fetch_object ( $resql ))
{
// New usage
$list [ $tab -> elementtype ][ $tab -> name ][ 'type' ] = $tab -> type ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'label' ] = $tab -> label ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'size' ] = $tab -> size ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'elementtype' ] = $tab -> elementtype ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'default' ] = $tab -> fielddefault ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'computed' ] = $tab -> fieldcomputed ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'unique' ] = $tab -> fieldunique ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'required' ] = $tab -> fieldrequired ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'param' ] = ( $tab -> param ? unserialize ( $tab -> param ) : '' );
$list [ $tab -> elementtype ][ $tab -> name ][ 'pos' ] = $tab -> pos ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'alwayseditable' ] = $tab -> alwayseditable ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'perms' ] = $tab -> perms ;
$list [ $tab -> elementtype ][ $tab -> name ][ 'list' ] = $tab -> list ;
}
}
}
else
{
throw new RestException ( 503 , 'Error when retrieving list of extra fields : ' . $this -> db -> lasterror ());
}
if ( ! count ( $list ))
{
throw new RestException ( 404 , 'No extrafield found' );
}
return $list ;
}
/**
* Get the list of towns .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param string $zipcode To filter on zipcode
* @ param string $town To filter on city name
2019-01-16 18:59:18 +01:00
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of towns
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / towns
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getListOfTowns ( $sortfield = " zip,town " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $zipcode = '' , $town = '' , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid AS id, zip, town, fk_county, fk_pays AS fk_country " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ziptown as t " ;
$sql .= " AND t.active = " . $active ;
if ( $zipcode ) $sql .= " AND t.zip LIKE '% " . $this -> db -> escape ( $zipcode ) . " %' " ;
if ( $town ) $sql .= " AND t.town LIKE '% " . $this -> db -> escape ( $town ) . " %' " ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of towns : ' . $this -> db -> lasterror ());
}
return $list ;
}
/**
* Get the list of payments terms .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number { @ min 0 }
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
* @ param string $sqlfilters SQL criteria to filter . Syntax example " (t.code:=:'CHQ') "
*
* @ url GET dictionary / payment_terms
*
* @ return array List of payment terms
*
* @ throws 400 RestException
* @ throws 200 OK
*/
2019-02-25 20:35:59 +01:00
public function getPaymentTerms ( $sortfield = " sortorder " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid as id, code, sortorder, libelle as label, libelle_facture as descr, type_cdr, nbjour, decalage, module " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_payment_term as t " ;
$sql .= " WHERE t.entity IN ( " . getEntity ( 'c_payment_term' ) . " ) " ;
$sql .= " AND t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 400 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 400 , $this -> db -> lasterror ());
}
return $list ;
}
2019-09-01 22:02:48 +02:00
2019-05-05 19:08:27 +02:00
/**
* Get the list of shipping methods .
*
* @ param int $limit Number of items per page
* @ param int $page Page number { @ min 0 }
* @ param int $active Shipping methodsm is active or not { @ min 0 } { @ max 1 }
* @ param string $sqlfilters SQL criteria to filter . Syntax example " (t.code:=:'CHQ') "
*
* @ url GET dictionary / shipping_methods
*
* @ return array List of shipping methods
*
* @ throws 400 RestException
* @ throws 200 OK
*/
public function getShippingModes ( $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
{
$list = array ();
$sql = " SELECT rowid as id, code, libelle as label, description, tracking, module " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_shipment_mode as t " ;
$sql .= " WHERE t.entity IN ( " . getEntity ( 'c_shipment_mode' ) . " ) " ;
$sql .= " AND t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 400 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
//$sql.= $this->db->order($sortfield, $sortorder);
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 400 , $this -> db -> lasterror ());
}
return $list ;
2019-05-05 20:54:31 +02:00
}
2019-01-16 14:03:21 +01:00
2019-06-17 20:53:10 +02:00
/**
* Get the list of measuring units .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of measuring unit
2019-06-17 20:53:10 +02:00
*
* @ url GET dictionary / units
*
* @ throws RestException
*/
public function getListOfMeasuringUnits ( $sortfield = " rowid " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
{
$list = array ();
//TODO link with multicurrency module
$sql = " SELECT t.rowid, t.code, t.label,t.short_label, t.active, t.scale, t.unit_type " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_units as t " ;
$sql .= " WHERE t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of measuring units: ' . $this -> db -> lasterror ());
}
return $list ;
}
2019-01-16 14:03:21 +01:00
/**
* Get the list of tickets categories .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
2019-01-16 18:59:18 +01:00
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of ticket categories
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / ticket_categories
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getTicketsCategories ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid, code, pos, label, use_default, description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_category as t " ;
$sql .= " WHERE t.active = " . $active ;
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of ticket categories : ' . $this -> db -> lasterror ());
}
return $list ;
}
/**
* Get the list of tickets severity .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
2019-01-16 18:59:18 +01:00
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of ticket severities
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / ticket_severities
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getTicketsSeverities ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid, code, pos, label, use_default, color, description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_severity as t " ;
2019-02-25 20:35:59 +01:00
$sql .= " WHERE t.active = " . $active ;
2019-01-16 14:03:21 +01:00
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of ticket severities : ' . $this -> db -> lasterror ());
}
return $list ;
}
/**
* Get the list of tickets types .
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Number of items per page
* @ param int $page Page number ( starting from zero )
2019-01-16 18:59:18 +01:00
* @ param int $active Payment term is active or not { @ min 0 } { @ max 1 }
2019-01-16 14:03:21 +01:00
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.code:like:'A%') and (t.active:>=:0) "
2019-09-01 22:02:48 +02:00
* @ return array List of ticket types
2019-01-16 14:03:21 +01:00
*
* @ url GET dictionary / ticket_types
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getTicketsTypes ( $sortfield = " code " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $active = 1 , $sqlfilters = '' )
2019-01-16 14:03:21 +01:00
{
$list = array ();
$sql = " SELECT rowid, code, pos, label, use_default, description " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " c_ticket_type as t " ;
2019-02-25 20:35:59 +01:00
$sql .= " WHERE t.active = " . $active ;
2019-01-16 14:03:21 +01:00
if ( $type ) $sql .= " AND t.type LIKE '% " . $this -> db -> escape ( $type ) . " %' " ;
if ( $module ) $sql .= " AND t.module LIKE '% " . $this -> db -> escape ( $module ) . " %' " ;
2018-10-16 20:56:10 +02:00
// Add sql filters
if ( $sqlfilters )
{
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters ))
{
throw new RestException ( 503 , 'Error when validating parameter sqlfilters ' . $sqlfilters );
}
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)' ;
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
$sql .= $this -> db -> order ( $sortfield , $sortorder );
if ( $limit ) {
if ( $page < 0 ) {
$page = 0 ;
}
$offset = $limit * $page ;
$sql .= $this -> db -> plimit ( $limit , $offset );
}
$result = $this -> db -> query ( $sql );
if ( $result ) {
$num = $this -> db -> num_rows ( $result );
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
for ( $i = 0 ; $i < $min ; $i ++ ) {
$list [] = $this -> db -> fetch_object ( $result );
}
} else {
throw new RestException ( 503 , 'Error when retrieving list of ticket types : ' . $this -> db -> lasterror ());
}
return $list ;
}
2017-09-27 12:34:41 +02:00
2017-12-16 17:24:23 +01:00
/**
* Do a test of integrity for files and setup .
*
* @ param string $target Can be 'local' or 'default' or Url of the signatures file to use for the test . Must be reachable by the tested Dolibarr .
2019-09-01 22:02:48 +02:00
* @ return array Result of file and setup integrity check
2017-12-16 17:24:23 +01:00
*
* @ url GET checkintegrity
*
* @ throws RestException
*/
2019-02-25 20:35:59 +01:00
public function getCheckIntegrity ( $target )
2017-12-16 17:24:23 +01:00
{
global $langs , $conf ;
if ( ! DolibarrApiAccess :: $user -> admin
&& ( empty ( $conf -> global -> API_LOGIN_ALLOWED_FOR_INTEGRITY_CHECK ) || DolibarrApiAccess :: $user -> login != $conf -> global -> API_LOGIN_ALLOWED_FOR_INTEGRITY_CHECK ))
{
throw new RestException ( 503 , 'Error API open to admin users only or to login user defined with constant API_LOGIN_ALLOWED_FOR_INTEGRITY_CHECK' );
}
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/lib/geturl.lib.php' ;
$langs -> load ( " admin " );
$outexpectedchecksum = '' ;
$outcurrentchecksum = '' ;
// Modified or missing files
$file_list = array ( 'missing' => array (), 'updated' => array ());
// Local file to compare to
$xmlshortfile = GETPOST ( 'xmlshortfile' ) ? GETPOST ( 'xmlshortfile' ) : '/install/filelist-' . DOL_VERSION . '.xml' ;
$xmlfile = DOL_DOCUMENT_ROOT . $xmlshortfile ;
// Remote file to compare to
$xmlremote = ( $target == 'default' ? '' : $target );
if ( empty ( $xmlremote ) && ! empty ( $conf -> global -> MAIN_FILECHECK_URL )) $xmlremote = $conf -> global -> MAIN_FILECHECK_URL ;
$param = 'MAIN_FILECHECK_URL_' . DOL_VERSION ;
if ( empty ( $xmlremote ) && ! empty ( $conf -> global -> $param )) $xmlremote = $conf -> global -> $param ;
if ( empty ( $xmlremote )) $xmlremote = 'https://www.dolibarr.org/files/stable/signatures/filelist-' . DOL_VERSION . '.xml' ;
if ( $target == 'local' )
{
if ( dol_is_file ( $xmlfile ))
{
$xml = simplexml_load_file ( $xmlfile );
}
else
{
throw new RestException ( 500 , $langs -> trans ( 'XmlNotFound' ) . ': ' . $xmlfile );
}
}
else
{
$xmlarray = getURLContent ( $xmlremote );
// Return array('content'=>response,'curl_error_no'=>errno,'curl_error_msg'=>errmsg...)
if ( ! $xmlarray [ 'curl_error_no' ] && $xmlarray [ 'http_code' ] != '404' )
{
$xmlfile = $xmlarray [ 'content' ];
2018-02-26 15:03:09 +01:00
//print "xmlfilestart".$xmlfile."endxmlfile";
2017-12-16 17:24:23 +01:00
$xml = simplexml_load_string ( $xmlfile );
}
else
{
$errormsg = $langs -> trans ( 'XmlNotFound' ) . ': ' . $xmlremote . ' - ' . $xmlarray [ 'http_code' ] . ' ' . $xmlarray [ 'curl_error_no' ] . ' ' . $xmlarray [ 'curl_error_msg' ];
throw new RestException ( 500 , $errormsg );
}
}
2017-12-22 14:24:31 +01:00
if ( $xml )
2017-12-16 17:24:23 +01:00
{
$checksumconcat = array ();
$file_list = array ();
$out = '' ;
// Forced constants
if ( is_object ( $xml -> dolibarr_constants [ 0 ]))
{
$out .= load_fiche_titre ( $langs -> trans ( " ForcedConstants " ));
$out .= '<div class="div-table-responsive-no-min">' ;
$out .= '<table class="noborder">' ;
$out .= '<tr class="liste_titre">' ;
$out .= '<td>#</td>' ;
$out .= '<td>' . $langs -> trans ( " Constant " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " ExpectedValue " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " Value " ) . '</td>' ;
$out .= '</tr>' . " \n " ;
$i = 0 ;
foreach ( $xml -> dolibarr_constants [ 0 ] -> constant as $constant ) // $constant is a simpleXMLElement
{
$constname = $constant [ 'name' ];
$constvalue = ( string ) $constant ;
$constvalue = ( empty ( $constvalue ) ? '0' : $constvalue );
// Value found
$value = '' ;
if ( $constname && $conf -> global -> $constname != '' ) $value = $conf -> global -> $constname ;
$valueforchecksum = ( empty ( $value ) ? '0' : $value );
$checksumconcat [] = $valueforchecksum ;
$i ++ ;
$out .= '<tr class="oddeven">' ;
$out .= '<td>' . $i . '</td>' . " \n " ;
$out .= '<td>' . $constname . '</td>' . " \n " ;
$out .= '<td align="center">' . $constvalue . '</td>' . " \n " ;
$out .= '<td align="center">' . $valueforchecksum . '</td>' . " \n " ;
$out .= " </tr> \n " ;
}
if ( $i == 0 )
{
$out .= '<tr class="oddeven"><td colspan="4" class="opacitymedium">' . $langs -> trans ( " None " ) . '</td></tr>' ;
}
$out .= '</table>' ;
$out .= '</div>' ;
$out .= '<br>' ;
}
// Scan htdocs
if ( is_object ( $xml -> dolibarr_htdocs_dir [ 0 ]))
{
//var_dump($xml->dolibarr_htdocs_dir[0]['includecustom']);exit;
$includecustom = ( empty ( $xml -> dolibarr_htdocs_dir [ 0 ][ 'includecustom' ]) ? 0 : $xml -> dolibarr_htdocs_dir [ 0 ][ 'includecustom' ]);
// Defined qualified files (must be same than into generate_filelist_xml.php)
$regextoinclude = '\.(php|css|html|js|json|tpl|jpg|png|gif|sql|lang)$' ;
$regextoexclude = '(' . ( $includecustom ? '' : 'custom|' ) . 'documents|conf|install|public\/test|Shared\/PCLZip|nusoap\/lib\/Mail|php\/example|php\/test|geoip\/sample.*\.php|ckeditor\/samples|ckeditor\/adapters)$' ; // Exclude dirs
$scanfiles = dol_dir_list ( DOL_DOCUMENT_ROOT , 'files' , 1 , $regextoinclude , $regextoexclude );
// Fill file_list with files in signature, new files, modified files
2019-09-01 22:02:48 +02:00
$ret = getFilesUpdated ( $file_list , $xml -> dolibarr_htdocs_dir [ 0 ], '' , DOL_DOCUMENT_ROOT , $checksumconcat ); // Fill array $file_list
2017-12-16 17:24:23 +01:00
// Complete with list of new files
foreach ( $scanfiles as $keyfile => $valfile )
{
2019-01-27 11:55:16 +01:00
$tmprelativefilename = preg_replace ( '/^' . preg_quote ( DOL_DOCUMENT_ROOT , '/' ) . '/' , '' , $valfile [ 'fullname' ]);
2017-12-16 17:24:23 +01:00
if ( ! in_array ( $tmprelativefilename , $file_list [ 'insignature' ]))
{
$md5newfile =@ md5_file ( $valfile [ 'fullname' ]); // Can fails if we don't have permission to open/read file
$file_list [ 'added' ][] = array ( 'filename' => $tmprelativefilename , 'md5' => $md5newfile );
}
}
// Files missings
$out .= load_fiche_titre ( $langs -> trans ( " FilesMissing " ));
$out .= '<div class="div-table-responsive-no-min">' ;
$out .= '<table class="noborder">' ;
$out .= '<tr class="liste_titre">' ;
$out .= '<td>#</td>' ;
$out .= '<td>' . $langs -> trans ( " Filename " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " ExpectedChecksum " ) . '</td>' ;
$out .= '</tr>' . " \n " ;
$tmpfilelist = dol_sort_array ( $file_list [ 'missing' ], 'filename' );
if ( is_array ( $tmpfilelist ) && count ( $tmpfilelist ))
{
$i = 0 ;
foreach ( $tmpfilelist as $file )
{
$i ++ ;
$out .= '<tr class="oddeven">' ;
$out .= '<td>' . $i . '</td>' . " \n " ;
$out .= '<td>' . $file [ 'filename' ] . '</td>' . " \n " ;
$out .= '<td align="center">' . $file [ 'expectedmd5' ] . '</td>' . " \n " ;
$out .= " </tr> \n " ;
}
}
else
{
$out .= '<tr class="oddeven"><td colspan="3" class="opacitymedium">' . $langs -> trans ( " None " ) . '</td></tr>' ;
}
$out .= '</table>' ;
$out .= '</div>' ;
$out .= '<br>' ;
// Files modified
$out .= load_fiche_titre ( $langs -> trans ( " FilesModified " ));
$totalsize = 0 ;
$out .= '<div class="div-table-responsive-no-min">' ;
$out .= '<table class="noborder">' ;
$out .= '<tr class="liste_titre">' ;
$out .= '<td>#</td>' ;
$out .= '<td>' . $langs -> trans ( " Filename " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " ExpectedChecksum " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " CurrentChecksum " ) . '</td>' ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . $langs -> trans ( " Size " ) . '</td>' ;
$out .= '<td class="right">' . $langs -> trans ( " DateModification " ) . '</td>' ;
2017-12-16 17:24:23 +01:00
$out .= '</tr>' . " \n " ;
$tmpfilelist2 = dol_sort_array ( $file_list [ 'updated' ], 'filename' );
if ( is_array ( $tmpfilelist2 ) && count ( $tmpfilelist2 ))
{
$i = 0 ;
foreach ( $tmpfilelist2 as $file )
{
$i ++ ;
$out .= '<tr class="oddeven">' ;
$out .= '<td>' . $i . '</td>' . " \n " ;
$out .= '<td>' . $file [ 'filename' ] . '</td>' . " \n " ;
$out .= '<td align="center">' . $file [ 'expectedmd5' ] . '</td>' . " \n " ;
$out .= '<td align="center">' . $file [ 'md5' ] . '</td>' . " \n " ;
$size = dol_filesize ( DOL_DOCUMENT_ROOT . '/' . $file [ 'filename' ]);
$totalsize += $size ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . dol_print_size ( $size ) . '</td>' . " \n " ;
2019-01-27 11:55:16 +01:00
$out .= '<td class="right">' . dol_print_date ( dol_filemtime ( DOL_DOCUMENT_ROOT . '/' . $file [ 'filename' ]), 'dayhour' ) . '</td>' . " \n " ;
2017-12-16 17:24:23 +01:00
$out .= " </tr> \n " ;
}
$out .= '<tr class="liste_total">' ;
$out .= '<td></td>' . " \n " ;
$out .= '<td>' . $langs -> trans ( " Total " ) . '</td>' . " \n " ;
$out .= '<td align="center"></td>' . " \n " ;
$out .= '<td align="center"></td>' . " \n " ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . dol_print_size ( $totalsize ) . '</td>' . " \n " ;
$out .= '<td class="right"></td>' . " \n " ;
2017-12-16 17:24:23 +01:00
$out .= " </tr> \n " ;
}
else
{
$out .= '<tr class="oddeven"><td colspan="5" class="opacitymedium">' . $langs -> trans ( " None " ) . '</td></tr>' ;
}
$out .= '</table>' ;
$out .= '</div>' ;
$out .= '<br>' ;
// Files added
$out .= load_fiche_titre ( $langs -> trans ( " FilesAdded " ));
$totalsize = 0 ;
$out .= '<div class="div-table-responsive-no-min">' ;
$out .= '<table class="noborder">' ;
$out .= '<tr class="liste_titre">' ;
$out .= '<td>#</td>' ;
$out .= '<td>' . $langs -> trans ( " Filename " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " ExpectedChecksum " ) . '</td>' ;
$out .= '<td align="center">' . $langs -> trans ( " CurrentChecksum " ) . '</td>' ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . $langs -> trans ( " Size " ) . '</td>' ;
$out .= '<td class="right">' . $langs -> trans ( " DateModification " ) . '</td>' ;
2017-12-16 17:24:23 +01:00
$out .= '</tr>' . " \n " ;
$tmpfilelist3 = dol_sort_array ( $file_list [ 'added' ], 'filename' );
if ( is_array ( $tmpfilelist3 ) && count ( $tmpfilelist3 ))
{
$i = 0 ;
foreach ( $tmpfilelist3 as $file )
{
$i ++ ;
$out .= '<tr class="oddeven">' ;
$out .= '<td>' . $i . '</td>' . " \n " ;
$out .= '<td>' . $file [ 'filename' ] . '</td>' . " \n " ;
$out .= '<td align="center">' . $file [ 'expectedmd5' ] . '</td>' . " \n " ;
$out .= '<td align="center">' . $file [ 'md5' ] . '</td>' . " \n " ;
$size = dol_filesize ( DOL_DOCUMENT_ROOT . '/' . $file [ 'filename' ]);
$totalsize += $size ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . dol_print_size ( $size ) . '</td>' . " \n " ;
2019-01-27 11:55:16 +01:00
$out .= '<td class="right">' . dol_print_date ( dol_filemtime ( DOL_DOCUMENT_ROOT . '/' . $file [ 'filename' ]), 'dayhour' ) . '</td>' . " \n " ;
2017-12-16 17:24:23 +01:00
$out .= " </tr> \n " ;
}
$out .= '<tr class="liste_total">' ;
$out .= '<td></td>' . " \n " ;
$out .= '<td>' . $langs -> trans ( " Total " ) . '</td>' . " \n " ;
$out .= '<td align="center"></td>' . " \n " ;
$out .= '<td align="center"></td>' . " \n " ;
2019-01-22 13:54:04 +01:00
$out .= '<td class="right">' . dol_print_size ( $totalsize ) . '</td>' . " \n " ;
$out .= '<td class="right"></td>' . " \n " ;
2017-12-16 17:24:23 +01:00
$out .= " </tr> \n " ;
}
else
{
$out .= '<tr class="oddeven"><td colspan="5" class="opacitymedium">' . $langs -> trans ( " None " ) . '</td></tr>' ;
}
$out .= '</table>' ;
$out .= '</div>' ;
// Show warning
if ( empty ( $tmpfilelist ) && empty ( $tmpfilelist2 ) && empty ( $tmpfilelist3 ))
{
2018-07-23 17:57:11 +02:00
//setEventMessages($langs->trans("FileIntegrityIsStrictlyConformedWithReference"), null, 'mesgs');
2017-12-16 17:24:23 +01:00
}
else
{
2018-07-23 17:57:11 +02:00
//setEventMessages($langs->trans("FileIntegritySomeFilesWereRemovedOrModified"), null, 'warnings');
2017-12-16 17:24:23 +01:00
}
}
else
{
throw new RestException ( 500 , 'Error: Failed to found dolibarr_htdocs_dir into XML file ' . $xmlfile );
}
// Scan scripts
asort ( $checksumconcat ); // Sort list of checksum
//var_dump($checksumconcat);
2019-01-27 11:55:16 +01:00
$checksumget = md5 ( join ( ',' , $checksumconcat ));
2017-12-16 17:24:23 +01:00
$checksumtoget = trim (( string ) $xml -> dolibarr_htdocs_dir_checksum );
$outexpectedchecksum = ( $checksumtoget ? $checksumtoget : $langs -> trans ( " Unknown " ));
if ( $checksumget == $checksumtoget )
{
if ( count ( $file_list [ 'added' ]))
{
$resultcode = 'warning' ;
$resultcomment = 'FileIntegrityIsOkButFilesWereAdded' ;
//$outcurrentchecksum = $checksumget.' - <span class="'.$resultcode.'">'.$langs->trans("FileIntegrityIsOkButFilesWereAdded").'</span>';
$outcurrentchecksum = $checksumget ;
}
else
{
$resultcode = 'ok' ;
$resultcomment = 'Success' ;
//$outcurrentchecksum = '<span class="'.$resultcode.'">'.$checksumget.'</span>';
$outcurrentchecksum = $checksumget ;
}
}
else
{
$resultcode = 'error' ;
$resultcomment = 'Error' ;
//$outcurrentchecksum = '<span class="'.$resultcode.'">'.$checksumget.'</span>';
$outcurrentchecksum = $checksumget ;
}
}
else {
throw new RestException ( 404 , 'No signature file known' );
}
return array ( 'resultcode' => $resultcode , 'resultcomment' => $resultcomment , 'expectedchecksum' => $outexpectedchecksum , 'currentchecksum' => $outcurrentchecksum , 'out' => $out );
}
2017-09-26 10:48:35 +02:00
}