forked from Wavyzz/dolibarr
400 lines
14 KiB
PHP
Executable File
400 lines
14 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
/*
|
|
* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
*
|
|
* 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 3 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 scripts/bank/export-bank-receipts.php
|
|
* \ingroup bank
|
|
* \brief Script file to export bank receipts into Excel files
|
|
*/
|
|
$sapi_type = php_sapi_name();
|
|
$script_file = basename(__FILE__);
|
|
$path = __DIR__ . '/';
|
|
|
|
// Test if batch mode
|
|
if (substr($sapi_type, 0, 3) == 'cgi') {
|
|
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
|
|
exit(- 1);
|
|
}
|
|
|
|
require_once $path . "../../htdocs/master.inc.php";
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/core/lib/bank.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/chargesociales.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/fourn/class/paiementfourn.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php';
|
|
require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/paymentsocialcontribution.class.php';
|
|
|
|
// Global variables
|
|
$version = DOL_VERSION;
|
|
$error = 0;
|
|
|
|
/*
|
|
* Main
|
|
*/
|
|
|
|
@set_time_limit(0);
|
|
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
|
|
dol_syslog($script_file . " launched with arg " . join(',', $argv));
|
|
|
|
if (! isset($argv[3]) || ! $argv[3]) {
|
|
print "Usage: " . $script_file . " bank_ref [bank_receipt_number|all] (csv|tsv|excel|excel2007) [lang=xx_XX]\n";
|
|
exit(- 1);
|
|
}
|
|
$bankref = $argv[1];
|
|
$num = $argv[2];
|
|
$model = $argv[3];
|
|
$newlangid = 'en_EN'; // To force a new lang id
|
|
|
|
$invoicestatic = new Facture($db);
|
|
$invoicesupplierstatic = new FactureFournisseur($db);
|
|
$societestatic = new Societe($db);
|
|
$chargestatic = new ChargeSociales($db);
|
|
$memberstatic = new Adherent($db);
|
|
$paymentstatic = new Paiement($db);
|
|
$paymentsupplierstatic = new PaiementFourn($db);
|
|
$paymentsocialcontributionstatic = new PaymentSocialContribution($db);
|
|
$paymentvatstatic = new Tva($db);
|
|
$bankstatic = new Account($db);
|
|
$banklinestatic = new AccountLine($db);
|
|
|
|
// Parse parameters
|
|
foreach ($argv as $key => $value) {
|
|
$found = false;
|
|
|
|
// Define options
|
|
if (preg_match('/^lang=/i', $value)) {
|
|
$found = true;
|
|
$valarray = explode('=', $value);
|
|
$newlangid = $valarray[1];
|
|
print 'Use language ' . $newlangid . ".\n";
|
|
}
|
|
}
|
|
$outputlangs = $langs;
|
|
if (! empty($newlangid)) {
|
|
if ($outputlangs->defaultlang != $newlangid) {
|
|
$outputlangs = new Translate("", $conf);
|
|
$outputlangs->setDefaultLang($newlangid);
|
|
}
|
|
}
|
|
|
|
// Load translation files required by the page
|
|
$outputlangs->loadLangs(array("main","companies","bills","banks","members","compta"));
|
|
|
|
$acct = new Account($db);
|
|
$result = $acct->fetch('', $bankref);
|
|
if ($result <= 0) {
|
|
print "Failed to find bank account with ref " . $bankref . ".\n";
|
|
exit(- 1);
|
|
} else {
|
|
print "Export for bank account " . $acct->ref . " (" . $acct->label . ").\n";
|
|
}
|
|
|
|
// Creation de la classe d'export du model ExportXXX
|
|
$dir = DOL_DOCUMENT_ROOT . "/core/modules/export/";
|
|
$file = "export_" . $model . ".modules.php";
|
|
$classname = "Export" . $model;
|
|
if (! dol_is_file($dir . $file)) {
|
|
print "No driver to export with format " . $model . "\n";
|
|
exit(- 1);
|
|
}
|
|
require_once $dir . $file;
|
|
$objmodel = new $classname($db);
|
|
|
|
// Define target path
|
|
$dirname = $conf->bank->dir_temp;
|
|
$filename = 'export-bank-receipts-' . $bankref . '-' . $num . '.' . $objmodel->extension;
|
|
|
|
$array_fields = array(
|
|
'bankreceipt' => $outputlangs->transnoentitiesnoconv("AccountStatementShort"),
|
|
'bankaccount' => $outputlangs->transnoentitiesnoconv("BankAccount"),
|
|
'dateop' => $outputlangs->transnoentitiesnoconv("DateOperationShort"),
|
|
'dateval' => $outputlangs->transnoentitiesnoconv("DateValueShort"),
|
|
'type' => $outputlangs->transnoentitiesnoconv("Type"),
|
|
'description' => $outputlangs->transnoentitiesnoconv("Description"),
|
|
'thirdparty' => $outputlangs->transnoentitiesnoconv("Tiers"),
|
|
'accountelem' => $outputlangs->transnoentitiesnoconv("Piece"),
|
|
'debit' => $outputlangs->transnoentitiesnoconv("Debit"),
|
|
'credit' => $outputlangs->transnoentitiesnoconv("Credit"),
|
|
'soldbefore' => $outputlangs->transnoentitiesnoconv("BankBalanceBefore"),
|
|
'soldafter' => $outputlangs->transnoentitiesnoconv("BankBalanceAfter"),
|
|
'comment' => $outputlangs->transnoentitiesnoconv("Comment")
|
|
);
|
|
$array_selected = array('bankreceipt' => 'bankreceipt','bankaccount' => 'bankaccount','dateop' => 'dateop','dateval' => 'dateval','type' => 'type','description' => 'description','thirdparty' => 'thirdparty','accountelem' => 'accountelem','debit' => 'debit','credit' => 'credit','soldbefore' => 'soldbefore','soldafter' => 'soldafter','comment' => 'comment');
|
|
$array_export_TypeFields = array('bankreceipt' => 'Text','bankaccount' => 'Text','dateop' => 'Date','dateval' => 'Date','type' => 'Text','description' => 'Text','thirdparty' => 'Text','accountelem' => 'Text','debit' => 'Number','credit' => 'Number','soldbefore' => 'Number','soldafter' => 'Number','comment' => 'Text');
|
|
|
|
// Build request to find records for a bank account/receipt
|
|
$listofnum = "";
|
|
if (! empty($num) && $num != "all") {
|
|
$listofnum .= "'";
|
|
$arraynum = explode(',', $num);
|
|
foreach ($arraynum as $val) {
|
|
if ($listofnum != "'")
|
|
$listofnum .= "','";
|
|
$listofnum .= $val;
|
|
}
|
|
$listofnum .= "'";
|
|
}
|
|
$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv,";
|
|
$sql .= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,";
|
|
$sql .= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel";
|
|
$sql .= " FROM " . MAIN_DB_PREFIX . "bank_account as ba";
|
|
$sql .= ", " . MAIN_DB_PREFIX . "bank as b";
|
|
$sql .= " WHERE b.fk_account = " . $acct->id;
|
|
if ($listofnum)
|
|
$sql .= " AND b.num_releve IN (" . $listofnum . ")";
|
|
if (! isset($num))
|
|
$sql .= " OR b.num_releve is null";
|
|
$sql .= " AND b.fk_account = ba.rowid";
|
|
$sql .= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day
|
|
// print $sql;
|
|
|
|
$resql = $db->query($sql);
|
|
if ($resql) {
|
|
$balancebefore = array();
|
|
|
|
$numrows = $db->num_rows($resql);
|
|
|
|
if ($numrows > 0) {
|
|
// Open file
|
|
print 'Open file ' . $filename . ' into directory ' . $dirname . "\n";
|
|
dol_mkdir($dirname);
|
|
$result = $objmodel->open_file($dirname . "/" . $filename, $outputlangs);
|
|
|
|
if ($result < 0) {
|
|
print 'Failed to create file ' . $filename . ' into dir ' . $dirname . '.' . "\n";
|
|
return - 1;
|
|
}
|
|
|
|
// Genere en-tete
|
|
$objmodel->write_header($outputlangs);
|
|
|
|
// Genere ligne de titre
|
|
$objmodel->write_title($array_fields, $array_selected, $outputlangs, $array_export_TypeFields);
|
|
}
|
|
|
|
$i = 0;
|
|
while ($i < $numrows) {
|
|
$thirdparty = '';
|
|
$accountelem = '';
|
|
$comment = '';
|
|
|
|
$objp = $db->fetch_object($resql);
|
|
|
|
// Calculate start balance
|
|
if (! isset($balancebefore[$objp->num_releve])) {
|
|
print 'Calculate start balance for receipt ' . $objp->num_releve . "\n";
|
|
|
|
$sql2 = "SELECT sum(b.amount) as amount";
|
|
$sql2 .= " FROM " . MAIN_DB_PREFIX . "bank as b";
|
|
$sql2 .= " WHERE b.num_releve < '" . $db->escape($objp->num_releve) . "'";
|
|
$sql2 .= " AND b.fk_account = " . $objp->bankid;
|
|
$resql2 = $db->query($sql2);
|
|
if ($resql2) {
|
|
$obj2 = $db->fetch_object($resql2);
|
|
$balancebefore[$objp->num_releve] = ($obj2->amount ? $obj2->amount : 0);
|
|
$db->free($resql2);
|
|
} else {
|
|
dol_print_error($db);
|
|
exit(- 1);
|
|
}
|
|
|
|
$total = $balancebefore[$objp->num_releve];
|
|
}
|
|
|
|
$totalbefore = $total;
|
|
$total = $total + $objp->amount;
|
|
|
|
// Date operation
|
|
$dateop = $db->jdate($objp->do);
|
|
|
|
// Date de valeur
|
|
$datevalue = $db->jdate($objp->dv);
|
|
|
|
// Num cheque
|
|
$numchq = ($objp->num_chq ? $objp->num_chq : '');
|
|
|
|
// Libelle
|
|
$reg = array();
|
|
preg_match('/\((.+)\)/i', $objp->label, $reg); // Si texte entoure de parenthese on tente recherche de traduction
|
|
if ($reg[1] && $langs->transnoentitiesnoconv($reg[1]) != $reg[1])
|
|
$description = $langs->transnoentitiesnoconv($reg[1]);
|
|
else
|
|
$description = $objp->label;
|
|
|
|
/*
|
|
* Ajout les liens (societe, company...)
|
|
*/
|
|
$links = $acct->get_url($objp->rowid);
|
|
foreach ($links as $key => $val) {
|
|
if ($links[$key]['type'] == 'payment') {
|
|
$paymentstatic->fetch($links[$key]['url_id']);
|
|
$tmparray = $paymentstatic->getBillsArray('');
|
|
if (is_array($tmparray)) {
|
|
foreach ($tmparray as $key => $val) {
|
|
$invoicestatic->fetch($val);
|
|
if ($accountelem)
|
|
$accountelem .= ', ';
|
|
$accountelem .= $invoicestatic->ref;
|
|
}
|
|
}
|
|
} elseif ($links[$key]['type'] == 'payment_supplier') {
|
|
$paymentsupplierstatic->fetch($links[$key]['url_id']);
|
|
$tmparray = $paymentsupplierstatic->getBillsArray('');
|
|
if (is_array($tmparray)) {
|
|
foreach ($tmparray as $key => $val) {
|
|
$invoicesupplierstatic->fetch($val);
|
|
if ($accountelem)
|
|
$accountelem .= ', ';
|
|
$accountelem .= $invoicesupplierstatic->ref;
|
|
}
|
|
}
|
|
} elseif ($links[$key]['type'] == 'payment_sc') {
|
|
$paymentsocialcontributionstatic->fetch($links[$key]['url_id']);
|
|
if ($accountelem)
|
|
$accountelem .= ', ';
|
|
$accountelem .= $langs->transnoentitiesnoconv("SocialContribution") . ' ' . $paymentsocialcontributionstatic->ref;
|
|
} elseif ($links[$key]['type'] == 'payment_vat') {
|
|
$paymentvatstatic->fetch($links[$key]['url_id']);
|
|
if ($accountelem)
|
|
$accountelem .= ', ';
|
|
$accountelem .= $langs->transnoentitiesnoconv("VATPayments") . ' ' . $paymentvatstatic->ref;
|
|
} elseif ($links[$key]['type'] == 'banktransfert') {
|
|
$comment = $outputlangs->transnoentitiesnoconv("Transfer");
|
|
if ($objp->amount > 0) {
|
|
if ($comment)
|
|
$comment .= ' ';
|
|
$banklinestatic->fetch($links[$key]['url_id']);
|
|
$bankstatic->id = $banklinestatic->fk_account;
|
|
$bankstatic->label = $banklinestatic->bank_account_label;
|
|
$comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' ';
|
|
$comment .= $bankstatic->getNomUrl(1, 'transactions');
|
|
$comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' ';
|
|
$bankstatic->id = $objp->bankid;
|
|
$bankstatic->label = $objp->bankref;
|
|
$comment .= $bankstatic->getNomUrl(1, '');
|
|
$comment .= ')';
|
|
} else {
|
|
if ($comment)
|
|
$comment .= ' ';
|
|
$bankstatic->id = $objp->bankid;
|
|
$bankstatic->label = $objp->bankref;
|
|
$comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' ';
|
|
$comment .= $bankstatic->getNomUrl(1, '');
|
|
$comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' ';
|
|
$banklinestatic->fetch($links[$key]['url_id']);
|
|
$bankstatic->id = $banklinestatic->fk_account;
|
|
$bankstatic->label = $banklinestatic->bank_account_label;
|
|
$comment .= $bankstatic->getNomUrl(1, 'transactions');
|
|
$comment .= ')';
|
|
}
|
|
} elseif ($links[$key]['type'] == 'company') {
|
|
if ($thirdparty)
|
|
$thirdparty .= ', ';
|
|
$thirdparty .= dol_trunc($links[$key]['label'], 24);
|
|
$newline = 0;
|
|
} elseif ($links[$key]['type'] == 'member') {
|
|
if ($thirdparty)
|
|
$accountelem .= ', ';
|
|
$thirdparty .= $links[$key]['label'];
|
|
$newline = 0;
|
|
}
|
|
/*
|
|
* elseif ($links[$key]['type']=='sc')
|
|
* {
|
|
* if ($accountelem) $accountelem.= ', ';
|
|
* //$accountelem.= '<a href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$links[$key]['url_id'].'">';
|
|
* //$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' ';
|
|
* $accountelem.= $langs->transnoentitiesnoconv("SocialContribution");
|
|
* //$accountelem.= '</a>';
|
|
* $newline=0;
|
|
* }
|
|
* else
|
|
* {
|
|
* if ($accountelem) $accountelem.= ', ';
|
|
* //$accountelem.= '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
|
|
* $accountelem.= $links[$key]['label'];
|
|
* //$accountelem.= '</a>';
|
|
* $newline=0;
|
|
* }
|
|
*/
|
|
}
|
|
|
|
$debit = $credit = '';
|
|
if ($objp->amount < 0) {
|
|
$totald = $totald + abs($objp->amount);
|
|
$debit = price2num($objp->amount * - 1);
|
|
} else {
|
|
$totalc = $totalc + abs($objp->amount);
|
|
$credit = price2num($objp->amount);
|
|
}
|
|
|
|
$i ++;
|
|
|
|
$rec = new stdClass();
|
|
$rec->bankreceipt = $objp->num_releve;
|
|
$rec->bankaccount = $objp->banklabel;
|
|
$rec->dateop = dol_print_date($dateop, 'dayrfc');
|
|
$rec->dateval = dol_print_date($datevalue, 'dayrfc');
|
|
$rec->type = $objp->fk_type . ' ' . ($objp->num_chq ? $objp->num_chq : '');
|
|
$rec->description = $description;
|
|
$rec->thirdparty = $thirdparty;
|
|
$rec->accountelem = $accountelem;
|
|
$rec->debit = $debit;
|
|
$rec->credit = $credit;
|
|
$rec->comment = $comment;
|
|
$rec->soldbefore = price2num($totalbefore);
|
|
$rec->soldafter = price2num($total);
|
|
|
|
// end of special operation processing
|
|
$objmodel->write_record($array_selected, $rec, $outputlangs, $array_export_TypeFields);
|
|
}
|
|
|
|
if ($numrows > 0) {
|
|
print "Found " . $numrows . " records for receipt " . $num . "\n";
|
|
|
|
// Genere en-tete
|
|
$objmodel->write_footer($outputlangs);
|
|
|
|
// Close file
|
|
$objmodel->close_file();
|
|
|
|
print 'File ' . $filename . ' was generated into dir ' . $dirname . '.' . "\n";
|
|
|
|
$ret = 0;
|
|
} else {
|
|
print "No records found for receipt " . $num . "\n";
|
|
|
|
$ret = 0;
|
|
}
|
|
} else {
|
|
dol_print_error($db);
|
|
$ret = - 1;
|
|
}
|
|
|
|
$db->close();
|
|
|
|
exit($ret);
|