2008-10-26 02:26:18 +01:00
< ? php
2021-02-28 07:09:30 +01:00
/* Copyright ( C ) 2004 - 2009 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2006 - 2007 Yannick Warnier < ywarnier @ beeznest . org >
* Copyright ( C ) 2011 Regis Houssin < regis . houssin @ inodbox . com >
* Copyright ( C ) 2012 - 2017 Juanjo Menent < jmenent @ 2 byte . es >
* Copyright ( C ) 2012 Cédric Salvador < csalvador @ gpcsolutions . fr >
* Copyright ( C ) 2012 - 2014 Raphaël Doursenaud < rdoursenaud @ gpcsolutions . fr >
* Copyright ( C ) 2015 Marcos García < marcosgdf @ gmail . com >
2022-01-27 06:21:07 +01:00
* Copyright ( C ) 2021 - 2022 Open - Dsi < support @ open - dsi . fr >
2024-07-08 21:51:27 +02:00
* Copyright ( C ) 2024 Frédéric France < frederic . france @ free . fr >
2024-09-23 00:37:30 +02:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2008-10-26 02:26:18 +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
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-10-26 02:26:18 +01:00
* ( 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 />.
2008-10-26 02:26:18 +01:00
*/
/**
2011-10-24 12:59:44 +02:00
* \file htdocs / core / lib / tax . lib . php
2009-03-09 00:09:45 +01:00
* \ingroup tax
2011-03-09 11:09:07 +01:00
* \brief Library for tax module
2009-03-09 00:09:45 +01:00
*/
2008-10-26 02:26:18 +01:00
2011-12-21 21:14:10 +01:00
/**
2012-02-04 10:48:47 +01:00
* Prepare array with list of tabs
*
2015-02-10 13:17:37 +01:00
* @ param ChargeSociales $object Object related to tabs
2024-09-23 00:37:30 +02:00
* @ return array < array { 0 : string , 1 : string , 2 : string } > Array of tabs to show
2012-02-04 10:48:47 +01:00
*/
2015-02-10 13:17:37 +01:00
function tax_prepare_head ( ChargeSociales $object )
2011-12-21 21:14:10 +01:00
{
2020-10-31 14:32:18 +01:00
global $db , $langs , $conf , $user ;
2011-12-21 21:14:10 +01:00
2020-10-31 14:32:18 +01:00
$h = 0 ;
$head = array ();
2011-12-21 21:14:10 +01:00
2016-08-22 13:43:49 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/compta/sociales/card.php?id=' . $object -> id ;
2020-07-09 23:18:19 +02:00
$head [ $h ][ 1 ] = $langs -> trans ( 'SocialContribution' );
2011-12-21 21:14:10 +01:00
$head [ $h ][ 2 ] = 'card' ;
$h ++ ;
2020-10-31 14:32:18 +01:00
// Show more tabs from modules
// Entries must be declared in modules descriptor with line
// $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab
// $this->tabs = array('entity:-tabname); to remove a tab
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'tax' );
2011-12-21 21:14:10 +01:00
2013-12-16 23:45:12 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
2020-10-31 14:32:18 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php' ;
2020-04-10 10:59:32 +02:00
$upload_dir = $conf -> tax -> dir_output . " / " . dol_sanitizeFileName ( $object -> ref );
2019-01-27 11:55:16 +01:00
$nbFiles = count ( dol_dir_list ( $upload_dir , 'files' , 0 , '' , '(\.meta|_preview.*\.png)$' ));
2020-10-31 14:32:18 +01:00
$nbLinks = Link :: count ( $db , $object -> element , $object -> id );
2012-01-11 20:31:40 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/compta/sociales/document.php?id=' . $object -> id ;
$head [ $h ][ 1 ] = $langs -> trans ( " Documents " );
2021-02-23 22:03:23 +01:00
if (( $nbFiles + $nbLinks ) > 0 ) {
$head [ $h ][ 1 ] .= '<span class="badge marginleftonlyshort">' . ( $nbFiles + $nbLinks ) . '</span>' ;
}
2012-01-11 20:31:40 +01:00
$head [ $h ][ 2 ] = 'documents' ;
$h ++ ;
2022-03-13 18:39:45 +01:00
$nbNote = 0 ;
if ( ! empty ( $object -> note_private )) {
$nbNote ++ ;
}
if ( ! empty ( $object -> note_public )) {
$nbNote ++ ;
}
2022-03-13 18:30:31 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/compta/sociales/note.php?id=' . $object -> id ;
2022-03-13 18:39:45 +01:00
$head [ $h ][ 1 ] = $langs -> trans ( 'Notes' );
if ( $nbNote > 0 ) {
2023-11-27 11:39:32 +01:00
$head [ $h ][ 1 ] .= ( ! getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' ) ? '<span class="badge marginleftonlyshort">' . $nbNote . '</span>' : '' );
2022-03-13 18:39:45 +01:00
}
2022-03-13 18:30:31 +01:00
$head [ $h ][ 2 ] = 'note' ;
$h ++ ;
2022-03-13 18:39:45 +01:00
2022-03-13 18:40:43 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/compta/sociales/info.php?id=' . $object -> id ;
$head [ $h ][ 1 ] = $langs -> trans ( " Info " );
$head [ $h ][ 2 ] = 'info' ;
$h ++ ;
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'tax' , 'remove' );
2012-12-01 15:45:05 +01:00
2020-10-31 14:32:18 +01:00
return $head ;
2011-12-21 21:14:10 +01:00
}
2008-10-26 02:26:18 +01:00
/**
2011-07-04 11:01:37 +02:00
* Look for collectable VAT clients in the chosen year ( and month )
2012-02-04 14:39:47 +01:00
*
2024-10-17 03:08:38 +02:00
* @ param 'vat' | 'localtax1' | 'localtax2' $type Tax type , either 'vat' , 'localtax1' or 'localtax2'
2024-07-08 21:51:27 +02:00
* @ param DoliDB $db Database handle
* @ param int $y Year
* @ param int | '' $date_start Start date
* @ param int | '' $date_end End date
* @ param int $modetax Not used
* @ param 'sell' | 'buy' $direction 'sell' or 'buy'
2024-10-17 03:08:38 +02:00
* @ param int < 0 , 12 > $m Month
* @ param int < 0 , 4 > $q Quarter
* @ return int <- 3 , - 1 >| array < int | string , array { totalht : float , vat : float , localtax1 : float , localtax2 : float , dtotal_ttc : float [], dtype : int [], datef : int [], datep : int [], company_name : string [], company_id : int [], company_alias : string [], company_email : string [], company_tva_intra : string [], company_client : int [], company_fournisseur : int [], company_customer_code : string [], company_supplier_code : string [], company_customer_accounting_code : string [], company_supplier_accounting_code : string [], company_status : int [], user_id : int [], drate : string [], ddate_start : int [], ddate_end : int [], facid : int [], facnum : string [], type : int [], ftotal_ttc : float [], descr : string [], totalht_list : string [], vat_list : float [], localtax1_list : float [], localtax2_list : float [], pid : int [], pref : string [], ptype : int [], payment_id : int [], payment_ref : string [], payment_amount : float []} > Array with details of VATs ( per third party ), - 1 if no accountancy module , - 2 if not yet developed , - 3 if error
2008-10-26 02:26:18 +01:00
*/
2019-01-27 15:20:16 +01:00
function tax_by_thirdparty ( $type , $db , $y , $date_start , $date_end , $modetax , $direction , $m = 0 , $q = 0 )
2008-10-26 02:26:18 +01:00
{
2020-10-31 14:32:18 +01:00
global $conf ;
// If we use date_start and date_end, we must not use $y, $m, $q
2021-02-23 22:03:23 +01:00
if (( $date_start || $date_end ) && ( ! empty ( $y ) || ! empty ( $m ) || ! empty ( $q ))) {
2024-07-08 21:52:03 +02:00
dol_print_error ( null , 'Bad value of input parameter for tax_by_thirdparty' );
2020-10-31 14:32:18 +01:00
}
$list = array ();
2021-02-23 22:03:23 +01:00
if ( $direction == 'sell' ) {
2020-10-31 14:32:18 +01:00
$invoicetable = 'facture' ;
$invoicedettable = 'facturedet' ;
$fk_facture = 'fk_facture' ;
$fk_facture2 = 'fk_facture' ;
$fk_payment = 'fk_paiement' ;
$total_tva = 'total_tva' ;
$paymenttable = 'paiement' ;
$paymentfacturetable = 'paiement_facture' ;
$invoicefieldref = 'ref' ;
2021-02-23 22:03:23 +01:00
} elseif ( $direction == 'buy' ) {
2020-10-31 14:32:18 +01:00
$invoicetable = 'facture_fourn' ;
$invoicedettable = 'facture_fourn_det' ;
$fk_facture = 'fk_facture_fourn' ;
$fk_facture2 = 'fk_facturefourn' ;
$fk_payment = 'fk_paiementfourn' ;
$total_tva = 'tva' ;
$paymenttable = 'paiementfourn' ;
$paymentfacturetable = 'paiementfourn_facturefourn' ;
$invoicefieldref = 'ref' ;
2024-10-17 03:08:38 +02:00
} else {
dol_print_error ( null , 'Invalid "direction" - must be buy or sell - found ' . $direction );
return - 2 ;
2020-10-31 14:32:18 +01:00
}
if ( strpos ( $type , 'localtax' ) === 0 ) {
$f_rate = $type . '_tx' ;
} else {
$f_rate = 'tva_tx' ;
}
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
// CAS DES BIENS/PRODUITS
// Define sql request
$sql = '' ;
2023-06-10 14:22:34 +02:00
if (( $direction == 'sell' && getDolGlobalString ( 'TAX_MODE_SELL_PRODUCT' ) == 'invoice' )
|| ( $direction == 'buy' && getDolGlobalString ( 'TAX_MODE_BUY_PRODUCT' ) == 'invoice' )) {
2020-10-31 14:32:18 +01:00
// Count on delivery date (use invoice date as delivery is unknown)
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2021-03-22 18:23:29 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, p.tosell as pstatus, p.tobuy as pstatusbuy, " ;
2021-03-22 18:50:47 +01:00
$sql .= " 0 as payment_id, '' as payment_ref, 0 as payment_amount " ;
2023-06-10 14:22:34 +02:00
$sql .= " ,'' as datep " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . " societe as s, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2022-10-12 12:14:04 +02:00
if ( $direction == 'buy' ) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
} else {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
$sql .= " AND s.rowid = f.fk_soc " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND f.datef > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 0 " ; // Limit to products
$sql .= " AND d.date_start is null AND d.date_end IS NULL) " ; // enhance detection of products
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
} else {
// Count on payments date
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2021-03-22 18:23:29 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, p.tosell as pstatus, p.tobuy as pstatusbuy, " ;
2020-10-31 14:32:18 +01:00
$sql .= " pf. " . $fk_payment . " as payment_id, pf.amount as payment_amount, " ;
2021-03-22 18:50:47 +01:00
$sql .= " pa.datep as datep, pa.ref as payment_ref " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $paymentfacturetable . " as pf, " ;
$sql .= " " . MAIN_DB_PREFIX . $paymenttable . " as pa, " ;
$sql .= " " . MAIN_DB_PREFIX . " societe as s, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Paid (partially or completely)
2022-10-12 12:14:04 +02:00
if ( $direction == 'buy' ) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
} else {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
$sql .= " AND s.rowid = f.fk_soc " ;
$sql .= " AND pf. " . $fk_facture2 . " = f.rowid " ;
$sql .= " AND pa.rowid = pf. " . $fk_payment ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND pa.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND pa.datep >= ' " . $db -> idate ( $date_start ) . " ' AND pa.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 0 " ; // Limit to products
$sql .= " AND d.date_start is null AND d.date_end IS NULL) " ; // enhance detection of products
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture . " , pf.rowid " ;
}
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
return - 1 ;
}
if ( $sql == 'TODO' ) {
return - 2 ;
}
if ( $sql != 'TODO' ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " Tax.lib.php::tax_by_thirdparty " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$company_id = - 1 ;
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'totalht' ])) {
$list [ $assoc [ 'company_id' ]][ 'totalht' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'vat' ])) {
$list [ $assoc [ 'company_id' ]][ 'vat' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax1' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax2' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] = 0 ;
}
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-10-31 14:32:18 +01:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
}
2023-06-10 14:22:34 +02:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
$list [ $assoc [ 'company_id' ]][ 'dtype' ][] = ( int ) $assoc [ 'dtype' ];
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'datef' ][] = $db -> jdate ( $assoc [ 'datef' ]);
$list [ $assoc [ 'company_id' ]][ 'datep' ][] = $db -> jdate ( $assoc [ 'datep' ]);
2021-03-22 18:11:44 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'company_name' ][] = ( string ) $assoc [ 'company_name' ];
$list [ $assoc [ 'company_id' ]][ 'company_id' ][] = ( int ) $assoc [ 'company_id' ];
$list [ $assoc [ 'company_id' ]][ 'company_alias' ][] = ( string ) $assoc [ 'company_alias' ];
$list [ $assoc [ 'company_id' ]][ 'company_email' ][] = ( string ) $assoc [ 'company_email' ];
$list [ $assoc [ 'company_id' ]][ 'company_tva_intra' ][] = ( string ) $assoc [ 'company_tva_intra' ];
$list [ $assoc [ 'company_id' ]][ 'company_client' ][] = ( int ) $assoc [ 'company_client' ];
$list [ $assoc [ 'company_id' ]][ 'company_fournisseur' ][] = ( int ) $assoc [ 'company_fournisseur' ];
$list [ $assoc [ 'company_id' ]][ 'company_customer_code' ][] = ( string ) $assoc [ 'company_customer_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_supplier_code' ][] = ( string ) $assoc [ 'company_supplier_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_customer_accounting_code' ][] = ( string ) $assoc [ 'company_customer_accounting_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_supplier_accounting_code' ][] = ( string ) $assoc [ 'company_supplier_accounting_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_status' ][] = ( int ) $assoc [ 'company_status' ];
2021-03-22 18:11:44 +01:00
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'drate' ][] = $assoc [ 'rate' ];
$list [ $assoc [ 'company_id' ]][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $assoc [ 'company_id' ]][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $assoc [ 'company_id' ]][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $assoc [ 'company_id' ]][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $assoc [ 'company_id' ]][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $assoc [ 'company_id' ]][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $assoc [ 'company_id' ]][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
$list [ $assoc [ 'company_id' ]][ 'ptype' ][] = ( int ) $assoc [ 'ptype' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $assoc [ 'company_id' ]][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2020-10-31 14:32:18 +01:00
$company_id = $assoc [ 'company_id' ];
}
} else {
dol_print_error ( $db );
return - 3 ;
}
}
// CAS DES SERVICES
// Define sql request
$sql = '' ;
2023-06-10 14:22:34 +02:00
if (( $direction == 'sell' && getDolGlobalString ( 'TAX_MODE_SELL_SERVICE' ) == 'invoice' )
|| ( $direction == 'buy' && getDolGlobalString ( 'TAX_MODE_BUY_SERVICE' ) == 'invoice' )) {
2020-10-31 14:32:18 +01:00
// Count on invoice date
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2021-03-22 18:23:29 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, p.tosell as pstatus, p.tobuy as pstatusbuy, " ;
2021-03-22 18:50:47 +01:00
$sql .= " 0 as payment_id, '' as payment_ref, 0 as payment_amount " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . " societe as s, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2022-10-12 12:14:04 +02:00
if ( $direction == 'buy' ) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
} else {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
$sql .= " AND s.rowid = f.fk_soc " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND f.datef > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 1 " ; // Limit to services
$sql .= " OR d.date_start is NOT null OR d.date_end IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
} else {
// Count on payments date
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2021-03-22 18:23:29 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, p.tosell as pstatus, p.tobuy as pstatusbuy, " ;
2020-10-31 14:32:18 +01:00
$sql .= " pf. " . $fk_payment . " as payment_id, pf.amount as payment_amount, " ;
2021-03-22 18:50:47 +01:00
$sql .= " pa.datep as datep, pa.ref as payment_ref " ;
2020-10-31 14:32:18 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $paymentfacturetable . " as pf, " ;
$sql .= " " . MAIN_DB_PREFIX . $paymenttable . " as pa, " ;
$sql .= " " . MAIN_DB_PREFIX . " societe as s, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Paid (partially or completely)
2025-01-24 11:52:29 +01:00
$sql .= " AND f.type IN (0,1,2,3,5) " ;
2020-10-31 14:32:18 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
$sql .= " AND s.rowid = f.fk_soc " ;
$sql .= " AND pf. " . $fk_facture2 . " = f.rowid " ;
$sql .= " AND pa.rowid = pf. " . $fk_payment ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND pa.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND pa.datep >= ' " . $db -> idate ( $date_start ) . " ' AND pa.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 1 " ; // Limit to services
$sql .= " OR d.date_start is NOT null OR d.date_end IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture . " , pf.rowid " ;
}
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
2024-07-08 21:52:03 +02:00
dol_syslog ( " Tax.lib.php::tax_by_thirdparty no accountancy module enabled " . $sql , LOG_ERR );
2020-10-31 14:32:18 +01:00
return - 1 ; // -1 = Not accountancy module enabled
}
2021-02-23 22:03:23 +01:00
if ( $sql == 'TODO' ) {
return - 2 ; // -2 = Feature not yet available
}
if ( $sql != 'TODO' ) {
2024-07-08 21:52:03 +02:00
dol_syslog ( " Tax.lib.php::tax_by_thirdparty " , LOG_DEBUG );
2020-10-31 14:32:18 +01:00
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$company_id = - 1 ;
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'totalht' ])) {
$list [ $assoc [ 'company_id' ]][ 'totalht' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'vat' ])) {
$list [ $assoc [ 'company_id' ]][ 'vat' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax1' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax2' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] = 0 ;
}
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-10-31 14:32:18 +01:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
}
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'dtype' ][] = $assoc [ 'dtype' ];
$list [ $assoc [ 'company_id' ]][ 'datef' ][] = $db -> jdate ( $assoc [ 'datef' ]);
$list [ $assoc [ 'company_id' ]][ 'datep' ][] = $db -> jdate ( $assoc [ 'datep' ]);
2021-03-22 18:11:44 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'company_name' ][] = ( string ) $assoc [ 'company_name' ];
$list [ $assoc [ 'company_id' ]][ 'company_id' ][] = ( int ) $assoc [ 'company_id' ];
$list [ $assoc [ 'company_id' ]][ 'company_alias' ][] = ( string ) $assoc [ 'company_alias' ];
$list [ $assoc [ 'company_id' ]][ 'company_email' ][] = ( string ) $assoc [ 'company_email' ];
$list [ $assoc [ 'company_id' ]][ 'company_tva_intra' ][] = ( string ) $assoc [ 'company_tva_intra' ];
$list [ $assoc [ 'company_id' ]][ 'company_client' ][] = ( int ) $assoc [ 'company_client' ];
$list [ $assoc [ 'company_id' ]][ 'company_fournisseur' ][] = ( int ) $assoc [ 'company_fournisseur' ];
$list [ $assoc [ 'company_id' ]][ 'company_customer_code' ][] = ( string ) $assoc [ 'company_customer_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_supplier_code' ][] = ( string ) $assoc [ 'company_supplier_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_customer_accounting_code' ][] = ( string ) $assoc [ 'company_customer_accounting_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_supplier_accounting_code' ][] = ( string ) $assoc [ 'company_supplier_accounting_code' ];
$list [ $assoc [ 'company_id' ]][ 'company_status' ][] = ( int ) $assoc [ 'company_status' ];
2021-03-22 18:11:44 +01:00
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'drate' ][] = $assoc [ 'rate' ];
$list [ $assoc [ 'company_id' ]][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $assoc [ 'company_id' ]][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $assoc [ 'company_id' ]][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $assoc [ 'company_id' ]][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $assoc [ 'company_id' ]][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $assoc [ 'company_id' ]][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $assoc [ 'company_id' ]][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
$list [ $assoc [ 'company_id' ]][ 'ptype' ][] = ( int ) $assoc [ 'ptype' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $assoc [ 'company_id' ]][ 'payment_ref' ][] = ( string ) $assoc [ 'payment_ref' ];
$list [ $assoc [ 'company_id' ]][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2020-10-31 14:32:18 +01:00
$company_id = $assoc [ 'company_id' ];
}
} else {
dol_print_error ( $db );
return - 3 ;
}
}
// CASE OF EXPENSE REPORT
2021-02-23 22:03:23 +01:00
if ( $direction == 'buy' ) { // buy only for expense reports
2020-10-31 14:32:18 +01:00
// Define sql request
$sql = '' ;
// Count on payments date
$sql = " SELECT d.rowid, d.product_type as dtype, e.rowid as facid, d. $f_rate as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d.total_tva as total_vat, e.note_private as descr, " ;
$sql .= " d.total_localtax1 as total_localtax1, d.total_localtax2 as total_localtax2, " ;
$sql .= " e.date_debut as date_start, e.date_fin as date_end, e.fk_user_author, " ;
$sql .= " e.ref as facnum, e.total_ttc as ftotal_ttc, e.date_create, d.fk_c_type_fees as type, " ;
$sql .= " p.fk_bank as payment_id, p.amount as payment_amount, p.rowid as pid, e.ref as pref " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " expensereport as e " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " expensereport_det as d ON d.fk_expensereport = e.rowid " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " payment_expensereport as p ON p.fk_expensereport = e.rowid " ;
$sql .= " WHERE e.entity = " . $conf -> entity ;
$sql .= " AND e.fk_statut in (6) " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND p.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND p.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND p.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND p.datep >= ' " . $db -> idate ( $date_start ) . " ' AND p.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = -1 " ;
$sql .= " OR e.date_debut is NOT null OR e.date_fin IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d.total_tva <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY e.rowid " ;
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
2024-07-08 21:52:03 +02:00
dol_syslog ( " Tax.lib.php::tax_by_thirdparty no accountancy module enabled " . $sql , LOG_ERR );
2020-10-31 14:32:18 +01:00
return - 1 ; // -1 = Not accountancy module enabled
}
2021-02-23 22:03:23 +01:00
if ( $sql == 'TODO' ) {
return - 2 ; // -2 = Feature not yet available
}
if ( $sql != 'TODO' ) {
2024-07-08 21:52:03 +02:00
dol_syslog ( " Tax.lib.php::tax_by_thirdparty " , LOG_DEBUG );
2020-10-31 14:32:18 +01:00
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$company_id = - 1 ;
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'totalht' ])) {
$list [ $assoc [ 'company_id' ]][ 'totalht' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'vat' ])) {
$list [ $assoc [ 'company_id' ]][ 'vat' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax1' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] = 0 ;
}
if ( ! isset ( $list [ $assoc [ 'company_id' ]][ 'localtax2' ])) {
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] = 0 ;
}
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-10-31 14:32:18 +01:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
}
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'dtype' ][] = 'ExpenseReportPayment' ;
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'datef' ][] = ( int ) $assoc [ 'datef' ];
2021-03-22 18:11:44 +01:00
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'company_name' ][] = '' ;
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'company_id' ][] = 0 ;
2021-03-22 18:11:44 +01:00
$list [ $assoc [ 'company_id' ]][ 'company_alias' ][] = '' ;
$list [ $assoc [ 'company_id' ]][ 'company_email' ][] = '' ;
$list [ $assoc [ 'company_id' ]][ 'company_tva_intra' ][] = '' ;
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'company_client' ][] = 0 ;
$list [ $assoc [ 'company_id' ]][ 'company_fournisseur' ][] = 0 ;
2021-03-22 18:11:44 +01:00
$list [ $assoc [ 'company_id' ]][ 'company_customer_code' ][] = '' ;
$list [ $assoc [ 'company_id' ]][ 'company_supplier_code' ][] = '' ;
$list [ $assoc [ 'company_id' ]][ 'company_customer_accounting_code' ][] = '' ;
$list [ $assoc [ 'company_id' ]][ 'company_supplier_accounting_code' ][] = '' ;
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'company_status' ][] = 0 ;
2021-03-22 18:11:44 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'user_id' ][] = ( int ) $assoc [ 'fk_user_author' ];
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'drate' ][] = $assoc [ 'rate' ];
$list [ $assoc [ 'company_id' ]][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $assoc [ 'company_id' ]][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $assoc [ 'company_id' ]][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $assoc [ 'company_id' ]][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $assoc [ 'company_id' ]][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $assoc [ 'company_id' ]][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $assoc [ 'company_id' ]][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $assoc [ 'company_id' ]][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'company_id' ]][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $assoc [ 'company_id' ]][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
2020-10-31 14:32:18 +01:00
$list [ $assoc [ 'company_id' ]][ 'ptype' ][] = 'ExpenseReportPayment' ;
2024-10-17 03:08:38 +02:00
$list [ $assoc [ 'company_id' ]][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $assoc [ 'company_id' ]][ 'payment_ref' ][] = ( string ) $assoc [ 'payment_ref' ];
$list [ $assoc [ 'company_id' ]][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2020-10-31 14:32:18 +01:00
$company_id = $assoc [ 'company_id' ];
}
} else {
dol_print_error ( $db );
return - 3 ;
}
}
}
return $list ;
2008-10-26 02:26:18 +01:00
}
2024-10-17 03:08:38 +02:00
2008-10-26 02:26:18 +01:00
/**
2017-07-10 04:19:59 +02:00
* Gets Tax to collect for the given year ( and given quarter or month )
* The function gets the Tax in split results , as the Tax declaration asks
* to report the amounts for different Tax rates as different lines .
2012-02-04 14:39:47 +01:00
*
2024-10-17 03:08:38 +02:00
* @ param 'vat' | 'localtax1' | 'localtax2' $type Tax type , either 'vat' , 'localtax1' or 'localtax2'
* @ param DoliDB $db Database handler object
* @ param int $y Year
* @ param int < 0 , 4 > $q Quarter
2024-07-08 21:51:27 +02:00
* @ param int | '' $date_start Start date
* @ param int | '' $date_end End date
* @ param int $modetax Not used
* @ param 'sell' | 'buy' $direction 'sell' ( customer invoice ) or 'buy' ( supplier invoices )
2024-10-17 03:08:38 +02:00
* @ param int < 0 , 12 > $m Month
* @ return int <- 3 , - 1 >| array < int | string , array { totalht : float , vat : float , localtax1 : float , localtax2 : float , dtotal_ttc : float [], dtype : int [], datef : int [], datep : int [], company_name : string [], company_id : int [], company_alias : string [], company_email : string [], company_tva_intra : string [], company_client : int [], company_fournisseur : int [], company_customer_code : string [], company_supplier_code : string [], company_customer_accounting_code : string [], company_supplier_accounting_code : string [], company_status : int [], user_id : int [], drate : string [], ddate_start : int [], ddate_end : int [], facid : int [], facnum : string [], type : int [], ftotal_ttc : float [], descr : string [], totalht_list : string [], vat_list : float [], localtax1_list : float [], localtax2_list : float [], pid : int [], pref : string [], ptype : int [], payment_id : int [], payment_ref : string [], payment_amount : float []} > Array with details of VATs ( per rate ), - 1 if no accountancy module , - 2 if not yet developed , - 3 if error
2008-10-26 02:26:18 +01:00
*/
2019-01-27 15:20:16 +01:00
function tax_by_rate ( $type , $db , $y , $q , $date_start , $date_end , $modetax , $direction , $m = 0 )
2008-10-26 02:26:18 +01:00
{
2020-10-31 14:32:18 +01:00
global $conf ;
// If we use date_start and date_end, we must not use $y, $m, $q
2021-02-23 22:03:23 +01:00
if (( $date_start || $date_end ) && ( ! empty ( $y ) || ! empty ( $m ) || ! empty ( $q ))) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , 'Bad value of input parameter for tax_by_rate' );
2020-10-31 14:32:18 +01:00
}
$list = array ();
2021-02-23 22:03:23 +01:00
if ( $direction == 'sell' ) {
2020-10-31 14:32:18 +01:00
$invoicetable = 'facture' ;
$invoicedettable = 'facturedet' ;
$fk_facture = 'fk_facture' ;
$fk_facture2 = 'fk_facture' ;
$fk_payment = 'fk_paiement' ;
$total_tva = 'total_tva' ;
$paymenttable = 'paiement' ;
$paymentfacturetable = 'paiement_facture' ;
$invoicefieldref = 'ref' ;
} else {
$invoicetable = 'facture_fourn' ;
$invoicedettable = 'facture_fourn_det' ;
$fk_facture = 'fk_facture_fourn' ;
$fk_facture2 = 'fk_facturefourn' ;
$fk_payment = 'fk_paiementfourn' ;
$total_tva = 'tva' ;
$paymenttable = 'paiementfourn' ;
$paymentfacturetable = 'paiementfourn_facturefourn' ;
$invoicefieldref = 'ref' ;
}
2009-03-05 21:14:13 +01:00
2020-04-10 10:59:32 +02:00
if ( strpos ( $type , 'localtax' ) === 0 ) {
$f_rate = $type . '_tx' ;
2017-07-10 04:15:14 +02:00
} else {
$f_rate = 'tva_tx' ;
}
2020-04-10 10:59:32 +02:00
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
2018-03-26 21:39:18 +02:00
2018-04-27 18:43:41 +02:00
2021-03-22 18:11:44 +01:00
// CASE OF PRODUCTS/GOODS
2020-10-31 14:32:18 +01:00
// Define sql request
$sql = '' ;
2023-06-10 14:22:34 +02:00
if (( $direction == 'sell' && getDolGlobalString ( 'TAX_MODE_SELL_PRODUCT' ) == 'invoice' )
|| ( $direction == 'buy' && getDolGlobalString ( 'TAX_MODE_BUY_PRODUCT' ) == 'invoice' )) {
2020-10-31 14:32:18 +01:00
// Count on delivery date (use invoice date as delivery is unknown)
2022-01-24 17:04:46 +01:00
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.vat_src_code as vat_src_code, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2020-10-31 14:32:18 +01:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2020-10-31 14:32:18 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
2023-06-10 14:44:22 +02:00
$sql .= " 0 as payment_id, '' as payment_ref, 0 as payment_amount, " ;
$sql .= " '' as datep " ;
2021-02-16 04:28:55 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f " ;
2021-02-25 05:07:26 +01:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " societe as s ON s.rowid = f.fk_soc " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $invoicedettable . " as d ON d. " . $fk_facture . " =f.rowid " ;
2020-10-31 14:32:18 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2022-10-12 12:14:04 +02:00
if ( $direction == 'buy' ) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
} else {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
}
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND f.datef > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 0 " ; // Limit to products
$sql .= " AND d.date_start is null AND d.date_end IS NULL) " ; // enhance detection of products
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
} else {
// Count on payments date
2022-01-24 17:04:46 +01:00
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.vat_src_code as vat_src_code, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2020-10-31 14:32:18 +01:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2020-10-31 14:32:18 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
$sql .= " pf. " . $fk_payment . " as payment_id, pf.amount as payment_amount, " ;
2021-03-22 18:50:47 +01:00
$sql .= " pa.datep as datep, pa.ref as payment_ref " ;
2021-02-16 04:28:55 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f " ;
2021-08-31 20:15:41 +02:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $paymentfacturetable . " as pf ON pf. " . $fk_facture2 . " = f.rowid " ;
2021-02-25 05:07:26 +01:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $paymenttable . " as pa ON pa.rowid = pf. " . $fk_payment ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " societe as s ON s.rowid = f.fk_soc " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $invoicedettable . " as d ON d. " . $fk_facture . " = f.rowid " ;
2020-10-31 14:32:18 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Paid (partially or completely)
2025-01-24 11:52:29 +01:00
$sql .= " AND f.type IN (0,1,2,3,5) " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND pa.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND pa.datep >= ' " . $db -> idate ( $date_start ) . " ' AND pa.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 0 " ; // Limit to products
$sql .= " AND d.date_start is null AND d.date_end IS NULL) " ; // enhance detection of products
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture . " , pf.rowid " ;
}
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
return - 1 ;
}
if ( $sql == 'TODO' ) {
return - 2 ;
}
if ( $sql != 'TODO' ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " Tax.lib.php::tax_by_rate " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$rate = - 1 ;
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
2022-01-24 17:04:46 +01:00
$rate_key = $assoc [ 'rate' ];
if ( $f_rate == 'tva_tx' && ! empty ( $assoc [ 'vat_src_code' ]) && ! preg_match ( '/\(/' , $rate_key )) {
$rate_key .= ' (' . $assoc [ 'vat_src_code' ] . ')' ;
}
2020-10-31 14:32:18 +01:00
// Code to avoid warnings when array entry not defined
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'totalht' ])) {
$list [ $rate_key ][ 'totalht' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'vat' ])) {
$list [ $rate_key ][ 'vat' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax1' ])) {
$list [ $rate_key ][ 'localtax1' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax2' ])) {
$list [ $rate_key ][ 'localtax2' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
2021-02-23 22:03:23 +01:00
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-10-31 14:32:18 +01:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
}
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
$list [ $rate_key ][ 'dtype' ][] = ( int ) $assoc [ 'dtype' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'datef' ][] = $db -> jdate ( $assoc [ 'datef' ]);
$list [ $rate_key ][ 'datep' ][] = $db -> jdate ( $assoc [ 'datep' ]);
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'company_name' ][] = ( string ) $assoc [ 'company_name' ];
$list [ $rate_key ][ 'company_id' ][] = ( int ) $assoc [ 'company_id' ];
$list [ $rate_key ][ 'company_alias' ][] = ( string ) $assoc [ 'company_alias' ];
$list [ $rate_key ][ 'company_email' ][] = ( string ) $assoc [ 'company_email' ];
$list [ $rate_key ][ 'company_tva_intra' ][] = ( string ) $assoc [ 'company_tva_intra' ];
$list [ $rate_key ][ 'company_client' ][] = ( int ) $assoc [ 'company_client' ];
$list [ $rate_key ][ 'company_fournisseur' ][] = ( int ) $assoc [ 'company_fournisseur' ];
$list [ $rate_key ][ 'company_customer_code' ][] = ( string ) $assoc [ 'company_customer_code' ];
$list [ $rate_key ][ 'company_supplier_code' ][] = ( string ) $assoc [ 'company_supplier_code' ];
$list [ $rate_key ][ 'company_customer_accounting_code' ][] = ( string ) $assoc [ 'company_customer_accounting_code' ];
$list [ $rate_key ][ 'company_supplier_accounting_code' ][] = ( string ) $assoc [ 'company_supplier_accounting_code' ];
$list [ $rate_key ][ 'company_status' ][] = ( int ) $assoc [ 'company_status' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $rate_key ][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $rate_key ][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $rate_key ][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $rate_key ][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $rate_key ][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
2022-01-24 17:04:46 +01:00
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
2022-01-24 17:04:46 +01:00
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $rate_key ][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
$list [ $rate_key ][ 'ptype' ][] = ( int ) $assoc [ 'ptype' ];
2022-01-24 17:04:46 +01:00
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $rate_key ][ 'payment_ref' ][] = ( string ) $assoc [ 'payment_ref' ];
$list [ $rate_key ][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2020-10-31 14:32:18 +01:00
$rate = $assoc [ 'rate' ];
}
} else {
dol_print_error ( $db );
return - 3 ;
}
}
2021-03-22 18:11:44 +01:00
// CASE OF SERVICES
2020-10-31 14:32:18 +01:00
// Define sql request
$sql = '' ;
2023-06-10 14:22:34 +02:00
if (( $direction == 'sell' && getDolGlobalString ( 'TAX_MODE_SELL_SERVICE' ) == 'invoice' )
|| ( $direction == 'buy' && getDolGlobalString ( 'TAX_MODE_BUY_SERVICE' ) == 'invoice' )) {
2020-10-31 14:32:18 +01:00
// Count on invoice date
2022-01-24 17:04:46 +01:00
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.vat_src_code as vat_src_code, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2020-10-31 14:32:18 +01:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2020-10-31 14:32:18 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
2021-03-22 18:50:47 +01:00
$sql .= " 0 as payment_id, '' as payment_ref, 0 as payment_amount " ;
2021-02-16 04:28:55 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f " ;
2021-02-25 05:07:26 +01:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " societe as s ON s.rowid = f.fk_soc " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $invoicedettable . " as d ON d. " . $fk_facture . " = f.rowid " ;
2020-10-31 14:32:18 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2022-10-12 12:14:04 +02:00
if ( $direction == 'buy' ) {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_SUPPLIER_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
} else {
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'FACTURE_DEPOSITS_ARE_JUST_PAYMENTS' )) {
2022-10-12 12:14:04 +02:00
$sql .= " AND f.type IN (0,1,2,5) " ;
} else {
$sql .= " AND f.type IN (0,1,2,3,5) " ;
}
2021-02-23 22:03:23 +01:00
}
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND f.datef > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 1 " ; // Limit to services
$sql .= " OR d.date_start is NOT null OR d.date_end IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
} else {
// Count on payments date
2022-01-24 17:04:46 +01:00
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d. $f_rate as rate, d.vat_src_code as vat_src_code, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2020-10-31 14:32:18 +01:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2021-03-22 18:11:44 +01:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, f.datef, " ;
$sql .= " s.nom as company_name, s.name_alias as company_alias, s.rowid as company_id, s.client as company_client, s.fournisseur as company_fournisseur, s.email as company_email, " ;
$sql .= " s.code_client as company_customer_code, s.code_fournisseur as company_supplier_code, " ;
$sql .= " s.code_compta as company_customer_accounting_code, s.code_compta_fournisseur as company_supplier_accounting_code, " ;
$sql .= " s.status as company_status, s.tva_intra as company_tva_intra, " ;
2020-10-31 14:32:18 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
$sql .= " pf. " . $fk_payment . " as payment_id, pf.amount as payment_amount, " ;
2021-03-22 18:50:47 +01:00
$sql .= " pa.datep as datep, pa.ref as payment_ref " ;
2021-02-16 04:28:55 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f " ;
2021-02-25 05:07:26 +01:00
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $paymentfacturetable . " as pf ON pf. " . $fk_facture2 . " = f.rowid " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $paymenttable . " as pa ON pa.rowid = pf. " . $fk_payment ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . " societe as s ON s.rowid = f.fk_soc " ;
$sql .= " INNER JOIN " . MAIN_DB_PREFIX . $invoicedettable . " as d ON d. " . $fk_facture . " = f.rowid " ;
2020-10-31 14:32:18 +01:00
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
$sql .= " WHERE f.entity IN ( " . getEntity ( $invoicetable ) . " ) " ;
$sql .= " AND f.fk_statut in (1,2) " ; // Paid (partially or completely)
2025-01-24 11:52:29 +01:00
$sql .= " AND f.type IN (0,1,2,3,5) " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-10-31 14:32:18 +01:00
$sql .= " AND pa.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND pa.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND pa.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND pa.datep >= ' " . $db -> idate ( $date_start ) . " ' AND pa.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " AND (d.product_type = 1 " ; // Limit to services
$sql .= " OR d.date_start is NOT null OR d.date_end IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2021-02-23 22:03:23 +01:00
$sql .= " AND (d. " . $f_rate . " <> 0 OR d. " . $total_tva . " <> 0) " ;
}
2020-10-31 14:32:18 +01:00
$sql .= " ORDER BY d.rowid, d. " . $fk_facture . " , pf.rowid " ;
}
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " Tax.lib.php::tax_by_rate no accountancy module enabled " . $sql , LOG_ERR );
return - 1 ; // -1 = Not accountancy module enabled
}
2021-02-23 22:03:23 +01:00
if ( $sql == 'TODO' ) {
return - 2 ; // -2 = Feature not yet available
}
if ( $sql != 'TODO' ) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " Tax.lib.php::tax_by_rate " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$rate = - 1 ;
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
2022-01-24 17:04:46 +01:00
$rate_key = $assoc [ 'rate' ];
if ( $f_rate == 'tva_tx' && ! empty ( $assoc [ 'vat_src_code' ]) && ! preg_match ( '/\(/' , $rate_key )) {
$rate_key .= ' (' . $assoc [ 'vat_src_code' ] . ')' ;
}
2020-10-31 14:32:18 +01:00
// Code to avoid warnings when array entry not defined
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'totalht' ])) {
$list [ $rate_key ][ 'totalht' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'vat' ])) {
$list [ $rate_key ][ 'vat' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax1' ])) {
$list [ $rate_key ][ 'localtax1' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax2' ])) {
$list [ $rate_key ][ 'localtax2' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
2021-02-23 22:03:23 +01:00
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-10-31 14:32:18 +01:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2020-10-31 14:32:18 +01:00
}
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
$list [ $rate_key ][ 'dtype' ][] = ( int ) $assoc [ 'dtype' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'datef' ][] = $db -> jdate ( $assoc [ 'datef' ]);
$list [ $rate_key ][ 'datep' ][] = $db -> jdate ( $assoc [ 'datep' ]);
$list [ $rate_key ][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $rate_key ][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'company_name' ][] = ( string ) $assoc [ 'company_name' ];
$list [ $rate_key ][ 'company_id' ][] = ( int ) $assoc [ 'company_id' ];
$list [ $rate_key ][ 'company_alias' ][] = ( string ) $assoc [ 'company_alias' ];
$list [ $rate_key ][ 'company_email' ][] = ( string ) $assoc [ 'company_email' ];
$list [ $rate_key ][ 'company_tva_intra' ][] = ( string ) $assoc [ 'company_tva_intra' ];
$list [ $rate_key ][ 'company_client' ][] = ( int ) $assoc [ 'company_client' ];
$list [ $rate_key ][ 'company_fournisseur' ][] = ( int ) $assoc [ 'company_fournisseur' ];
$list [ $rate_key ][ 'company_customer_code' ][] = ( string ) $assoc [ 'company_customer_code' ];
$list [ $rate_key ][ 'company_supplier_code' ][] = ( string ) $assoc [ 'company_supplier_code' ];
$list [ $rate_key ][ 'company_customer_accounting_code' ][] = ( string ) $assoc [ 'company_customer_accounting_code' ];
$list [ $rate_key ][ 'company_supplier_accounting_code' ][] = ( string ) $assoc [ 'company_supplier_accounting_code' ];
$list [ $rate_key ][ 'company_status' ][] = ( int ) $assoc [ 'company_status' ];
$list [ $rate_key ][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $rate_key ][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $rate_key ][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $rate_key ][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $rate_key ][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
$list [ $rate_key ][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
$list [ $rate_key ][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $rate_key ][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
$list [ $rate_key ][ 'ptype' ][] = ( int ) $assoc [ 'ptype' ];
$list [ $rate_key ][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $rate_key ][ 'payment_ref' ][] = ( string ) $assoc [ 'payment_ref' ];
$list [ $rate_key ][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2020-10-31 14:32:18 +01:00
$rate = $assoc [ 'rate' ];
}
} else {
dol_print_error ( $db );
return - 3 ;
}
}
// CASE OF EXPENSE REPORT
2018-04-27 18:43:41 +02:00
2021-02-23 22:03:23 +01:00
if ( $direction == 'buy' ) { // buy only for expense reports
2016-11-12 07:40:08 +01:00
// Define sql request
2020-04-10 10:59:32 +02:00
$sql = '' ;
2016-11-12 07:40:08 +01:00
// Count on payments date
2022-01-24 17:04:46 +01:00
$sql = " SELECT d.rowid, d.product_type as dtype, e.rowid as facid, d. $f_rate as rate, d.vat_src_code as vat_src_code, d.total_ht as total_ht, d.total_ttc as total_ttc, d.total_tva as total_vat, e.note_private as descr, " ;
2020-04-10 10:59:32 +02:00
$sql .= " d.total_localtax1 as total_localtax1, d.total_localtax2 as total_localtax2, " ;
$sql .= " e.date_debut as date_start, e.date_fin as date_end, e.fk_user_author, " ;
2024-11-21 22:13:45 +01:00
$sql .= " e.ref as facnum, e.ref as pref, e.total_ttc as ftotal_ttc, e.date_create, d.fk_c_type_fees as type, " ;
$sql .= " p.fk_bank as payment_id, p.amount as payment_amount, p.rowid as pid " ;
2021-02-16 04:28:55 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . " expensereport as e " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " expensereport_det as d ON d.fk_expensereport = e.rowid " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " payment_expensereport as p ON p.fk_expensereport = e.rowid " ;
2020-04-10 10:59:32 +02:00
$sql .= " WHERE e.entity = " . $conf -> entity ;
$sql .= " AND e.fk_statut in (6) " ;
2021-02-23 22:03:23 +01:00
if ( $y && $m ) {
2020-04-10 10:59:32 +02:00
$sql .= " AND p.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , $m , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , $m , false )) . " ' " ;
2021-02-23 22:03:23 +01:00
} elseif ( $y ) {
2020-04-10 10:59:32 +02:00
$sql .= " AND p.datep >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
2016-11-12 07:40:08 +01:00
}
2021-02-23 22:03:23 +01:00
if ( $q ) {
2021-03-22 16:09:18 +01:00
$sql .= " AND p.datep > ' " . $db -> idate ( dol_get_first_day ( $y , (( $q - 1 ) * 3 ) + 1 , false )) . " ' " ;
$sql .= " AND p.datep <= ' " . $db -> idate ( dol_get_last_day ( $y , ( $q * 3 ), false )) . " ' " ;
2021-02-23 22:03:23 +01:00
}
if ( $date_start && $date_end ) {
$sql .= " AND p.datep >= ' " . $db -> idate ( $date_start ) . " ' AND p.datep <= ' " . $db -> idate ( $date_end ) . " ' " ;
}
2020-04-10 10:59:32 +02:00
$sql .= " AND (d.product_type = -1 " ;
$sql .= " OR e.date_debut is NOT null OR e.date_fin IS NOT NULL) " ; // enhance detection of service
2023-11-27 11:39:32 +01:00
if ( getDolGlobalString ( 'MAIN_NOT_INCLUDE_ZERO_VAT_IN_REPORTS' )) {
2024-11-21 22:13:45 +01:00
$sql .= " AND (d. " . $db -> sanitize ( $f_rate ) . " <> 0 OR d.total_tva <> 0) " ;
2021-02-23 22:03:23 +01:00
}
2020-04-10 10:59:32 +02:00
$sql .= " ORDER BY e.rowid " ;
2021-02-23 22:03:23 +01:00
if ( ! $sql ) {
2019-01-27 11:55:16 +01:00
dol_syslog ( " Tax.lib.php::tax_by_rate no accountancy module enabled " . $sql , LOG_ERR );
2020-04-10 10:59:32 +02:00
return - 1 ; // -1 = Not accountancy module enabled
2016-11-12 07:40:08 +01:00
}
2021-02-23 22:03:23 +01:00
if ( $sql == 'TODO' ) {
return - 2 ; // -2 = Feature not yet available
}
if ( $sql != 'TODO' ) {
2018-04-27 18:43:41 +02:00
dol_syslog ( " Tax.lib.php::tax_by_rate " , LOG_DEBUG );
2016-11-12 07:40:08 +01:00
$resql = $db -> query ( $sql );
2021-02-23 22:03:23 +01:00
if ( $resql ) {
2016-11-12 07:40:08 +01:00
$rate = - 1 ;
2020-04-10 10:59:32 +02:00
$oldrowid = '' ;
2021-02-23 22:03:23 +01:00
while ( $assoc = $db -> fetch_array ( $resql )) {
2022-01-24 17:04:46 +01:00
$rate_key = $assoc [ 'rate' ];
if ( $f_rate == 'tva_tx' && ! empty ( $assoc [ 'vat_src_code' ]) && ! preg_match ( '/\(/' , $rate_key )) {
$rate_key .= ' (' . $assoc [ 'vat_src_code' ] . ')' ;
}
2018-04-28 16:06:46 +02:00
// Code to avoid warnings when array entry not defined
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'totalht' ])) {
$list [ $rate_key ][ 'totalht' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'vat' ])) {
$list [ $rate_key ][ 'vat' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax1' ])) {
$list [ $rate_key ][ 'localtax1' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2022-01-24 17:04:46 +01:00
if ( ! isset ( $list [ $rate_key ][ 'localtax2' ])) {
$list [ $rate_key ][ 'localtax2' ] = 0 ;
2021-02-23 22:03:23 +01:00
}
2016-11-12 07:40:08 +01:00
2021-02-23 22:03:23 +01:00
if ( $assoc [ 'rowid' ] != $oldrowid ) { // Si rupture sur d.rowid
2020-04-10 10:59:32 +02:00
$oldrowid = $assoc [ 'rowid' ];
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'totalht' ] += ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat' ] += ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1' ] += ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2' ] += ( float ) $assoc [ 'total_localtax2' ];
2016-11-12 07:40:08 +01:00
}
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'dtotal_ttc' ][] = ( float ) $assoc [ 'total_ttc' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'dtype' ][] = 'ExpenseReportPayment' ;
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'datef' ][] = ( int ) $assoc [ 'datef' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'company_name' ][] = '' ;
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'company_id' ][] = 0 ;
$list [ $rate_key ][ 'user_id' ][] = ( int ) $assoc [ 'fk_user_author' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $rate_key ][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'facid' ][] = ( int ) $assoc [ 'facid' ];
$list [ $rate_key ][ 'facnum' ][] = ( string ) $assoc [ 'facnum' ];
$list [ $rate_key ][ 'type' ][] = ( int ) $assoc [ 'type' ];
$list [ $rate_key ][ 'ftotal_ttc' ][] = ( float ) $assoc [ 'ftotal_ttc' ];
$list [ $rate_key ][ 'descr' ][] = ( string ) $assoc [ 'descr' ];
2022-01-24 17:04:46 +01:00
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'totalht_list' ][] = ( float ) $assoc [ 'total_ht' ];
$list [ $rate_key ][ 'vat_list' ][] = ( float ) $assoc [ 'total_vat' ];
$list [ $rate_key ][ 'localtax1_list' ][] = ( float ) $assoc [ 'total_localtax1' ];
$list [ $rate_key ][ 'localtax2_list' ][] = ( float ) $assoc [ 'total_localtax2' ];
2022-01-24 17:04:46 +01:00
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'pid' ][] = ( int ) $assoc [ 'pid' ];
$list [ $rate_key ][ 'pref' ][] = ( string ) $assoc [ 'pref' ];
2022-01-24 17:04:46 +01:00
$list [ $rate_key ][ 'ptype' ][] = 'ExpenseReportPayment' ;
2024-10-17 03:08:38 +02:00
$list [ $rate_key ][ 'payment_id' ][] = ( int ) $assoc [ 'payment_id' ];
$list [ $rate_key ][ 'payment_ref' ][] = ( string ) $assoc [ 'payment_ref' ];
$list [ $rate_key ][ 'payment_amount' ][] = ( float ) $assoc [ 'payment_amount' ];
2016-11-12 07:40:08 +01:00
$rate = $assoc [ 'rate' ];
}
2020-05-21 15:05:19 +02:00
} else {
2016-11-12 07:40:08 +01:00
dol_print_error ( $db );
return - 3 ;
}
}
}
return $list ;
2008-10-26 02:26:18 +01:00
}