345 lines
8.6 KiB
PHP
345 lines
8.6 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* AgileBill - Open Billing Software
|
||
|
*
|
||
|
* This body of work is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the Open AgileBill License
|
||
|
* License as published at http://www.agileco.com/agilebill/license1-4.txt
|
||
|
*
|
||
|
* For questions, help, comments, discussion, etc., please join the
|
||
|
* Agileco community forums at http://forum.agileco.com/
|
||
|
*
|
||
|
* @link http://www.agileco.com/
|
||
|
* @copyright 2004-2008 Agileco, LLC.
|
||
|
* @license http://www.agileco.com/agilebill/license1-4.txt
|
||
|
* @author Tony Landis <tony@agileco.com>
|
||
|
* @package AgileBill
|
||
|
* @version 1.4.93
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Import Handler Module.
|
||
|
*/
|
||
|
class CORE_import
|
||
|
{
|
||
|
|
||
|
### Validate the import file/upload.
|
||
|
### Generate the array to display the field options.
|
||
|
|
||
|
function prepare_import($VAR, $construct)
|
||
|
{
|
||
|
global $_FILES, $C_debug, $smarty;
|
||
|
|
||
|
if($VAR['filetype'] == 'upload')
|
||
|
{
|
||
|
if(isset($_FILES['file']) && $_FILES['file']['size'] > 0)
|
||
|
{
|
||
|
# added str_replace for spaces, because Linux really doesn't like them much.
|
||
|
$this->filename = str_replace(" ","_",'import_'.$VAR['module'].'_'.$_FILES['file']['name']);
|
||
|
$this->file = PATH_FILES . $this->filename;
|
||
|
copy($_FILES['file']['tmp_name'], $this->file);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$C_debug->alert('Please go back and enter a file to upload!');
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
elseif ($VAR['filetype'] == 'local')
|
||
|
{
|
||
|
@$this->filename = $VAR['file'];
|
||
|
@$this->file = PATH_FILES.$VAR['file'];
|
||
|
if(!is_file($this->file))
|
||
|
$C_debug->alert('The specified file does not exist!');
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$C_debug->alert('Please go back and enter all required fields!');
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
# open the file for parsing
|
||
|
require_once('includes/pear/Compat/Function/file_get_contents.php');
|
||
|
$data = file_get_contents($this->file);
|
||
|
$rows = explode("\r\n", $data);
|
||
|
|
||
|
|
||
|
if($VAR['type'] == 'csv')
|
||
|
$sp = ',';
|
||
|
elseif($VAR['type'] == 'tab')
|
||
|
$sp = ' ';
|
||
|
else
|
||
|
return false;
|
||
|
|
||
|
# get the first row for the example data
|
||
|
if(count($rows) == 0)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# set the columns and sample data smarty array:
|
||
|
$columns = explode($sp, $rows[0]);
|
||
|
$this->sbox = array('-- Use Constant Value --');
|
||
|
|
||
|
for($i=0;$i<count($columns);$i++)
|
||
|
{
|
||
|
$smart[$i]['idx'] = $i;
|
||
|
$smart[$i]['sample'] = $columns[$i];
|
||
|
$this->sbox[] = "Field #$i: ".$columns[$i];
|
||
|
|
||
|
if($VAR['type'] && ereg("^\"",$smart[$i]['sample']) && ereg("\"$",$smart[$i]['sample']))
|
||
|
{
|
||
|
$smart[$i]['sample'] = ereg_replace("^\"","",$smart[$i]['sample']);
|
||
|
$smart[$i]['sample'] = ereg_replace("\"$","",$smart[$i]['sample']);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# set the smarty vars:
|
||
|
$smarty->assign('rows',count($rows));
|
||
|
$smarty->assign('columns',$smart);
|
||
|
$smarty->assign('file', $this->filename);
|
||
|
$smarty->assign('type', $VAR['type']);
|
||
|
|
||
|
# set the available fields:
|
||
|
$fields = explode(',', '--NONE--,'.$construct->method['import']);
|
||
|
$smarty->assign('fields', $fields);
|
||
|
|
||
|
|
||
|
$smarty->assign('fields_array',$this->build_fields($construct));
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function build_fields(&$construct)
|
||
|
{
|
||
|
$fields_array = explode(",",$construct->method['import']);
|
||
|
$i = 0;
|
||
|
foreach ($fields_array as $f) {
|
||
|
$itbl[$i]['field'] = $f;
|
||
|
$itbl[$i]['options'] = @$this->sbox;
|
||
|
$itbl[$i]['type'] = '';
|
||
|
$itbl[$i]['custom'] = 0;
|
||
|
$i++;
|
||
|
}
|
||
|
if(isset($construct->import_custom) && count($construct->import_custom)) {
|
||
|
foreach ($construct->import_custom as $f) {
|
||
|
$itbl[$i]['field'] = $f['name'];
|
||
|
$itbl[$i]['options'] = $f['value'];
|
||
|
$itbl[$i]['type'] = $f['type'];
|
||
|
$itbl[$i]['custom'] = 1;
|
||
|
$i++;
|
||
|
}
|
||
|
}
|
||
|
return $itbl;
|
||
|
}
|
||
|
|
||
|
### Perform the actual import
|
||
|
function do_new_import(&$VAR, &$construct)
|
||
|
{
|
||
|
global $C_debug;
|
||
|
$this->file = PATH_FILES.$VAR['file'];
|
||
|
require_once('includes/pear/Compat/Function/file_get_contents.php');
|
||
|
$data = file_get_contents($this->file);
|
||
|
$rows = explode("\r\n", $data);
|
||
|
|
||
|
# get the file type:
|
||
|
if($VAR['type'] == 'csv')
|
||
|
$sp = ',';
|
||
|
elseif($VAR['type'] == 'tab')
|
||
|
$sp = ' ';
|
||
|
else
|
||
|
return false;
|
||
|
|
||
|
# get the first row for the example data
|
||
|
if(count($rows) == 0)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# get the available fields:
|
||
|
$fields = $this->build_fields($construct);
|
||
|
|
||
|
# start the insert statement
|
||
|
$db = &DB();
|
||
|
$q = "INSERT INTO ".AGILE_DB_PREFIX."$construct->table ";
|
||
|
$sql = "SELECT * FROM ".AGILE_DB_PREFIX."$construct->table WHERE id = -1";
|
||
|
$rs = $db->Execute($sql);
|
||
|
|
||
|
$bad = 0;
|
||
|
# loop through the rows
|
||
|
for($row=0; $row<count($rows); $row++)
|
||
|
{
|
||
|
$record = array();
|
||
|
$columns = explode($sp, $rows[$row]);
|
||
|
|
||
|
if (strlen($rows[$row])) {
|
||
|
# echo "<pre>".print_r($columns,true)."</pre>";
|
||
|
$record = array();
|
||
|
for($i=0;$i<count($fields);$i++)
|
||
|
{
|
||
|
$idx = $VAR['import_select'][$fields[$i]['field']];
|
||
|
if ($idx > 0) {
|
||
|
$record[$fields[$i]['field']] = @$columns[--$idx];
|
||
|
if($VAR['type'] && ereg("^\"",$record[$fields[$i]['field']]) && ereg("\"$",$record[$fields[$i]['field']])) {
|
||
|
$record[$fields[$i]['field']] = ereg_replace("^\"","",$record[$fields[$i]['field']]);
|
||
|
$record[$fields[$i]['field']] = ereg_replace("\"$","",$record[$fields[$i]['field']]);
|
||
|
}
|
||
|
} else {
|
||
|
$record[$fields[$i]['field']] = @$VAR['import_constant'][$fields[$i]['field']];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
$record['site_id'] = DEFAULT_SITE;
|
||
|
if(empty($record['id']))
|
||
|
$record['id'] = $db->GenID(AGILE_DB_PREFIX . $construct->table . '_id');
|
||
|
|
||
|
$SQL = $db->GetInsertSQL($rs, $record);
|
||
|
# echo $SQL."<br>";
|
||
|
|
||
|
/* call import_line_process */
|
||
|
if (is_callable(array($construct,'import_line_process'))) {
|
||
|
$construct->import_line_process($db, $VAR, $fields, $record);
|
||
|
}
|
||
|
|
||
|
if($VAR['import_type'] == 'db')
|
||
|
{
|
||
|
# execute command
|
||
|
$db->Execute($SQL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# add to sql command for download
|
||
|
@$SQL_DL .= $SQL . ";\r\n\r\n";
|
||
|
}
|
||
|
} else {
|
||
|
$bad++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(@$VAR['import_type'] == 'dl')
|
||
|
{
|
||
|
header ("Content-Disposition: attachment; filename=$construct->table.sql" );
|
||
|
echo $SQL_DL;
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
$C_debug->alert("Imported $row record(s) and $bad record(s) were skipped.");
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
### Validate the fields.
|
||
|
### Perform the actual import
|
||
|
|
||
|
function do_import($VAR, $construct)
|
||
|
{
|
||
|
global $C_debug;
|
||
|
$this->file = PATH_FILES.$VAR['file'];
|
||
|
require_once('includes/pear/Compat/Function/file_get_contents.php');
|
||
|
$data = file_get_contents($this->file);
|
||
|
$rows = explode("\r\n", $data);
|
||
|
|
||
|
# get the file type:
|
||
|
if($VAR['type'] == 'csv')
|
||
|
$sp = ',';
|
||
|
elseif($VAR['type'] == 'tab')
|
||
|
$sp = ' ';
|
||
|
else
|
||
|
return false;
|
||
|
|
||
|
# get the first row for the example data
|
||
|
if(count($rows) == 0)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# get the available fields:
|
||
|
$fields = explode(',', ','.$construct->method['import']);
|
||
|
|
||
|
# start the insert statement
|
||
|
$db = &DB();
|
||
|
$q = "INSERT INTO ".AGILE_DB_PREFIX."$construct->table ";
|
||
|
$sql = "SELECT * FROM ".AGILE_DB_PREFIX."$construct->table WHERE id = -1";
|
||
|
$rs = $db->Execute($sql);
|
||
|
|
||
|
|
||
|
# loop through the rows
|
||
|
for($row=0; $row<count($rows); $row++)
|
||
|
{
|
||
|
$record = array();
|
||
|
$columns = explode($sp, $rows[$row]);
|
||
|
|
||
|
for($i=0;$i<count($columns);$i++)
|
||
|
{
|
||
|
# get the field:
|
||
|
$import_field = $VAR['import_field'];
|
||
|
$import_field = $import_field[$i];
|
||
|
$field = $fields[$import_field];
|
||
|
|
||
|
# check that the field is not defined already:
|
||
|
if(!empty($record["$field"])) {
|
||
|
$C_debug->alert("You have used the table <u>$field</u> more than once!");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
# get the field data:
|
||
|
if(!empty($field))
|
||
|
{
|
||
|
# get the data:
|
||
|
$data = $columns[$i];
|
||
|
if($VAR['type'] && ereg("^\"",$data) && ereg("\"$",$data))
|
||
|
{
|
||
|
$data = ereg_replace("^\"","",$data);
|
||
|
$data = ereg_replace("\"$","",$data);
|
||
|
}
|
||
|
|
||
|
# check for relational records:
|
||
|
|
||
|
|
||
|
$record["$field"] = $data;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$record['site_id'] = DEFAULT_SITE;
|
||
|
if(empty($record['id']))
|
||
|
$record['id'] = $db->GenID(AGILE_DB_PREFIX . $construct->table . '_id');
|
||
|
|
||
|
$SQL = $db->GetInsertSQL($rs, $record);
|
||
|
|
||
|
if($VAR['import_type'] == 'db')
|
||
|
{
|
||
|
# execute command
|
||
|
$db->Execute($SQL);
|
||
|
if($import_rs === false)
|
||
|
{
|
||
|
# error message
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# add to sql command for download
|
||
|
@$SQL_DL .= $SQL . ";\r\n\r\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if($VAR['import_type'] == 'dl')
|
||
|
{
|
||
|
header ("Content-Disposition: attachment; filename=$construct->table.sql" );
|
||
|
echo $SQL_DL;
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
$C_debug->alert("Imported $row record(s).");
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|