mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-05-10 00:34:17 -04:00
PSR and Readability Changes - Removed unused import - Corrected PHPdoc to include the correct return type - Refactored out a function to get attribute data from the row in a CSV item import. - refactored snake_case variables and function names to camelCase - Refactored the naming of saveAttributeData() to better reflect the functions purpose. - Improved PHPdocs - Remove whitespace - Remove unneeded comment - Refactored abbreviated variable name for clarity - Removed $csvHeaders as it is unused - Corrected spacing and curly brace location - Refactored Stock Locations validation inside general validation Bugfixes - Fixed bug causing attribute_id and item_id to not be properly assigned when empty() returns true. - Fixed bug causing CSV Item import to not update barcode when changed in the import file. - Fixed saveAttributeValue() logic causing attribute_value to be updated to a value that already exists for a different attribute_id - Fixed bug preventing Category as dropdown functionality from working - Fixed bug preventing barcodes from updating. in Item CSV Imports - Corrected bug in stock_location->save_value() - Corrected incorrect helper file references. - Removed duplicate call to save attribute link - Rollback transaction on failure before returning false - Rollback transaction and return 0 on failure to save attribute link. - Account for '0' being an acceptable TEXT or DECIMAL attributeValue. - Corrected Business logic - Resolved incorrect array key - Account for 0 in column values - Correct check empty attribute check - Previously 0 would have been skipped even though that's a valid value for an attribute. - Removed unused foreach loop index variables - Corrected CodeIgniter Framework version to specific version UnitTest Seeder and tests - Created a seeder to automatically prepare the test database. - Modified the Unit Test setup to properly seed the test database. - Wrote a unit test to test deleting an attribute from an item through the CSV. - Corrected errors in unit tests preventing them from passing. save_value() returns a bool, not the itemId - Fix Unit Tests that were failing - Corrected the logic in itemUpdate test - Replaced precision test with one reflecting testing of actual value. - This test does not test cash rounding rules. That should go into a different test. - Correct expected value in test. - Update app/Database/Seeds/TestDatabaseBootstrapSeeder.php - Added check to testImportDeleteAttributeFromExistingItem - Correct mocking of dropdowns - Remove code depending on removed database.sql - Removed FQN in seeder() call - Added checks in Database seeder - Moved the function to the attribute model where it belongs which allows testability. Case Change Capability (CSV Import and Form) - CSV Import and view Case Changes of `attribute_value` - Store attribute even when just case is different. - Add getAttributeValueByAttributeId() to assist in comparing the value - Corrected Capitalization in File Handling Logic CSV Import Attribute Link Deletion Capability - Validation checks bypass magic word cells. - Delete the attribute link for an item if the CSV contains `_DELETE_` - Added calls to deleteOrphanedValues() - Items CSV Import Attribute Delete - Exclude the itemId in the check to see if the barcode number exists Error Checking and Reporting Improvements - Fail the import if an invalid stock location is found in the CSV - Return false if deleteAttributeLinks fails - Match sanitization of description field to Form submission import - Fold errors into result and return value - Populated $allowedStockLocations before sending it to the validation function - Added logic to not ignore failed saveItemAttributes calls - Add error checking to failed row insert - Reworked &= to && logic so that it short-circuits the function call after if success is already false. - Add transaction to storeCSVAttributeValue function to prevent deleting the attribute links before confirming the new value successfully saved. - Modified generate_message in Db_log.php to be defensive. Attribute Improvements - Move ATTRIBUTE_VALUE_TYPES to the helper - Normalize AttributeId in saveAttributeLink() - normalize itemId in saveAttributeLink() - Account for '0' in column values for allow_alt_description - Remove duplicate saveAttributeValue call - Correct return value of function - Like other save_value() functions, the location_data variable is passed by reference. - Unlike other save_value() functions, the location_data variable is not being updated with the primary key id. - Added updateAttributeValue() function as part of logic fix. - Added attribute_helper.php - Simplified logic to store attribute values --------- Signed-off-by: objec <objecttothis@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
101 lines
2.4 KiB
PHP
101 lines
2.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @param array $stock_locations
|
|
* @param array $attributes
|
|
* @return string
|
|
*/
|
|
function generate_import_items_csv(array $stock_locations, array $attributes): string
|
|
{
|
|
$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;
|
|
}
|
|
|
|
/**
|
|
* @param array $locations
|
|
* @return string
|
|
*/
|
|
function generate_stock_location_headers(array $locations): string
|
|
{
|
|
$location_headers = '';
|
|
|
|
foreach ($locations as $location_name) {
|
|
$location_headers .= ',"location_' . $location_name . '"';
|
|
}
|
|
|
|
return $location_headers;
|
|
}
|
|
|
|
/**
|
|
* @param array $attribute_names
|
|
* @return string
|
|
*/
|
|
function generate_attribute_headers(array $attribute_names): string
|
|
{
|
|
$attribute_headers = '';
|
|
unset($attribute_names[-1]);
|
|
|
|
foreach ($attribute_names as $attribute_name) {
|
|
$attribute_headers .= ',"attribute_' . $attribute_name . '"';
|
|
}
|
|
|
|
return $attribute_headers;
|
|
}
|
|
|
|
/**
|
|
* Processes a CSV file and returns it.
|
|
* @param string $file_name
|
|
* @return array A multidimensional array of rows found within the file and their associative key/value pairs.
|
|
*/
|
|
function get_csv_file(string $file_name): array
|
|
{
|
|
$csv_rows = false;
|
|
|
|
if (($csv_file = fopen($file_name, 'r')) !== false) {
|
|
helper('security');
|
|
|
|
$csv_rows = [];
|
|
|
|
// Skip Byte-Order Mark
|
|
if (bom_exists($csv_file)) {
|
|
fseek($csv_file, 3);
|
|
}
|
|
|
|
$headers = fgetcsv($csv_file);
|
|
|
|
while (($row = fgetcsv($csv_file)) !== false) {
|
|
if ($row !== [null]) {
|
|
$csv_rows[] = array_combine($headers, $row);
|
|
}
|
|
}
|
|
|
|
fclose($csv_file);
|
|
}
|
|
|
|
return $csv_rows;
|
|
}
|
|
|
|
/**
|
|
* @param $file_handle
|
|
* @return bool
|
|
*/
|
|
function bom_exists(&$file_handle): bool
|
|
{
|
|
$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;
|
|
}
|