2015-05-05 04:40:28 +02:00
< ? php
/* Copyright ( C ) 2015 Jean - François Ferry < jfefe @ aternatik . fr >
2021-03-20 09:02:29 +01:00
* Copyright ( C ) 2020 Thibault FOUCART < support @ ptibogxiv . net >
2015-05-05 04:40:28 +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 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 />.
2015-05-05 04:40:28 +02:00
*/
2017-10-19 12:35:15 +02:00
use Luracast\Restler\RestException ;
2015-05-05 04:40:28 +02:00
2017-10-19 12:35:15 +02:00
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php' ;
2022-02-28 10:37:03 +01:00
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture-rec.class.php' ;
2015-05-05 04:40:28 +02:00
/**
2016-06-14 19:55:49 +02:00
* API class for invoices
2015-05-05 04:40:28 +02:00
*
2017-07-28 10:16:17 +02:00
* @ access protected
2015-05-05 04:40:28 +02:00
* @ class DolibarrApiAccess { @ requires user , external }
*/
2016-06-14 19:55:49 +02:00
class Invoices extends DolibarrApi
2015-05-06 00:55:42 +02:00
{
2020-09-14 04:30:04 +02:00
/**
*
* @ var array $FIELDS Mandatory fields , checked when create and update object
*/
static $FIELDS = array (
'socid' ,
);
/**
* @ var Facture $invoice { @ type Facture }
*/
2022-02-28 10:37:03 +01:00
private $invoice ;
/**
* @ var FactureRec $templte_invoice { @ type FactureRec }
*/
private $template_invoice ;
2020-09-14 04:30:04 +02:00
/**
* Constructor
*/
public function __construct ()
{
global $db , $conf ;
$this -> db = $db ;
$this -> invoice = new Facture ( $this -> db );
2022-02-28 10:37:03 +01:00
$this -> template_invoice = new FactureRec ( $this -> db );
2020-09-14 04:30:04 +02:00
}
/**
* Get properties of a invoice object
*
* Return an array with invoice informations
*
* @ param int $id ID of invoice
2022-02-28 10:37:03 +01:00
* @ param int $contact_list 0 : Return array contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
2020-09-14 04:30:04 +02:00
* @ return array | mixed data without useless information
*
* @ throws RestException
*/
2019-02-25 23:15:48 +01:00
public function get ( $id , $contact_list = 1 )
2018-02-01 02:14:17 +01:00
{
2020-09-14 04:30:04 +02:00
return $this -> _fetch ( $id , '' , '' , $contact_list );
2020-03-01 18:33:13 +01:00
}
2020-03-01 18:35:12 +01:00
2020-09-14 04:30:04 +02:00
/**
* Get properties of an invoice object by ref
*
* Return an array with invoice informations
*
* @ param string $ref Ref of object
2022-02-28 10:37:03 +01:00
* @ param int $contact_list 0 : Returned array of contacts / addresses contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
2020-09-14 04:30:04 +02:00
* @ return array | mixed data without useless information
*
* @ url GET ref / { ref }
*
* @ throws RestException
*/
public function getByRef ( $ref , $contact_list = 1 )
{
return $this -> _fetch ( '' , $ref , '' , $contact_list );
}
/**
* Get properties of an invoice object by ref_ext
*
* Return an array with invoice informations
*
* @ param string $ref_ext External reference of object
2022-02-28 10:37:03 +01:00
* @ param int $contact_list 0 : Returned array of contacts / addresses contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
2020-09-14 04:30:04 +02:00
* @ return array | mixed data without useless information
*
* @ url GET ref_ext / { ref_ext }
*
* @ throws RestException
*/
public function getByRefExt ( $ref_ext , $contact_list = 1 )
{
return $this -> _fetch ( '' , '' , $ref_ext , $contact_list );
}
/**
* Get properties of an invoice object
*
* Return an array with invoice informations
*
2022-02-28 10:37:03 +01:00
* @ param int $id ID of order
2020-03-01 18:33:13 +01:00
* @ param string $ref Ref of object
* @ param string $ref_ext External reference of object
2022-02-28 10:37:03 +01:00
* @ param int $contact_list 0 : Returned array of contacts / addresses contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
2020-09-14 04:30:04 +02:00
* @ return array | mixed data without useless information
*
* @ throws RestException
*/
private function _fetch ( $id , $ref = '' , $ref_ext = '' , $contact_list = 1 )
{
2019-11-13 19:37:08 +01:00
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 );
}
2017-07-28 10:16:17 +02:00
2020-03-06 14:38:06 +01:00
$result = $this -> invoice -> fetch ( $id , $ref , $ref_ext );
2019-11-13 19:37:08 +01:00
if ( ! $result ) {
2018-02-01 02:14:17 +01:00
throw new RestException ( 404 , 'Invoice not found' );
}
2017-07-28 10:16:17 +02:00
2018-02-01 02:14:17 +01:00
// Get payment details
2019-05-18 00:40:29 +02:00
$this -> invoice -> totalpaid = $this -> invoice -> getSommePaiement ();
2018-02-01 02:14:17 +01:00
$this -> invoice -> totalcreditnotes = $this -> invoice -> getSumCreditNotesUsed ();
$this -> invoice -> totaldeposits = $this -> invoice -> getSumDepositsUsed ();
2019-05-18 00:58:43 +02:00
$this -> invoice -> remaintopay = price2num ( $this -> invoice -> total_ttc - $this -> invoice -> totalpaid - $this -> invoice -> totalcreditnotes - $this -> invoice -> totaldeposits , 'MT' );
2017-10-23 16:45:49 +02:00
2019-11-13 19:37:08 +01:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2018-05-29 10:04:20 +02:00
// Add external contacts ids
2022-02-28 10:37:03 +01:00
if ( $contact_list > - 1 ) {
2022-05-21 15:22:08 +02:00
$tmparray = $this -> invoice -> liste_contact ( - 1 , 'external' , $contact_list );
2022-05-21 23:07:22 +02:00
if ( is_array ( $tmparray )) {
2022-05-21 15:22:08 +02:00
$this -> invoice -> contacts_ids = $tmparray ;
}
2022-02-28 10:37:03 +01:00
}
2018-05-29 10:04:20 +02:00
2017-10-19 17:57:16 +02:00
$this -> invoice -> fetchObjectLinked ();
2022-02-28 10:37:03 +01:00
2015-05-05 04:40:28 +02:00
return $this -> _cleanObjectDatas ( $this -> invoice );
2020-09-14 04:30:04 +02:00
}
/**
* List invoices
*
* Get a list of invoices
*
* @ param string $sortfield Sort field
* @ param string $sortorder Sort order
* @ param int $limit Limit for list
* @ param int $page Page number
* @ param string $thirdparty_ids Thirdparty ids to filter orders of ( example '1' or '1,2,3' ) { @ pattern /^ [ 0 - 9 ,] * $ / i }
* @ param string $status Filter by invoice status : draft | unpaid | paid | cancelled
* @ param string $sqlfilters Other criteria to filter answers separated by a comma . Syntax example " (t.ref:like:'SO-%') and (t.date_creation:<:'20160101') "
* @ return array Array of invoice objects
*
2020-03-17 13:50:20 +01:00
* @ throws RestException 404 Not found
* @ throws RestException 503 Error
2020-09-14 04:30:04 +02:00
*/
public function index ( $sortfield = " t.rowid " , $sortorder = 'ASC' , $limit = 100 , $page = 0 , $thirdparty_ids = '' , $status = '' , $sqlfilters = '' )
{
global $db , $conf ;
2017-07-28 10:16:17 +02:00
2021-04-08 19:05:28 +02:00
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
throw new RestException ( 401 );
}
2020-09-14 04:30:04 +02:00
$obj_ret = array ();
2016-12-07 19:02:39 +01:00
2020-09-14 04:30:04 +02:00
// case of external user, $thirdparty_ids param is ignored and replaced by user's socid
$socids = DolibarrApiAccess :: $user -> socid ? DolibarrApiAccess :: $user -> socid : $thirdparty_ids ;
2017-07-28 10:16:17 +02:00
2020-09-14 04:30:04 +02:00
// If the internal user must only see his customers, force searching by him
$search_sale = 0 ;
2021-02-23 21:09:01 +01:00
if ( ! DolibarrApiAccess :: $user -> rights -> societe -> client -> voir && ! $socids ) {
$search_sale = DolibarrApiAccess :: $user -> id ;
}
2015-05-05 04:40:28 +02:00
2020-09-14 04:30:04 +02:00
$sql = " SELECT t.rowid " ;
2021-02-23 21:09:01 +01:00
if (( ! DolibarrApiAccess :: $user -> rights -> societe -> client -> voir && ! $socids ) || $search_sale > 0 ) {
$sql .= " , sc.fk_soc, sc.fk_user " ; // We need these fields in order to filter by sale (including the case where the user can only see his prospects)
}
2020-09-14 04:30:04 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . " facture as t " ;
2017-07-28 10:16:17 +02:00
2021-02-23 21:09:01 +01:00
if (( ! DolibarrApiAccess :: $user -> rights -> societe -> client -> voir && ! $socids ) || $search_sale > 0 ) {
$sql .= " , " . MAIN_DB_PREFIX . " societe_commerciaux as sc " ; // We need this table joined to the select in order to filter by sale
}
2015-05-05 04:40:28 +02:00
2020-09-14 04:30:04 +02:00
$sql .= ' WHERE t.entity IN (' . getEntity ( 'invoice' ) . ')' ;
2021-02-23 21:09:01 +01:00
if (( ! DolibarrApiAccess :: $user -> rights -> societe -> client -> voir && ! $socids ) || $search_sale > 0 ) {
$sql .= " AND t.fk_soc = sc.fk_soc " ;
}
if ( $socids ) {
2021-03-22 11:30:18 +01:00
$sql .= " AND t.fk_soc IN ( " . $this -> db -> sanitize ( $socids ) . " ) " ;
2021-02-23 21:09:01 +01:00
}
2016-12-07 19:02:39 +01:00
2021-02-23 21:09:01 +01:00
if ( $search_sale > 0 ) {
$sql .= " AND t.rowid = sc.fk_soc " ; // Join for the needed table to filter by sale
}
2017-07-28 10:16:17 +02:00
2016-06-14 19:55:49 +02:00
// Filter by status
2021-02-23 21:09:01 +01:00
if ( $status == 'draft' ) {
$sql .= " AND t.fk_statut IN (0) " ;
}
if ( $status == 'unpaid' ) {
$sql .= " AND t.fk_statut IN (1) " ;
}
if ( $status == 'paid' ) {
$sql .= " AND t.fk_statut IN (2) " ;
}
if ( $status == 'cancelled' ) {
$sql .= " AND t.fk_statut IN (3) " ;
}
2020-09-14 04:30:04 +02:00
// Insert sale filter
2021-02-23 21:09:01 +01:00
if ( $search_sale > 0 ) {
2021-06-09 15:36:47 +02:00
$sql .= " AND sc.fk_user = " . (( int ) $search_sale );
2020-09-14 04:30:04 +02:00
}
// Add sql filters
2021-02-23 21:09:01 +01:00
if ( $sqlfilters ) {
2021-12-20 20:49:32 +01:00
$errormessage = '' ;
if ( ! DolibarrApi :: _checkFilters ( $sqlfilters , $errormessage )) {
throw new RestException ( 503 , 'Error when validating parameter sqlfilters -> ' . $errormessage );
2020-09-14 04:30:04 +02:00
}
2021-05-03 14:58:29 +02:00
$regexstring = '\(([^:\'\(\)]+:[^:\'\(\)]+:[^\(\)]+)\)' ;
2020-09-14 04:30:04 +02:00
$sql .= " AND ( " . preg_replace_callback ( '/' . $regexstring . '/' , 'DolibarrApi::_forge_criteria_callback' , $sqlfilters ) . " ) " ;
}
2017-07-28 10:16:17 +02:00
2020-09-19 23:30:29 +02:00
$sql .= $this -> db -> order ( $sortfield , $sortorder );
2021-02-23 21:09:01 +01:00
if ( $limit ) {
if ( $page < 0 ) {
2020-09-14 04:30:04 +02:00
$page = 0 ;
}
$offset = $limit * $page ;
2015-05-05 04:40:28 +02:00
2020-09-19 23:30:29 +02:00
$sql .= $this -> db -> plimit ( $limit + 1 , $offset );
2020-09-14 04:30:04 +02:00
}
2015-05-05 04:40:28 +02:00
2020-09-19 23:30:29 +02:00
$result = $this -> db -> query ( $sql );
2021-02-23 21:09:01 +01:00
if ( $result ) {
2020-09-14 04:30:04 +02:00
$i = 0 ;
2020-09-19 23:30:29 +02:00
$num = $this -> db -> num_rows ( $result );
2020-09-14 04:30:04 +02:00
$min = min ( $num , ( $limit <= 0 ? $num : $limit ));
2021-02-23 21:09:01 +01:00
while ( $i < $min ) {
2020-09-19 23:30:29 +02:00
$obj = $this -> db -> fetch_object ( $result );
$invoice_static = new Facture ( $this -> db );
2021-02-23 21:09:01 +01:00
if ( $invoice_static -> fetch ( $obj -> rowid )) {
2020-09-14 04:30:04 +02:00
// Get payment details
$invoice_static -> totalpaid = $invoice_static -> getSommePaiement ();
$invoice_static -> totalcreditnotes = $invoice_static -> getSumCreditNotesUsed ();
$invoice_static -> totaldeposits = $invoice_static -> getSumDepositsUsed ();
$invoice_static -> remaintopay = price2num ( $invoice_static -> total_ttc - $invoice_static -> totalpaid - $invoice_static -> totalcreditnotes - $invoice_static -> totaldeposits , 'MT' );
2018-01-04 21:14:45 +01:00
2018-05-29 10:04:20 +02:00
// Add external contacts ids
2022-05-21 15:22:08 +02:00
$tmparray = $invoice_static -> liste_contact ( - 1 , 'external' , 1 );
if ( is_array ( $tmparray )) {
$invoice_static -> contacts_ids = $tmparray ;
}
2020-09-14 04:30:04 +02:00
$obj_ret [] = $this -> _cleanObjectDatas ( $invoice_static );
}
$i ++ ;
}
} else {
2020-09-19 23:30:29 +02:00
throw new RestException ( 503 , 'Error when retrieve invoice list : ' . $this -> db -> lasterror ());
2020-09-14 04:30:04 +02:00
}
if ( ! count ( $obj_ret )) {
throw new RestException ( 404 , 'No invoice found' );
}
2015-05-05 04:40:28 +02:00
return $obj_ret ;
2020-09-14 04:30:04 +02:00
}
/**
* Create invoice object
*
* @ param array $request_data Request datas
* @ return int ID of invoice
*/
public function post ( $request_data = null )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
2016-07-29 02:28:51 +02:00
throw new RestException ( 401 , " Insuffisant rights " );
2015-05-05 04:40:28 +02:00
}
2020-09-14 04:30:04 +02:00
// Check mandatory fields
$result = $this -> _validate ( $request_data );
2017-07-28 10:16:17 +02:00
2020-09-14 04:30:04 +02:00
foreach ( $request_data as $field => $value ) {
$this -> invoice -> $field = $value ;
}
if ( ! array_key_exists ( 'date' , $request_data )) {
$this -> invoice -> date = dol_now ();
}
/* We keep lines as an array
2021-02-23 21:09:01 +01:00
if ( isset ( $request_data [ " lines " ])) {
$lines = array ();
foreach ( $request_data [ " lines " ] as $line ) {
array_push ( $lines , ( object ) $line );
}
$this -> invoice -> lines = $lines ;
} */
2017-07-28 10:16:17 +02:00
2020-09-14 04:30:04 +02:00
if ( $this -> invoice -> create ( DolibarrApiAccess :: $user , 0 , ( empty ( $request_data [ " date_lim_reglement " ]) ? 0 : $request_data [ " date_lim_reglement " ])) < 0 ) {
throw new RestException ( 500 , " Error creating invoice " , array_merge ( array ( $this -> invoice -> error ), $this -> invoice -> errors ));
}
return $this -> invoice -> id ;
}
2017-11-14 15:49:09 +01:00
2020-09-14 04:30:04 +02:00
/**
* Create an invoice using an existing order .
*
*
* @ param int $orderid Id of the order
*
* @ url POST / createfromorder / { orderid }
*
* @ return int
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 405
*/
public function createInvoiceFromOrder ( $orderid )
{
2017-11-14 15:49:09 +01:00
2020-09-14 04:30:04 +02:00
require_once DOL_DOCUMENT_ROOT . '/commande/class/commande.class.php' ;
2017-11-14 15:49:09 +01:00
2020-09-14 04:30:04 +02:00
if ( ! DolibarrApiAccess :: $user -> rights -> commande -> lire ) {
throw new RestException ( 401 );
}
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
if ( empty ( $orderid )) {
throw new RestException ( 400 , 'Order ID is mandatory' );
}
2017-11-14 15:49:09 +01:00
2020-09-14 04:30:04 +02:00
$order = new Commande ( $this -> db );
$result = $order -> fetch ( $orderid );
if ( ! $result ) {
throw new RestException ( 404 , 'Order not found' );
}
$result = $this -> invoice -> createFromOrder ( $order , DolibarrApiAccess :: $user );
if ( $result < 0 ) {
throw new RestException ( 405 , $this -> invoice -> error );
}
$this -> invoice -> fetchObjectLinked ();
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Get lines of an invoice
*
* @ param int $id Id of invoice
*
* @ url GET { id } / lines
*
* @ return int
*/
public function getLines ( $id )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$this -> invoice -> getLinesArray ();
$result = array ();
foreach ( $this -> invoice -> lines as $line ) {
array_push ( $result , $this -> _cleanObjectDatas ( $line ));
}
return $result ;
}
/**
* Update a line to a given invoice
*
* @ param int $id Id of invoice to update
* @ param int $lineid Id of line to update
* @ param array $request_data InvoiceLine data
*
* @ url PUT { id } / lines / { lineid }
*
* @ return array
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404 Invoice not found
*/
public function putLine ( $id , $lineid , $request_data = null )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2021-04-25 19:21:48 +02:00
2020-09-14 04:30:04 +02:00
$request_data = ( object ) $request_data ;
2021-04-25 19:21:48 +02:00
2022-03-30 12:16:17 +02:00
$request_data -> desc = sanitizeVal ( $request_data -> desc , 'restricthtml' );
$request_data -> label = sanitizeVal ( $request_data -> label );
2021-04-25 19:21:48 +02:00
2020-09-14 04:30:04 +02:00
$updateRes = $this -> invoice -> updateline (
$lineid ,
$request_data -> desc ,
$request_data -> subprice ,
$request_data -> qty ,
$request_data -> remise_percent ,
$request_data -> date_start ,
$request_data -> date_end ,
$request_data -> tva_tx ,
$request_data -> localtax1_tx ,
$request_data -> localtax2_tx ,
2021-04-25 19:21:48 +02:00
$request_data -> price_base_type ? $request_data -> price_base_type : 'HT' ,
2020-09-14 04:30:04 +02:00
$request_data -> info_bits ,
$request_data -> product_type ,
$request_data -> fk_parent_line ,
0 ,
$request_data -> fk_fournprice ,
$request_data -> pa_ht ,
$request_data -> label ,
$request_data -> special_code ,
$request_data -> array_options ,
$request_data -> situation_percent ,
$request_data -> fk_unit ,
$request_data -> multicurrency_subprice ,
0 ,
2022-05-11 15:34:16 +02:00
$request_data -> ref_ext ,
$request_data -> rang
2020-09-14 04:30:04 +02:00
);
if ( $updateRes > 0 ) {
$result = $this -> get ( $id );
unset ( $result -> line );
return $this -> _cleanObjectDatas ( $result );
} else {
throw new RestException ( 304 , $this -> invoice -> error );
}
}
/**
2019-02-14 00:44:40 +01:00
* Add a contact type of given invoice
*
* @ param int $id Id of invoice to update
* @ param int $contactid Id of contact to add
* @ param string $type Type of the contact ( BILLING , SHIPPING , CUSTOMER )
*
* @ url POST { id } / contact / { contactid } / { type }
*
* @ return int
2020-03-01 18:43:20 +01:00
*
2020-09-14 04:30:04 +02:00
* @ throws RestException 401
* @ throws RestException 404
2019-02-14 00:44:40 +01:00
*/
2020-09-14 04:30:04 +02:00
public function postContact ( $id , $contactid , $type )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
2019-02-14 00:44:40 +01:00
2020-09-14 04:30:04 +02:00
$result = $this -> invoice -> fetch ( $id );
2019-02-14 00:44:40 +01:00
2019-11-13 19:37:08 +01:00
if ( ! $result ) {
2019-02-14 00:44:40 +01:00
throw new RestException ( 404 , 'Invoice not found' );
}
2020-09-14 04:30:04 +02:00
if ( ! in_array ( $type , array ( 'BILLING' , 'SHIPPING' , 'CUSTOMER' ), true )) {
throw new RestException ( 500 , 'Availables types: BILLING, SHIPPING OR CUSTOMER' );
}
2019-02-14 00:44:40 +01:00
2020-09-14 04:30:04 +02:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'invoice' , $this -> invoice -> id )) {
2019-02-14 00:44:40 +01:00
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2020-09-14 04:30:04 +02:00
$result = $this -> invoice -> add_contact ( $contactid , $type , 'external' );
2019-02-14 00:44:40 +01:00
2020-09-14 04:30:04 +02:00
if ( ! $result ) {
throw new RestException ( 500 , 'Error when added the contact' );
}
2019-02-14 00:44:40 +01:00
2020-09-14 04:30:04 +02:00
return $this -> _cleanObjectDatas ( $this -> invoice );
}
2019-02-14 00:44:40 +01:00
2020-09-14 04:30:04 +02:00
/**
2019-02-14 00:44:40 +01:00
* Delete a contact type of given invoice
*
* @ param int $id Id of invoice to update
2020-10-05 12:21:54 +02:00
* @ param int $contactid Row key of the contact in the array contact_ids .
2020-09-19 22:39:39 +02:00
* @ param string $type Type of the contact ( BILLING , SHIPPING , CUSTOMER ) .
2019-02-14 00:44:40 +01:00
*
2020-10-05 12:21:54 +02:00
* @ url DELETE { id } / contact / { contactid } / { type }
2019-02-14 00:44:40 +01:00
*
2019-09-30 21:44:37 +02:00
* @ return array
2020-10-31 18:51:30 +01:00
*
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2019-02-14 00:44:40 +01:00
*/
2020-10-31 18:51:30 +01:00
public function deleteContact ( $id , $contactid , $type )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
2019-02-14 00:44:40 +01:00
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> fetch ( $id );
2019-02-14 00:44:40 +01:00
2019-02-14 18:22:35 +01:00
if ( ! $result ) {
2019-02-14 00:44:40 +01:00
throw new RestException ( 404 , 'Invoice not found' );
}
2020-10-31 18:51:30 +01:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'invoice' , $this -> invoice -> id )) {
2019-02-14 00:44:40 +01:00
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2020-10-31 18:51:30 +01:00
$contacts = $this -> invoice -> liste_contact ();
2020-09-19 22:05:08 +02:00
2020-09-19 22:01:48 +02:00
foreach ( $contacts as $contact ) {
2020-10-05 12:21:54 +02:00
if ( $contact [ 'id' ] == $contactid && $contact [ 'code' ] == $type ) {
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> delete_contact ( $contact [ 'rowid' ]);
if ( ! $result ) {
throw new RestException ( 500 , 'Error when deleted the contact' );
}
}
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Deletes a line of a given invoice
*
* @ param int $id Id of invoice
* @ param int $lineid Id of the line to delete
*
* @ url DELETE { id } / lines / { lineid }
*
* @ return array
*
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 405
*/
public function deleteLine ( $id , $lineid )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
if ( empty ( $lineid )) {
throw new RestException ( 400 , 'Line ID is mandatory' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
// TODO Check the lineid $lineid is a line of ojbect
$updateRes = $this -> invoice -> deleteline ( $lineid );
if ( $updateRes > 0 ) {
return $this -> get ( $id );
} else {
throw new RestException ( 405 , $this -> invoice -> error );
}
}
/**
* Update invoice
*
* @ param int $id Id of invoice to update
* @ param array $request_data Datas
* @ return int
*/
public function put ( $id , $request_data = null )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 );
}
2017-07-28 10:16:17 +02:00
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
2017-07-28 10:16:17 +02:00
2019-11-13 19:37:08 +01:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2020-10-31 18:51:30 +01:00
foreach ( $request_data as $field => $value ) {
2021-02-23 21:09:01 +01:00
if ( $field == 'id' ) {
continue ;
}
2020-10-31 18:51:30 +01:00
$this -> invoice -> $field = $value ;
}
2017-07-28 10:16:17 +02:00
2020-10-31 18:51:30 +01:00
// update bank account
2021-02-23 21:09:01 +01:00
if ( ! empty ( $this -> invoice -> fk_account )) {
2020-10-31 18:51:30 +01:00
if ( $this -> invoice -> setBankAccount ( $this -> invoice -> fk_account ) == 0 ) {
throw new RestException ( 400 , $this -> invoice -> error );
}
}
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> update ( DolibarrApiAccess :: $user )) {
2020-10-31 18:51:30 +01:00
return $this -> get ( $id );
2021-02-23 21:09:01 +01:00
}
2020-10-31 18:51:30 +01:00
return false ;
}
/**
* Delete invoice
*
* @ param int $id Invoice ID
* @ return array
*/
public function delete ( $id )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> supprimer ) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 );
}
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
2017-07-28 10:16:17 +02:00
2019-11-13 19:37:08 +01:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
2015-05-05 04:40:28 +02:00
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2017-07-28 10:16:17 +02:00
2020-04-17 10:27:38 +02:00
$result = $this -> invoice -> delete ( DolibarrApiAccess :: $user );
2021-02-23 21:09:01 +01:00
if ( $result < 0 ) {
2022-03-18 16:14:20 +01:00
throw new RestException ( 500 , 'Error when deleting invoice' );
2020-10-31 18:51:30 +01:00
}
2020-10-05 23:58:00 +02:00
2020-10-31 18:51:30 +01:00
return array (
'success' => array (
'code' => 200 ,
'message' => 'Invoice deleted'
)
);
}
2019-04-08 16:00:01 +02:00
2020-10-31 18:51:30 +01:00
/**
* Add a line to a given invoice
*
* Exemple of POST query :
* {
* " desc " : " Desc " , " subprice " : " 1.00000000 " , " qty " : " 1 " , " tva_tx " : " 20.000 " , " localtax1_tx " : " 0.000 " , " localtax2_tx " : " 0.000 " ,
* " fk_product " : " 1 " , " remise_percent " : " 0 " , " date_start " : " " , " date_end " : " " , " fk_code_ventilation " : 0 , " info_bits " : " 0 " ,
* " fk_remise_except " : null , " product_type " : " 1 " , " rang " : " -1 " , " special_code " : " 0 " , " fk_parent_line " : null , " fk_fournprice " : null ,
* " pa_ht " : " 0.00000000 " , " label " : " " , " array_options " : [], " situation_percent " : " 100 " , " fk_prev_id " : null , " fk_unit " : null
* }
*
* @ param int $id Id of invoice
* @ param array $request_data InvoiceLine data
*
* @ url POST { id } / lines
*
* @ return int
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 400
*/
public function postLine ( $id , $request_data = null )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
2019-04-08 16:00:01 +02:00
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
2019-04-08 16:00:01 +02:00
2020-10-31 18:51:30 +01:00
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2020-09-22 16:41:28 +02:00
2020-10-31 18:51:30 +01:00
$request_data = ( object ) $request_data ;
2020-09-19 14:23:53 +02:00
2022-03-30 12:16:17 +02:00
$request_data -> desc = sanitizeVal ( $request_data -> desc , 'restricthtml' );
$request_data -> label = sanitizeVal ( $request_data -> label );
2021-04-25 19:21:48 +02:00
2020-10-31 18:51:30 +01:00
// Reset fk_parent_line for no child products and special product
if (( $request_data -> product_type != 9 && empty ( $request_data -> fk_parent_line )) || $request_data -> product_type == 9 ) {
$request_data -> fk_parent_line = 0 ;
}
// calculate pa_ht
$marginInfos = getMarginInfos ( $request_data -> subprice , $request_data -> remise_percent , $request_data -> tva_tx , $request_data -> localtax1_tx , $request_data -> localtax2_tx , $request_data -> fk_fournprice , $request_data -> pa_ht );
$pa_ht = $marginInfos [ 0 ];
$updateRes = $this -> invoice -> addline (
$request_data -> desc ,
$request_data -> subprice ,
$request_data -> qty ,
$request_data -> tva_tx ,
$request_data -> localtax1_tx ,
$request_data -> localtax2_tx ,
$request_data -> fk_product ,
$request_data -> remise_percent ,
$request_data -> date_start ,
$request_data -> date_end ,
$request_data -> fk_code_ventilation ,
$request_data -> info_bits ,
$request_data -> fk_remise_except ,
2021-04-25 19:21:48 +02:00
$request_data -> price_base_type ? $request_data -> price_base_type : 'HT' ,
$request_data -> subprice ,
2020-10-31 18:51:30 +01:00
$request_data -> product_type ,
$request_data -> rang ,
$request_data -> special_code ,
$request_data -> origin ,
$request_data -> origin_id ,
$request_data -> fk_parent_line ,
empty ( $request_data -> fk_fournprice ) ? null : $request_data -> fk_fournprice ,
$pa_ht ,
$request_data -> label ,
$request_data -> array_options ,
$request_data -> situation_percent ,
$request_data -> fk_prev_id ,
$request_data -> fk_unit ,
0 ,
$request_data -> ref_ext
);
if ( $updateRes < 0 ) {
throw new RestException ( 400 , 'Unable to insert the new line. Check your inputs. ' . $this -> invoice -> error );
}
return $updateRes ;
}
/**
* Adds a contact to an invoice
*
* @ param int $id Order ID
* @ param int $fk_socpeople Id of thirdparty contact ( if source = 'external' ) or id of user ( if souce = 'internal' ) to link
* @ param string $type_contact Type of contact ( code ) . Must a code found into table llx_c_type_contact . For example : BILLING
* @ param string $source external = Contact extern ( llx_socpeople ), internal = Contact intern ( llx_user )
* @ param int $notrigger Disable all triggers
*
* @ url POST { id } / contacts
*
* @ return array
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2020-10-31 18:51:30 +01:00
*
*/
public function addContact ( $id , $fk_socpeople , $type_contact , $source , $notrigger = 0 )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> add_contact ( $fk_socpeople , $type_contact , $source , $notrigger );
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error : ' . $this -> invoice -> error );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Sets an invoice as draft
*
* @ param int $id Order ID
* @ param int $idwarehouse Warehouse ID
*
* @ url POST { id } / settodraft
*
* @ return array
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2020-10-31 18:51:30 +01:00
*
*/
public function settodraft ( $id , $idwarehouse = - 1 )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> setDraft ( DolibarrApiAccess :: $user , $idwarehouse );
if ( $result == 0 ) {
throw new RestException ( 304 , 'Nothing done.' );
}
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error : ' . $this -> invoice -> error );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Validate an invoice
*
* If you get a bad value for param notrigger check that ou provide this in body
* {
* " idwarehouse " : 0 ,
* " notrigger " : 0
* }
*
* @ param int $id Invoice ID
* @ param int $idwarehouse Warehouse ID
* @ param int $notrigger 1 = Does not execute triggers , 0 = execute triggers
*
* @ url POST { id } / validate
*
* @ return array
*/
public function validate ( $id , $idwarehouse = 0 , $notrigger = 0 )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> validate ( DolibarrApiAccess :: $user , '' , $idwarehouse , $notrigger );
if ( $result == 0 ) {
throw new RestException ( 304 , 'Error nothing done. May be object is already validated' );
}
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error when validating Invoice: ' . $this -> invoice -> error );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Sets an invoice as paid
*
* @ param int $id Order ID
* @ param string $close_code Code filled if we classify to 'Paid completely' when payment is not complete ( for escompte for example )
* @ param string $close_note Comment defined if we classify to 'Paid' when payment is not complete ( for escompte for example )
*
* @ url POST { id } / settopaid
*
* @ return array An invoice object
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2020-10-31 18:51:30 +01:00
*/
public function settopaid ( $id , $close_code = '' , $close_note = '' )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2021-02-09 10:26:17 +01:00
$result = $this -> invoice -> setPaid ( DolibarrApiAccess :: $user , $close_code , $close_note );
2020-10-31 18:51:30 +01:00
if ( $result == 0 ) {
throw new RestException ( 304 , 'Error nothing done. May be object is already validated' );
}
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error : ' . $this -> invoice -> error );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Sets an invoice as unpaid
*
* @ param int $id Order ID
*
* @ url POST { id } / settounpaid
*
* @ return array An invoice object
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2020-10-31 18:51:30 +01:00
*/
public function settounpaid ( $id )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2021-02-09 09:40:07 +01:00
$result = $this -> invoice -> setUnpaid ( DolibarrApiAccess :: $user );
2020-10-31 18:51:30 +01:00
if ( $result == 0 ) {
throw new RestException ( 304 , 'Nothing done' );
}
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error : ' . $this -> invoice -> error );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Get discount from invoice
*
* @ param int $id Id of invoice
*
* @ url GET { id } / discount
*
* @ return mixed
*/
public function getDiscount ( $id )
{
require_once DOL_DOCUMENT_ROOT . '/core/class/discount.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$discountcheck = new DiscountAbsolute ( $this -> db );
$result = $discountcheck -> fetch ( 0 , $this -> invoice -> id );
if ( $result == 0 ) {
throw new RestException ( 404 , 'Discount not found' );
}
if ( $result < 0 ) {
throw new RestException ( 500 , $discountcheck -> error );
}
return parent :: _cleanObjectDatas ( $discountcheck );
}
/**
* Create a discount ( credit available ) for a credit note or a deposit .
*
* @ param int $id Invoice ID
* @ url POST { id } / markAsCreditAvailable
*
* @ return array An invoice object
*
* @ throws RestException 304
* @ throws RestException 401
* @ throws RestException 404
2022-03-18 16:14:20 +01:00
* @ throws RestException 500 System error
2020-10-31 18:51:30 +01:00
*/
public function markAsCreditAvailable ( $id )
{
require_once DOL_DOCUMENT_ROOT . '/core/class/discount.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $this -> invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
if ( $this -> invoice -> paye ) {
2021-02-03 19:36:02 +01:00
throw new RestException ( 500 , 'Alreay paid' );
2020-10-31 18:51:30 +01:00
}
$this -> invoice -> fetch ( $id );
$this -> invoice -> fetch_thirdparty ();
// Check if there is already a discount (protection to avoid duplicate creation when resubmit post)
$discountcheck = new DiscountAbsolute ( $this -> db );
$result = $discountcheck -> fetch ( 0 , $this -> invoice -> id );
$canconvert = 0 ;
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> type == Facture :: TYPE_DEPOSIT && empty ( $discountcheck -> id )) {
$canconvert = 1 ; // we can convert deposit into discount if deposit is payed (completely, partially or not at all) and not already converted (see real condition into condition used to show button converttoreduc)
}
if (( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE || $this -> invoice -> type == Facture :: TYPE_STANDARD ) && $this -> invoice -> paye == 0 && empty ( $discountcheck -> id )) {
$canconvert = 1 ; // we can convert credit note into discount if credit note is not payed back and not already converted and amount of payment is 0 (see real condition into condition used to show button converttoreduc)
}
if ( $canconvert ) {
2020-10-31 18:51:30 +01:00
$this -> db -> begin ();
$amount_ht = $amount_tva = $amount_ttc = array ();
$multicurrency_amount_ht = $multicurrency_amount_tva = $multicurrency_amount_ttc = array ();
// Loop on each vat rate
$i = 0 ;
2021-02-23 21:09:01 +01:00
foreach ( $this -> invoice -> lines as $line ) {
if ( $line -> product_type < 9 && $line -> total_ht != 0 ) { // Remove lines with product_type greater than or equal to 9
// no need to create discount if amount is null
2020-10-31 18:51:30 +01:00
$amount_ht [ $line -> tva_tx ] += $line -> total_ht ;
$amount_tva [ $line -> tva_tx ] += $line -> total_tva ;
$amount_ttc [ $line -> tva_tx ] += $line -> total_ttc ;
$multicurrency_amount_ht [ $line -> tva_tx ] += $line -> multicurrency_total_ht ;
$multicurrency_amount_tva [ $line -> tva_tx ] += $line -> multicurrency_total_tva ;
$multicurrency_amount_ttc [ $line -> tva_tx ] += $line -> multicurrency_total_ttc ;
$i ++ ;
}
}
// Insert one discount by VAT rate category
$discount = new DiscountAbsolute ( $this -> db );
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE ) {
$discount -> description = '(CREDIT_NOTE)' ;
} elseif ( $this -> invoice -> type == Facture :: TYPE_DEPOSIT ) {
$discount -> description = '(DEPOSIT)' ;
} elseif ( $this -> invoice -> type == Facture :: TYPE_STANDARD || $this -> invoice -> type == Facture :: TYPE_REPLACEMENT || $this -> invoice -> type == Facture :: TYPE_SITUATION ) {
$discount -> description = '(EXCESS RECEIVED)' ;
} else {
throw new RestException ( 500 , 'Cant convert to reduc an Invoice of this type' );
}
$discount -> fk_soc = $this -> invoice -> socid ;
$discount -> fk_facture_source = $this -> invoice -> id ;
$error = 0 ;
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> type == Facture :: TYPE_STANDARD || $this -> invoice -> type == Facture :: TYPE_REPLACEMENT || $this -> invoice -> type == Facture :: TYPE_SITUATION ) {
2020-10-31 18:51:30 +01:00
// If we're on a standard invoice, we have to get excess received to create a discount in TTC without VAT
// Total payments
$sql = 'SELECT SUM(pf.amount) as total_payments' ;
$sql .= ' FROM ' . MAIN_DB_PREFIX . 'paiement_facture as pf, ' . MAIN_DB_PREFIX . 'paiement as p' ;
$sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'c_paiement as c ON p.fk_paiement = c.id' ;
2021-08-27 23:36:06 +02:00
$sql .= ' WHERE pf.fk_facture = ' . (( int ) $this -> invoice -> id );
2020-10-31 18:51:30 +01:00
$sql .= ' AND pf.fk_paiement = p.rowid' ;
$sql .= ' AND p.entity IN (' . getEntity ( 'invoice' ) . ')' ;
$resql = $this -> db -> query ( $sql );
2021-02-23 21:09:01 +01:00
if ( ! $resql ) {
dol_print_error ( $this -> db );
}
2020-10-31 18:51:30 +01:00
$res = $this -> db -> fetch_object ( $resql );
$total_payments = $res -> total_payments ;
// Total credit note and deposit
$total_creditnote_and_deposit = 0 ;
$sql = " SELECT re.rowid, re.amount_ht, re.amount_tva, re.amount_ttc, " ;
$sql .= " re.description, re.fk_facture_source " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " societe_remise_except as re " ;
2021-03-30 17:53:25 +02:00
$sql .= " WHERE fk_facture = " . (( int ) $this -> invoice -> id );
2020-10-31 18:51:30 +01:00
$resql = $this -> db -> query ( $sql );
if ( ! empty ( $resql )) {
2021-02-23 21:09:01 +01:00
while ( $obj = $this -> db -> fetch_object ( $resql )) {
$total_creditnote_and_deposit += $obj -> amount_ttc ;
}
} else {
dol_print_error ( $this -> db );
}
2020-10-31 18:51:30 +01:00
$discount -> amount_ht = $discount -> amount_ttc = $total_payments + $total_creditnote_and_deposit - $this -> invoice -> total_ttc ;
$discount -> amount_tva = 0 ;
$discount -> tva_tx = 0 ;
$result = $discount -> create ( DolibarrApiAccess :: $user );
2021-02-23 21:09:01 +01:00
if ( $result < 0 ) {
2020-10-31 18:51:30 +01:00
$error ++ ;
}
}
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE || $this -> invoice -> type == Facture :: TYPE_DEPOSIT ) {
foreach ( $amount_ht as $tva_tx => $xxx ) {
2020-10-31 18:51:30 +01:00
$discount -> amount_ht = abs ( $amount_ht [ $tva_tx ]);
$discount -> amount_tva = abs ( $amount_tva [ $tva_tx ]);
$discount -> amount_ttc = abs ( $amount_ttc [ $tva_tx ]);
$discount -> multicurrency_amount_ht = abs ( $multicurrency_amount_ht [ $tva_tx ]);
$discount -> multicurrency_amount_tva = abs ( $multicurrency_amount_tva [ $tva_tx ]);
$discount -> multicurrency_amount_ttc = abs ( $multicurrency_amount_ttc [ $tva_tx ]);
$discount -> tva_tx = abs ( $tva_tx );
$result = $discount -> create ( DolibarrApiAccess :: $user );
2021-02-23 21:09:01 +01:00
if ( $result < 0 ) {
2020-10-31 18:51:30 +01:00
$error ++ ;
break ;
}
}
}
2021-02-23 21:09:01 +01:00
if ( empty ( $error )) {
2020-10-31 18:51:30 +01:00
if ( $this -> invoice -> type != Facture :: TYPE_DEPOSIT ) {
// Classe facture
2021-02-09 10:26:17 +01:00
$result = $this -> invoice -> setPaid ( DolibarrApiAccess :: $user );
2021-02-23 21:09:01 +01:00
if ( $result >= 0 ) {
2020-10-31 18:51:30 +01:00
$this -> db -> commit ();
} else {
$this -> db -> rollback ();
throw new RestException ( 500 , 'Could not set paid' );
}
} else {
$this -> db -> commit ();
}
} else {
$this -> db -> rollback ();
throw new RestException ( 500 , 'Discount creation error' );
}
}
return $this -> _cleanObjectDatas ( $this -> invoice );
}
/**
* Add a discount line into an invoice ( as an invoice line ) using an existing absolute discount
*
* Note that this consume the discount .
*
* @ param int $id Id of invoice
* @ param int $discountid Id of discount
*
* @ url POST { id } / usediscount / { discountid }
*
* @ return int
*
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 405
*/
public function useDiscount ( $id , $discountid )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
if ( empty ( $id )) {
throw new RestException ( 400 , 'Invoice ID is mandatory' );
}
if ( empty ( $discountid )) {
throw new RestException ( 400 , 'Discount ID is mandatory' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
$result = $this -> invoice -> insert_discount ( $discountid );
if ( $result < 0 ) {
throw new RestException ( 405 , $this -> invoice -> error );
}
return $result ;
}
/**
* Add an available credit note discount to payments of an existing invoice .
*
* Note that this consume the credit note .
*
* @ param int $id Id of invoice
* @ param int $discountid Id of a discount coming from a credit note
*
* @ url POST { id } / usecreditnote / { discountid }
*
* @ return int
*
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 405
*/
public function useCreditNote ( $id , $discountid )
{
require_once DOL_DOCUMENT_ROOT . '/core/class/discount.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
if ( empty ( $id )) {
throw new RestException ( 400 , 'Invoice ID is mandatory' );
}
if ( empty ( $discountid )) {
throw new RestException ( 400 , 'Credit ID is mandatory' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$discount = new DiscountAbsolute ( $this -> db );
$result = $discount -> fetch ( $discountid );
if ( ! $result ) {
throw new RestException ( 404 , 'Credit not found' );
}
$result = $discount -> link_to_invoice ( 0 , $id );
if ( $result < 0 ) {
throw new RestException ( 405 , $discount -> error );
}
return $result ;
}
/**
* Get list of payments of a given invoice
*
* @ param int $id Id of invoice
*
* @ url GET { id } / payments
*
* @ return array
*
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
* @ throws RestException 405
*/
public function getPayments ( $id )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
throw new RestException ( 401 );
}
if ( empty ( $id )) {
throw new RestException ( 400 , 'Invoice ID is mandatory' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
$result = $this -> invoice -> getListOfPayments ();
if ( $result < 0 ) {
throw new RestException ( 405 , $this -> invoice -> error );
}
return $result ;
}
/**
* Add payment line to a specific invoice with the remain to pay as amount .
*
* @ param int $id Id of invoice
* @ param string $datepaye { @ from body } Payment date { @ type timestamp }
* @ param int $paymentid { @ from body } Payment mode Id { @ min 1 }
* @ param string $closepaidinvoices { @ from body } Close paid invoices { @ choice yes , no }
* @ param int $accountid { @ from body } Account Id { @ min 1 }
* @ param string $num_payment { @ from body } Payment number ( optional )
* @ param string $comment { @ from body } Note private ( optional )
* @ param string $chqemetteur { @ from body } Payment issuer ( mandatory if paymentcode = 'CHQ' )
* @ param string $chqbank { @ from body } Issuer bank name ( optional )
*
* @ url POST { id } / payments
*
* @ return int Payment ID
*
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 404
*/
public function addPayment ( $id , $datepaye , $paymentid , $closepaidinvoices , $accountid , $num_payment = '' , $comment = '' , $chqemetteur = '' , $chqbank = '' )
{
global $conf ;
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 403 );
}
if ( empty ( $id )) {
throw new RestException ( 400 , 'Invoice ID is mandatory' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 403 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
2022-08-29 11:23:57 +02:00
if ( isModEnabled ( 'banque' )) {
2020-10-31 18:51:30 +01:00
if ( empty ( $accountid )) {
throw new RestException ( 400 , 'Account ID is mandatory' );
}
}
if ( empty ( $paymentid )) {
throw new RestException ( 400 , 'Payment ID or Payment Code is mandatory' );
}
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Invoice not found' );
}
// Calculate amount to pay
2022-05-22 17:09:08 +02:00
$totalpaid = $this -> invoice -> getSommePaiement ();
2020-10-31 18:51:30 +01:00
$totalcreditnotes = $this -> invoice -> getSumCreditNotesUsed ();
$totaldeposits = $this -> invoice -> getSumDepositsUsed ();
2022-05-22 17:09:08 +02:00
$resteapayer = price2num ( $this -> invoice -> total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits , 'MT' );
2020-10-31 18:51:30 +01:00
$this -> db -> begin ();
$amounts = array ();
$multicurrency_amounts = array ();
// Clean parameters amount if payment is for a credit note
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE ) {
$resteapayer = price2num ( $resteapayer , 'MT' );
$amounts [ $id ] = - $resteapayer ;
// Multicurrency
$newvalue = price2num ( $this -> invoice -> multicurrency_total_ttc , 'MT' );
$multicurrency_amounts [ $id ] = - $newvalue ;
} else {
$resteapayer = price2num ( $resteapayer , 'MT' );
$amounts [ $id ] = $resteapayer ;
// Multicurrency
$newvalue = price2num ( $this -> invoice -> multicurrency_total_ttc , 'MT' );
$multicurrency_amounts [ $id ] = $newvalue ;
}
// Creation of payment line
$paymentobj = new Paiement ( $this -> db );
$paymentobj -> datepaye = $datepaye ;
$paymentobj -> amounts = $amounts ; // Array with all payments dispatching with invoice id
$paymentobj -> multicurrency_amounts = $multicurrency_amounts ; // Array with all payments dispatching
$paymentobj -> paiementid = $paymentid ;
$paymentobj -> paiementcode = dol_getIdFromCode ( $this -> db , $paymentid , 'c_paiement' , 'id' , 'code' , 1 );
$paymentobj -> num_payment = $num_payment ;
$paymentobj -> note_private = $comment ;
$payment_id = $paymentobj -> create ( DolibarrApiAccess :: $user , ( $closepaidinvoices == 'yes' ? 1 : 0 )); // This include closing invoices
2021-02-23 21:09:01 +01:00
if ( $payment_id < 0 ) {
2020-10-31 18:51:30 +01:00
$this -> db -> rollback ();
throw new RestException ( 400 , 'Payment error : ' . $paymentobj -> error );
}
2022-08-29 11:23:57 +02:00
if ( isModEnabled ( 'banque' )) {
2020-10-31 18:51:30 +01:00
$label = '(CustomerInvoicePayment)' ;
if ( $paymentobj -> paiementcode == 'CHQ' && empty ( $chqemetteur )) {
throw new RestException ( 400 , 'Emetteur is mandatory when payment code is ' . $paymentobj -> paiementcode );
}
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE ) {
$label = '(CustomerInvoicePaymentBack)' ; // Refund of a credit note
}
2020-10-31 18:51:30 +01:00
$result = $paymentobj -> addPaymentToBank ( DolibarrApiAccess :: $user , 'payment' , $label , $accountid , $chqemetteur , $chqbank );
2021-02-23 21:09:01 +01:00
if ( $result < 0 ) {
2020-10-31 18:51:30 +01:00
$this -> db -> rollback ();
throw new RestException ( 400 , 'Add payment to bank error : ' . $paymentobj -> error );
}
}
$this -> db -> commit ();
return $payment_id ;
}
/**
* Add a payment to pay partially or completely one or several invoices .
* Warning : Take care that all invoices are owned by the same customer .
* Example of value for parameter arrayofamounts : { " 1 " : { " amount " : " 99.99 " , " multicurrency_amount " : " " }, " 2 " : { " amount " : " " , " multicurrency_amount " : " 10 " }}
*
* @ param array $arrayofamounts { @ from body } Array with id of invoices with amount to pay for each invoice
* @ param string $datepaye { @ from body } Payment date { @ type timestamp }
* @ param int $paymentid { @ from body } Payment mode Id { @ min 1 }
* @ param string $closepaidinvoices { @ from body } Close paid invoices { @ choice yes , no }
* @ param int $accountid { @ from body } Account Id { @ min 1 }
* @ param string $num_payment { @ from body } Payment number ( optional )
* @ param string $comment { @ from body } Note private ( optional )
* @ param string $chqemetteur { @ from body } Payment issuer ( mandatory if paiementcode = 'CHQ' )
* @ param string $chqbank { @ from body } Issuer bank name ( optional )
* @ param string $ref_ext { @ from body } External reference ( optional )
* @ param bool $accepthigherpayment { @ from body } Accept higher payments that it remains to be paid ( optional )
*
* @ url POST / paymentsdistributed
*
* @ return int Payment ID
* @ throws RestException 400
* @ throws RestException 401
* @ throws RestException 403
* @ throws RestException 404
*/
public function addPaymentDistributed ( $arrayofamounts , $datepaye , $paymentid , $closepaidinvoices , $accountid , $num_payment = '' , $comment = '' , $chqemetteur = '' , $chqbank = '' , $ref_ext = '' , $accepthigherpayment = false )
{
global $conf ;
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 403 );
}
foreach ( $arrayofamounts as $id => $amount ) {
if ( empty ( $id )) {
throw new RestException ( 400 , 'Invoice ID is mandatory. Fill the invoice id and amount into arrayofamounts parameter. For example: {"1": "99.99", "2": "10"}' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facture' , $id )) {
throw new RestException ( 403 , 'Access not allowed on invoice ID ' . $id . ' for login ' . DolibarrApiAccess :: $user -> login );
}
}
2022-08-29 11:23:57 +02:00
if ( isModEnabled ( 'banque' )) {
2020-10-31 18:51:30 +01:00
if ( empty ( $accountid )) {
throw new RestException ( 400 , 'Account ID is mandatory' );
}
}
if ( empty ( $paymentid )) {
throw new RestException ( 400 , 'Payment ID or Payment Code is mandatory' );
}
$this -> db -> begin ();
$amounts = array ();
$multicurrency_amounts = array ();
// Loop on each invoice to pay
2021-02-23 21:09:01 +01:00
foreach ( $arrayofamounts as $id => $amountarray ) {
2020-10-31 18:51:30 +01:00
$result = $this -> invoice -> fetch ( $id );
if ( ! $result ) {
$this -> db -> rollback ();
throw new RestException ( 404 , 'Invoice ID ' . $id . ' not found' );
}
if (( $amountarray [ " amount " ] == " remain " || $amountarray [ " amount " ] > 0 ) && ( $amountarray [ " multicurrency_amount " ] == " remain " || $amountarray [ " multicurrency_amount " ] > 0 )) {
$this -> db -> rollback ();
throw new RestException ( 400 , 'Payment in both currency ' . $id . ' ( amount: ' . $amountarray [ " amount " ] . ', multicurrency_amount: ' . $amountarray [ " multicurrency_amount " ] . ')' );
}
$is_multicurrency = 0 ;
$total_ttc = $this -> invoice -> total_ttc ;
if ( $amountarray [ " multicurrency_amount " ] > 0 || $amountarray [ " multicurrency_amount " ] == " remain " ) {
$is_multicurrency = 1 ;
$total_ttc = $this -> invoice -> multicurrency_total_ttc ;
}
// Calculate amount to pay
2022-05-22 17:09:08 +02:00
$totalpaid = $this -> invoice -> getSommePaiement ( $is_multicurrency );
2020-10-31 18:51:30 +01:00
$totalcreditnotes = $this -> invoice -> getSumCreditNotesUsed ( $is_multicurrency );
$totaldeposits = $this -> invoice -> getSumDepositsUsed ( $is_multicurrency );
2022-05-22 17:09:08 +02:00
$remainstopay = $amount = price2num ( $total_ttc - $totalpaid - $totalcreditnotes - $totaldeposits , 'MT' );
2020-10-31 18:51:30 +01:00
2021-02-23 21:09:01 +01:00
if ( ! $is_multicurrency && $amountarray [ " amount " ] != 'remain' ) {
2020-10-31 18:51:30 +01:00
$amount = price2num ( $amountarray [ " amount " ], 'MT' );
}
2021-02-23 21:09:01 +01:00
if ( $is_multicurrency && $amountarray [ " multicurrency_amount " ] != 'remain' ) {
2020-10-31 18:51:30 +01:00
$amount = price2num ( $amountarray [ " multicurrency_amount " ], 'MT' );
}
if ( $amount > $remainstopay && ! $accepthigherpayment ) {
$this -> db -> rollback ();
throw new RestException ( 400 , 'Payment amount on invoice ID ' . $id . ' (' . $amount . ') is higher than remain to pay (' . $remainstopay . ')' );
}
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE ) {
$amount = - $amount ;
}
if ( $is_multicurrency ) {
$amounts [ $id ] = null ;
// Multicurrency
$multicurrency_amounts [ $id ] = $amount ;
} else {
$amounts [ $id ] = $amount ;
// Multicurrency
$multicurrency_amounts [ $id ] = null ;
}
}
// Creation of payment line
$paymentobj = new Paiement ( $this -> db );
$paymentobj -> datepaye = $datepaye ;
$paymentobj -> amounts = $amounts ; // Array with all payments dispatching with invoice id
$paymentobj -> multicurrency_amounts = $multicurrency_amounts ; // Array with all payments dispatching
$paymentobj -> paiementid = $paymentid ;
$paymentobj -> paiementcode = dol_getIdFromCode ( $this -> db , $paymentid , 'c_paiement' , 'id' , 'code' , 1 );
$paymentobj -> num_payment = $num_payment ;
$paymentobj -> note_private = $comment ;
$paymentobj -> ref_ext = $ref_ext ;
$payment_id = $paymentobj -> create ( DolibarrApiAccess :: $user , ( $closepaidinvoices == 'yes' ? 1 : 0 )); // This include closing invoices
2021-02-23 21:09:01 +01:00
if ( $payment_id < 0 ) {
2020-10-31 18:51:30 +01:00
$this -> db -> rollback ();
throw new RestException ( 400 , 'Payment error : ' . $paymentobj -> error );
}
2022-08-29 11:23:57 +02:00
if ( isModEnabled ( 'banque' )) {
2020-10-31 18:51:30 +01:00
$label = '(CustomerInvoicePayment)' ;
if ( $paymentobj -> paiementcode == 'CHQ' && empty ( $chqemetteur )) {
throw new RestException ( 400 , 'Emetteur is mandatory when payment code is ' . $paymentobj -> paiementcode );
}
2021-02-23 21:09:01 +01:00
if ( $this -> invoice -> type == Facture :: TYPE_CREDIT_NOTE ) {
$label = '(CustomerInvoicePaymentBack)' ; // Refund of a credit note
}
2020-10-31 18:51:30 +01:00
$result = $paymentobj -> addPaymentToBank ( DolibarrApiAccess :: $user , 'payment' , $label , $accountid , $chqemetteur , $chqbank );
2021-02-23 21:09:01 +01:00
if ( $result < 0 ) {
2020-10-31 18:51:30 +01:00
$this -> db -> rollback ();
throw new RestException ( 400 , 'Add payment to bank error : ' . $paymentobj -> error );
}
}
$this -> db -> commit ();
return $payment_id ;
}
/**
* Update a payment
*
* @ param int $id Id of payment
* @ param string $num_payment Payment number
*
* @ url PUT payments / { id }
*
* @ return array
* @ throws RestException 400 Bad parameters
* @ throws RestException 401 Not allowed
* @ throws RestException 404 Not found
*/
public function putPayment ( $id , $num_payment = '' )
{
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php' ;
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> creer ) {
throw new RestException ( 401 );
}
if ( empty ( $id )) {
throw new RestException ( 400 , 'Payment ID is mandatory' );
}
$paymentobj = new Paiement ( $this -> db );
$result = $paymentobj -> fetch ( $id );
if ( ! $result ) {
throw new RestException ( 404 , 'Payment not found' );
}
if ( ! empty ( $num_payment )) {
$result = $paymentobj -> update_num ( $num_payment );
if ( $result < 0 ) {
throw new RestException ( 500 , 'Error when updating the payment num' );
}
}
return [
'success' => [
'code' => 200 ,
'message' => 'Payment updated'
]
];
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensible object datas
*
* @ param Object $object Object to clean
* @ return Object Object with cleaned properties
*/
protected function _cleanObjectDatas ( $object )
{
// phpcs:enable
$object = parent :: _cleanObjectDatas ( $object );
unset ( $object -> note );
unset ( $object -> address );
unset ( $object -> barcode_type );
unset ( $object -> barcode_type_code );
unset ( $object -> barcode_type_label );
unset ( $object -> barcode_type_coder );
2022-02-28 10:37:03 +01:00
unset ( $object -> canvas );
2020-10-31 18:51:30 +01:00
return $object ;
}
/**
* Validate fields before create or update object
*
* @ param array | null $data Datas to validate
* @ return array
*
* @ throws RestException
*/
private function _validate ( $data )
{
$invoice = array ();
foreach ( Invoices :: $FIELDS as $field ) {
if ( ! isset ( $data [ $field ])) {
throw new RestException ( 400 , " $field field missing " );
}
$invoice [ $field ] = $data [ $field ];
}
return $invoice ;
}
2022-02-28 10:37:03 +01:00
/**
* Get properties of a template invoice object
*
* Return an array with invoice informations
*
2022-04-28 19:05:23 +02:00
* @ param int $id ID of template invoice
* @ param int $contact_list 0 : Return array contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
2022-02-28 10:37:03 +01:00
* @ return array | mixed data without useless information
*
* @ url GET templates / { id }
*
* @ throws RestException
*/
public function getTemplateInvoice ( $id , $contact_list = 1 )
{
return $this -> _fetchTemplateInvoice ( $id , '' , '' , $contact_list );
}
/**
* Get properties of an invoice object
*
* Return an array with invoice informations
*
* @ param int $id ID of order
* @ param string $ref Ref of object
* @ param string $ref_ext External reference of object
* @ param int $contact_list 0 : Returned array of contacts / addresses contains all properties , 1 : Return array contains just id , - 1 : Do not return contacts / adddesses
* @ return array | mixed data without useless information
*
* @ throws RestException
*/
private function _fetchTemplateInvoice ( $id , $ref = '' , $ref_ext = '' , $contact_list = 1 )
{
if ( ! DolibarrApiAccess :: $user -> rights -> facture -> lire ) {
throw new RestException ( 401 );
}
$result = $this -> template_invoice -> fetch ( $id , $ref , $ref_ext );
if ( ! $result ) {
throw new RestException ( 404 , 'Template invoice not found' );
}
if ( ! DolibarrApi :: _checkAccessToResource ( 'facturerec' , $this -> template_invoice -> id )) {
throw new RestException ( 401 , 'Access not allowed for login ' . DolibarrApiAccess :: $user -> login );
}
// Add external contacts ids
if ( $contact_list > - 1 ) {
2022-05-21 15:22:08 +02:00
$tmparray = $this -> template_invoice -> liste_contact ( - 1 , 'external' , $contact_list );
if ( is_array ( $tmparray )) {
$this -> template_invoice -> contacts_ids = $tmparray ;
}
2022-02-28 10:37:03 +01:00
}
$this -> template_invoice -> fetchObjectLinked ();
return $this -> _cleanTemplateObjectDatas ( $this -> template_invoice );
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore
/**
* Clean sensible object datas
*
* @ param Object $object Object to clean
* @ return Object Object with cleaned properties
*/
protected function _cleanTemplateObjectDatas ( $object )
{
// phpcs:enable
$object = parent :: _cleanObjectDatas ( $object );
unset ( $object -> note );
unset ( $object -> address );
unset ( $object -> barcode_type );
unset ( $object -> barcode_type_code );
unset ( $object -> barcode_type_label );
unset ( $object -> barcode_type_coder );
unset ( $object -> canvas );
return $object ;
}
2015-05-05 04:40:28 +02:00
}