Skip to content
Snippets Groups Projects
Select Git revision
  • d87f14b7ce4c9962efe8449ea9852ca80c63a31b
  • 3.9 default
  • develop
  • 6.0
  • 5.0
  • 4.0
  • scrutinizer-patch-4
  • scrutinizer-patch-3
  • scrutinizer-patch-2
  • scrutinizer-patch-1
  • 3.7
  • 3.8
  • 3.6
  • 3.9_backported
  • 3.8_backported
  • 3.7_backported
  • 3.5
  • 3.6_backported
  • 3.5_backported
  • 3.4
  • 3.3_backported
  • 6.0.4
  • 6.0.3
  • 5.0.7
  • 6.0.2
  • 6.0.1
  • 5.0.6
  • 6.0.0
  • 5.0.5
  • 6.0.0-rc
  • 5.0.4
  • 6.0.0-beta
  • 5.0.3
  • 4.0.6
  • 5.0.2
  • 5.0.1
  • 4.0.5
  • 5.0.0
  • 4.0.4
  • 5.0.0-rc2
  • 5.0.0-rc1
41 results

paiement.php

Blame
  • paiement.php 24.51 KiB
    <?php
    /* Copyright (C) 2001-2006 Rodolphe Quiedeville  <rodolphe@quiedeville.org>
     * Copyright (C) 2004-2012 Laurent Destailleur   <eldy@users.sourceforge.net>
     * Copyright (C) 2005      Marc Barilley / Ocebo <marc@ocebo.com>
     * Copyright (C) 2005-2012 Regis Houssin         <regis@dolibarr.fr>
     * Copyright (C) 2007      Franky Van Liedekerke <franky.van.liedekerke@telenet.be>
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation; either version 2 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program. If not, see <http://www.gnu.org/licenses/>.
     */
    
    /**
     *	\file       htdocs/compta/paiement.php
     *	\ingroup    compta
     *	\brief      Page to create a payment
     */
    
    require('../main.inc.php');
    require_once(DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php');
    require_once(DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php');
    require_once(DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php');
    
    $langs->load('companies');
    $langs->load('bills');
    $langs->load('banks');
    
    $action		= GETPOST('action');
    $confirm	= GETPOST('confirm');
    
    $facid		= GETPOST('facid','int');
    $socname	= GETPOST('socname');
    $accountid	= GETPOST('accountid');
    $paymentnum	= GETPOST('num_paiement');
    
    $sortfield	= GETPOST('sortfield');
    $sortorder	= GETPOST('sortorder');
    $page		= GETPOST('page');
    
    $amounts=array();
    $amountsresttopay=array();
    $addwarning=0;
    
    // Security check
    $socid=0;
    if ($user->societe_id > 0)
    {
        $socid = $user->societe_id;
    }
    
    
    
    /*
     * Action add_paiement et confirm_paiement
     */
    if ($action == 'add_paiement' || ($action == 'confirm_paiement' && $confirm=='yes'))
    {
        $error = 0;
    
        $datepaye = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
        $paiement_id = 0;
    
        // Verifie si des paiements sont superieurs au montant facture
        foreach ($_POST as $key => $value)
        {
            if (substr($key,0,7) == 'amount_')
            {
                $cursorfacid = substr($key,7);
                $amounts[$cursorfacid] = price2num($_POST[$key]);
                $totalpaiement = $totalpaiement + $amounts[$cursorfacid];
                $tmpfacture=new Facture($db);
                $tmpfacture->fetch($cursorfacid);
                $amountsresttopay[$cursorfacid]=price2num($tmpfacture->total_ttc-$tmpfacture->getSommePaiement());
                if ($amounts[$cursorfacid] && $amounts[$cursorfacid] > $amountsresttopay[$cursorfacid])
                {
                    $addwarning=1;
                    $formquestion['text'] = img_warning($langs->trans("PaymentHigherThanReminderToPay")).' '.$langs->trans("HelpPaymentHigherThanReminderToPay");
                }
    
                $formquestion[$i++]=array('type' => 'hidden','name' => $key,  'value' => $_POST[$key]);
            }
        }
    
        // Check parameters
        if (! GETPOST('paiementcode'))
        {
            $fiche_erreur_message = '<div class="error">'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('PaymentMode')).'</div>';
            $error++;
        }
    
        if ($conf->banque->enabled)
        {
            // Si module bank actif, un compte est obligatoire lors de la saisie
            // d'un paiement
            if (! $_POST['accountid'])
            {
                $fiche_erreur_message = '<div class="error">'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('AccountToCredit')).'</div>';
                $error++;
            }
        }
    
        if ($totalpaiement == 0)
        {
            $fiche_erreur_message = '<div class="error">'.$langs->transnoentities('ErrorFieldRequired',$langs->trans('PaymentAmount')).'</div>';
            $error++;
        }
    
        if (empty($datepaye))
        {
            $fiche_erreur_message = '<div class="error">'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('Date')).'</div>';
            $error++;
        }
    }
    
    /*
     * Action add_paiement
     */
    if ($action == 'add_paiement')
    {
        if ($error)
        {
            $action = 'create';
        }
        // Le reste propre a cette action s'affiche en bas de page.
    }
    
    /*
     * Action confirm_paiement
     */
    if ($action == 'confirm_paiement' && $confirm == 'yes')
    {
        $error=0;
    
        $datepaye = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
    
        $db->begin();
    
        // Creation of payment line
        $paiement = new Paiement($db);
        $paiement->datepaye     = $datepaye;
        $paiement->amounts      = $amounts;   // Array with all payments dispatching
        $paiement->paiementid   = dol_getIdFromCode($db,$_POST['paiementcode'],'c_paiement');
        $paiement->num_paiement = $_POST['num_paiement'];
        $paiement->note         = $_POST['comment'];
    
        if (! $error)
        {
            $paiement_id = $paiement->create($user,(GETPOST('closepaidinvoices')=='on'?1:0));
            if ($paiement_id < 0)
            {
                $errmsg=$paiement->error;
                $error++;
            }
        }
    
        if (! $error)
        {
            $result=$paiement->addPaymentToBank($user,'payment','(CustomerInvoicePayment)',$_POST['accountid'],$_POST['chqemetteur'],$_POST['chqbank']);
            if ($result < 0)
            {
                $errmsg=$paiement->error;
                $error++;
            }
        }
    
        if (! $error)
        {
            $db->commit();
    
            // If payment dispatching on more than one invoice, we keep on summary page, otherwise go on invoice card
            $invoiceid=0;
            foreach ($paiement->amounts as $key => $amount)
            {
                $facid = $key;
                if (is_numeric($amount) && $amount <> 0)
                {
                    if ($invoiceid != 0) $invoiceid=-1; // There is more than one invoice payed by this payment
                    else $invoiceid=$facid;
                }
            }
            if ($invoiceid > 0) $loc = DOL_URL_ROOT.'/compta/facture.php?facid='.$invoiceid;
            else $loc = DOL_URL_ROOT.'/compta/paiement/fiche.php?id='.$paiement_id;
            Header('Location: '.$loc);
            exit;
        }
        else
        {
            $db->rollback();
        }
    }
    
    
    /*
     * View
     */
    
    llxHeader();
    
    $form=new Form($db);
    
    
    if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paiement')
    {
    	$facture = new Facture($db);
    	$result=$facture->fetch($facid);
    
    	if ($result >= 0)
    	{
    		$facture->fetch_thirdparty();
    
    		$title='';
    		if ($facture->type != 2) $title.=$langs->trans("EnterPaymentReceivedFromCustomer");
    		if ($facture->type == 2) $title.=$langs->trans("EnterPaymentDueToCustomer");
    		print_fiche_titre($title);
    
    		dol_htmloutput_errors($errmsg);
    
    		// Bouchon
    		if ($facture->type == 2)
    		{
    			print $langs->trans("FeatureNotYetAvailable");
    			llxFooter();
    			exit;
    		}
    
    		// Initialize data for confirmation (this is used because data can be change during confirmation)
    		if ($action == 'add_paiement')
    		{
    			$i=0;
    
    			$formquestion[$i++]=array('type' => 'hidden','name' => 'facid', 'value' => $facture->id);
    			$formquestion[$i++]=array('type' => 'hidden','name' => 'socid', 'value' => $facture->socid);
    			$formquestion[$i++]=array('type' => 'hidden','name' => 'type',  'value' => $facture->type);
    		}
    
    		// Invoice with Paypal transaction
    		// TODO add hook possibility (regis)
    		if ($conf->paypalplus->enabled && $conf->global->PAYPAL_ENABLE_TRANSACTION_MANAGEMENT && ! empty($facture->ref_int))
    		{
    			if (! empty($conf->global->PAYPAL_BANK_ACCOUNT)) $accountid=$conf->global->PAYPAL_BANK_ACCOUNT;
    			$paymentnum=$facture->ref_int;
    		}
    		if ($conf->use_javascript_ajax)
    		{
    			print "\n".'<script type="text/javascript" language="javascript">';
    			print '$(document).ready(function () {
                			setPaiementCode();
    
                			$("#selectpaiementcode").change(function() {
                				setPaiementCode();
                			});
    
                			function setPaiementCode()
                			{
                				var code = $("#selectpaiementcode option:selected").val();
    
                				if (code == \'CHQ\')
                				{
                					$(\'.fieldrequireddyn\').addClass(\'fieldrequired\');
                					if ($(\'#fieldchqemetteur\').val() == \'\')
                					{
                						$(\'#fieldchqemetteur\').val(jQuery(\'#thirdpartylabel\').val());
                					}
                				}
                				else
                				{
                					$(\'.fieldrequireddyn\').removeClass(\'fieldrequired\');
                					$(\'#fieldchqemetteur\').val(\'\');
                				}
                			}';
    			// For paiement auto-completion
    			if (! empty($conf->global->MAIN_JS_ON_PAYMENT))
    			{
    				print "\n".'
    						function elemToJson(selector)
    						{
    							var subJson = {};
    							$.map(selector.serializeArray(), function(n,i)
    							{
    								subJson[n["name"]] = n["value"];
    							});
    							return subJson;
    						}
    						function callForResult(imgId)
    						{
    							var json = {};
    							var form = $("#payment_form");
    
    							json["amountPayment"] = $("#amountpayment").attr("value");
    							json["amounts"] = elemToJson(form.find("input[name*=\"amount_\"]"));
    							json["remains"] = elemToJson(form.find("input[name*=\"remain_\"]"));
    
    							if (imgId != null) {
    								json["imgClicked"] = imgId;
    							}
    
    							$.post("ajaxpayment.php", json, function(data)
    							{
    								json = $.parseJSON(data);
    
    								form.data(json);
    
    								for (var key in json)
    								{
    									if (key == "result")	{
    										if (json["makeRed"]) {
    											$("#"+key).css("color", "red");
    										} else {
    											$("#"+key).removeAttr("style");
    										}
    										json[key]=json["label"]+" "+json[key];
    										$("#"+key).text(json[key]);
    									} else {
    										form.find("input[name*=\""+key+"\"]").each(function() {
    											$(this).attr("value", json[key]);
    										});
    									}
    								}
    							});
    						}
    						function callToBreakdown(imgSelector) {
    							var form = $("#payment_form"), imgId;
    
    							imgId =  imgSelector.attr("id");
    							callForResult(imgId);
    						}
    
    						$("#payment_form").find("img").click(function() {
    							callToBreakdown(jQuery(this));
    						});
    
    						$("#payment_form").find("input[name*=\"amount_\"]").change(function() {
    							callForResult();
    						});
    
    						$("#amountpayment").change(function() {
    							callForResult();
    						});';
    			}
    			print '});
    			</script>'."\n";
    		}
    
    		print '<form id="payment_form" name="add_paiement" action="'.$_SERVER["PHP_SELF"].'" method="POST">';
    		print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
    		print '<input type="hidden" name="action" value="add_paiement">';
    		print '<input type="hidden" name="facid" value="'.$facture->id.'">';
    		print '<input type="hidden" name="socid" value="'.$facture->socid.'">';
    		print '<input type="hidden" name="type" value="'.$facture->type.'">';
    		print '<input type="hidden" name="thirdpartylabel" id="thirdpartylabel" value="'.dol_escape_htmltag($facture->client->name).'">';
    
    		print '<table class="border" width="100%">';
    
            // Third party
            print '<tr><td><span class="fieldrequired">'.$langs->trans('Company').'</span></td><td colspan="2">'.$facture->client->getNomUrl(4)."</td></tr>\n";
    
            // Date payment
            print '<tr><td><span class="fieldrequired">'.$langs->trans('Date').'</span></td><td>';
            $datepayment = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
            $datepayment= ($datepayment == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE)?-1:0) : $datepayment);
            $form->select_date($datepayment,'','','',0,"add_paiement",1,1);
            print '</td>';
            print '<td>'.$langs->trans('Comments').'</td></tr>';
    
            $rowspan=5;
            if ($conf->use_javascript_ajax && !empty($conf->global->MAIN_JS_ON_PAYMENT)) $rowspan++;
    
            // Payment mode
            print '<tr><td><span class="fieldrequired">'.$langs->trans('PaymentMode').'</span></td><td>';
            $form->select_types_paiements((GETPOST('paiementcode')?GETPOST('paiementcode'):$facture->mode_reglement_code),'paiementcode','',2);
            print "</td>\n";
            print '<td rowspan="'.$rowspan.'" valign="top">';
            print '<textarea name="comment" wrap="soft" cols="60" rows="'.ROWS_4.'">'.(empty($_POST['comment'])?'':$_POST['comment']).'</textarea></td>';
            print '</tr>';
    
            // Bank account
            print '<tr>';
            if ($conf->banque->enabled)
            {
                if ($facture->type != 2) print '<td><span class="fieldrequired">'.$langs->trans('AccountToCredit').'</span></td>';
                if ($facture->type == 2) print '<td><span class="fieldrequired">'.$langs->trans('AccountToDebit').'</span></td>';
                print '<td>';
                $form->select_comptes($accountid,'accountid',0,'',2);
                print '</td>';
            }
            else
            {
                print '<td colspan="2">&nbsp;</td>';
            }
            print "</tr>\n";
    
            // Payment amount
            if ($conf->use_javascript_ajax && !empty($conf->global->MAIN_JS_ON_PAYMENT))
            {
                print '<tr><td><span class="fieldrequired">'.$langs->trans('AmountPayment').'</span></td>';
                print '<td>';
                if ($action == 'add_paiement')
                {
                    print '<input id="amountpayment" name="amountpaymenthidden" size="8" type="text" value="'.(empty($_POST['amountpayment'])?'':$_POST['amountpayment']).'" disabled="disabled">';
                    print '<input name="amountpayment" type="hidden" value="'.(empty($_POST['amountpayment'])?'':$_POST['amountpayment']).'">';
                }
                else
                {
                    print '<input id="amountpayment" name="amountpayment" size="8" type="text" value="'.(empty($_POST['amountpayment'])?'':$_POST['amountpayment']).'">';
                }
                print '</td>';
                print '</tr>';
            }
    
            // Cheque number
            print '<tr><td>'.$langs->trans('Numero');
            print ' <em>('.$langs->trans("ChequeOrTransferNumber").')</em>';
            print '</td>';
            print '<td><input name="num_paiement" type="text" value="'.$paymentnum.'"></td></tr>';
    
            // Check transmitter
            print '<tr><td class="'.(GETPOST('paiementcode')=='CHQ'?'fieldrequired ':'').'fieldrequireddyn">'.$langs->trans('CheckTransmitter');
            print ' <em>('.$langs->trans("ChequeMaker").')</em>';
            print '</td>';
            print '<td><input id="fieldchqemetteur" name="chqemetteur" size="30" type="text" value="'.GETPOST('chqemetteur').'"></td></tr>';
    
            // Bank name
            print '<tr><td>'.$langs->trans('Bank');
            print ' <em>('.$langs->trans("ChequeBank").')</em>';
            print '</td>';
            print '<td><input name="chqbank" size="30" type="text" value="'.GETPOST('chqbank').'"></td></tr>';
    
            print '</table>';
    
            /*
             * List of unpaid invoices
             */
            $sql = 'SELECT f.rowid as facid, f.facnumber, f.total_ttc, f.type, ';
            $sql.= ' f.datef as df';
            $sql.= ' FROM '.MAIN_DB_PREFIX.'facture as f';
            $sql.= ' WHERE f.fk_soc = '.$facture->socid;
            $sql.= ' AND f.paye = 0';
            $sql.= ' AND f.fk_statut = 1'; // Statut=0 => not validated, Statut=2 => canceled
            if ($facture->type != 2)
            {
                $sql .= ' AND type in (0,1,3)';	// Standard invoice, replacement, deposit
            }
            else
            {
                $sql .= ' AND type = 2';		// If paying back a credit note, we show all credit notes
            }
    
            $resql = $db->query($sql);
            if ($resql)
            {
                $num = $db->num_rows($resql);
                if ($num > 0)
                {
    
                    $i = 0;
                    //print '<tr><td colspan="3">';
                    print '<br>';
                    print '<table class="noborder" width="100%">';
                    print '<tr class="liste_titre">';
                    print '<td>'.$langs->trans('Invoice').'</td>';
                    print '<td align="center">'.$langs->trans('Date').'</td>';
                    print '<td align="right">'.$langs->trans('AmountTTC').'</td>';
                    print '<td align="right">'.$langs->trans('Received').'</td>';
                    print '<td align="right">'.$langs->trans('RemainderToPay').'</td>';
                    print '<td align="right">'.$langs->trans('PaymentAmount').'</td>';
                    print '<td align="right">&nbsp;</td>';
                    print "</tr>\n";
    
                    $var=True;
                    $total=0;
                    $totalrecu=0;
                    $totalrecucreditnote=0;
                    $totalrecudeposits=0;
    
                    while ($i < $num)
                    {
                        $objp = $db->fetch_object($resql);
                        $var=!$var;
    
                        $invoice=new Facture($db);
                        $invoice->fetch($objp->facid);
                        $paiement = $invoice->getSommePaiement();
                        $creditnotes=$invoice->getSumCreditNotesUsed();
                        $deposits=$invoice->getSumDepositsUsed();
                        $alreadypayed=price2num($paiement + $creditnotes + $deposits,'MT');
                        $remaintopay=price2num($invoice->total_ttc - $paiement - $creditnotes - $deposits,'MT');
    
                        print '<tr '.$bc[$var].'>';
    
                        print '<td>';
                        print $invoice->getNomUrl(1,'');
                        print "</td>\n";
    
                        // Date
                        print '<td align="center">'.dol_print_date($db->jdate($objp->df),'day')."</td>\n";
    
                        // Prix
                        print '<td align="right">'.price($objp->total_ttc).'</td>';
    
                        // Recu
                        print '<td align="right">'.price($paiement);
                        if ($creditnotes) print '+'.price($creditnotes);
                        if ($deposits) print '+'.price($deposits);
                        print '</td>';
    
                        // Remain to pay
                        print '<td align="right">'.price($remaintopay).'</td>';
                        $test= price(price2num($objp->total_ttc - $paiement - $creditnotes - $deposits));
    
                        // Amount
                        print '<td align="right">';
    
                        // Add remind amount
                        $namef = 'amount_'.$objp->facid;
                        $nameRemain = 'remain_'.$objp->facid;
    
                        if ($action != 'add_paiement')
                        {
                            if ($conf->use_javascript_ajax && !empty($conf->global->MAIN_JS_ON_PAYMENT))
                            {
                                print img_picto($langs->trans('AddRemind'),'rightarrow.png','id="'.$objp->facid.'" "');
                            }
                            print '<input type=hidden name="'.$nameRemain.'" value="'.$remaintopay.'">';
                            print '<input type="text" size="8" name="'.$namef.'" value="'.$_POST[$namef].'">';
                        }
                        else
                        {
                            print '<input type="text" size="8" name="'.$namef.'_disabled" value="'.$_POST[$namef].'" disabled="disabled">';
                            print '<input type="hidden" name="'.$namef.'" value="'.$_POST[$namef].'">';
                        }
                        print "</td>";
    
                        // Warning
                        print '<td align="center" width="16">';
                        if ($amounts[$invoice->id] && $amounts[$invoice->id] > $amountsresttopay[$invoice->id])
                        {
                            print ' '.img_warning($langs->trans("PaymentHigherThanReminderToPay"));
                        }
                        print '</td>';
    
    
                        print "</tr>\n";
    
                        $total+=$objp->total;
                        $total_ttc+=$objp->total_ttc;
                        $totalrecu+=$paiement;
                        $totalrecucreditnote+=$creditnotes;
                        $totalrecudeposits+=$deposits;
                        $i++;
                    }
                    if ($i > 1)
                    {
                        // Print total
                        print '<tr class="liste_total">';
                        print '<td colspan="2" align="left">'.$langs->trans('TotalTTC').'</td>';
                        print '<td align="right"><b>'.price($total_ttc).'</b></td>';
                        print '<td align="right"><b>'.price($totalrecu);
                        if ($totalrecucreditnote) print '+'.price($totalrecucreditnote);
                        if ($totalrecudeposits) print '+'.price($totalrecudeposits);
                        print '</b></td>';
                        print '<td align="right"><b>'.price(price2num($total_ttc - $totalrecu - $totalrecucreditnote - $totalrecudeposits,'MT')).'</b></td>';
                        print '<td align="right" id="result" style="font-weight:bold;"></td>';
                        print '<td align="center">&nbsp;</td>';
                        print "</tr>\n";
                    }
                    print "</table>";
                    //print "</td></tr>\n";
                }
                $db->free($resql);
            }
            else
            {
                dol_print_error($db);
            }
    
    
            // Bouton Enregistrer
            if ($action != 'add_paiement')
            {
                //			print '<tr><td colspan="3" align="center">';
                print '<center><br><input type="checkbox" checked="checked" name="closepaidinvoices"> '.$langs->trans("ClosePaidInvoicesAutomatically");
                /*if ($conf->prelevement->enabled)
                {
                    $langs->load("withdrawals");
                    if ($conf->global->WITHDRAW_DISABLE_AUTOCREATE_ONPAYMENTS) print '<br>'.$langs->trans("IfInvoiceNeedOnWithdrawPaymentWontBeClosed");
                }*/
                print '<br><input type="submit" class="button" value="'.$langs->trans('Save').'"><br><br></center>';
                //			print '</td></tr>';
            }
    
    
    
            // Message d'erreur
            if ($fiche_erreur_message)
            {
                print $fiche_erreur_message;
            }
    
            // Form to confirm payment
            if ($action == 'add_paiement')
            {
                $preselectedchoice=$addwarning?'no':'yes';
    
                print '<br>';
                $text=$langs->trans('ConfirmCustomerPayment',$totalpaiement,$langs->trans("Currency".$conf->currency));
                if (GETPOST('closepaidinvoices'))
                {
                    $text.='<br>'.$langs->trans("AllCompletelyPayedInvoiceWillBeClosed");
                    print '<input type="hidden" name="closepaidinvoices" value="'.GETPOST('closepaidinvoices').'">';
                }
                $form->form_confirm($_SERVER['PHP_SELF'].'?facid='.$facture->id.'&socid='.$facture->socid.'&type='.$facture->type,$langs->trans('ReceivedCustomersPayments'),$text,'confirm_paiement',$formquestion,$preselectedchoice);
            }
    
            print "</form>\n";
        }
    }
    
    
    /**
     *  Show list of payments
     */
    if (! GETPOST('action'))
    {
        if ($page == -1) $page = 0 ;
        $limit = $conf->liste_limit;
        $offset = $limit * $page ;
    
        if (! $sortorder) $sortorder='DESC';
        if (! $sortfield) $sortfield='p.datep';
    
        $sql = 'SELECT p.datep as dp, p.amount, f.amount as fa_amount, f.facnumber';
        $sql.=', f.rowid as facid, c.libelle as paiement_type, p.num_paiement';
        $sql.= ' FROM '.MAIN_DB_PREFIX.'paiement as p, '.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'c_paiement as c';
        $sql.= ' WHERE p.fk_facture = f.rowid AND p.fk_paiement = c.id';
        $sql.= ' AND f.entity = '.$conf->entity;
        if ($socid)
        {
            $sql.= ' AND f.fk_soc = '.$socid;
        }
    
        $sql.= ' ORDER BY '.$sortfield.' '.$sortorder;
        $sql.= $db->plimit($limit+1, $offset);
        $resql = $db->query($sql);
    
        if ($resql)
        {
            $num = $db->num_rows($resql);
            $i = 0;
            $var=True;
    
            print_barre_liste($langs->trans('Payments'), $page, 'paiement.php','',$sortfield,$sortorder,'',$num);
            print '<table class="noborder" width="100%">';
            print '<tr class="liste_titre">';
            print_liste_field_titre($langs->trans('Invoice'),'paiement.php','facnumber','','','',$sortfield,$sortorder);
            print_liste_field_titre($langs->trans('Date'),'paiement.php','dp','','','',$sortfield,$sortorder);
            print_liste_field_titre($langs->trans('Type'),'paiement.php','libelle','','','',$sortfield,$sortorder);
            print_liste_field_titre($langs->trans('Amount'),'paiement.php','fa_amount','','','align="right"',$sortfield,$sortorder);
            print '<td>&nbsp;</td>';
            print "</tr>\n";
    
            while ($i < min($num,$limit))
            {
                $objp = $db->fetch_object($resql);
                $var=!$var;
                print '<tr '.$bc[$var].'>';
                print '<td><a href="facture.php?facid='.$objp->facid.'">'.$objp->facnumber."</a></td>\n";
                print '<td>'.dol_print_date($db->jdate($objp->dp))."</td>\n";
                print '<td>'.$objp->paiement_type.' '.$objp->num_paiement."</td>\n";
                print '<td align="right">'.price($objp->amount).'</td><td>&nbsp;</td>';
                print '</tr>';
                $i++;
            }
            print '</table>';
        }
    }
    
    $db->close();
    
    llxFooter();
    ?>