2008-10-26 02:26:18 +01:00
< ? php
2011-09-15 09:38:41 +02:00
/* Copyright ( C ) 2004 - 2009 Laurent Destailleur < eldy @ users . sourceforge . net >
* Copyright ( C ) 2006 - 2007 Yannick Warnier < ywarnier @ beeznest . org >
2012-12-30 15:13:49 +01:00
* Copyright ( C ) 2011 Regis Houssin < regis . houssin @ capnetworks . com >
2013-08-29 10:03:32 +02:00
* Copyright ( C ) 2012 Juanjo Menent < jmenent @ 2 byte . es >
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
2011-08-01 01:24:38 +02:00
* along with this program . If not , see < http :// 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
*
* @ param Object $object Object related to tabs
* @ return array Array of tabs to shoc
*/
2011-12-21 21:14:10 +01:00
function tax_prepare_head ( $object )
{
global $langs , $conf ;
$h = 0 ;
$head = array ();
$head [ $h ][ 0 ] = DOL_URL_ROOT . '/compta/sociales/charges.php?id=' . $object -> id ;
$head [ $h ][ 1 ] = $langs -> trans ( 'Card' );
$head [ $h ][ 2 ] = 'card' ;
$h ++ ;
// 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
2012-12-01 15:45:05 +01:00
// $this->tabs = array('entity:-tabname); to remove a tab
2011-12-21 21:14:10 +01:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'tax' );
2013-12-16 23:45:12 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php' ;
$upload_dir = $conf -> tax -> dir_output . " / " . dol_sanitizeFileName ( $object -> ref );
$nbFiles = count ( dol_dir_list ( $upload_dir , 'files' ));
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 " );
2013-12-16 23:45:12 +01:00
if ( $nbFiles > 0 ) $head [ $h ][ 1 ] .= ' (' . $nbFiles . ')' ;
2012-01-11 20:31:40 +01:00
$head [ $h ][ 2 ] = 'documents' ;
$h ++ ;
2011-12-21 21:14:10 +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 ++ ;
2012-12-01 15:45:05 +01:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'tax' , 'remove' );
2011-12-21 21:14:10 +01:00
return $head ;
}
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
*
* @ param DoliDB $db Database handle
* @ param int $y Year
* @ param string $date_start Start date
* @ param string $date_end End date
* @ param int $modetax 0 or 1 ( option vat on debit )
* @ param string $direction 'sell' or 'buy'
* @ param int $m Month
* @ return array List of customers third parties with vat , - 1 if no accountancy module , - 2 if not yet developped , - 3 if error
2008-10-26 02:26:18 +01:00
*/
2011-03-09 11:04:58 +01:00
function vat_by_thirdparty ( $db , $y , $date_start , $date_end , $modetax , $direction , $m = 0 )
2008-10-26 02:26:18 +01:00
{
2011-03-09 11:09:07 +01:00
global $conf ;
$list = array ();
//print "xx".$conf->global->MAIN_MODULE_ACCOUNTING;
//print "xx".$conf->global->MAIN_MODULE_COMPTABILITE;
if ( $direction == 'sell' )
{
$invoicetable = 'facture' ;
$invoicedettable = 'facturedet' ;
$fk_facture = 'fk_facture' ;
$total_tva = 'total_tva' ;
2011-10-28 12:17:53 +02:00
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
2011-03-09 11:09:07 +01:00
}
if ( $direction == 'buy' )
{
$invoicetable = 'facture_fourn' ;
$invoicedettable = 'facture_fourn_det' ;
$fk_facture = 'fk_facture_fourn' ;
$total_tva = 'tva' ;
2011-10-28 12:17:53 +02:00
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
2011-03-09 11:09:07 +01:00
}
2008-10-26 02:26:18 +01:00
// Define sql request
2011-03-09 11:09:07 +01:00
$sql = '' ;
if ( $modetax == 1 )
2008-10-26 02:26:18 +01:00
{
2009-08-19 19:16:47 +02:00
// If vat paid on due invoices (non draft)
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un payment a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +01:00
{
2011-10-28 12:17:53 +02:00
$sql = " SELECT s.rowid as socid, s.nom as nom, s.siren as tva_intra, s.tva_assuj as assuj, " ;
$sql .= " sum(fd.total_ht) as amount, sum(fd. " . $total_tva . " ) as tva, " ;
$sql .= " sum(fd. " . $total_localtax1 . " ) as localtax1, " ;
$sql .= " sum(fd. " . $total_localtax2 . " ) as localtax2 " ;
2011-09-15 09:38:41 +02:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as fd, " ;
$sql .= " " . MAIN_DB_PREFIX . " societe as s " ;
$sql .= " WHERE f.entity = " . $conf -> entity ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
else if ( $y )
{
$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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
if ( $date_start && $date_end ) $sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
$sql .= " AND s.rowid = f.fk_soc AND f.rowid = fd. " . $fk_facture ;
2011-03-09 11:12:04 +01:00
$sql .= " GROUP BY s.rowid, s.nom, s.tva_intra, s.tva_assuj " ;
2011-03-09 11:09:07 +01:00
}
2008-10-26 02:26:18 +01:00
}
else
{
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
// If vat paid on payments
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un payment a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +01:00
{
// Tva sur factures payes (should be on payment)
2011-03-09 11:12:04 +01:00
/* $sql = " SELECT s.rowid as socid, s.nom as nom, s.tva_intra as tva_intra, s.tva_assuj as assuj, " ;
$sql .= " sum(fd.total_ht) as amount, sum( " . $total_tva . " ) as tva " ;
2011-03-09 11:09:07 +01:00
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " . MAIN_DB_PREFIX . $invoicetable . " as fd, " . MAIN_DB_PREFIX . " societe as s " ;
$sql .= " WHERE " ;
$sql .= " f.fk_statut in (2) " ; // Paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
else if ( $y )
{
$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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
if ( $date_start && $date_end ) $sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
$sql .= " AND s.rowid = f.fk_soc AND f.rowid = fd. " . $fk_facture ;
2011-03-09 11:12:04 +01:00
$sql .= " GROUP BY s.rowid as socid, s.nom as nom, s.tva_intra as tva_intra, s.tva_assuj as assuj " ;
2008-10-26 02:26:18 +01:00
*/
2011-03-09 11:09:07 +01:00
$sql = 'TODO' ;
}
2008-10-26 02:26:18 +01:00
}
2011-03-09 11:09:07 +01:00
if ( ! $sql ) return - 1 ;
2011-07-18 13:11:19 +02:00
if ( $sql == 'TODO' ) return - 2 ;
if ( $sql != 'TODO' )
2011-03-09 11:09:07 +01:00
{
dol_syslog ( " Tax.lib:thirdparty sql= " . $sql );
$resql = $db -> query ( $sql );
if ( $resql )
{
2011-03-09 11:31:38 +01:00
while ( $assoc = $db -> fetch_object ( $resql ))
2011-03-09 11:09:07 +01:00
{
$list [] = $assoc ;
}
$db -> free ( $resql );
return $list ;
}
else
{
dol_print_error ( $db );
return - 3 ;
}
}
2008-10-26 02:26:18 +01:00
}
/**
2012-02-04 14:39:47 +01:00
* Gets VAT to collect for the given year ( and given quarter or month )
* The function gets the VAT in split results , as the VAT declaration asks
* to report the amounts for different VAT rates as different lines .
* This function also accounts recurrent invoices .
*
* @ param DoliDB $db Database handler object
* @ param int $y Year
* @ param int $q Quarter
* @ param string $date_start Start date
* @ param string $date_end End date
* @ param int $modetax 0 or 1 ( option vat on debit )
* @ param int $direction 'sell' ( customer invoice ) or 'buy' ( supplier invoices )
* @ param int $m Month
* @ return array List of quarters with vat
2008-10-26 02:26:18 +01:00
*/
2010-01-12 00:25:54 +01:00
function vat_by_date ( $db , $y , $q , $date_start , $date_end , $modetax , $direction , $m = 0 )
2008-10-26 02:26:18 +01:00
{
2011-03-09 11:09:07 +01:00
global $conf ;
$list = array ();
if ( $direction == 'sell' )
{
$invoicetable = 'facture' ;
$invoicedettable = 'facturedet' ;
$fk_facture = 'fk_facture' ;
$fk_facture2 = 'fk_facture' ;
$fk_payment = 'fk_paiement' ;
$total_tva = 'total_tva' ;
2011-10-28 12:17:53 +02:00
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
2011-03-09 11:09:07 +01:00
$paymenttable = 'paiement' ;
$paymentfacturetable = 'paiement_facture' ;
2013-04-11 23:04:25 +02:00
$invoicefieldref = 'facnumber' ;
2011-03-09 11:09:07 +01:00
}
if ( $direction == 'buy' )
{
$invoicetable = 'facture_fourn' ;
$invoicedettable = 'facture_fourn_det' ;
$fk_facture = 'fk_facture_fourn' ;
$fk_facture2 = 'fk_facturefourn' ;
$fk_payment = 'fk_paiementfourn' ;
$total_tva = 'tva' ;
2011-10-28 12:17:53 +02:00
$total_localtax1 = 'total_localtax1' ;
$total_localtax2 = 'total_localtax2' ;
2011-03-09 11:09:07 +01:00
$paymenttable = 'paiementfourn' ;
$paymentfacturetable = 'paiementfourn_facturefourn' ;
2013-04-11 23:04:25 +02:00
$invoicefieldref = 'ref' ;
2011-03-09 11:09:07 +01:00
}
2009-03-05 21:14:13 +01:00
2008-10-26 02:26:18 +01:00
// CAS DES BIENS
2009-03-05 21:14:13 +01:00
2011-03-09 11:09:07 +01:00
// Define sql request
$sql = '' ;
if ( $modetax == 1 ) // Option vat on delivery for goods (payment) and debit invoice for services
2008-10-26 02:26:18 +01:00
{
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un payment a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +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.tva_tx as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2011-10-28 12:17:53 +02:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
2011-03-09 11:09:07 +01:00
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2013-04-11 23:04:25 +02:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, " ;
2011-03-09 11:09:07 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
$sql .= " 0 as payment_id, 0 as payment_amount " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
2011-09-15 09:38:41 +02:00
$sql .= " WHERE f.entity = " . $conf -> entity ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:09:07 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
else if ( $y )
2011-03-09 11:09:07 +01:00
{
$sql .= " AND f.datef >= ' " . $db -> idate ( dol_get_first_day ( $y , 1 , false )) . " ' " ;
2011-03-09 11:04:58 +01:00
$sql .= " AND f.datef <= ' " . $db -> idate ( dol_get_last_day ( $y , 12 , false )) . " ' " ;
2011-03-09 11:09:07 +01:00
}
if ( $q ) $sql .= " AND (date_format(f.datef,'%m') > " . (( $q - 1 ) * 3 ) . " AND date_format(f.datef,'%m') <= " . ( $q * 3 ) . " ) " ;
if ( $date_start && $date_end ) $sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
$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 service
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
}
2008-10-26 02:26:18 +01:00
}
2011-03-09 11:09:07 +01:00
else // Option vat on delivery for goods (payments) and payments for services
2008-10-26 02:26:18 +01:00
{
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un payment a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +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.tva_tx as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2011-10-28 12:17:53 +02:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
2011-03-09 11:09:07 +01:00
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2013-04-11 23:04:25 +02:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, " ;
2011-03-09 11:09:07 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
$sql .= " 0 as payment_id, 0 as payment_amount " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
2011-09-15 09:38:41 +02:00
$sql .= " WHERE f.entity = " . $conf -> entity ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:09:07 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
else if ( $y )
2011-03-09 11:04:58 +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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
if ( $q ) $sql .= " AND (date_format(f.datef,'%m') > " . (( $q - 1 ) * 3 ) . " AND date_format(f.datef,'%m') <= " . ( $q * 3 ) . " ) " ;
if ( $date_start && $date_end ) $sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
$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 service
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
//print $sql;
}
2008-10-26 02:26:18 +01:00
}
2009-07-29 18:13:33 +02:00
//print $sql.'<br>';
2011-03-09 11:09:07 +01:00
if ( ! $sql ) return - 1 ;
2011-07-18 13:11:19 +02:00
if ( $sql == 'TODO' ) return - 2 ;
if ( $sql != 'TODO' )
2011-03-09 11:09:07 +01:00
{
dol_syslog ( " Tax.lib.php::vat_by_date sql= " . $sql );
$resql = $db -> query ( $sql );
if ( $resql )
{
$rate = - 1 ;
$oldrowid = '' ;
while ( $assoc = $db -> fetch_array ( $resql ))
{
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'totalht' ])) $list [ $assoc [ 'rate' ]][ 'totalht' ] = 0 ;
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'vat' ])) $list [ $assoc [ 'rate' ]][ 'vat' ] = 0 ;
2013-08-29 10:03:32 +02:00
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'localtax1' ])) $list [ $assoc [ 'rate' ]][ 'localtax1' ] = 0 ;
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'localtax2' ])) $list [ $assoc [ 'rate' ]][ 'localtax2' ] = 0 ;
2011-03-09 11:09:07 +01:00
if ( $assoc [ 'rowid' ] != $oldrowid ) // Si rupture sur d.rowid
{
$oldrowid = $assoc [ 'rowid' ];
$list [ $assoc [ 'rate' ]][ 'totalht' ] += $assoc [ 'total_ht' ];
$list [ $assoc [ 'rate' ]][ 'vat' ] += $assoc [ 'total_vat' ];
2011-10-28 12:17:53 +02:00
$list [ $assoc [ 'rate' ]][ 'localtax1' ] += $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'rate' ]][ 'localtax2' ] += $assoc [ 'total_localtax2' ];
2011-03-09 11:09:07 +01:00
}
$list [ $assoc [ 'rate' ]][ 'dtotal_ttc' ][] = $assoc [ 'total_ttc' ];
$list [ $assoc [ 'rate' ]][ 'dtype' ][] = $assoc [ 'dtype' ];
$list [ $assoc [ 'rate' ]][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $assoc [ 'rate' ]][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
$list [ $assoc [ 'rate' ]][ 'facid' ][] = $assoc [ 'facid' ];
$list [ $assoc [ 'rate' ]][ 'facnum' ][] = $assoc [ 'facnum' ];
$list [ $assoc [ 'rate' ]][ 'type' ][] = $assoc [ 'type' ];
$list [ $assoc [ 'rate' ]][ 'ftotal_ttc' ][] = $assoc [ 'ftotal_ttc' ];
$list [ $assoc [ 'rate' ]][ 'descr' ][] = $assoc [ 'descr' ];
$list [ $assoc [ 'rate' ]][ 'totalht_list' ][] = $assoc [ 'total_ht' ];
$list [ $assoc [ 'rate' ]][ 'vat_list' ][] = $assoc [ 'total_vat' ];
2011-10-28 12:17:53 +02:00
$list [ $assoc [ 'rate' ]][ 'localtax1_list' ][] = $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'rate' ]][ 'localtax2_list' ][] = $assoc [ 'total_localtax2' ];
2011-03-09 11:09:07 +01:00
$list [ $assoc [ 'rate' ]][ 'pid' ][] = $assoc [ 'pid' ];
$list [ $assoc [ 'rate' ]][ 'pref' ][] = $assoc [ 'pref' ];
$list [ $assoc [ 'rate' ]][ 'ptype' ][] = $assoc [ 'ptype' ];
$list [ $assoc [ 'rate' ]][ 'payment_id' ][] = $assoc [ 'payment_id' ];
$list [ $assoc [ 'rate' ]][ 'payment_amount' ][] = $assoc [ 'payment_amount' ];
$rate = $assoc [ 'rate' ];
}
}
else
{
dol_print_error ( $db );
return - 3 ;
}
}
// CAS DES SERVICES
// Define sql request
$sql = '' ;
if ( $modetax == 1 ) // Option vat on delivery for goods (payment) and debit invoice for services
2008-10-26 02:26:18 +01:00
{
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
// Count on invoice date
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un payment a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +01:00
{
// Count on invoice date
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d.tva_tx as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2011-10-28 12:17:53 +02:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
2011-03-09 11:09:07 +01:00
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2013-04-11 23:04:25 +02:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, " ;
2011-03-09 11:09:07 +01:00
$sql .= " p.rowid as pid, p.ref as pref, p.fk_product_type as ptype, " ;
$sql .= " 0 as payment_id, 0 as payment_amount " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $invoicetable . " as f, " ;
$sql .= " " . MAIN_DB_PREFIX . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
2011-09-15 09:38:41 +02:00
$sql .= " WHERE f.entity = " . $conf -> entity ;
$sql .= " AND f.fk_statut in (1,2) " ; // Validated or paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:09:07 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
else if ( $y )
{
$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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
if ( $q ) $sql .= " AND (date_format(f.datef,'%m') > " . (( $q - 1 ) * 3 ) . " AND date_format(f.datef,'%m') <= " . ( $q * 3 ) . " ) " ;
if ( $date_start && $date_end ) $sql .= " AND f.datef >= ' " . $db -> idate ( $date_start ) . " ' AND f.datef <= ' " . $db -> idate ( $date_end ) . " ' " ;
$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
$sql .= " ORDER BY d.rowid, d. " . $fk_facture ;
}
2008-10-26 02:26:18 +01:00
}
2011-03-09 11:09:07 +01:00
else // Option vat on delivery for goods (payments) and payments for services
2008-10-26 02:26:18 +01:00
{
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_ACCOUNTING ))
2011-03-09 11:09:07 +01:00
{
// Count on payments date
2011-09-03 02:14:27 +02:00
// TODO a ce jour on se sait pas la compter car le montant tva d'un payment
2011-03-09 11:09:07 +01:00
// n'est pas stocke dans la table des payments.
// Seul le module compta expert peut resoudre ce probleme.
// (Il faut quand un paiement a lieu, stocker en plus du montant du paiement le
// detail part tva et part ht).
$sql = 'TODO' ;
}
2012-09-15 10:01:35 +02:00
if ( ! empty ( $conf -> global -> MAIN_MODULE_COMPTABILITE ))
2011-03-09 11:09:07 +01:00
{
// Count on payments date
$sql = " SELECT d.rowid, d.product_type as dtype, d. " . $fk_facture . " as facid, d.tva_tx as rate, d.total_ht as total_ht, d.total_ttc as total_ttc, d. " . $total_tva . " as total_vat, d.description as descr, " ;
2011-10-28 12:17:53 +02:00
$sql .= " d. " . $total_localtax1 . " as total_localtax1, d. " . $total_localtax2 . " as total_localtax2, " ;
2011-03-09 11:09:07 +01:00
$sql .= " d.date_start as date_start, d.date_end as date_end, " ;
2013-04-11 23:04:25 +02:00
$sql .= " f. " . $invoicefieldref . " as facnum, f.type, f.total_ttc as ftotal_ttc, " ;
2011-03-09 11:09:07 +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 " ;
$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 . $invoicedettable . " as d " ;
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . " product as p on d.fk_product = p.rowid " ;
2011-09-15 09:38:41 +02:00
$sql .= " WHERE f.entity = " . $conf -> entity ;
$sql .= " AND f.fk_statut in (1,2) " ; // Paid (partially or completely)
2012-01-08 23:43:32 +01:00
if ( ! empty ( $conf -> global -> FACTURE_DEPOSITS_ARE_JUST_PAYMENTS )) $sql .= " AND f.type IN (0,1,2) " ;
else $sql .= " AND f.type IN (0,1,2,3) " ;
2011-03-09 11:09:07 +01:00
$sql .= " AND f.rowid = d. " . $fk_facture ;;
$sql .= " AND pf. " . $fk_facture2 . " = f.rowid " ;
$sql .= " AND pa.rowid = pf. " . $fk_payment ;
2011-03-09 11:04:58 +01:00
if ( $y && $m )
{
$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 )) . " ' " ;
}
else if ( $y )
{
$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 )) . " ' " ;
}
2011-03-09 11:09:07 +01:00
if ( $q ) $sql .= " AND (date_format(pa.datep,'%m') > " . (( $q - 1 ) * 3 ) . " AND date_format(pa.datep,'%m') <= " . ( $q * 3 ) . " ) " ;
if ( $date_start && $date_end ) $sql .= " AND pa.datep >= " . $db -> idate ( $date_start ) . " AND pa.datep <= " . $db -> idate ( $date_end );
$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
$sql .= " ORDER BY d.rowid, d. " . $fk_facture . " , pf.rowid " ;
}
}
if ( ! $sql )
{
dol_syslog ( " Tax.lib.php::vat_by_date no accountancy module enabled " . $sql , LOG_ERR );
return - 1 ; // -1 = Not accountancy module enabled
}
2011-07-18 13:11:19 +02:00
if ( $sql == 'TODO' ) return - 2 ; // -2 = Feature not yet available
if ( $sql != 'TODO' )
2011-03-09 11:09:07 +01:00
{
dol_syslog ( " Tax.lib.php::vat_by_date sql= " . $sql );
$resql = $db -> query ( $sql );
if ( $resql )
{
$rate = - 1 ;
$oldrowid = '' ;
while ( $assoc = $db -> fetch_array ( $resql ))
{
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'totalht' ])) $list [ $assoc [ 'rate' ]][ 'totalht' ] = 0 ;
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'vat' ])) $list [ $assoc [ 'rate' ]][ 'vat' ] = 0 ;
2013-08-29 10:03:32 +02:00
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'localtax1' ])) $list [ $assoc [ 'rate' ]][ 'localtax1' ] = 0 ;
if ( ! isset ( $list [ $assoc [ 'rate' ]][ 'localtax2' ])) $list [ $assoc [ 'rate' ]][ 'localtax2' ] = 0 ;
2011-03-09 11:09:07 +01:00
if ( $assoc [ 'rowid' ] != $oldrowid ) // Si rupture sur d.rowid
{
$oldrowid = $assoc [ 'rowid' ];
$list [ $assoc [ 'rate' ]][ 'totalht' ] += $assoc [ 'total_ht' ];
$list [ $assoc [ 'rate' ]][ 'vat' ] += $assoc [ 'total_vat' ];
2011-10-28 12:17:53 +02:00
$list [ $assoc [ 'rate' ]][ 'localtax1' ] += $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'rate' ]][ 'localtax2' ] += $assoc [ 'total_localtax2' ];
2011-03-09 11:09:07 +01:00
}
$list [ $assoc [ 'rate' ]][ 'dtotal_ttc' ][] = $assoc [ 'total_ttc' ];
$list [ $assoc [ 'rate' ]][ 'dtype' ][] = $assoc [ 'dtype' ];
$list [ $assoc [ 'rate' ]][ 'ddate_start' ][] = $db -> jdate ( $assoc [ 'date_start' ]);
$list [ $assoc [ 'rate' ]][ 'ddate_end' ][] = $db -> jdate ( $assoc [ 'date_end' ]);
$list [ $assoc [ 'rate' ]][ 'facid' ][] = $assoc [ 'facid' ];
$list [ $assoc [ 'rate' ]][ 'facnum' ][] = $assoc [ 'facnum' ];
$list [ $assoc [ 'rate' ]][ 'type' ][] = $assoc [ 'type' ];
$list [ $assoc [ 'rate' ]][ 'ftotal_ttc' ][] = $assoc [ 'ftotal_ttc' ];
$list [ $assoc [ 'rate' ]][ 'descr' ][] = $assoc [ 'descr' ];
$list [ $assoc [ 'rate' ]][ 'totalht_list' ][] = $assoc [ 'total_ht' ];
$list [ $assoc [ 'rate' ]][ 'vat_list' ][] = $assoc [ 'total_vat' ];
2011-10-28 12:17:53 +02:00
$list [ $assoc [ 'rate' ]][ 'localtax1_list' ][] = $assoc [ 'total_localtax1' ];
$list [ $assoc [ 'rate' ]][ 'localtax2_list' ][] = $assoc [ 'total_localtax2' ];
2011-03-09 11:09:07 +01:00
$list [ $assoc [ 'rate' ]][ 'pid' ][] = $assoc [ 'pid' ];
$list [ $assoc [ 'rate' ]][ 'pref' ][] = $assoc [ 'pref' ];
$list [ $assoc [ 'rate' ]][ 'ptype' ][] = $assoc [ 'ptype' ];
$list [ $assoc [ 'rate' ]][ 'payment_id' ][] = $assoc [ 'payment_id' ];
$list [ $assoc [ 'rate' ]][ 'payment_amount' ][] = $assoc [ 'payment_amount' ];
$rate = $assoc [ 'rate' ];
}
}
else
{
dol_print_error ( $db );
return - 3 ;
}
2008-10-26 02:26:18 +01:00
}
2011-03-09 11:09:07 +01:00
return $list ;
2008-10-26 02:26:18 +01:00
}
2008-02-18 05:23:08 +01:00
?>