mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-01-19 06:47:56 -05:00
Optimizations and CSV Import Rework - Replaced " with ' where possible to prevent the parser from being called when not needed. - Replaced == and != with === and !== where possible for bug prevention and speed. - Replaced -1 with NEW_ITEM global constant for code clarity. - Added NEW_ITEM global constant to constants.php. - Refactored CSV import function names for clarity. - Added capability to import a CSV file containing updates. - Replaced array() with [] for speed and consistency. - Removed hungarian notation from two private functions. - Refactored QueryBuilder functions to place table name in the get() function call. - Replaced (int) cast with call to intval() for speed. - Replaced == and != with === and !== where possible to prevent bugs and for speed. - Replaced array() with [] for speed and consistency. - Fixed search_custom call Optimizations and bugfixes for attributes used in csv_import - Reordered where statements in queries to match composite index on attribute_links table. - fixed value_exists() to account for different attribute types. - Removed hungarian notation on private function. - Replaced array() with [] for speed and consistency. - Replaced != with <> in SQL for consistency. - Removed from() calls in querybuilder where possible to reduce function calls. - Add get_items_by_value() - Reworked check_data_validity() - Remove unneeded comments - Refactor functions for code clarity. - Use $this->db->dbprefix() where possible instead of hand-writing ospos_... - Removed unneeded column from query. - Replaced (int) cast with intval() call for speed. - Added get_attribute_values() - Fixed issue with date format locale not being used - Refactored save_value to respect different attribute_types - Added delete_orphaned_links() to remove attribute_links that are no longer linked to any items - Added get_attributes_by_definition() - Added attribute_cleanup() Optimizations used in csv_import - replaced array() with [] for consistency and speed. - Removed hungarian notation in private functions. - Replaced " with ' where possible to prevent the parser from being called. - Minor formatting - Refactored if statement to tertiary notation for cleaner implementation. - Replaced " for ' where possible to prevent the parser from being called. - Added the Id column in the generate_import_items_csv() template so that users can submit an update to an existing item. - Removed unused key=>value pairs in foreach loops for speed. - Removed unneeded comments where the function name was self-explanatory. - Rework get_csv_file() for speed. - Rework bom_exists() for speed. - Replaced array() with [] for speed and consistency. - Replaced == with === where possible to prevent bugs and for speed. - Reworked valid_date() and valid_decimal helper functions for speed and accuracy according to the locale_format instead of a fixed format. - Minor Reformatting for clarity. - Replaced " for ' to prevent the parser from being called. - Refactored function call names to reflect new names. - Added missing ; in - Used String interpolation where useful. - Spelling fix in comment Requested Review Changes - Fixed indentation in Items.php - Fixed indentation in Attribute.php - Refactored variable out of long line of code to make it more readable.
93 lines
2.2 KiB
PHP
93 lines
2.2 KiB
PHP
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
|
|
|
|
function generate_import_items_csv($stock_locations,$attributes)
|
|
{
|
|
$csv_headers = pack('CCC',0xef,0xbb,0xbf); //Encode the Byte-Order Mark (BOM) so that UTF-8 File headers display properly in Microsoft Excel
|
|
$csv_headers .= 'Id,Barcode,"Item Name",Category,"Supplier ID","Cost Price","Unit Price","Tax 1 Name","Tax 1 Percent","Tax 2 Name","Tax 2 Percent","Reorder Level",Description,"Allow Alt Description","Item has Serial Number",Image,HSN';
|
|
$csv_headers .= generate_stock_location_headers($stock_locations);
|
|
$csv_headers .= generate_attribute_headers($attributes);
|
|
|
|
return $csv_headers;
|
|
}
|
|
|
|
function generate_stock_location_headers($locations)
|
|
{
|
|
$location_headers = '';
|
|
|
|
foreach($locations as $location_name)
|
|
{
|
|
$location_headers .= ',"location_' . $location_name . '"';
|
|
}
|
|
|
|
return $location_headers;
|
|
}
|
|
|
|
function generate_attribute_headers($attribute_names)
|
|
{
|
|
$attribute_headers = '';
|
|
unset($attribute_names[-1]);
|
|
|
|
foreach($attribute_names as $attribute_name)
|
|
{
|
|
$attribute_headers .= ',"attribute_' . $attribute_name . '"';
|
|
}
|
|
|
|
return $attribute_headers;
|
|
}
|
|
|
|
function get_csv_file($file_name)
|
|
{
|
|
//TODO: current implementation reads the entire file in. This is memory intensive for large files.
|
|
//We may want to rework the CSV import feature to read the file in chunks, process it and continue.
|
|
//It must be done in a way that does not significantly negatively affect performance.
|
|
ini_set('auto_detect_line_endings', true);
|
|
|
|
$csv_rows = FALSE;
|
|
|
|
if(($csv_file = fopen($file_name,'r')) !== FALSE)
|
|
{
|
|
$CI =& get_instance();
|
|
$CI->load->helper('security');
|
|
|
|
$csv_rows = [];
|
|
|
|
//Skip Byte-Order Mark
|
|
if(bom_exists($csv_file) === TRUE)
|
|
{
|
|
fseek($csv_file, 3);
|
|
}
|
|
|
|
$headers = fgetcsv($csv_file);
|
|
|
|
while(($row = fgetcsv($csv_file)) !== FALSE)
|
|
{
|
|
//Skip empty lines
|
|
if($row !== array(null))
|
|
{
|
|
$csv_rows[] = array_combine($headers, $CI->security->xss_clean($row));
|
|
}
|
|
}
|
|
|
|
fclose($csv_file);
|
|
}
|
|
|
|
return $csv_rows;
|
|
}
|
|
|
|
function bom_exists(&$file_handle)
|
|
{
|
|
$result = FALSE;
|
|
$candidate = fread($file_handle, 3);
|
|
|
|
rewind($file_handle);
|
|
|
|
$bom = pack('CCC', 0xef, 0xbb, 0xbf);
|
|
|
|
if (0 === strncmp($candidate, $bom, 3))
|
|
{
|
|
$result = TRUE;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
?>
|