* Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005 Marc Barilley / Ocebo * 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. * * $Id$ * $Source$ */ /** \file htdocs/compta/paiement.php \ingroup compta \brief Page de création d'un paiement \version $Revision$ */ include_once('./pre.inc.php'); require_once(DOL_DOCUMENT_ROOT.'/paiement.class.php'); include_once(DOL_DOCUMENT_ROOT.'/facture.class.php'); include_once(DOL_DOCUMENT_ROOT.'/compta/bank/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; /* * Action add_paiement et confirm_paiement */ if ($_POST['action'] == 'add_paiement' || $_POST['action'] == 'confirm_paiement') { $error = 0; $datepaye = dolibarr_mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); $paiement_id = 0; // Verifie si des paiements sont supérieurs au montant facture foreach ($_POST as $key => $value) { if (substr($key,0,7) == 'amount_') { $cursorfacid = substr($key,7); $amounts[$cursorfacid] = $_POST[$key]; $totalpaiement = $totalpaiement + price2num($amounts[$cursorfacid]); $tmpfacture=new Facture($db); $tmpfacture->fetch($cursorfacid); $amountsresttopay[$cursorfacid]=($tmpfacture->total_ttc-$tmpfacture->getSommePaiement()); if ($amounts[$cursorfacid] && $amounts[$cursorfacid] > $amountsresttopay[$cursorfacid]) { $addwarning=1; $formquestion['text'] = img_warning($langs->trans("PaymentHigherThanReminderToPay")).' Attention, le montant de paiement pour une ou plusieurs facture est supérieur au reste à payer.'; $formquestion['text'].='
Corriger votre saisie, sinon, confirmer et penser à créer un avoir du trop perçu lors de la fermeture de chacune des factures surpayées.'; } $formquestion[$i++]=array('type' => 'hidden','name' => $key, 'value' => $_POST[$key]); } } // Effectue les vérifications des parametres 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('Amount')).'
'; $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') { 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']; $paiement_id = $paiement->create($user); if ($paiement_id > 0) { if ($conf->banque->enabled) { // Insertion dans llx_bank $label = "(CustomerInvoicePayment)"; $acc = new Account($db, $_POST['accountid']); //paiementid contient "CHQ ou VIR par exemple" $bank_line_id = $acc->addline($paiement->datepaye, $paiement->paiementid, $label, $totalpaiement, $paiement->num_paiement, '', $user, $_POST['chqemetteur'], $_POST['chqbank']); // Mise a jour fk_bank dans llx_paiement. // On connait ainsi le paiement qui a généré l'écriture bancaire if ($bank_line_id > 0) { $paiement->update_fk_bank($bank_line_id); // Mise a jour liens (pour chaque facture concernées par le paiement) foreach ($paiement->amounts as $key => $value) { $facid = $key; $fac = new Facture($db); $fac->fetch($facid); $fac->fetch_client(); $acc->add_url_line($bank_line_id, $paiement_id, DOL_URL_ROOT.'/compta/paiement/fiche.php?id=', '(paiement)', 'payment'); $acc->add_url_line($bank_line_id, $fac->client->id, DOL_URL_ROOT.'/compta/fiche.php?socid=', $fac->client->nom, 'company'); } } else { $error++; } } } else { $error++; } if ($error == 0) { $loc = DOL_URL_ROOT.'/compta/paiement/fiche.php?id='.$paiement_id; $db->commit(); Header('Location: '.$loc); exit; } else { $db->rollback(); } } } // Sécurité accés client if ($user->societe_id > 0) { $action = ''; $socid = $user->societe_id; } /* * Affichage */ 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_client(); $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; } // Initialise donnees pour page de 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 '\n"; 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 ''; /* * Liste factures impayées */ $sql = 'SELECT f.rowid as facid, f.facnumber, f.total_ttc, f.type, '; $sql.= $db->pdate('f.datef').' as df, '; $sql.= ' sum(pf.amount) as am'; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture as f'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON pf.fk_facture = f.rowid'; $sql.= ' WHERE f.fk_soc = '.$facture->socid; $sql.= ' AND f.paye = 0'; $sql.= ' AND f.fk_statut = 1'; // Statut=0 => non validée, Statut=2 => annulée if ($facture->type != 2) { $sql .= ' AND type in (0,1)'; // Facture standard ou de remplacement } else { $sql .= ' AND type = 2'; } $sql .= ' GROUP BY f.facnumber'; $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); if ($num > 0) { $i = 0; print '\n"; } $db->free($resql); } else { dolibarr_print_error($db); } // Bouton Enregistrer if ($_POST["action"] != 'add_paiement') { print ''; } print '
'.$langs->trans('Company').''.$facture->client->getNomUrl(4)."
'.$langs->trans('Date').''; if (!empty($_POST['remonth']) && !empty($_POST['reday']) && !empty($_POST['reyear'])) $sel_date=mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']); else $sel_date=''; $html->select_date($sel_date,'','','','',"add_paiement"); 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 ' (Numéro chèque ou virement)'; // \todo a traduire print '
'.$langs->trans('CheckTransmitter'); print ' (Emetteur du chèque)'; // \todo a traduire print '
'.$langs->trans('Bank'); print ' (Banque du chèque)'; // \todo a traduire print '
'; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print "\n"; $var=True; $total=0; $totalrecu=0; while ($i < $num) { $objp = $db->fetch_object($resql); $var=!$var; print ''; print '\n"; // Date print '\n"; // Prix print ''; // Recu print ''; // Reste a payer print ''; // Montant print '"; // Warning print ''; print "\n"; $total+=$objp->total; $total_ttc+=$objp->total_ttc; $totalrecu+=$objp->am; $i++; } if ($i > 1) { // Print total 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').' 
'; $facturestatic->ref=$objp->facnumber; $facturestatic->id=$objp->facid; $facturestatic->type=$objp->type; print $facturestatic->getNomUrl(1,''); print "'.dolibarr_print_date($objp->df)."'.price($objp->total_ttc).''.price($objp->am).''.price($objp->total_ttc - $objp->am).''; $namef = 'amount_'.$objp->facid; 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).''.price($total_ttc - $totalrecu).' 
'; // Message d'erreur if ($fiche_erreur_message) { print ''.$fiche_erreur_message.''; } // Formulaire confirmation if ($_POST["action"] == 'add_paiement') { // print ''; 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); // print ''; } print "
\n"; } } /** * \brief Affichage de la liste des paiement */ 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 '.$db->pdate('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); print_liste_field_titre($langs->trans('Date'),'paiement.php','dp','','','',$sortfield); print_liste_field_titre($langs->trans('Type'),'paiement.php','libelle','','','',$sortfield); print_liste_field_titre($langs->trans('Amount'),'paiement.php','fa_amount','','','align="right"',$sortfield); 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."'.dolibarr_print_date($objp->dp)."'.$objp->paiement_type.' '.$objp->num_paiement."'.price($objp->amount).' 
'; } } $db->close(); llxFooter('$Date$ - $Revision$'); ?>