bank.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. <?php
  2. /* Copyright (C) 2002-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  3. * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
  4. * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
  5. * Copyright (C) 2005-2009 Regis Houssin <regis.houssin@inodbox.com>
  6. * Copyright (C) 2013 Peter Fontaine <contact@peterfontaine.fr>
  7. * Copyright (C) 2015-2016 Marcos García <marcosgdf@gmail.com>
  8. * Copyright (C) 2015 Alexandre Spangaro <aspangaro.dolibarr@gmail.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. */
  23. /**
  24. * \file htdocs/user/bank.php
  25. * \ingroup HRM
  26. * \brief Tab for HRM
  27. */
  28. require '../main.inc.php';
  29. require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
  30. require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
  31. require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
  32. require_once DOL_DOCUMENT_ROOT.'/user/class/userbankaccount.class.php';
  33. if (! empty($conf->holiday->enabled)) require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
  34. if (! empty($conf->expensereport->enabled)) require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
  35. if (! empty($conf->salaries->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php';
  36. // Load translation files required by page
  37. $langs->loadLangs(array('companies', 'commercial', 'banks', 'bills', 'trips', 'holiday', 'salaries'));
  38. $id = GETPOST('id','int');
  39. $bankid = GETPOST('bankid','int');
  40. $action = GETPOST("action",'alpha');
  41. $cancel = GETPOST('cancel','alpha');
  42. // Security check
  43. $socid=0;
  44. if ($user->societe_id > 0) $socid = $user->societe_id;
  45. $feature2 = (($socid && $user->rights->user->self->creer)?'':'user');
  46. // Ok if user->rights->salaries->read or user->rights->hrm->read
  47. //$result = restrictedArea($user, 'salaries|hrm', $id, 'user&user', $feature2);
  48. $ok=false;
  49. if ($user->id == $id) $ok=true; // A user can always read its own card
  50. if (! empty($user->rights->salaries->read)) $ok=true;
  51. if (! empty($user->rights->hrm->read)) $ok=true;
  52. if (! $ok)
  53. {
  54. accessforbidden();
  55. }
  56. $object = new User($db);
  57. if ($id > 0 || ! empty($ref))
  58. {
  59. $result = $object->fetch($id, $ref, '', 1);
  60. $object->getrights();
  61. }
  62. /*
  63. * Actions
  64. */
  65. if ($action == 'add' && ! $cancel)
  66. {
  67. // Modification
  68. $account = new UserBankAccount($db);
  69. $account->userid = $object->id;
  70. $account->bank = $_POST["bank"];
  71. $account->label = $_POST["label"];
  72. $account->courant = $_POST["courant"];
  73. $account->clos = $_POST["clos"];
  74. $account->code_banque = $_POST["code_banque"];
  75. $account->code_guichet = $_POST["code_guichet"];
  76. $account->number = $_POST["number"];
  77. $account->cle_rib = $_POST["cle_rib"];
  78. $account->bic = $_POST["bic"];
  79. $account->iban = $_POST["iban"];
  80. $account->domiciliation = $_POST["domiciliation"];
  81. $account->proprio = $_POST["proprio"];
  82. $account->owner_address = $_POST["owner_address"];
  83. $result = $account->create($user);
  84. if (! $result)
  85. {
  86. setEventMessages($account->error, $account->errors, 'errors');
  87. $action='edit'; // Force chargement page edition
  88. }
  89. else
  90. {
  91. $url=DOL_URL_ROOT.'/user/bank.php?id='.$object->id.'&bankid='.$bankid;
  92. header('Location: '.$url);
  93. exit;
  94. }
  95. }
  96. if ($action == 'update' && ! $cancel)
  97. {
  98. // Modification
  99. $account = new UserBankAccount($db);
  100. $account->fetch($bankid);
  101. $account->userid = $object->id;
  102. $account->bank = $_POST["bank"];
  103. $account->label = $_POST["label"];
  104. $account->courant = $_POST["courant"];
  105. $account->clos = $_POST["clos"];
  106. $account->code_banque = $_POST["code_banque"];
  107. $account->code_guichet = $_POST["code_guichet"];
  108. $account->number = $_POST["number"];
  109. $account->cle_rib = $_POST["cle_rib"];
  110. $account->bic = $_POST["bic"];
  111. $account->iban = $_POST["iban"];
  112. $account->domiciliation = $_POST["domiciliation"];
  113. $account->proprio = $_POST["proprio"];
  114. $account->owner_address = $_POST["owner_address"];
  115. $result = $account->update($user);
  116. if (! $result)
  117. {
  118. setEventMessages($account->error, $account->errors, 'errors');
  119. $action='edit'; // Force chargement page edition
  120. }
  121. else
  122. {
  123. $url=DOL_URL_ROOT.'/user/bank.php?id='.$object->id.'&bankid='.$bankid;
  124. header('Location: '.$url);
  125. exit;
  126. }
  127. }
  128. /*
  129. * View
  130. */
  131. $form = new Form($db);
  132. llxHeader(null, $langs->trans("BankAccounts"));
  133. $head = user_prepare_head($object);
  134. $account = new UserBankAccount($db);
  135. if (! $bankid)
  136. {
  137. $account->fetch(0, '', $id);
  138. }
  139. else
  140. {
  141. $account->fetch($bankid);
  142. }
  143. if (empty($account->userid)) $account->userid=$object->id;
  144. if ($id && $bankid && $action == 'edit' && $user->rights->user->user->creer)
  145. {
  146. print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="post">';
  147. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  148. print '<input type="hidden" name="action" value="update">';
  149. print '<input type="hidden" name="id" value="'.GETPOST("id",'int').'">';
  150. print '<input type="hidden" name="bankid" value="'.$bankid.'">';
  151. }
  152. if ($id && $action == 'create' && $user->rights->user->user->creer)
  153. {
  154. print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="post">';
  155. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  156. print '<input type="hidden" name="action" value="add">';
  157. print '<input type="hidden" name="bankid" value="'.$bankid.'">';
  158. }
  159. // View
  160. if ($action != 'edit' && $action != 'create') // If not bank account yet, $account may be empty
  161. {
  162. $title = $langs->trans("User");
  163. dol_fiche_head($head, 'bank', $title, -1, 'user');
  164. $linkback = '';
  165. if ($user->rights->user->user->lire || $user->admin) {
  166. $linkback = '<a href="'.DOL_URL_ROOT.'/user/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
  167. }
  168. dol_banner_tab($object,'id',$linkback,$user->rights->user->user->lire || $user->admin);
  169. print '<div class="fichecenter"><div class="fichehalfleft">';
  170. print '<div class="underbanner clearboth"></div>';
  171. print '<table class="border centpercent">';
  172. print '<tr><td class="titlefield">'.$langs->trans("Login").'</td>';
  173. print '<td>'.$object->login.'</td>';
  174. print '</tr>';
  175. print '</table>';
  176. print '</br>';
  177. print load_fiche_titre($langs->trans("BAN"));
  178. print '<div class="underbanner clearboth"></div>';
  179. print '<table class="border centpercent">';
  180. print '<tr><td class="titlefield">'.$langs->trans("LabelRIB").'</td>';
  181. print '<td>'.$account->label.'</td></tr>';
  182. print '<tr><td>'.$langs->trans("BankName").'</td>';
  183. print '<td>'.$account->bank.'</td></tr>';
  184. // Show fields of bank account
  185. foreach ($account->getFieldsToShow() as $val) {
  186. if ($val == 'BankCode') {
  187. $content = $account->code_banque;
  188. } elseif ($val == 'DeskCode') {
  189. $content = $account->code_guichet;
  190. } elseif ($val == 'BankAccountNumber') {
  191. $content = $account->number;
  192. } elseif ($val == 'BankAccountNumberKey') {
  193. $content = $account->cle_rib;
  194. }
  195. print '<tr><td>'.$langs->trans($val).'</td>';
  196. print '<td colspan="3">'.$content.'</td>';
  197. print '</tr>';
  198. }
  199. print '<tr><td class="tdtop">'.$langs->trans("IBAN").'</td>';
  200. print '<td>'.$account->iban . '&nbsp;';
  201. if (! empty($account->iban)) {
  202. if (! checkIbanForAccount($account)) {
  203. print img_picto($langs->trans("IbanNotValid"),'warning');
  204. } else {
  205. print img_picto($langs->trans("IbanValid"),'info');
  206. }
  207. }
  208. print '</td></tr>';
  209. print '<tr><td class="tdtop">'.$langs->trans("BIC").'</td>';
  210. print '<td>'.$account->bic.'&nbsp;';
  211. if (! empty($account->bic)) {
  212. if (! checkSwiftForAccount($account)) {
  213. print img_picto($langs->trans("SwiftNotValid"),'warning');
  214. } else {
  215. print img_picto($langs->trans("SwiftValid"),'info');
  216. }
  217. }
  218. print '</td></tr>';
  219. print '<tr><td class="tdtop">'.$langs->trans("BankAccountDomiciliation").'</td><td>';
  220. print $account->domiciliation;
  221. print "</td></tr>\n";
  222. print '<tr><td class="tdtop">'.$langs->trans("BankAccountOwner").'</td><td>';
  223. print $account->proprio;
  224. print "</td></tr>\n";
  225. print '<tr><td class="tdtop">'.$langs->trans("BankAccountOwnerAddress").'</td><td>';
  226. print $account->owner_address;
  227. print "</td></tr>\n";
  228. print '</table>';
  229. // Check BBAN
  230. if ($account->label && ! checkBanForAccount($account))
  231. {
  232. print '<div class="warning">'.$langs->trans("RIBControlError").'</div>';
  233. }
  234. print '</div><div class="fichehalfright"><div class="ficheaddleft">';
  235. // Nbre max d'elements des petites listes
  236. $MAXLIST=$conf->global->MAIN_SIZE_SHORTLIST_LIMIT;
  237. /*
  238. * Last salaries
  239. */
  240. if (! empty($conf->salaries->enabled) &&
  241. ($user->rights->salaries->read && $object->id == $user->id)
  242. )
  243. {
  244. $salary = new PaymentSalary($db);
  245. $sql = "SELECT ps.rowid, ps.datesp, ps.dateep, ps.amount";
  246. $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as ps";
  247. $sql.= " WHERE ps.fk_user = ".$object->id;
  248. $sql.= " AND ps.entity = ".$conf->entity;
  249. $sql.= " ORDER BY ps.datesp DESC";
  250. $resql=$db->query($sql);
  251. if ($resql)
  252. {
  253. $num = $db->num_rows($resql);
  254. print '<table class="noborder" width="100%">';
  255. print '<tr class="liste_titre">';
  256. print '<td colspan="4"><table width="100%" class="nobordernopadding"><tr><td>'.$langs->trans("LastSalaries",($num<=$MAXLIST?"":$MAXLIST)).'</td><td align="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/compta/salaries/list.php?search_user='.$object->login.'">'.$langs->trans("AllSalaries").' <span class="badge">'.$num.'</span></a></td>';
  257. print '</tr></table></td>';
  258. print '</tr>';
  259. $i = 0;
  260. while ($i < $num && $i < $MAXLIST)
  261. {
  262. $objp = $db->fetch_object($resql);
  263. print '<tr class="oddeven">';
  264. print '<td class="nowrap">';
  265. $salary->id = $objp->rowid;
  266. $salary->ref = $objp->rowid;
  267. print $salary->getNomUrl(1);
  268. print '</td><td align="right" width="80px">'.dol_print_date($db->jdate($objp->datesp),'day')."</td>\n";
  269. print '<td align="right" width="80px">'.dol_print_date($db->jdate($objp->dateep),'day')."</td>\n";
  270. print '<td align="right" style="min-width: 60px">'.price($objp->amount).'</td></tr>';
  271. $i++;
  272. }
  273. $db->free($resql);
  274. if ($num <= 0) print '<td colspan="4" class="opacitymedium">'.$langs->trans("None").'</a>';
  275. print "</table>";
  276. }
  277. else
  278. {
  279. dol_print_error($db);
  280. }
  281. }
  282. /*
  283. * Last holidays
  284. */
  285. if (! empty($conf->holiday->enabled) &&
  286. ($user->rights->holiday->read_all || ($user->rights->holiday->read && $object->id == $user->id))
  287. )
  288. {
  289. $holiday = new Holiday($db);
  290. $sql = "SELECT h.rowid, h.statut, h.fk_type, h.date_debut, h.date_fin, h.halfday";
  291. $sql.= " FROM ".MAIN_DB_PREFIX."holiday as h";
  292. $sql.= " WHERE h.fk_user = ".$object->id;
  293. $sql.= " AND h.entity = ".$conf->entity;
  294. $sql.= " ORDER BY h.date_debut DESC";
  295. $resql=$db->query($sql);
  296. if ($resql)
  297. {
  298. $num = $db->num_rows($resql);
  299. print '<table class="noborder" width="100%">';
  300. print '<tr class="liste_titre">';
  301. print '<td colspan="4"><table width="100%" class="nobordernopadding"><tr><td>'.$langs->trans("LastHolidays",($num<=$MAXLIST?"":$MAXLIST)).'</td><td align="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/holiday/list.php?id='.$object->id.'">'.$langs->trans("AllHolidays").' <span class="badge">'.$num.'</span></a></td>';
  302. print '</tr></table></td>';
  303. print '</tr>';
  304. $i = 0;
  305. while ($i < $num && $i < $MAXLIST)
  306. {
  307. $objp = $db->fetch_object($resql);
  308. print '<tr class="oddeven">';
  309. print '<td class="nowrap">';
  310. $holiday->id = $objp->rowid;
  311. $holiday->ref = $objp->rowid;
  312. $holiday->fk_type = $objp->fk_type;
  313. $nbopenedday=num_open_day($db->jdate($objp->date_debut), $db->jdate($objp->date_fin), 0, 1, $objp->halfday);
  314. print $holiday->getNomUrl(1);
  315. print '</td><td align="right" width="80px">'.dol_print_date($db->jdate($objp->date_debut),'day')."</td>\n";
  316. print '<td align="right" style="min-width: 60px">'.$nbopenedday.' '.$langs->trans('DurationDays').'</td>';
  317. print '<td align="right" style="min-width: 60px" class="nowrap">'.$holiday->LibStatut($objp->statut,5).'</td></tr>';
  318. $i++;
  319. }
  320. $db->free($resql);
  321. if ($num <= 0) print '<td colspan="4" class="opacitymedium">'.$langs->trans("None").'</a>';
  322. print "</table>";
  323. }
  324. else
  325. {
  326. dol_print_error($db);
  327. }
  328. }
  329. /*
  330. * Last expense report
  331. */
  332. if (! empty($conf->expensereport->enabled) &&
  333. ($user->rights->expensereport->readall || ($user->rights->expensereport->lire && $object->id == $user->id))
  334. )
  335. {
  336. $exp = new ExpenseReport($db);
  337. $sql = "SELECT e.rowid, e.ref, e.fk_statut, e.date_debut, e.total_ttc";
  338. $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as e";
  339. $sql.= " WHERE e.fk_user_author = ".$object->id;
  340. $sql.= " AND e.entity = ".$conf->entity;
  341. $sql.= " ORDER BY e.date_debut DESC";
  342. $resql=$db->query($sql);
  343. if ($resql)
  344. {
  345. $num = $db->num_rows($resql);
  346. print '<table class="noborder" width="100%">';
  347. print '<tr class="liste_titre">';
  348. print '<td colspan="4"><table width="100%" class="nobordernopadding"><tr><td>'.$langs->trans("LastExpenseReports",($num<=$MAXLIST?"":$MAXLIST)).'</td><td align="right"><a class="notasortlink" href="'.DOL_URL_ROOT.'/expensereport/list.php?id='.$object->id.'">'.$langs->trans("AllExpenseReports").' <span class="badge">'.$num.'</span></a></td>';
  349. print '</tr></table></td>';
  350. print '</tr>';
  351. $i = 0;
  352. while ($i < $num && $i < $MAXLIST)
  353. {
  354. $objp = $db->fetch_object($resql);
  355. print '<tr class="oddeven">';
  356. print '<td class="nowrap">';
  357. $exp->id = $objp->rowid;
  358. $exp->ref = $objp->ref;
  359. $exp->fk_type = $objp->fk_type;
  360. print $exp->getNomUrl(1);
  361. print '</td><td align="right" width="80px">'.dol_print_date($db->jdate($objp->date_debut),'day')."</td>\n";
  362. print '<td align="right" style="min-width: 60px">'.price($objp->total_ttc).'</td>';
  363. print '<td align="right" style="min-width: 60px" class="nowrap">'.$exp->LibStatut($objp->fk_statut,5).'</td></tr>';
  364. $i++;
  365. }
  366. $db->free($resql);
  367. if ($num <= 0) print '<td colspan="4" class="opacitymedium">'.$langs->trans("None").'</a>';
  368. print "</table>";
  369. }
  370. else
  371. {
  372. dol_print_error($db);
  373. }
  374. }
  375. print '</div></div></div>';
  376. print '<div style="clear:both"></div>';
  377. dol_fiche_end();
  378. /*
  379. * Barre d'actions
  380. */
  381. print '<div class="tabsAction">';
  382. if ($user->rights->user->user->creer)
  383. {
  384. if ($account->id > 0)
  385. print '<a class="butAction" href="bank.php?id='.$object->id.'&bankid='.$account->id.'&action=edit">'.$langs->trans("Edit").'</a>';
  386. else
  387. print '<a class="butAction" href="bank.php?id='.$object->id.'&bankid='.$account->id.'&action=create">'.$langs->trans("Create").'</a>';
  388. }
  389. print '</div>';
  390. }
  391. // Edit
  392. if ($id && ($action == 'edit' || $action == 'create' ) && $user->rights->user->user->creer)
  393. {
  394. $title = $langs->trans("User");
  395. dol_fiche_head($head, 'bank', $title, 0, 'user');
  396. $linkback = '<a href="'.DOL_URL_ROOT.'/user/list.php">'.$langs->trans("BackToList").'</a>';
  397. dol_banner_tab($object, 'id', $linkback, $user->rights->user->user->lire || $user->admin);
  398. //print '<div class="fichecenter">';
  399. print '<div class="underbanner clearboth"></div>';
  400. print '<table class="border centpercent">';
  401. print '<tr><td class="titlefield fieldrequired">'.$langs->trans("LabelRIB").'</td>';
  402. print '<td colspan="4"><input size="30" type="text" name="label" value="'.$account->label.'"></td></tr>';
  403. print '<tr><td class="fieldrequired">'.$langs->trans("BankName").'</td>';
  404. print '<td><input size="30" type="text" name="bank" value="'.$account->bank.'"></td></tr>';
  405. // Show fields of bank account
  406. foreach ($account->getFieldsToShow() as $val) {
  407. if ($val == 'BankCode') {
  408. $name = 'code_banque';
  409. $size = 8;
  410. $content = $account->code_banque;
  411. } elseif ($val == 'DeskCode') {
  412. $name = 'code_guichet';
  413. $size = 8;
  414. $content = $account->code_guichet;
  415. } elseif ($val == 'BankAccountNumber') {
  416. $name = 'number';
  417. $size = 18;
  418. $content = $account->number;
  419. } elseif ($val == 'BankAccountNumberKey') {
  420. $name = 'cle_rib';
  421. $size = 3;
  422. $content = $account->cle_rib;
  423. }
  424. print '<td>'.$langs->trans($val).'</td>';
  425. print '<td><input size="'.$size.'" type="text" class="flat" name="'.$name.'" value="'.$content.'"></td>';
  426. print '</tr>';
  427. }
  428. // IBAN
  429. print '<tr><td class="fieldrequired">'.$langs->trans("IBAN").'</td>';
  430. print '<td colspan="4"><input size="30" type="text" name="iban" value="'.$account->iban.'"></td></tr>';
  431. print '<tr><td class="fieldrequired">'.$langs->trans("BIC").'</td>';
  432. print '<td colspan="4"><input size="12" type="text" name="bic" value="'.$account->bic.'"></td></tr>';
  433. print '<tr><td class="tdtop">'.$langs->trans("BankAccountDomiciliation").'</td><td colspan="4">';
  434. print '<textarea name="domiciliation" rows="4" class="quatrevingtpercent">';
  435. print $account->domiciliation;
  436. print "</textarea></td></tr>";
  437. print '<tr><td>'.$langs->trans("BankAccountOwner").'</td>';
  438. print '<td colspan="4"><input size="30" type="text" name="proprio" value="'.$account->proprio.'"></td></tr>';
  439. print "</td></tr>\n";
  440. print '<tr><td class="tdtop">'.$langs->trans("BankAccountOwnerAddress").'</td><td colspan="4">';
  441. print '<textarea name="owner_address" rows="4" class="quatrevingtpercent">';
  442. print $account->owner_address;
  443. print "</textarea></td></tr>";
  444. print '</table>';
  445. //print '</div>';
  446. dol_fiche_end();
  447. print '<div align="center">';
  448. print '<input class="button" value="'.$langs->trans("Modify").'" type="submit">';
  449. print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
  450. print '<input class="button" name="cancel" value="'.$langs->trans("Cancel").'" type="submit">';
  451. print '</div>';
  452. }
  453. if ($id && $action == 'edit' && $user->rights->user->user->creer) print '</form>';
  454. if ($id && $action == 'create' && $user->rights->user->user->creer) print '</form>';
  455. // End of page
  456. llxFooter();
  457. $db->close();