* Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005 Marc Barilley / Ocebo * Copyright (C) 2005-2010 Regis Houssin * Copyright (C) 2007 Franky Van Liedekerke * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * \file htdocs/compta/paiement.php * \ingroup compta * \brief Page to create a payment * \version $Id$ */ 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'); $facid=isset($_GET['facid'])?$_GET['facid']:$_POST['facid']; $socname=isset($_GET['socname'])?$_GET['socname']:$_POST['socname']; $sortfield = isset($_GET['sortfield'])?$_GET['sortfield']:$_POST['sortfield']; $sortorder = isset($_GET['sortorder'])?$_GET['sortorder']:$_POST['sortorder']; $page=isset($_GET['page'])?$_GET['page']:$_POST['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 ($_POST['action'] == 'add_paiement' || ($_POST['action'] == 'confirm_paiement' && $_POST['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 ($_POST['paiementid'] <= 0) { $fiche_erreur_message = '
'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('PaymentMode')).'
'; $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 = '
'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('AccountToCredit')).'
'; $error++; } } if ($totalpaiement == 0) { $fiche_erreur_message = '
'.$langs->transnoentities('ErrorFieldRequired',$langs->trans('PaymentAmount')).'
'; $error++; } if (empty($datepaye)) { $fiche_erreur_message = '
'.$langs->trans('ErrorFieldRequired',$langs->transnoentities('Date')).'
'; $error++; } } /* * Action add_paiement */ if ($_POST['action'] == 'add_paiement') { if ($error) { $_POST['action']=''; $_GET['action'] = 'create'; } // Le reste propre a cette action s'affiche en bas de page. } /* * Action confirm_paiement */ if ($_POST['action'] == 'confirm_paiement' && $_POST['confirm'] == 'yes') { $error=0; $datepaye = dol_mktime(12, 0, 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); if (! $error) { $db->begin(); // Creation de la ligne paiement $paiement = new Paiement($db); $paiement->datepaye = $datepaye; $paiement->amounts = $amounts; // Tableau de montant $paiement->paiementid = $_POST['paiementid']; $paiement->num_paiement = $_POST['num_paiement']; $paiement->note = $_POST['comment']; if (! $error) { $paiement_id = $paiement->create($user); 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(); $loc = DOL_URL_ROOT.'/compta/paiement/fiche.php?id='.$paiement_id; Header('Location: '.$loc); exit; } else { $db->rollback(); } } } /* * View */ llxHeader(); $html=new Form($db); $facturestatic=new Facture($db); if ($_GET['action'] == 'create' || $_POST['action'] == 'confirm_paiement' || $_POST['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); // 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 ($_POST["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); } print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print '\n"; // Date payment print ''; print ''; print '\n"; print ''; print ''; if ($conf->banque->enabled) { if ($facture->type != 2) print ''; if ($facture->type == 2) print ''; print ''; } else { print ''; } print "\n"; print ''; print ''; print ''; print ''; print ''; print ''; print '
'.$langs->trans('Company').''.$facture->client->getNomUrl(4)."
'.$langs->trans('Date').''; $datepayment = dol_mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); $datepayment= ($datepayment == '' ? (empty($conf->global->MAIN_AUTOFILL_DATE)?-1:0) : $datepayment); $html->select_date($datepayment,'','','',0,"add_paiement",1,1); print ''.$langs->trans('Comments').'
'.$langs->trans('PaymentMode').''; $html->select_types_paiements(empty($_POST['paiementid'])?'':$_POST['paiementid'],'paiementid'); print "'; print '
'.$langs->trans('AccountToCredit').''.$langs->trans('AccountToDebit').''; $html->select_comptes(empty($_POST['accountid'])?'':$_POST['accountid'],'accountid',0,'',1); print ' 
'.$langs->trans('Numero'); print ' ('.$langs->trans("ChequeOrTransferNumber").')'; print '
'.$langs->trans('CheckTransmitter'); print ' ('.$langs->trans("ChequeMaker").')'; print '
'.$langs->trans('Bank'); print ' ('.$langs->trans("ChequeBank").')'; print '
'; /* * 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 ''; print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print "\n"; $var=True; $total=0; $totalrecu=0; $totalrecucreditnote=0; $totalrecudeposits=0; while ($i < $num) { $objp = $db->fetch_object($resql); $var=!$var; $facturestatic->ref=$objp->facnumber; $facturestatic->id=$objp->facid; $facturestatic->type=$objp->type; $creditnotes=$facturestatic->getSumCreditNotesUsed(); $deposits=$facturestatic->getSumDepositsUsed(); print ''; print '\n"; // Date print '\n"; // Prix print ''; // Recu $paiement = $facturestatic->getSommePaiement(); print ''; // Remain to pay print ''; // Amount print '"; // Warning print ''; print "\n"; $total+=$objp->total; $total_ttc+=$objp->total_ttc; $totalrecu+=$paiement; $totalrecucreditnote+=$creditnotes; $totalrecudeposits+=$deposits; $i++; } if ($i > 1) { // Print total print ''; print ''; print ''; print ''; print ''; print ''; print ''; print "\n"; } print "
'.$langs->trans('Invoice').''.$langs->trans('Date').''.$langs->trans('AmountTTC').''.$langs->trans('Received').''.$langs->trans('RemainderToPay').''.$langs->trans('PaymentAmount').' 
'; print $facturestatic->getNomUrl(1,''); print "'.dol_print_date($db->jdate($objp->df),'day')."'.price($objp->total_ttc).''.price($paiement); if ($creditnotes) print '+'.price($creditnotes); if ($deposits) print '+'.price($deposits); print ''.price(price2num($objp->total_ttc - $paiement - $creditnotes - $deposits,'MT')).''; $namef = 'amount_'.$objp->facid; if ($_POST["action"] != 'add_paiement') { print ''; } else { print ''; print ''; } print "'; if ($amounts[$facturestatic->id] && $amounts[$facturestatic->id] > $amountsresttopay[$facturestatic->id]) { print ' '.img_warning($langs->trans("PaymentHigherThanReminderToPay")); } print '
'.$langs->trans('TotalTTC').''.price($total_ttc).''.price($totalrecu); if ($totalrecucreditnote) print '+'.price($totalrecucreditnote); if ($totalrecudeposits) print '+'.price($totalrecudeposits); print ''.price(price2num($total_ttc - $totalrecu - $totalrecucreditnote - $totalrecudeposits,'MT')).'  
"; //print "\n"; } $db->free($resql); } else { dol_print_error($db); } // Bouton Enregistrer if ($_POST["action"] != 'add_paiement') { // print ''; print '
'; // print ''; } // Message d'erreur if ($fiche_erreur_message) { print $fiche_erreur_message; } // Form to confirm payment if ($_POST["action"] == 'add_paiement') { $preselectedchoice=$addwarning?'no':'yes'; print '
'; $text=$langs->trans('ConfirmCustomerPayment',$totalpaiement,$langs->trans("Currency".$conf->monnaie)); $html->form_confirm($_SERVER['PHP_SELF'].'?facid='.$facture->id.'&socid='.$facture->socid.'&type='.$facture->type,$langs->trans('ReceivedCustomersPayments'),$text,'confirm_paiement',$formquestion,$preselectedchoice); } print "
\n"; } } /** * \brief Affichage de la liste des paiements */ if (! $_GET['action'] && ! $_POST['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'; 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 ''; print ''; 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 ''; print "\n"; while ($i < min($num,$limit)) { $objp = $db->fetch_object($resql); $var=!$var; print ''; print '\n"; print '\n"; print '\n"; print ''; print ''; $i++; } print '
 
'.$objp->facnumber."'.dol_print_date($db->jdate($objp->dp))."'.$objp->paiement_type.' '.$objp->num_paiement."'.price($objp->amount).' 
'; } } $db->close(); llxFooter('$Date$ - $Revision$'); ?>