This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/modules/core/import.inc.php
2008-11-26 14:50:40 -08:00

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;
}
}
}
?>