Compare commits

..

15 Commits

Author SHA1 Message Date
jekkos
86e150ad96 Update INSTALL.md with opensourcepos.org short URL
- Preferred install URL: https://opensourcepos.org/install
- Falls back to direct GitHub URL if redirect unavailable
- More professional and easier to remember
2026-03-06 10:21:22 +00:00
jekkos
8f4055c711 Add one-line Ubuntu installation script
- Creates scripts/install-ubuntu.sh for automated fresh Ubuntu server setup
- Installs Apache, MariaDB, PHP 8.2 with required extensions
- Downloads and configures OSPOS from GitHub
- Sets up Apache virtual host with proper permissions
- Generates secure random database password
- Supports environment variables for customization
- Updates INSTALL.md with curl pipe to bash instructions

This provides an alternative to cloud-specific instructions and
allows users to quickly set up OSPOS on any fresh Ubuntu server.
2026-03-05 15:11:06 +00:00
jekkos
3c25fd77e2 Add validation for invalid stock locations in CSV import
- Add validateCSVStockLocations() method to check CSV columns against allowed locations
- Log error when invalid stock location columns are detected
- Tests for valid, invalid, and mixed stock location columns
- Tests for location name case sensitivity
- Tests for CSV parsing and detecting location columns
- Add error message language string for invalid locations
2026-03-05 15:06:28 +00:00
jekkos
3f7ea18f18 Add unit tests for CSV import functionality
- Add comprehensive test suite for CSV import in ItemsCsvImportTest.php
- Test CSV header generation (locations, attributes, BOM handling)
- Test CSV file parsing (multiple rows, BOM detection)
- Test item import (basic fields, quantities, inventory records)
- Test item updates, taxes, and attributes
- Test edge cases (zero quantities, negative values, precision)
- Add GitHub Actions workflow for unit tests
- Tests verify data ends up correctly in items/item_quantities tables
2026-03-05 12:57:37 +00:00
jekkos
36bf130bdd Add comprehensive unit tests for PR #4384
This commit adds unit tests for the case-sensitive attribute updates
and CSV import attribute deletion capability features introduced in PR #4384.

Test Coverage:
- Attribute Model Tests (tests/Models/AttributeTest.php):
  - testCaseSensitiveAttributeValueUpdate: Verifies case-insensitive check then case-sensitive update
  - testDeleteAttributeLinks: Tests deletion of attribute links
  - testCategoryDropdownCanBeEnabled: Verifies dropdown enablement bug fix
  - testDropdownAttributeValueSave: Tests DROPDOWN type attributes
  - testDateAttributeValueSave/Update: Tests DATE type attributes
  - testDecimalAttributeValueSave: Tests DECIMAL type attributes
  - testCheckboxAttributeValueSave: Tests CHECKBOX type attributes
  - testCategoryDropdownWithConstant: Tests CATEGORY_DEFINITION_ID usage
  - testDeleteAttributeLinksPreservesSalesAndReceivings: Ensures sales/receivings links protected
  - testDeleteOrphanedValues: Tests orphan value cleanup
  - testUnicodeCaseComparison: Tests Unicode handling in case comparisons
  - testGetAttributeValueByAttributeId: Tests new utility method
  - testAttributeLinkWithNullAttributeId: Tests null attribute_id handling
  - testCategoryDropdownUpdatesItemCategory: Tests category dropdown behavior

- Attribute Helper Tests (tests/Helpers/AttributeHelperTest.php):
  - Test getAttributeDataType for all attribute types (TEXT, DECIMAL, DATE, DROPDOWN, CHECKBOX)
  - Test getAttributeDataType returns 'attribute_value' as fallback for invalid types
  - Test validateAttributeValueType throws InvalidArgumentException for invalid types
  - Test validateAttributeValueType accepts valid data types

- Import File Helper Tests (tests/Helpers/ImportFileHelperTest.php):
  - Tests _DELETE_ magic word case-insensitive comparison using strcasecmp
  - Tests that _DELETE_ does not match similar-looking strings (security)
  - Tests empty string does not match _DELETE_
  - Tests null safety considerations for strcasecmp usage

Test Configuration:
- Updated phpunit.xml to include Models and Controllers test suites
- Uses DatabaseTestTrait for database migration between tests
- Tests cover positive and negative cases
- Tests include edge cases: Unicode, null values, empty strings, similar strings

Files Added:
- tests/Models/AttributeTest.php (26,541 bytes, 16 test methods)
- tests/Helpers/AttributeHelperTest.php (3,331 bytes, 8 test methods)
- tests/Helpers/ImportFileHelperTest.php (2,906 bytes, 4 test methods)

Total: 28 test methods covering all new features and edge cases

Note: Tests currently designed; will run once PHP environment is configured.
2026-03-04 20:48:10 +00:00
objec
088ad47c99 CSV Barcode Update Bug
- Refactored variable names for PSR compliance
- Removed bug preventing updates in CSV import files from updating the barcode number.
- Corrected duplicate saveAttributeLink() calls with attribute type was not DROPDOWN.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-27 18:00:30 +04:00
objec
808840b2e9 Implement Magic word deletion in CSV import
- Corrected spacing
- Added business logic to delete an attribute_link if the import contains `_DELETE_` in that space.
- Removed unneeded PHPdoc comments
- Improved PHPdoc to clarify behavior of function
- Refactor variable names for PSR compliance
- Add logic in validation code for magic word

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-27 16:53:03 +04:00
objec
2ed74c5c0e Resolve review comments
- Replaced -1 for CATEGORY_DEFINITION_ID constant for readability

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-27 00:31:51 +04:00
objec
c935fc7a2a Resolve review comments
- Move validation function to attribute_helper.php
- Removed extra line in security_helper.php
- Corrected some calls to helper() that included `_helper`

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-26 23:16:39 +04:00
objec
89012054b4 Resolve review comments
- Fixed call to deleteOrphanedValues that refactor missed.
- Removed unused import.
- Fixed issue preventing DROPDOWN values from being added.
- Updated logic to fix potential TypeError being thrown by strcasecmp()

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-26 15:16:51 +04:00
objec
89572aa289 Resolve review comments
- Replaced unneeded case-sensitive database search with case-insensitive variant.
- Added input validation.
- Added logic to properly check for case changes in CSV import.
- Moved deleteOrphanedValues() to outside a foreach loop to prevent it running redundantly.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-26 13:52:14 +04:00
objec
2b56d56072 Resolve business logic bugs
- Fixed logic causing attribute_value to be updated to a value that already exists for a different attribute_id.
- Added logic for edge case where an attribute_value was updated due to capitalization that had a row in attribute_links for category_dropdown definitions (definition_id = -1). This will also update the items.category values to correct the capitalization of those.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-26 12:28:48 +04:00
objec
2fc9fc09a4 Comment Resolutions
- Removed redundant variable declaration.
- Refactored local variables for PSR compliance.
- Add back in Date Formatting and corrected business logic
- Corrected spacing in comments.
- Corrected business logic of function call in Attribute model and refactored redundant code to a private function.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-26 00:19:57 +04:00
objec
932b612c9e Case-sensitive attribute update in Item view
- Refactored local variables for PSR compliance
- Added business logic to Attribute->saveAttributeValue so that the attribute value gets overwritten if the only difference is capitalization.
- Added PHPdocs
- Fixed bug in Attribute->saveDefinition preventing category as dropdown from working.
- Modified Attribute->saveAttributeLink() to account for dropdown attributes.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-25 19:22:02 +04:00
objec
ab6e8ee083 Case-sensitive attributes in CSV imports
- Added attribute_helper.php and getAttributeDataType function for quick translation in the code.
- Refactored code for PSR compliance
- Added getAttributeValueByAttributeId() to the attribute model.
- Added PHPdocs where it was missing
- Updated business logic to check for capitalization differences on CSV import of an item.

Signed-off-by: objec <objecttothis@gmail.com>
2026-02-25 16:30:21 +04:00
268 changed files with 2705 additions and 7450 deletions

View File

@@ -1,33 +0,0 @@
name: opencode
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
opencode:
if: |
contains(github.event.comment.body, ' /oc') ||
startsWith(github.event.comment.body, '/oc') ||
contains(github.event.comment.body, ' /opencode') ||
startsWith(github.event.comment.body, '/opencode')
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
pull-requests: read
issues: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
persist-credentials: false
- name: Run opencode
uses: anomalyco/opencode/github@latest
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
with:
model: anthropic/claude-3-haiku-20240307

View File

@@ -1,126 +0,0 @@
name: PHPUnit Tests
on:
push:
paths:
- '**.php'
- 'spark'
- 'tests/**'
- '.github/workflows/phpunit.yml'
- 'gulpfile.js'
- 'app/Database/**'
pull_request:
paths:
- '**.php'
- 'spark'
- 'tests/**'
- '.github/workflows/phpunit.yml'
- 'gulpfile.js'
- 'app/Database/**'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
jobs:
test:
name: PHP ${{ matrix.php-version }} Tests
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
php-version:
- '8.1'
- '8.2'
- '8.3'
- '8.4'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: intl, mbstring, mysqli
coverage: none
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Get npm cache directory
run: echo "NPM_CACHE_DIR=$(npm config get cache)" >> $GITHUB_ENV
- name: Cache npm dependencies
uses: actions/cache@v3
with:
path: ${{ env.NPM_CACHE_DIR }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install npm dependencies
run: npm install
- name: Build database.sql
run: npm run gulp build-database
- name: Start MariaDB
run: |
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=ospos \
-e MYSQL_USER=admin \
-e MYSQL_PASSWORD=pointofsale \
-v $PWD/app/Database/database.sql:/docker-entrypoint-initdb.d/database.sql \
-p 3306:3306 \
mariadb:10.5
# Wait for MariaDB to be ready
until docker exec mysql mysqladmin ping -h 127.0.0.1 -u root -proot --silent; do
echo "Waiting for MariaDB..."
sleep 2
done
echo "MariaDB is ready!"
- name: Get composer cache directory
run: echo "COMPOSER_CACHE_FILES_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ${{ env.COMPOSER_CACHE_FILES_DIR }}
key: ${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.php-version }}-
${{ runner.os }}-
- name: Install dependencies
run: composer update --ansi --no-interaction
- name: Create .env file
run: cp .env.example .env
- name: Run PHPUnit tests
env:
CI_ENVIRONMENT: testing
MYSQL_HOST_NAME: 127.0.0.1
run: composer test -- --log-junit test-results/junit.xml
- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results-php-${{ matrix.php-version }}
path: test-results/
retention-days: 30
- name: Stop MariaDB
if: always()
run: docker stop mysql && docker rm mysql

116
.github/workflows/unit-tests.yml vendored Normal file
View File

@@ -0,0 +1,116 @@
name: Unit Tests
on:
push:
paths:
- 'app/**/*.php'
- 'tests/**/*.php'
- '.github/workflows/unit-tests.yml'
pull_request:
paths:
- 'app/**/*.php'
- 'tests/**/*.php'
- '.github/workflows/unit-tests.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
jobs:
test:
name: PHP ${{ matrix.php-version }} Unit Tests
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
php-version:
- '8.1'
- '8.2'
- '8.3'
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: ospos_test
MYSQL_USER: ospos
MYSQL_PASSWORD: ospos
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping --silent"
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: intl, mysqli, pdo_mysql, mbstring, json, dom, xml
coverage: xdebug
- name: Get composer cache directory
run: echo "COMPOSER_CACHE_FILES_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ${{ env.COMPOSER_CACHE_FILES_DIR }}
key: ${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-${{ matrix.php-version }}-
${{ runner.os }}-
- name: Install dependencies
run: composer install --no-progress --ansi --no-interaction
- name: Wait for MySQL
run: |
while ! mysqladmin ping -h"127.0.0.1" --silent; do
echo "Waiting for MySQL..."
sleep 1
done
- name: Setup test database
run: |
mysql -h 127.0.0.1 -u root -proot -e "CREATE DATABASE IF NOT EXISTS ospos_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -h 127.0.0.1 -u root -proot -e "GRANT ALL PRIVILEGES ON ospos_test.* TO 'ospos'@'%' IDENTIFIED BY 'ospos';"
mysql -h 127.0.0.1 -u root -proot -e "FLUSH PRIVILEGES;"
- name: Copy test environment config
run: |
if [ -f ".env.testing" ]; then
cp .env.testing .env
else
cp .env.example .env
fi
- name: Run migrations
run: php spark migrate --all || true
- name: Run unit tests
run: vendor/bin/phpunit --configuration tests/phpunit.xml --testsuite Helpers,Models,Controllers --colors=always --verbose
- name: Generate test report
if: always()
run: |
vendor/bin/phpunit --configuration tests/phpunit.xml --testsuite Helpers,Models,Controllers --log-junit build/logs/junit.xml --coverage-clover build/logs/clover.xml || true
echo "Test run completed"
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-php-${{ matrix.php-version }}
path: build/logs/
retention-days: 30

View File

@@ -28,7 +28,7 @@ script:
env:
global:
- BRANCH=$(echo ${TRAVIS_BRANCH} | sed s/feature\\///)
- TAG=$(echo "${TRAVIS_TAG:-$BRANCH}" | tr '/' '-')
- TAG=${TRAVIS_TAG:-$BRANCH}
- date=`date +%Y%m%d%H%M%S` && branch=${TRAVIS_BRANCH} && rev=`git rev-parse --short=6 HEAD`
after_success:
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" && docker tag "ospos:latest"

View File

@@ -63,3 +63,39 @@ Do **not** use below command on live deployments unless you want to tear everyth
If you choose DigitalOcean:
[Through this link](https://m.do.co/c/ac38c262507b), you will get a [**free $100, 60-day credit**](https://m.do.co/c/ac38c262507b). [Check the wiki](https://github.com/opensourcepos/opensourcepos/wiki/Getting-Started-installations) for further instructions on how to install the necessary components.
## One-line Ubuntu Installation
For a fresh Ubuntu server (20.04 LTS or newer), you can install OSPOS directly with:
```bash
curl -sSL https://opensourcepos.org/install | sudo bash
```
> **Note:** This URL redirects to the latest installation script from the official repository. If the redirect is unavailable, use the direct GitHub URL:
> ```bash
> curl -sSL https://raw.githubusercontent.com/opensourcepos/opensourcepos/master/scripts/install-ubuntu.sh | sudo bash
> ```
This script will:
- Install Apache, MariaDB, PHP 8.2 and required extensions
- Create a MySQL database and user with a secure random password
- Download and configure OSPOS
- Set up Apache virtual host with proper permissions
- Display login credentials after completion
**Environment Variables (optional):**
- `DB_NAME` - Database name (default: ospos)
- `DB_USER` - Database user (default: ospos)
- `DB_PASS` - Database password (default: auto-generated)
- `OSPOS_DIR` - Installation directory (default: /var/www/ospos)
- `OSPOS_BRANCH` - Git branch to install (default: master)
- `PHP_VERSION` - PHP version (default: 8.2)
- `APACHE_SERVER_NAME` - Server hostname (default: localhost)
Example with custom settings:
```bash
curl -sSL https://opensourcepos.org/install | DB_PASS=mypassword APACHE_SERVER_NAME=pos.example.com sudo -E bash
```
**Note:** This script is designed for fresh servers. For production use, ensure you configure SSL/TLS certificates after installation.

View File

@@ -205,7 +205,6 @@ class Autoload extends AutoloadConfig
'cookie',
'tabular',
'locale',
'security',
'plugin'
'security'
];
}

View File

@@ -1,23 +1,38 @@
<?php
/*
* The environment testing is reserved for PHPUnit testing. It has special
* conditions built into the framework at various places to assist with that.
* You cant use it for your development.
*/
/*
|--------------------------------------------------------------------------
| ERROR DISPLAY
| ERROR DISPLAY
|--------------------------------------------------------------------------
*/
| In development, we want to show as many errors as possible to help
| make sure they don't make it to production. And save us hours of
| painful debugging.
*/
error_reporting(E_ALL);
ini_set('display_errors', '1');
/*
|--------------------------------------------------------------------------
| DEBUG BACKTRACES
| DEBUG BACKTRACES
|--------------------------------------------------------------------------
*/
| If true, this constant will tell the error screens to display debug
| backtraces along with the other error information. If you would
| prefer to not see this, set this value to false.
*/
defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true);
/*
|--------------------------------------------------------------------------
| DEBUG MODE
| DEBUG MODE
|--------------------------------------------------------------------------
*/
defined('CI_DEBUG') || define('CI_DEBUG', true);
| Debug mode is an experimental flag that can allow changes throughout
| the system. It's not widely used currently, and may not survive
| release of the framework.
*/
defined('CI_DEBUG') || define('CI_DEBUG', true);

View File

@@ -100,6 +100,7 @@ const CHECKBOX = 'CHECKBOX';
const NO_DEFINITION_ID = 0;
const CATEGORY_DEFINITION_ID = -1;
const DEFINITION_TYPES = [GROUP, DROPDOWN, DECIMAL, TEXT, DATE, CHECKBOX];
const ATTRIBUTE_VALUE_TYPES = ['attribute_value', 'attribute_decimal', 'attribute_date'];
/**
* Item Related Constants.
@@ -169,8 +170,3 @@ const MAX_PRECISION = 1e14;
const DEFAULT_PRECISION = 2;
const DEFAULT_LANGUAGE = 'english';
const DEFAULT_LANGUAGE_CODE = 'en';
/**
* Admin modules - list of modules required for admin privileges
*/
const ADMIN_MODULES = ['customers', 'employees', 'giftcards', 'items', 'item_kits', 'messages', 'receivings', 'reports', 'sales', 'config', 'suppliers'];

View File

@@ -8,7 +8,23 @@ use CodeIgniter\HotReloader\HotReloader;
use App\Events\Db_log;
use App\Events\Load_config;
use App\Events\Method;
use App\Libraries\Plugins\PluginManager;
/*
* --------------------------------------------------------------------
* Application Events
* --------------------------------------------------------------------
* Events allow you to tap into the execution of the program without
* modifying or extending core files. This file provides a central
* location to define your events, though they can always be added
* at run-time, also, if needed.
*
* You create code that can execute by subscribing to events with
* the 'on()' method. This accepts any form of callable, including
* Closures, that will be executed when the event is triggered.
*
* Example:
* Events::on('create', [$myInstance, 'myMethod']);
*/
Events::on('pre_system', static function (): void {
if (ENVIRONMENT !== 'testing') {
@@ -23,19 +39,22 @@ Events::on('pre_system', static function (): void {
ob_start(static fn ($buffer) => $buffer);
}
/*
* --------------------------------------------------------------------
* Debug Toolbar Listeners.
* --------------------------------------------------------------------
* If you delete, they will no longer be collected.
*/
if (CI_DEBUG && ! is_cli()) {
Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
service('toolbar')->respond();
// Hot Reload route - for framework use on the hot reloader.
if (ENVIRONMENT === 'development') {
service('routes')->get('__hot-reload', static function (): void {
(new HotReloader())->run();
});
}
}
$pluginManager = new PluginManager();
$pluginManager->discoverPlugins();
$pluginManager->registerPluginEvents();
});
$config = new Load_config();
@@ -45,4 +64,4 @@ $db_log = new Db_log();
Events::on('DBQuery', [$db_log, 'db_log_queries']);
$method = new Method();
Events::on('pre_controller', [$method, 'validate_method']);
Events::on('pre_controller', [$method, 'validate_method']);

View File

@@ -100,25 +100,9 @@ class Filters extends BaseFilters
* before or after URI patterns.
*
* Example:
* isLoggedIn' => ['before' => ['account/*', 'profiles/*']]
* 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']]
*
* @var array<string, array<string, list<string>>>
*/
public array $filters = [];
/**
* Constructor to conditionally disable CSRF filter in testing environment
*/
public function __construct()
{
// Check for testing environment via env variable or constant
$isTesting = ($_ENV['CI_ENVIRONMENT'] ?? $_SERVER['CI_ENVIRONMENT'] ?? getenv('CI_ENVIRONMENT')) === 'testing'
|| (defined('ENVIRONMENT') && ENVIRONMENT === 'testing');
// Remove CSRF filter from globals in testing environment
if ($isTesting) {
// Remove the 'csrf' key from $globals['before'] while preserving array structure
$this->globals['before'] = array_filter($this->globals['before'], static fn($key) => $key !== 'csrf', ARRAY_FILTER_USE_KEY);
}
}
}

View File

@@ -13,9 +13,9 @@ class Security extends BaseConfig
*
* Protection Method for Cross Site Request Forgery protection.
*
* @var string|false 'cookie', 'session', or false
* @var string 'cookie' or 'session'
*/
public string|false $csrfProtection = 'session';
public string $csrfProtection = 'session';
/**
* --------------------------------------------------------------------------

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Attribute;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
require_once('Secure_Controller.php');
@@ -25,19 +24,19 @@ class Attributes extends Secure_Controller
/**
* Gets and sends the main view for Attributes to the browser.
*
* @return string
* @return void
**/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_attribute_definition_manage_table_headers();
return view('attributes/manage', $data);
echo view('attributes/manage', $data);
}
/**
* Returns attribute table data rows. This will be called with AJAX.
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -54,15 +53,15 @@ class Attributes extends Secure_Controller
$data_rows[] = get_attribute_definition_data_row($attribute_row);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* AJAX called function which saves the attribute value sent via POST by using the model save function.
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveAttributeValue(): ResponseInterface
public function postSaveAttributeValue(): void
{
$success = $this->attribute->saveAttributeValue(
html_entity_decode($this->request->getPost('attribute_value')),
@@ -71,32 +70,32 @@ class Attributes extends Secure_Controller
$this->request->getPost('attribute_id', FILTER_SANITIZE_NUMBER_INT) ?? false
);
return $this->response->setJSON(['success' => $success != 0]);
echo json_encode(['success' => $success != 0]);
}
/**
* AJAX called function deleting an attribute value using the model delete function.
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postDeleteDropdownAttributeValue(): ResponseInterface
public function postDeleteDropdownAttributeValue(): void
{
$success = $this->attribute->deleteDropdownAttributeValue(
html_entity_decode($this->request->getPost('attribute_value')),
$this->request->getPost('definition_id', FILTER_SANITIZE_NUMBER_INT)
);
return $this->response->setJSON(['success' => $success]);
echo json_encode(['success' => $success]);
}
/**
* AJAX called function which saves the attribute definition.
*
* @param int $definition_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveDefinition(int $definition_id = NO_DEFINITION_ID): ResponseInterface
public function postSaveDefinition(int $definition_id = NO_DEFINITION_ID): void
{
$definition_flags = 0;
@@ -120,7 +119,7 @@ class Attributes extends Secure_Controller
$definition_name = $definition_data['definition_name'];
if ($this->attribute->save_definition($definition_data, $definition_id)) {
if ($this->attribute->saveDefinition($definition_data, $definition_id)) {
// New definition
if ($definition_id == NO_DEFINITION_ID) {
$definition_values = json_decode(html_entity_decode($this->request->getPost('definition_values')));
@@ -129,20 +128,20 @@ class Attributes extends Secure_Controller
$this->attribute->saveAttributeValue($definition_value, $definition_data['definition_id']);
}
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Attributes.definition_successful_adding') . ' ' . $definition_name,
'id' => $definition_data['definition_id']
]);
} else { // Existing definition
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Attributes.definition_successful_updating') . ' ' . $definition_name,
'id' => $definition_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Attributes.definition_error_adding_updating', [$definition_name]),
'id' => NEW_ENTRY
@@ -153,27 +152,27 @@ class Attributes extends Secure_Controller
/**
*
* @param int $definition_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggestAttribute(int $definition_id): ResponseInterface
public function getSuggestAttribute(int $definition_id): void
{
$suggestions = $this->attribute->get_suggestions($definition_id, html_entity_decode($this->request->getGet('term')));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$attribute_definition_info = $this->attribute->getAttributeInfo($row_id);
$attribute_definition_info->definition_flags = $this->get_attributes($attribute_definition_info->definition_flags);
$data_row = get_attribute_definition_data_row($attribute_definition_info);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
@@ -193,9 +192,9 @@ class Attributes extends Secure_Controller
/**
* @param int $definition_id
* @return string
* @return void
*/
public function getView(int $definition_id = NO_DEFINITION_ID): string
public function getView(int $definition_id = NO_DEFINITION_ID): void
{
$info = $this->attribute->getAttributeInfo($definition_id);
foreach (get_object_vars($info) as $property => $value) {
@@ -213,22 +212,22 @@ class Attributes extends Secure_Controller
$selected_flags = $info->definition_flags === '' ? $show_all : $info->definition_flags;
$data['selected_definition_flags'] = $this->get_attributes($selected_flags);
return view('attributes/form', $data);
echo view('attributes/form', $data);
}
/**
* Deletes an attribute definition
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$attributes_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if($this->attribute->deleteDefinitionList($attributes_to_delete)) {
$message = lang('Attributes.definition_successful_deleted') . ' ' . count($attributes_to_delete) . ' ' . lang('Attributes.definition_one_or_multiple');
return $this->response->setJSON(['success' => true, 'message' => $message]);
echo json_encode(['success' => true, 'message' => $message]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Attributes.definition_cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Attributes.definition_cannot_be_deleted')]);
}
}
}

View File

@@ -5,7 +5,6 @@ namespace App\Controllers;
use App\Models\Cashup;
use App\Models\Expense;
use App\Models\Reports\Summary_payments;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -27,22 +26,22 @@ class Cashups extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_cashups_manage_table_headers();
// filters that will be loaded in the multiselect dropdown
$data['filters'] = ['is_deleted' => lang('Cashups.is_deleted')];
return view('cashups/manage', $data);
echo view('cashups/manage', $data);
}
/**
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -65,14 +64,14 @@ class Cashups extends Secure_Controller
$data_rows[] = get_cash_up_data_row($cash_up);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @param int $cashup_id
* @return string
* @return void
*/
public function getView(int $cashup_id = NEW_ENTRY): string
public function getView(int $cashup_id = NEW_ENTRY): void
{
$data = [];
@@ -181,26 +180,26 @@ class Cashups extends Secure_Controller
$data['cash_ups_info'] = $cash_ups_info;
return view("cashups/form", $data);
echo view("cashups/form", $data);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$cash_ups_info = $this->cashup->get_info($row_id);
$data_row = get_cash_up_data_row($cash_ups_info);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $cashup_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $cashup_id = NEW_ENTRY): ResponseInterface
public function postSave(int $cashup_id = NEW_ENTRY): void
{
$open_date = $this->request->getPost('open_date');
$open_date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $open_date);
@@ -228,36 +227,36 @@ class Cashups extends Secure_Controller
if ($this->cashup->save_value($cash_up_data, $cashup_id)) {
// New cashup_id
if ($cashup_id == NEW_ENTRY) {
return $this->response->setJSON(['success' => true, 'message' => lang('Cashups.successful_adding'), 'id' => $cash_up_data['cashup_id']]);
echo json_encode(['success' => true, 'message' => lang('Cashups.successful_adding'), 'id' => $cash_up_data['cashup_id']]);
} else { // Existing Cashup
return $this->response->setJSON(['success' => true, 'message' => lang('Cashups.successful_updating'), 'id' => $cashup_id]);
echo json_encode(['success' => true, 'message' => lang('Cashups.successful_updating'), 'id' => $cashup_id]);
}
} else { // Failure
return $this->response->setJSON(['success' => false, 'message' => lang('Cashups.error_adding_updating'), 'id' => NEW_ENTRY]);
echo json_encode(['success' => false, 'message' => lang('Cashups.error_adding_updating'), 'id' => NEW_ENTRY]);
}
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$cash_ups_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($this->cashup->delete_list($cash_ups_to_delete)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Cashups.successful_deleted') . ' ' . count($cash_ups_to_delete) . ' ' . lang('Cashups.one_or_multiple'), 'ids' => $cash_ups_to_delete]);
echo json_encode(['success' => true, 'message' => lang('Cashups.successful_deleted') . ' ' . count($cash_ups_to_delete) . ' ' . lang('Cashups.one_or_multiple'), 'ids' => $cash_ups_to_delete]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Cashups.cannot_be_deleted'), 'ids' => $cash_ups_to_delete]);
echo json_encode(['success' => false, 'message' => lang('Cashups.cannot_be_deleted'), 'ids' => $cash_ups_to_delete]);
}
}
/**
* Calculate the total for cashups. Used in app\Views\cashups\form.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postAjax_cashup_total(): ResponseInterface
public function postAjax_cashup_total(): void
{
$open_amount_cash = parse_decimals($this->request->getPost('open_amount_cash'));
$transfer_amount_cash = parse_decimals($this->request->getPost('transfer_amount_cash'));
@@ -268,7 +267,7 @@ class Cashups extends Secure_Controller
$total = $this->_calculate_total($open_amount_cash, $transfer_amount_cash, $closed_amount_due, $closed_amount_cash, $closed_amount_card, $closed_amount_check); // TODO: hungarian notation
return $this->response->setJSON(['total' => to_currency_no_money($total)]);
echo json_encode(['total' => to_currency_no_money($total)]);
}
/**

View File

@@ -17,7 +17,6 @@ use App\Models\Stock_location;
use App\Models\Tax;
use CodeIgniter\Database\BaseConnection;
use CodeIgniter\Encryption\EncrypterInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Database;
use Config\OSPOS;
use Config\Services;
@@ -216,9 +215,8 @@ class Config extends Secure_Controller
}
/**
* @return string
*/
public function getIndex(): string
public function getIndex(): void
{
$data['stock_locations'] = $this->stock_location->get_all()->getResultArray();
$data['dinner_tables'] = $this->dinner_table->get_all()->getResultArray();
@@ -226,7 +224,6 @@ class Config extends Secure_Controller
$data['support_barcode'] = $this->barcode_lib->get_list_barcodes();
$data['barcode_fonts'] = $this->barcode_lib->listfonts('fonts');
$data['logo_exists'] = $this->config['company_logo'] != '';
$data['logo_src'] = !empty($this->config['company_logo']) ? base_url('uploads/' . $this->config['company_logo']) : '';
$data['line_sequence_options'] = $this->sale_lib->get_line_sequence_options();
$data['register_mode_options'] = $this->sale_lib->get_register_mode_options();
$data['invoice_type_options'] = $this->sale_lib->get_invoice_type_options();
@@ -275,17 +272,17 @@ class Config extends Secure_Controller
$data['mailchimp']['lists'] = $this->_mailchimp();
return view('configs/manage', $data);
echo view('configs/manage', $data);
}
/**
* Saves company information. Used in app/Views/configs/info_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveInfo(): ResponseInterface
public function postSaveInfo(): void
{
$upload_data = $this->upload_logo();
$upload_success = empty($upload_data['error']);
@@ -309,7 +306,7 @@ class Config extends Secure_Controller
$message = lang('Config.saved_' . ($success ? '' : 'un') . 'successfully');
$message = $upload_success ? $message : strip_tags($upload_data['error']);
return $this->response->setJSON(['success' => $success, 'message' => $message]);
echo json_encode(['success' => $success, 'message' => $message]);
}
@@ -361,12 +358,11 @@ class Config extends Secure_Controller
* Saves general configuration. Used in app/Views/configs/general_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function postSaveGeneral(): ResponseInterface
public function postSaveGeneral(): void
{
$batch_save_data = [
$batchSaveData = [
'theme' => $this->request->getPost('theme'),
'login_form' => $this->request->getPost('login_form'),
'default_sales_discount_type' => $this->request->getPost('default_sales_discount_type') != null,
@@ -397,30 +393,30 @@ class Config extends Secure_Controller
$this->module->set_show_office_group($this->request->getPost('show_office_group') != null);
if ($batch_save_data['category_dropdown'] == 1) {
$definition_data['definition_name'] = 'ospos_category';
$definition_data['definition_flags'] = 0;
$definition_data['definition_type'] = 'DROPDOWN';
$definition_data['definition_id'] = CATEGORY_DEFINITION_ID;
$definition_data['deleted'] = 0;
if ($batchSaveData['category_dropdown']) {
$definitionData['definition_name'] = 'ospos_category';
$definitionData['definition_flags'] = 0;
$definitionData['definition_type'] = 'DROPDOWN';
$definitionData['definition_id'] = CATEGORY_DEFINITION_ID;
$definitionData['deleted'] = 0;
$this->attribute->save_definition($definition_data, CATEGORY_DEFINITION_ID);
} elseif ($batch_save_data['category_dropdown'] == NO_DEFINITION_ID) {
$this->attribute->saveDefinition($definitionData, CATEGORY_DEFINITION_ID);
} elseif ($batchSaveData['category_dropdown'] == NO_DEFINITION_ID) {
$this->attribute->deleteDefinition(CATEGORY_DEFINITION_ID);
}
$success = $this->appconfig->batch_save($batch_save_data);
$success = $this->appconfig->batch_save($batchSaveData);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Checks a number against the currently selected locale. Used in app/Views/configs/locale_config.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckNumberLocale(): ResponseInterface
public function postCheckNumberLocale(): void
{
$number_locale = $this->request->getPost('number_locale');
$save_number_locale = $this->request->getPost('save_number_locale');
@@ -442,7 +438,7 @@ class Config extends Secure_Controller
$fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $currency_symbol);
$number_local_example = $fmt->format(1234567890.12300);
return $this->response->setJSON([
echo json_encode([
'success' => $number_local_example != false,
'save_number_locale' => $save_number_locale,
'number_locale_example' => $number_local_example,
@@ -455,15 +451,14 @@ class Config extends Secure_Controller
* Saves locale configuration. Used in app/Views/configs/locale_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveLocale(): ResponseInterface
public function postSaveLocale(): void
{
$exploded = explode(":", $this->request->getPost('language'));
$currency_symbol = $this->request->getPost('currency_symbol');
$batch_save_data = [
'currency_symbol' => htmlspecialchars($currency_symbol ?? ''),
'currency_symbol' => $this->request->getPost('currency_symbol'),
'currency_code' => $this->request->getPost('currency_code'),
'language_code' => $exploded[0],
'language' => $exploded[1],
@@ -485,17 +480,17 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves email configuration. Used in app/Views/configs/email_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveEmail(): ResponseInterface
public function postSaveEmail(): void
{
$password = '';
@@ -516,17 +511,17 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves SMS message configuration. Used in app/Views/configs/message_config.php.
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveMessage(): ResponseInterface
public function postSaveMessage(): void
{
$password = '';
@@ -543,7 +538,7 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
@@ -570,15 +565,15 @@ class Config extends Secure_Controller
/**
* Gets Mailchimp lists when a valid API key is inserted. Used in app/Views/configs/integrations_config.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckMailchimpApiKey(): ResponseInterface
public function postCheckMailchimpApiKey(): void
{
$lists = $this->_mailchimp($this->request->getPost('mailchimp_api_key'));
$success = count($lists) > 0;
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Config.mailchimp_key_' . ($success ? '' : 'un') . 'successfully'),
'mailchimp_lists' => $lists
@@ -589,10 +584,10 @@ class Config extends Secure_Controller
* Saves Mailchimp configuration. Used in app/Views/configs/integrations_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveMailchimp(): ResponseInterface
public function postSaveMailchimp(): void
{
$api_key = '';
$list_id = '';
@@ -613,56 +608,56 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Gets all stock locations. Used in app/Views/configs/stock_config.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getStockLocations(): string
public function getStockLocations(): void
{
$stock_locations = $this->stock_location->get_all()->getResultArray();
return view('partial/stock_locations', ['stock_locations' => $stock_locations]);
echo view('partial/stock_locations', ['stock_locations' => $stock_locations]);
}
/**
* @return string
* @return void
*/
public function getDinnerTables(): string
public function getDinnerTables(): void
{
$dinner_tables = $this->dinner_table->get_all()->getResultArray();
return view('partial/dinner_tables', ['dinner_tables' => $dinner_tables]);
echo view('partial/dinner_tables', ['dinner_tables' => $dinner_tables]);
}
/**
* Gets all tax categories.
*
* @return string
* @return void
*/
public function ajax_tax_categories(): string // TODO: Is this function called anywhere in the code?
public function ajax_tax_categories(): void // TODO: Is this function called anywhere in the code?
{
$tax_categories = $this->tax->get_all_tax_categories()->getResultArray();
return view('partial/tax_categories', ['tax_categories' => $tax_categories]);
echo view('partial/tax_categories', ['tax_categories' => $tax_categories]);
}
/**
* Gets all customer rewards. Used in app/Views/configs/reward_config.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getCustomerRewards(): string
public function getCustomerRewards(): void
{
$customer_rewards = $this->customer_rewards->get_all()->getResultArray();
return view('partial/customer_rewards', ['customer_rewards' => $customer_rewards]);
echo view('partial/customer_rewards', ['customer_rewards' => $customer_rewards]);
}
/**
@@ -682,10 +677,10 @@ class Config extends Secure_Controller
/**
* Saves stock locations. Used in app/Views/configs/stock_config.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveLocations(): ResponseInterface
public function postSaveLocations(): void
{
$this->db->transStart();
@@ -717,17 +712,17 @@ class Config extends Secure_Controller
$success = $this->db->transStatus();
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves all dinner tables. Used in app/Views/configs/table_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveTables(): ResponseInterface
public function postSaveTables(): void
{
$this->db->transStart();
@@ -764,17 +759,17 @@ class Config extends Secure_Controller
$success = $this->db->transStatus();
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves tax configuration. Used in app/Views/configs/tax_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveTax(): ResponseInterface
public function postSaveTax(): void
{
$default_tax_1_rate = $this->request->getPost('default_tax_1_rate');
$default_tax_2_rate = $this->request->getPost('default_tax_2_rate');
@@ -796,17 +791,17 @@ class Config extends Secure_Controller
$message = lang('Config.saved_' . ($success ? '' : 'un') . 'successfully');
return $this->response->setJSON(['success' => $success, 'message' => $message]);
echo json_encode(['success' => $success, 'message' => $message]);
}
/**
* Saves customer rewards configuration. Used in app/Views/configs/reward_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function postSaveRewards(): ResponseInterface
* @throws ReflectionException
* @return void
* @noinspection PhpUnused
*/
public function postSaveRewards(): void
{
$this->db->transStart();
@@ -850,17 +845,17 @@ class Config extends Secure_Controller
$success = $this->db->transStatus();
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves barcode configuration. Used in app/Views/configs/barcode_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveBarcode(): ResponseInterface
public function postSaveBarcode(): void
{
$batch_save_data = [
'barcode_type' => $this->request->getPost('barcode_type'),
@@ -882,17 +877,17 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves receipt configuration. Used in app/Views/configs/receipt_config.php.
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveReceipt(): ResponseInterface
public function postSaveReceipt(): void
{
$batch_save_data = [
'receipt_template' => $this->request->getPost('receipt_template'),
@@ -917,17 +912,17 @@ class Config extends Secure_Controller
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Saves invoice configuration. Used in app/Views/configs/invoice_config.php.
*
* @throws ReflectionException
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSaveInvoice(): ResponseInterface
public function postSaveInvoice(): void
{
$batch_save_data = [
'invoice_enable' => $this->request->getPost('invoice_enable') != null,
@@ -943,9 +938,7 @@ class Config extends Secure_Controller
'work_order_enable' => $this->request->getPost('work_order_enable') != null,
'work_order_format' => $this->request->getPost('work_order_format'),
'last_used_work_order_number' => $this->request->getPost('last_used_work_order_number', FILTER_SANITIZE_NUMBER_INT),
'invoice_type' => Sale_lib::isValidInvoiceType($this->request->getPost('invoice_type'))
? $this->request->getPost('invoice_type')
: 'invoice'
'invoice_type' => $this->request->getPost('invoice_type')
];
$success = $this->appconfig->batch_save($batch_save_data);
@@ -960,20 +953,20 @@ class Config extends Secure_Controller
}
}
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Removes the company logo from the database. Used in app/Views/configs/info_config.php.
*
* @return ResponseInterface
* @return void
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postRemoveLogo(): ResponseInterface
public function postRemoveLogo(): void
{
$success = $this->appconfig->save(['company_logo' => '']);
return $this->response->setJSON(['success' => $success]);
echo json_encode(['success' => $success]);
}
}

View File

@@ -8,7 +8,6 @@ use App\Models\Customer;
use App\Models\Customer_rewards;
use App\Models\Tax_code;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
use stdClass;
@@ -41,20 +40,19 @@ class Customers extends Persons
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_customer_manage_table_headers();
return view('people/manage', $data);
echo view('people/manage', $data);
}
/**
* Gets one row for a customer manage table. This is called using AJAX to update one row.
* @return ResponseInterface
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$person = $this->customer->get_info($row_id);
@@ -74,7 +72,7 @@ class Customers extends Persons
$data_row = get_customer_data_row($person, $stats);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
@@ -83,7 +81,7 @@ class Customers extends Persons
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -113,37 +111,35 @@ class Customers extends Persons
$data_rows[] = get_customer_data_row($person, $stats);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* Gives search suggestions based on what is being searched for
* @return ResponseInterface
*/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->customer->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->customer->get_search_suggestions($search, 25, false);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Loads the customer edit form
* @return string
*/
public function getView(int $customer_id = NEW_ENTRY): string
public function getView(int $customer_id = NEW_ENTRY): void
{
// Set default values
if ($customer_id == null) $customer_id = NEW_ENTRY;
@@ -231,14 +227,13 @@ class Customers extends Persons
}
}
return view("customers/form", $data);
echo view("customers/form", $data);
}
/**
* Inserts/updates a customer
* @return ResponseInterface
*/
public function postSave(int $customer_id = NEW_ENTRY): ResponseInterface
public function postSave(int $customer_id = NEW_ENTRY): void
{
$first_name = $this->request->getPost('first_name');
$last_name = $this->request->getPost('last_name');
@@ -293,20 +288,20 @@ class Customers extends Persons
// New customer
if ($customer_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Customers.successful_adding') . ' ' . $first_name . ' ' . $last_name,
'id' => $customer_data['person_id']
]);
} else { // Existing customer
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Customers.successful_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => $customer_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Customers.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => NEW_ENTRY
@@ -317,37 +312,36 @@ class Customers extends Persons
/**
* Verifies if an email address already exists. Used in app/Views/customers/form.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckEmail(): ResponseInterface
public function postCheckEmail(): void
{
$email = strtolower($this->request->getPost('email', FILTER_SANITIZE_EMAIL));
$person_id = $this->request->getPost('person_id', FILTER_SANITIZE_NUMBER_INT);
$exists = $this->customer->check_email_exists($email, $person_id);
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
* Verifies if an account number already exists. Used in app/Views/customers/form.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckAccountNumber(): ResponseInterface
public function postCheckAccountNumber(): void
{
$exists = $this->customer->check_account_number_exists($this->request->getPost('account_number'), $this->request->getPost('person_id', FILTER_SANITIZE_NUMBER_INT));
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
* This deletes customers from the customers table
* @return ResponseInterface
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$customers_to_delete = $this->request->getPost('ids');
$customers_info = $this->customer->get_multiple_info($customers_to_delete);
@@ -364,12 +358,12 @@ class Customers extends Persons
}
if ($count == count($customers_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Customers.successful_deleted') . ' ' . $count . ' ' . lang('Customers.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Customers.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Customers.cannot_be_deleted')]);
}
}
@@ -389,24 +383,24 @@ class Customers extends Persons
/**
* Displays the customer CSV import modal. Used in app/Views/people/manage.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getCsvImport(): string
public function getCsvImport(): void
{
return view('customers/form_csv_import');
echo view('customers/form_csv_import');
}
/**
* Imports a CSV file containing customers. Used in app/Views/customers/form_csv_import.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postImportCsvFile(): ResponseInterface
public function postImportCsvFile(): void
{
if ($_FILES['file_path']['error'] != UPLOAD_ERR_OK) {
return $this->response->setJSON(['success' => false, 'message' => lang('Customers.csv_import_failed')]);
echo json_encode(['success' => false, 'message' => lang('Customers.csv_import_failed')]);
} else {
if (($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== false) {
// Skip the first row as it's the table description
@@ -473,12 +467,12 @@ class Customers extends Persons
if (count($failCodes) > 0) {
$message = lang('Customers.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
return $this->response->setJSON(['success' => false, 'message' => $message]);
echo json_encode(['success' => false, 'message' => $message]);
} else {
return $this->response->setJSON(['success' => true, 'message' => lang('Customers.csv_import_success')]);
echo json_encode(['success' => true, 'message' => lang('Customers.csv_import_success')]);
}
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Customers.csv_import_nodata_wrongformat')]);
echo json_encode(['success' => false, 'message' => lang('Customers.csv_import_nodata_wrongformat')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Module;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
/**
@@ -26,7 +25,7 @@ class Employees extends Persons
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -42,47 +41,39 @@ class Employees extends Persons
$data_rows[] = get_person_data_row($person);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* AJAX called function gives search suggestions based on what is being searched for.
*
* @return ResponseInterface
* @return void
*/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->employee->get_search_suggestions($search, 25, true);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->employee->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Loads the employee edit form
* @return string
*/
public function getView(int $employee_id = NEW_ENTRY): string
public function getView(int $employee_id = NEW_ENTRY): void
{
$person_info = $this->employee->get_info($employee_id);
$current_user = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY && !$this->employee->canModifyEmployee($person_info->person_id, $current_user->person_id)) {
header('Location: ' . base_url('no_access/employees/employees'));
exit();
}
foreach (get_object_vars($person_info) as $property => $value) {
$person_info->$property = $value;
}
@@ -107,28 +98,14 @@ class Employees extends Persons
}
$data['all_subpermissions'] = $permissions;
return view('employees/form', $data);
echo view('employees/form', $data);
}
/**
* Inserts/updates an employee
* @return ResponseInterface
*/
public function postSave(int $employee_id = NEW_ENTRY): ResponseInterface
public function postSave(int $employee_id = NEW_ENTRY): void
{
$current_user = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY) {
$target_employee = $this->employee->get_info($employee_id);
if (!$this->employee->canModifyEmployee($target_employee->person_id, $current_user->person_id)) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_updating_admin'),
'id' => NEW_ENTRY
]);
}
}
$first_name = $this->request->getPost('first_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // TODO: duplicated code
$last_name = $this->request->getPost('last_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$email = strtolower($this->request->getPost('email', FILTER_SANITIZE_EMAIL));
@@ -153,16 +130,11 @@ class Employees extends Persons
];
$grants_array = [];
$isAdmin = $this->employee->isAdmin($current_user->person_id);
foreach ($this->module->get_all_permissions()->getResult() as $permission) {
$grants = [];
$grant = $this->request->getPost('grant_' . $permission->permission_id) != null ? $this->request->getPost('grant_' . $permission->permission_id, FILTER_SANITIZE_FULL_SPECIAL_CHARS) : '';
if ($grant == $permission->permission_id) {
if (!$isAdmin && !$this->employee->has_grant($permission->permission_id, $current_user->person_id)) {
continue;
}
$grants['permission_id'] = $permission->permission_id;
$grants['menu_group'] = $this->request->getPost('menu_group_' . $permission->permission_id) != null ? $this->request->getPost('menu_group_' . $permission->permission_id, FILTER_SANITIZE_FULL_SPECIAL_CHARS) : '--';
$grants_array[] = $grants;
@@ -191,25 +163,20 @@ class Employees extends Persons
if ($this->employee->save_employee($person_data, $employee_data, $grants_array, $employee_id)) {
// New employee
if ($employee_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Employees.successful_adding') . ' ' . $first_name . ' ' . $last_name,
'id' => $employee_data['person_id']
]);
} else { // Existing employee
$logged_in_employee_id = session()->get('person_id');
if ($employee_id == $logged_in_employee_id) {
session()->set('language_code', $employee_data['language_code']);
session()->set('language', $employee_data['language']);
}
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Employees.successful_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => $employee_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Employees.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => NEW_ENTRY
@@ -219,28 +186,18 @@ class Employees extends Persons
/**
* This deletes employees from the employees table
* @return ResponseInterface
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$employees_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$current_user = $this->employee->get_logged_in_employee_info();
if (!$this->employee->isAdmin($current_user->person_id)) {
foreach ($employees_to_delete as $emp_id) {
if ($this->employee->isAdmin((int)$emp_id)) {
return $this->response->setJSON(['success' => false, 'message' => lang('Employees.error_deleting_admin')]);
}
}
}
if ($this->employee->delete_list($employees_to_delete)) { // TODO: this is passing a string, but delete_list expects an array
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Employees.successful_deleted') . ' ' . count($employees_to_delete) . ' ' . lang('Employees.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Employees.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Employees.cannot_be_deleted')]);
}
}
@@ -248,12 +205,12 @@ class Employees extends Persons
* Checks an employee username against the database. Used in app\Views\employees\form.php
*
* @param $employee_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getCheckUsername($employee_id): ResponseInterface
public function getCheckUsername($employee_id): void
{
$exists = $this->employee->username_exists($employee_id, $this->request->getGet('username'));
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
}

View File

@@ -4,7 +4,6 @@ namespace App\Controllers;
use App\Models\Expense;
use App\Models\Expense_category;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -24,7 +23,7 @@ class Expenses extends Secure_Controller
/**
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_expenses_manage_table_headers();
@@ -38,13 +37,13 @@ class Expenses extends Secure_Controller
'is_deleted' => lang('Expenses.is_deleted')
];
return view('expenses/manage', $data);
echo view('expenses/manage', $data);
}
/**
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -79,14 +78,14 @@ class Expenses extends Secure_Controller
$data_rows[] = get_expenses_data_last_row($expenses);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
}
/**
* @param int $expense_id
* @return void
*/
public function getView(int $expense_id = NEW_ENTRY): string
public function getView(int $expense_id = NEW_ENTRY): void
{
$data = []; // TODO: Duplicated code
@@ -126,26 +125,26 @@ class Expenses extends Secure_Controller
// Don't allow gift card to be a payment option in a sale transaction edit because it's a complex change
$data['payment_options'] = $this->expense->get_payment_options();
return view("expenses/form", $data);
echo view("expenses/form", $data);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$expense_info = $this->expense->get_info($row_id);
$data_row = get_expenses_data_row($expense_info);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $expense_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $expense_id = NEW_ENTRY): ResponseInterface
public function postSave(int $expense_id = NEW_ENTRY): void
{
$config = config(OSPOS::class)->settings;
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -168,26 +167,26 @@ class Expenses extends Secure_Controller
if ($this->expense->save_value($expense_data, $expense_id)) {
// New Expense
if ($expense_id == NEW_ENTRY) {
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_adding'), 'id' => $expense_data['expense_id']]);
echo json_encode(['success' => true, 'message' => lang('Expenses.successful_adding'), 'id' => $expense_data['expense_id']]);
} else { // Existing Expense
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_updating'), 'id' => $expense_id]);
echo json_encode(['success' => true, 'message' => lang('Expenses.successful_updating'), 'id' => $expense_id]);
}
} else { // Failure
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses.error_adding_updating'), 'id' => NEW_ENTRY]);
echo json_encode(['success' => false, 'message' => lang('Expenses.error_adding_updating'), 'id' => NEW_ENTRY]);
}
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$expenses_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($this->expense->delete_list($expenses_to_delete)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_deleted') . ' ' . count($expenses_to_delete) . ' ' . lang('Expenses.one_or_multiple'), 'ids' => $expenses_to_delete]);
echo json_encode(['success' => true, 'message' => lang('Expenses.successful_deleted') . ' ' . count($expenses_to_delete) . ' ' . lang('Expenses.one_or_multiple'), 'ids' => $expenses_to_delete]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses.cannot_be_deleted'), 'ids' => $expenses_to_delete]);
echo json_encode(['success' => false, 'message' => lang('Expenses.cannot_be_deleted'), 'ids' => $expenses_to_delete]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Expense_category;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
class Expenses_categories extends Secure_Controller // TODO: Is this class ever used?
@@ -20,17 +19,17 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
/**
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_expense_category_manage_table_headers();
return view('expenses_categories/manage', $data);
echo view('expenses_categories/manage', $data);
}
/**
* Returns expense_category_manage table data rows. This will be called with AJAX.
**/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -46,36 +45,36 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
$data_rows[] = get_expense_category_data_row($expense_category);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @param int $row_id
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_expense_category_data_row($this->expense_category->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $expense_category_id
* @return void
*/
public function getView(int $expense_category_id = NEW_ENTRY): string
public function getView(int $expense_category_id = NEW_ENTRY): void
{
$data['category_info'] = $this->expense_category->get_info($expense_category_id);
return view("expenses_categories/form", $data);
echo view("expenses_categories/form", $data);
}
/**
* @param int $expense_category_id
* @return void
*/
public function postSave(int $expense_category_id = NEW_ENTRY): ResponseInterface
public function postSave(int $expense_category_id = NEW_ENTRY): void
{
$expense_category_data = [
'category_name' => $this->request->getPost('category_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -85,20 +84,20 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
if ($this->expense_category->save_value($expense_category_data, $expense_category_id)) {
// New expense_category
if ($expense_category_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Expenses_categories.successful_adding'),
'id' => $expense_category_data['expense_category_id']
]);
} else { // Existing Expense Category
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Expenses_categories.successful_updating'),
'id' => $expense_category_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Expenses_categories.error_adding_updating') . ' ' . $expense_category_data['category_name'],
'id' => NEW_ENTRY
@@ -109,17 +108,17 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
/**
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$expense_category_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($this->expense_category->delete_list($expense_category_to_delete)) { // TODO: Convert to ternary notation.
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Expenses_categories.successful_deleted') . ' ' . count($expense_category_to_delete) . ' ' . lang('Expenses_categories.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses_categories.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Expenses_categories.cannot_be_deleted')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Giftcard;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -19,19 +18,19 @@ class Giftcards extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_giftcards_manage_table_headers();
return view('giftcards/manage', $data);
echo view('giftcards/manage', $data);
}
/**
* Returns Giftcards table data rows. This will be called with AJAX.
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -47,50 +46,50 @@ class Giftcards extends Secure_Controller
$data_rows[] = get_giftcard_data_row($giftcard);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* Gets search suggestions for giftcards. Used in app\Views\sales\register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->giftcard->get_search_suggestions($search, true);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->giftcard->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_giftcard_data_row($this->giftcard->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $giftcard_id
* @return string
* @return void
*/
public function getView(int $giftcard_id = NEW_ENTRY): string
public function getView(int $giftcard_id = NEW_ENTRY): void
{
$config = config(OSPOS::class)->settings;
$giftcard_info = $this->giftcard->get_info($giftcard_id);
@@ -107,14 +106,14 @@ class Giftcards extends Secure_Controller
$data['giftcard_id'] = $giftcard_id;
$data['giftcard_value'] = $giftcard_info->value;
return view("giftcards/form", $data);
echo view("giftcards/form", $data);
}
/**
* @param int $giftcard_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $giftcard_id = NEW_ENTRY): ResponseInterface
public function postSave(int $giftcard_id = NEW_ENTRY): void
{
$giftcard_number = $this->request->getPost('giftcard_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -132,20 +131,20 @@ class Giftcards extends Secure_Controller
if ($this->giftcard->save_value($giftcard_data, $giftcard_id)) {
// New giftcard
if ($giftcard_id == NEW_ENTRY) { // TODO: Constant needed
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Giftcards.successful_adding') . ' ' . $giftcard_data['giftcard_number'],
'id' => $giftcard_data['giftcard_id']
]);
} else { // Existing giftcard
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Giftcards.successful_updating') . ' ' . $giftcard_data['giftcard_number'],
'id' => $giftcard_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Giftcards.error_adding_updating') . ' ' . $giftcard_data['giftcard_number'],
'id' => NEW_ENTRY
@@ -159,30 +158,30 @@ class Giftcards extends Secure_Controller
* @return void
* @noinspection PhpUnused
*/
public function postCheckNumberGiftcard(): ResponseInterface
public function postCheckNumberGiftcard(): void
{
$existing_id = $this->request->getPost('giftcard_id', FILTER_SANITIZE_NUMBER_INT);
$giftcard_number = $this->request->getPost('giftcard_number', FILTER_SANITIZE_NUMBER_INT);
$giftcard_id = $this->giftcard->get_giftcard_id($giftcard_number);
$success = ($giftcard_id == (int) $existing_id || !$giftcard_id );
return $this->response->setJSON($success ? 'true' : 'false');
echo $success ? 'true' : 'false';
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$giftcards_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($this->giftcard->delete_list($giftcards_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Giftcards.successful_deleted') . ' ' . count($giftcards_to_delete) . ' ' . lang('Giftcards.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Giftcards.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Giftcards.cannot_be_deleted')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\ResponseInterface;
class Home extends Secure_Controller
{
@@ -13,12 +12,12 @@ class Home extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$logged_in = $this->employee->is_logged_in();
return view('home/home');
echo view('home/home');
}
/**
@@ -36,93 +35,58 @@ class Home extends Secure_Controller
/**
* Load "change employee password" form
*
* @return string
* @noinspection PhpUnused
*/
public function getChangePassword(int $employeeId = NEW_ENTRY): string
public function getChangePassword(int $employee_id = -1): void // TODO: Replace -1 with a constant
{
$loggedInEmployee = $this->employee->get_logged_in_employee_info();
$currentPersonId = $loggedInEmployee->person_id;
$employeeId = $employeeId === NEW_ENTRY ? $currentPersonId : $employeeId;
if (!$this->employee->can_modify_employee($employeeId, $currentPersonId)) {
header('Location: ' . base_url('no_access/home/home'));
exit();
}
$person_info = $this->employee->get_info($employeeId);
$person_info = $this->employee->get_info($employee_id);
foreach (get_object_vars($person_info) as $property => $value) {
$person_info->$property = $value;
}
$data['person_info'] = $person_info;
return view('home/form_change_password', $data);
echo view('home/form_change_password', $data);
}
/**
* Change employee password
*
* @return ResponseInterface
*/
public function postSave(int $employeeId = NEW_ENTRY): ResponseInterface
public function postSave(int $employee_id = -1): void // TODO: Replace -1 with a constant
{
$currentUser = $this->employee->get_logged_in_employee_info();
$employeeId = $employeeId === NEW_ENTRY ? $currentUser->person_id : $employeeId;
if (!$this->employee->can_modify_employee($employeeId, $currentUser->person_id)) {
return $this->response->setStatusCode(403)->setJSON([
'success' => false,
'message' => lang('Employees.unauthorized_modify')
]);
}
if (!empty($this->request->getPost('current_password')) && $employeeId != NEW_ENTRY) {
if (!empty($this->request->getPost('current_password')) && $employee_id != -1) {
if ($this->employee->check_password($this->request->getPost('username', FILTER_SANITIZE_FULL_SPECIAL_CHARS), $this->request->getPost('current_password'))) {
// Validate password length BEFORE hashing
$new_password = $this->request->getPost('password');
if (strlen($new_password) < 8) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.password_minlength'),
'id' => NEW_ENTRY
]);
}
$employee_data = [
'username' => $this->request->getPost('username', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'password' => password_hash($new_password, PASSWORD_DEFAULT),
'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
'hash_version' => 2
];
if ($this->employee->change_password($employee_data, $employeeId)) {
return $this->response->setJSON([
if ($this->employee->change_password($employee_data, $employee_id) && strlen($employee_data['password']) >= 8) {
echo json_encode([
'success' => true,
'message' => lang('Employees.successful_change_password'),
'id' => $employeeId
'id' => $employee_id
]);
} else {
return $this->response->setJSON([
} else { // Failure // TODO: Replace -1 with constant
echo json_encode([
'success' => false,
'message' => lang('Employees.unsuccessful_change_password'),
'id' => NEW_ENTRY
'id' => -1
]);
}
} else {
return $this->response->setJSON([
} else { // TODO: Replace -1 with constant
echo json_encode([
'success' => false,
'message' => lang('Employees.current_password_invalid'),
'id' => NEW_ENTRY
'id' => -1
]);
}
} else {
return $this->response->setJSON([
} else { // TODO: Replace -1 with constant
echo json_encode([
'success' => false,
'message' => lang('Employees.current_password_invalid'),
'id' => NEW_ENTRY
'id' => -1
]);
}
}
}
}

View File

@@ -7,7 +7,6 @@ use App\Libraries\Barcode_lib;
use App\Models\Item;
use App\Models\Item_kit;
use App\Models\Item_kit_items;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
class Item_kits extends Secure_Controller
@@ -60,19 +59,19 @@ class Item_kits extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_item_kits_manage_table_headers();
return view('item_kits/manage', $data);
echo view('item_kits/manage', $data);
}
/**
* Returns Item_kit table data rows. This will be called with AJAX.
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search') ?? '';
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -90,37 +89,37 @@ class Item_kits extends Secure_Controller
$data_rows[] = get_item_kit_data_row($item_kit);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->item_kit->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
// Calculate the total cost and retail price of the Kit, so it can be added to the table refresh
$item_kit = $this->_add_totals_to_item_kit($this->item_kit->get_info($row_id));
return $this->response->setJSON(get_item_kit_data_row($item_kit));
echo json_encode(get_item_kit_data_row($item_kit));
}
/**
* @param int $item_kit_id
* @return string
* @return void
*/
public function getView(int $item_kit_id = NEW_ENTRY): string
public function getView(int $item_kit_id = NEW_ENTRY): void
{
$info = $this->item_kit->get_info($item_kit_id);
@@ -154,14 +153,14 @@ class Item_kits extends Secure_Controller
$data['selected_kit_item_id'] = $info->kit_item_id;
$data['selected_kit_item'] = ($item_kit_id > 0 && isset($info->kit_item_id)) ? $info->item_name : '';
return view("item_kits/form", $data);
echo view("item_kits/form", $data);
}
/**
* @param int $item_kit_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $item_kit_id = NEW_ENTRY): ResponseInterface
public function postSave(int $item_kit_id = NEW_ENTRY): void
{
$item_kit_data = [
'name' => $this->request->getPost('name'),
@@ -202,20 +201,20 @@ class Item_kits extends Secure_Controller
}
if ($new_item) {
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Item_kits.successful_adding') . ' ' . $item_kit_data['name'],
'id' => $item_kit_id
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Item_kits.successful_updating') . ' ' . $item_kit_data['name'],
'id' => $item_kit_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Item_kits.error_adding_updating') . ' ' . $item_kit_data['name'],
'id' => NEW_ENTRY
@@ -224,42 +223,42 @@ class Item_kits extends Secure_Controller
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$item_kits_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($this->item_kit->delete_list($item_kits_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Item_kits.successful_deleted') . ' ' . count($item_kits_to_delete) . ' ' . lang('Item_kits.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Item_kits.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Item_kits.cannot_be_deleted')]);
}
}
/**
* Checks the validity of the item kit number. Used in app/Views/item_kits/form.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckItemNumber(): ResponseInterface
public function postCheckItemNumber(): void
{
$exists = $this->item_kit->item_number_exists($this->request->getPost('item_kit_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS), $this->request->getPost('item_kit_id', FILTER_SANITIZE_NUMBER_INT));
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
* AJAX called function that generates barcodes for selected item_kits.
*
* @param string $item_kit_ids Colon separated list of item_kit_id values to generate barcodes for.
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getGenerateBarcodes(string $item_kit_ids): string
public function getGenerateBarcodes(string $item_kit_ids): void
{
$barcode_lib = new Barcode_lib();
$result = [];
@@ -290,6 +289,6 @@ class Item_kits extends Secure_Controller
$data['barcode_config'] = $barcode_config;
// Display barcodes
return view("barcodes/barcode_sheet", $data);
echo view("barcodes/barcode_sheet", $data);
}
}

View File

@@ -4,7 +4,6 @@ namespace App\Controllers;
use App\Libraries\Barcode_lib;
use App\Libraries\Item_lib;
use App\Models\Attribute;
use App\Models\Inventory;
use App\Models\Item;
@@ -14,8 +13,6 @@ use App\Models\Item_taxes;
use App\Models\Stock_location;
use App\Models\Supplier;
use App\Models\Tax_category;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Images\Handlers\BaseHandler;
use CodeIgniter\HTTP\DownloadResponse;
use Config\OSPOS;
@@ -66,9 +63,9 @@ class Items extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$this->session->set('allow_temp_items', 0);
@@ -87,16 +84,16 @@ class Items extends Secure_Controller
'temporary' => lang('Items.temp')
];
return view('items/manage', $data);
echo view('items/manage', $data);
}
/**
* Returns Items table data rows. This will be called with AJAX.
* @noinspection PhpUnused
**/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(item_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'item_id');
@@ -135,20 +132,19 @@ class Items extends Secure_Controller
}
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* AJAX function. Processes thumbnail of image. Called via tabular_helper
* @param string $pic_filename
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getPicThumb(string $pic_filename): ResponseInterface
public function getPicThumb(string $pic_filename): void
{
helper('file');
$pic_filename = rawurldecode($pic_filename);
$file_extension = pathinfo($pic_filename, PATHINFO_EXTENSION);
$images = glob("./uploads/item_pics/$pic_filename");
$base_path = './uploads/item_pics/' . pathinfo($pic_filename, PATHINFO_FILENAME);
@@ -166,17 +162,15 @@ class Items extends Secure_Controller
$this->response->setContentType(mime_content_type($thumb_path));
$this->response->setBody(file_get_contents($thumb_path));
$this->response->send();
}
return $this->response;
}
/**
* Gives search suggestions based on what is being searched for
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$options = [
'search_custom' => $this->request->getPost('search_custom'),
@@ -186,73 +180,71 @@ class Items extends Secure_Controller
$search = $this->request->getPost('term');
$suggestions = $this->item->get_search_suggestions($search, $options);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* AJAX Function used to get search suggestions from the model and return them in JSON format
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggestLowSell(): ResponseInterface
public function getSuggestLowSell(): void
{
$suggestions = $this->item->get_low_sell_suggestions($this->request->getPostGet('name'));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggestKits(): ResponseInterface
public function getSuggestKits(): void
{
$suggestions = $this->item->get_kit_search_suggestions($this->request->getGet('term'), ['search_custom' => false, 'is_deleted' => false], true);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Gives search suggestions based on what is being searched for. Called from the view.
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function getSuggestCategory(): ResponseInterface
public function getSuggestCategory(): void
{
$suggestions = $this->item->get_category_suggestions($this->request->getGet('term'));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Gives search suggestions based on what is being searched for.
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function getSuggestLocation(): ResponseInterface
public function getSuggestLocation(): void
{
$suggestions = $this->item->get_location_suggestions($this->request->getGet('term'));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @param string $item_ids
* @return ResponseInterface
* @return void
*/
public function getRow(string $item_ids): ResponseInterface // TODO: An array would be better for parameter.
public function getRow(string $item_ids): void // TODO: An array would be better for parameter.
{
$item_infos = $this->item->get_multiple_info(explode(':', $item_ids), $this->item_lib->get_item_location());
@@ -262,14 +254,14 @@ class Items extends Secure_Controller
$result[$item_info->item_id] = get_item_data_row($item_info);
}
return $this->response->setJSON($result);
echo json_encode($result);
}
/**
* @param int $item_id
* @return string
* @return void
*/
public function getView(int $item_id = NEW_ENTRY): string // TODO: Long function. Perhaps we need to refactor out some methods.
public function getView(int $item_id = NEW_ENTRY): void // TODO: Long function. Perhaps we need to refactor out some methods.
{
$item_id ??= NEW_ENTRY;
@@ -378,7 +370,7 @@ class Items extends Secure_Controller
} else {
$images = glob("./uploads/item_pics/$item_info->pic_filename");
}
$data['image_path'] = sizeof($images) > 0 ? base_url(implode('/', array_map('rawurlencode', explode('/', ltrim($images[0], './'))))) : '';
$data['image_path'] = sizeof($images) > 0 ? base_url($images[0]) : '';
} else {
$data['image_path'] = '';
}
@@ -401,17 +393,17 @@ class Items extends Secure_Controller
$data['selected_low_sell_item'] = '';
}
return view('items/form', $data);
echo view('items/form', $data);
}
/**
* AJAX called function which returns the update inventory form view for an item
*
* @param int $item_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getInventory(int $item_id = NEW_ENTRY): string
public function getInventory(int $item_id = NEW_ENTRY): void
{
$item_info = $this->item->get_info($item_id); // TODO: Duplicate code
@@ -430,15 +422,15 @@ class Items extends Secure_Controller
$data['item_quantities'][$location['location_id']] = $quantity;
}
return view('items/form_inventory', $data);
echo view('items/form_inventory', $data);
}
/**
* @param int $item_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getCountDetails(int $item_id = NEW_ENTRY): string
public function getCountDetails(int $item_id = NEW_ENTRY): void
{
$item_info = $this->item->get_info($item_id); // TODO: Duplicate code
@@ -457,17 +449,17 @@ class Items extends Secure_Controller
$data['item_quantities'][$location['location_id']] = $quantity;
}
return view('items/form_count_details', $data);
echo view('items/form_count_details', $data);
}
/**
* AJAX called function that generates barcodes for selected items.
*
* @param string $item_ids Colon separated list of item_id values to generate barcodes for.
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getGenerateBarcodes(string $item_ids): string // TODO: Passing these through as a string instead of an array limits the contents of the item_ids. Perhaps a better approach would to serialize as JSON in an array and pass through post variables?
public function getGenerateBarcodes(string $item_ids): void // TODO: Passing these through as a string instead of an array limits the contents of the item_ids. Perhaps a better approach would to serialize as JSON in an array and pass through post variables?
{
$item_ids = explode(':', $item_ids);
$result = $this->item->get_multiple_info($item_ids, $this->item_lib->get_item_location())->getResultArray();
@@ -483,16 +475,16 @@ class Items extends Secure_Controller
}
$data['items'] = $result;
return view('barcodes/barcode_sheet', $data);
echo view('barcodes/barcode_sheet', $data);
}
/**
* Gathers attribute value information for an item and returns it in a view.
*
* @param int $item_id
* @return string
* @return void
*/
public function getAttributes(int $item_id = NEW_ENTRY): string
public function getAttributes(int $item_id = NEW_ENTRY): void
{
$data['item_id'] = $item_id;
$definition_ids = json_decode($this->request->getGet('definition_ids') ?? '', true);
@@ -500,7 +492,7 @@ class Items extends Secure_Controller
$data['definition_names'] = $this->attribute->get_definition_names();
foreach ($data['definition_values'] as $definition_id => $definition_value) {
$attribute_value = $this->attribute->get_attribute_value($item_id, $definition_id);
$attribute_value = $this->attribute->getAttributeValue($item_id, $definition_id);
$attribute_id = (empty($attribute_value) || empty($attribute_value->attribute_id)) ? null : $attribute_value->attribute_id;
$values = &$data['definition_values'][$definition_id];
$values['attribute_id'] = $attribute_id;
@@ -520,15 +512,15 @@ class Items extends Secure_Controller
unset($data['definition_names'][$definition_id]);
}
return view('attributes/item', $data);
echo view('attributes/item', $data);
}
/**
* @param int $item_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function postAttributes(int $item_id = NEW_ENTRY): string
public function postAttributes(int $item_id = NEW_ENTRY): void
{
$data['item_id'] = $item_id;
$definition_ids = json_decode($this->request->getPost('definition_ids'), true);
@@ -536,7 +528,7 @@ class Items extends Secure_Controller
$data['definition_names'] = $this->attribute->get_definition_names();
foreach ($data['definition_values'] as $definition_id => $definition_value) {
$attribute_value = $this->attribute->get_attribute_value($item_id, $definition_id);
$attribute_value = $this->attribute->getAttributeValue($item_id, $definition_id);
$attribute_id = (empty($attribute_value) || empty($attribute_value->attribute_id)) ? null : $attribute_value->attribute_id;
$values = &$data['definition_values'][$definition_id];
$values['attribute_id'] = $attribute_id;
@@ -556,16 +548,16 @@ class Items extends Secure_Controller
unset($data['definition_names'][$definition_id]);
}
return view('attributes/item', $data);
echo view('attributes/item', $data);
}
/**
* Edit multiple items. Used in app/Views/items/manage.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getBulkEdit(): string
public function getBulkEdit(): void
{
$suppliers = ['' => lang('Items.none')];
@@ -586,15 +578,14 @@ class Items extends Secure_Controller
0 => lang('Items.change_all_to_unserialized')
];
return view('items/form_bulk', $data);
echo view('items/form_bulk', $data);
}
/**
* @param int $item_id
* @return ResponseInterface
* @throws ReflectionException
*/
public function postSave(int $item_id = NEW_ENTRY): ResponseInterface
public function postSave(int $item_id = NEW_ENTRY): void
{
$upload_data = $this->upload_image();
$upload_success = empty($upload_data['error']);
@@ -618,7 +609,7 @@ class Items extends Secure_Controller
// Save item data
$item_data = [
'name' => $this->request->getPost('name'),
'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'description' => $this->request->getPost('description'),
'category' => $this->request->getPost('category'),
'item_type' => $item_type,
'stock_type' => $this->request->getPost('stock_type') === null ? HAS_STOCK : intval($this->request->getPost('stock_type')),
@@ -724,16 +715,16 @@ class Items extends Secure_Controller
if ($success && $upload_success) {
$message = lang('Items.successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name'];
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $item_id]);
echo json_encode(['success' => true, 'message' => $message, 'id' => $item_id]);
} else {
$message = $upload_success ? lang('Items.error_adding_updating') . ' ' . $item_data['name'] : strip_tags($upload_data['error']);
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => $item_id]);
echo json_encode(['success' => false, 'message' => $message, 'id' => $item_id]);
}
} else {
$message = lang('Items.error_adding_updating') . ' ' . $item_data['name'];
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
echo json_encode(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
}
}
@@ -769,13 +760,10 @@ class Items extends Secure_Controller
$filename = $file->getClientName();
$info = pathinfo($filename);
// Sanitize filename to remove problematic characters like spaces
$sanitized_name = preg_replace('/[^a-zA-Z0-9_\-\.]/', '_', $info['filename']);
$file_info = [
'orig_name' => $filename,
'raw_name' => $sanitized_name,
'raw_name' => $info['filename'],
'file_ext' => $file->guessExtension()
];
@@ -787,51 +775,49 @@ class Items extends Secure_Controller
/**
* Ajax call to check to see if the item number, a.k.a. barcode, is already used by another item
* If it exists then that is an error condition so return true for "error found"
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckItemNumber(): ResponseInterface
public function postCheckItemNumber(): void
{
$exists = $this->item->item_number_exists($this->request->getPost('item_number'), $this->request->getPost('item_id'));
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
* Checks to see if an item kit with the same name as the item already exists.
*
* @return ResponseInterface
* @return void
*/
public function check_kit_exists(): ResponseInterface // TODO: This function appears to be never called in the code. Need to confirm.
public function check_kit_exists(): void // TODO: This function appears to be never called in the code. Need to confirm.
{
if ($this->request->getPost('item_number') === NEW_ENTRY) {
$exists = $this->item_kit->item_kit_exists_for_name($this->request->getPost('name')); // TODO: item_kit_exists_for_name doesn't exist in Item_kit. I looked at the blame and it appears to have never existed.
} else {
$exists = false;
}
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
* @param $item_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getRemoveLogo($item_id): ResponseInterface
public function getRemoveLogo($item_id): void
{
$item_data = ['pic_filename' => null];
$result = $this->item->save_value($item_data, $item_id);
return $this->response->setJSON(['success' => $result]);
echo json_encode(['success' => $result]);
}
/**
* @return ResponseInterface
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postSaveInventory($item_id = NEW_ENTRY): ResponseInterface
public function postSaveInventory($item_id = NEW_ENTRY): void
{
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->item->get_info($item_id);
@@ -859,29 +845,29 @@ class Items extends Secure_Controller
if ($this->item_quantity->save_value($item_quantity_data, $item_id, $location_id)) {
$message = lang('Items.successful_updating') . " $cur_item_info->name";
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $item_id]);
echo json_encode(['success' => true, 'message' => $message, 'id' => $item_id]);
} else {
$message = lang('Items.error_adding_updating') . " $cur_item_info->name";
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
echo json_encode(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
}
}
/**
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postBulkUpdate(): ResponseInterface
public function postBulkUpdate(): void
{
$items_to_update = $this->request->getPost('item_ids');
$item_data = [];
foreach (Item::ALLOWED_BULK_EDIT_FIELDS as $field) {
$value = $this->request->getPost($field);
if ($field === 'supplier_id' && $value !== '') {
$item_data[$field] = $value;
} elseif ($value !== null && $value !== '') {
$item_data[$field] = $value;
foreach ($_POST as $key => $value) {
// This field is nullable, so treat it differently
if ($key === 'supplier_id' && $value !== '') {
$item_data[$key] = $value;
} elseif ($value !== '' && !(in_array($key, ['item_ids', 'tax_names', 'tax_percents']))) {
$item_data[$key] = $value;
}
}
@@ -903,24 +889,23 @@ class Items extends Secure_Controller
$this->item_taxes->save_multiple($items_taxes_data, $items_to_update);
}
return $this->response->setJSON(['success' => true, 'message' => lang('Items.successful_bulk_edit'), 'id' => $items_to_update]);
echo json_encode(['success' => true, 'message' => lang('Items.successful_bulk_edit'), 'id' => $items_to_update]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Items.error_updating_multiple')]);
echo json_encode(['success' => false, 'message' => lang('Items.error_updating_multiple')]);
}
}
/**
* @return ResponseInterface
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$items_to_delete = $this->request->getPost('ids');
if ($this->item->delete_list($items_to_delete)) {
$message = lang('Items.successful_deleted') . ' ' . count($items_to_delete) . ' ' . lang('Items.one_or_multiple');
return $this->response->setJSON(['success' => true, 'message' => $message]);
echo json_encode(['success' => true, 'message' => $message]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Items.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Items.cannot_be_deleted')]);
}
}
@@ -932,7 +917,7 @@ class Items extends Secure_Controller
*/
public function getGenerateCsvFile(): DownloadResponse
{
helper('importfile_helper');
helper('importfile');
$name = 'import_items.csv';
$allowed_locations = $this->stock_location->get_allowed_locations();
$allowed_attributes = $this->attribute->get_definition_names();
@@ -942,56 +927,54 @@ class Items extends Secure_Controller
}
/**
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getCsvImport(): string
public function getCsvImport(): void
{
return view('items/form_csv_import');
echo view('items/form_csv_import');
}
/**
* Imports items from CSV formatted file.
* @return ResponseInterface
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postImportCsvFile(): ResponseInterface
public function postImportCsvFile(): void
{
helper('importfile_helper');
helper('importfile');
try {
if ($_FILES['file_path']['error'] !== UPLOAD_ERR_OK) {
return $this->response->setJSON(['success' => false, 'message' => lang('Items.csv_import_failed')]);
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_failed')]);
} else {
if (file_exists($_FILES['file_path']['tmp_name'])) {
set_time_limit(240);
$failCodes = [];
$csv_rows = get_csv_file($_FILES['file_path']['tmp_name']);
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$allowed_stock_locations = $this->stock_location->get_allowed_locations();
$attribute_definition_names = $this->attribute->get_definition_names();
$csvRows = get_csv_file($_FILES['file_path']['tmp_name']);
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
$allowedStockLocations = $this->stock_location->get_allowed_locations();
$attributeDefinitionNames = $this->attribute->get_definition_names();
unset($attribute_definition_names[NEW_ENTRY]); // Removes the common_none_selected_text from the array
unset($attributeDefinitionNames[NEW_ENTRY]); // Removes the common_none_selected_text from the array
$attribute_data = [];
$attributeData = [];
foreach ($attribute_definition_names as $definition_name) {
$attribute_data[$definition_name] = $this->attribute->get_definition_by_name($definition_name)[0];
foreach ($attributeDefinitionNames as $definitionName) {
$attributeData[$definitionName] = $this->attribute->get_definition_by_name($definitionName)[0];
if ($attribute_data[$definition_name]['definition_type'] === DROPDOWN) {
$attribute_data[$definition_name]['dropdown_values'] = $this->attribute->get_definition_values($attribute_data[$definition_name]['definition_id']);
if ($attributeData[$definitionName]['definition_type'] === DROPDOWN) {
$attributeData[$definitionName]['dropdown_values'] = $this->attribute->get_definition_values($attributeData[$definitionName]['definition_id']);
}
}
$db = db_connect();
$db->transBegin(); // TODO: This section needs to be reworked so that the data array is being created then passed to the Item model because $db doesn't exist in the controller without being instantiated, but database operations should be restricted to the model
foreach ($csv_rows as $key => $row) {
$is_failed_row = false;
$item_id = (int)$row['Id'];
$is_update = ($item_id > 0);
$item_data = [
'item_id' => $item_id,
foreach ($csvRows as $key => $row) {
$isFailedRow = false;
$itemId = (int)$row['Id'];
$isUpdate = ($itemId > 0);
$itemData = [
'item_id' => $itemId,
'name' => $row['Item Name'],
'description' => $row['Description'],
'category' => $row['Category'],
@@ -1004,23 +987,23 @@ class Items extends Secure_Controller
];
if (!empty($row['supplier ID'])) {
$item_data['supplier_id'] = $this->supplier->exists($row['Supplier ID']) ? $row['Supplier ID'] : null;
$itemData['supplier_id'] = $this->supplier->exists($row['Supplier ID']) ? $row['Supplier ID'] : null;
}
if ($is_update) {
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? null : $row['Allow Alt Description'];
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? null : $row['Item has Serial Number'];
if ($isUpdate) {
$itemData['allow_alt_description'] = empty($row['Allow Alt Description']) ? null : $row['Allow Alt Description'];
$itemData['is_serialized'] = empty($row['Item has Serial Number']) ? null : $row['Item has Serial Number'];
} else {
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? '0' : '1';
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? '0' : '1';
$itemData['allow_alt_description'] = empty($row['Allow Alt Description']) ? '0' : '1';
$itemData['is_serialized'] = empty($row['Item has Serial Number']) ? '0' : '1';
}
if (!empty($row['Barcode']) && !$is_update) {
$item_data['item_number'] = $row['Barcode'];
$is_failed_row = $this->item->item_number_exists($item_data['item_number']);
if (!empty($row['Barcode'])) {
$itemData['item_number'] = $row['Barcode'];
$isFailedRow = $this->item->item_number_exists($itemData['item_number']);
}
if (!$is_failed_row) {
if (!$isFailedRow) {
$invalidLocations = $this->validateCSVStockLocations($row, $allowedStockLocations);
if (!empty($invalidLocations)) {
$isFailedRow = true;
@@ -1028,45 +1011,51 @@ class Items extends Secure_Controller
}
}
if (!$isFailedRow) {
$isFailedRow = $this->validateCSVData($row, $itemData, $allowedStockLocations, $attributeDefinitionNames, $attributeData);
}
// Remove false, null, '' and empty strings but keep 0
$item_data = array_filter($item_data, function ($value) {
$itemData = array_filter($itemData, function ($value) {
return $value !== null && strlen($value);
});
if (!$is_failed_row && $this->item->save_value($item_data, $item_id)) {
$this->save_tax_data($row, $item_data);
$this->save_inventory_quantities($row, $item_data, $allowed_stock_locations, $employee_id);
$is_failed_row = $this->save_attribute_data($row, $item_data, $attribute_data); // TODO: $is_failed_row never gets used after this.
if (!$isFailedRow && $this->item->save_value($itemData, $itemId)) {
$this->save_tax_data($row, $itemData);
$this->save_inventory_quantities($row, $itemData, $allowedStockLocations, $employeeId);
$isFailedRow = $this->saveAttributeData($row, $itemData, $attributeData); // TODO: $is_failed_row never gets used after this.
if ($is_update) {
$item_data = array_merge($item_data, get_object_vars($this->item->get_info_by_id_or_number($item_id)));
if ($isUpdate) {
$itemData = array_merge($itemData, get_object_vars($this->item->get_info_by_id_or_number($itemId)));
}
} else {
$failed_row = $key + 2;
$failCodes[] = $failed_row;
log_message('error', "CSV Item import failed on line $failed_row. This item was not imported.");
$failedRow = $key + 2;
$failCodes[] = $failedRow;
log_message('error', "CSV Item import failed on line $failedRow. This item was not imported.");
}
unset($csv_rows[$key]);
unset($csvRows[$key]);
}
$csv_rows = null;
$csvRows = null;
if (count($failCodes) > 0) {
$message = lang('Items.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
$db->transRollback();
return $this->response->setJSON(['success' => false, 'message' => $message]);
echo json_encode(['success' => false, 'message' => $message]);
} else {
$db->transCommit();
$this->attribute->deleteOrphanedValues();
return $this->response->setJSON(['success' => true, 'message' => lang('Items.csv_import_success')]);
echo json_encode(['success' => true, 'message' => lang('Items.csv_import_success')]);
}
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
}
}
} catch (Exception $e) {
return $this->response->setJSON(['success' => false, 'message' => $e->getMessage()]);
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
return;
}
}
@@ -1099,56 +1088,56 @@ class Items extends Secure_Controller
* Checks the entire line of data in an import file for errors
*
* @param array $row
* @param array $item_data
* @param array $allowed_locations
* @param array $definition_names
* @param array $attribute_data
* @param array $itemData
* @param array $allowedLocations
* @param array $definitionNames
* @param array $attributeData
* @return bool Returns false if all data checks out and true when there is an error in the data
*/
private function data_error_check(array $row, array $item_data, array $allowed_locations, array $definition_names, array $attribute_data): bool // TODO: Long function and large number of parameters in the declaration... perhaps refactoring is needed
private function validateCSVData(array $row, array $itemData, array $allowedLocations, array $definitionNames, array $attributeData): bool // TODO: Long function and large number of parameters in the declaration... perhaps refactoring is needed
{
$item_id = $row['Id'];
$is_update = (bool)$item_id;
$itemId = $row['Id'];
$isUpdate = (bool)$itemId;
// Check for empty required fields
$check_for_empty = [
'name' => $item_data['name'],
'category' => $item_data['category'],
'unit_price' => $item_data['unit_price']
$valuesToCheckForEmpty = [
'name' => $itemData['name'],
'category' => $itemData['category'],
'unit_price' => $itemData['unit_price']
];
foreach ($check_for_empty as $key => $val) {
if (empty($val) && !$is_update) {
foreach ($valuesToCheckForEmpty as $key => $val) {
if (empty($val) && !$isUpdate) {
log_message('error', "Empty required value in $key.");
return true;
}
}
if (!$is_update) {
$item_data['cost_price'] = empty($item_data['cost_price']) ? 0 : $item_data['cost_price']; // Allow for zero wholesale price
if (!$isUpdate) {
$itemData['cost_price'] = empty($itemData['cost_price']) ? 0 : $itemData['cost_price']; // Allow for zero wholesale price
} else {
if (!$this->item->exists($item_id)) {
log_message('error', "non-existent item_id: '$item_id' when either existing item_id or no item_id is required.");
if (!$this->item->exists($itemId)) {
log_message('error', "non-existent item_id: '$itemId' when either existing item_id or no item_id is required.");
return true;
}
}
// Build array of fields to check for numerics
$check_for_numeric_values = [
'cost_price' => $item_data['cost_price'],
'unit_price' => $item_data['unit_price'],
'reorder_level' => $item_data['reorder_level'],
$valuesToCheckForNumeric = [
'cost_price' => $itemData['cost_price'],
'unit_price' => $itemData['unit_price'],
'reorder_level' => $itemData['reorder_level'],
'supplier_id' => $row['Supplier ID'],
'Tax 1 Percent' => $row['Tax 1 Percent'],
'Tax 2 Percent' => $row['Tax 2 Percent']
];
foreach ($allowed_locations as $location_name) {
$check_for_numeric_values[] = $row["location_$location_name"];
foreach ($allowedLocations as $location_name) {
$valuesToCheckForNumeric[] = $row["location_$location_name"];
}
// Check for non-numeric values which require numeric
foreach ($check_for_numeric_values as $key => $value) {
foreach ($valuesToCheckForNumeric as $key => $value) {
if (!is_numeric($value) && !empty($value)) {
log_message('error', "non-numeric: '$value' for '$key' when numeric is required");
return true;
@@ -1156,30 +1145,34 @@ class Items extends Secure_Controller
}
// Check Attribute Data
foreach ($definition_names as $definition_name) {
if (!empty($row["attribute_$definition_name"])) {
$definition_type = $attribute_data[$definition_name]['definition_type'];
$attribute_value = $row["attribute_$definition_name"];
foreach ($definitionNames as $definitionName) {
if (!empty($row["attribute_$definitionName"])) {
$definitionType = $attributeData[$definitionName]['definition_type'];
$attributeValue = $row["attribute_$definitionName"];
switch ($definition_type) {
if (strcasecmp($attributeValue, '_DELETE_') === 0) {
continue;
}
switch ($definitionType) {
case DROPDOWN:
$dropdown_values = $attribute_data[$definition_name]['dropdown_values'];
$dropdown_values[] = '';
$dropdownValues = $attributeData[$definitionName]['dropdown_values'];
$dropdownValues[] = '';
if (!empty($attribute_value) && !in_array($attribute_value, $dropdown_values)) {
log_message('error', "Value: '$attribute_value' is not an acceptable DROPDOWN value");
if (!empty($attributeValue) && !in_array($attributeValue, $dropdownValues)) {
log_message('error', "Value: '$attributeValue' is not an acceptable DROPDOWN value");
return true;
}
break;
case DECIMAL:
if (!is_numeric($attribute_value) && !empty($attribute_value)) {
log_message('error', "'$attribute_value' is not an acceptable DECIMAL value");
if (!is_numeric($attributeValue) && !empty($attributeValue)) {
log_message('error', "'$attributeValue' is not an acceptable DECIMAL value");
return true;
}
break;
case DATE:
if (!valid_date($attribute_value) && !empty($attribute_value)) {
log_message('error', "'$attribute_value' is not an acceptable DATE value. The value must match the set locale.");
if (!valid_date($attributeValue) && !empty($attributeValue)) {
log_message('error', "'$attributeValue' is not an acceptable DATE value. The value must match the set locale.");
return true;
}
break;
@@ -1191,28 +1184,36 @@ class Items extends Secure_Controller
}
/**
* Saves attribute data found in the CSV import.
* Saves attribute data found in one row of a CSV import file. Loops through all attribute definitions and checks
* if there is data for that attribute in the row. If there is, it saves the attribute value and link to the item.
*
* @param array $row
* @param array $item_data
* @param array $definitions
* @return bool
* @param array $row Contains all parsed data from one row of the CSV import file
* @param array $itemData Contains data for the item being imported/updated from the CSV file.
* @param array $definitions Contains all attribute definitions in the system.
* @return bool Returns false if all attribute data saves correctly and true if there is an error saving any of
* the attribute data.
*/
private function save_attribute_data(array $row, array $item_data, array $definitions): bool
private function saveAttributeData(array $row, array $itemData, array $definitions): bool
{
helper('attribute');
foreach ($definitions as $definition) {
$attribute_name = $definition['definition_name'];
$attribute_value = $row["attribute_$attribute_name"];
$attributeName = $definition['definition_name'];
$attributeValue = $row["attribute_$attributeName"];
if (isset($attributeValue) && strcasecmp($attributeValue, '_DELETE_') === 0) {
$this->attribute->deleteAttributeLinks($itemData['item_id'], $definition['definition_id']);
continue;
}
// Create attribute value
if (!empty($attribute_value) || $attribute_value === '0') {
if (!empty($attributeValue) || $attributeValue === '0') {
if ($definition['definition_type'] === CHECKBOX) {
$checkbox_is_unchecked = (strcasecmp($attribute_value, 'false') === 0 || $attribute_value === '0');
$attribute_value = $checkbox_is_unchecked ? '0' : '1';
$checkbox_is_unchecked = (strcasecmp($attributeValue, 'false') === 0 || $attributeValue === '0');
$attributeValue = $checkbox_is_unchecked ? '0' : '1';
$attribute_id = $this->store_attribute_value($attribute_value, $definition, $item_data['item_id']);
} elseif (!empty($attribute_value)) {
$attribute_id = $this->store_attribute_value($attribute_value, $definition, $item_data['item_id']);
$attribute_id = $this->storeAttributeValue($attributeValue, $definition, $itemData['item_id']);
} elseif (!empty($attributeValue)) {
$attribute_id = $this->storeAttributeValue($attributeValue, $definition, $itemData['item_id']);
} else {
return true;
}
@@ -1227,20 +1228,36 @@ class Items extends Secure_Controller
/**
* Saves the attribute_value and attribute_link if necessary
* @param string $value
* @param array $attributeData
* @param int $itemId
* @return bool|int
*/
private function store_attribute_value(string $value, array $attribute_data, int $item_id)
private function storeAttributeValue(string $value, array $attributeData, int $itemId): bool|int
{
$attribute_id = $this->attribute->attributeValueExists($value, $attribute_data['definition_type']);
$attributeId = $this->attribute->attributeValueExists($value, $attributeData['definition_type']);
$this->attribute->deleteAttributeLinks($item_id, $attribute_data['definition_id']);
$this->attribute->deleteAttributeLinks($itemId, $attributeData['definition_id']);
if (!$attribute_id) {
$attribute_id = $this->attribute->saveAttributeValue($value, $attribute_data['definition_id'], $item_id, false, $attribute_data['definition_type']);
} elseif (!$this->attribute->saveAttributeLink($item_id, $attribute_data['definition_id'], $attribute_id)) {
return false;
if (!$attributeId) {
$attributeId = $this->attribute->saveAttributeValue($value, $attributeData['definition_id'], $itemId, false, $attributeData['definition_type']);
} else {
helper('attribute');
$dataType = getAttributeDataType($attributeData['definition_type']);
$storedValue = $this->attribute->getAttributeValueByAttributeId($attributeId, $dataType);
// Update attribute value if only the case has changed and only for text values.
if ($dataType === 'attribute_value'
&& is_string($storedValue)
&& strcasecmp($storedValue, $value) === 0
&& $storedValue !== $value) {
$attributeId = $this->attribute->saveAttributeValue($value, $attributeData['definition_id'], $itemId, $attributeId, $attributeData['definition_type']);
} elseif (!$this->attribute->saveAttributeLink($itemId, $attributeData['definition_id'], $attributeId)) {
return false;
}
}
return $attribute_id;
return $attributeId;
}
/**
@@ -1351,16 +1368,17 @@ class Items extends Secure_Controller
switch ($definitionType) {
case DROPDOWN:
$attributeId = $attributeValue;
$this->attribute->saveAttributeLink($itemId, $definitionId, $attributeId);
break;
case DECIMAL:
$attributeValue = parse_decimals($attributeValue);
// Fall through to save the attribute value
// no break
default:
$attributeId = $this->attribute->saveAttributeValue($attributeValue, $definitionId, $itemId, $attributeIds[$definitionId], $definitionType);
break;
}
$this->attribute->saveAttributeLink($itemId, $definitionId, $attributeId);
}
$this->attribute->deleteOrphanedValues();
}
}

View File

@@ -5,7 +5,6 @@ namespace App\Controllers;
use App\Libraries\Sms_lib;
use App\Models\Person;
use CodeIgniter\HTTP\ResponseInterface;
class Messages extends Secure_Controller
{
@@ -19,18 +18,18 @@ class Messages extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
return view('messages/sms');
echo view('messages/sms');
}
/**
* @param int $person_id
* @return string
* @return void
*/
public function getView(int $person_id = NEW_ENTRY): string
public function getView(int $person_id = NEW_ENTRY): void
{
$person = model(Person::class);
$info = $person->get_info($person_id);
@@ -40,13 +39,13 @@ class Messages extends Secure_Controller
}
$data['person_info'] = $info;
return view('messages/form_sms', $data);
echo view('messages/form_sms', $data);
}
/**
* @return ResponseInterface
* @return void
*/
public function send(): ResponseInterface
public function send(): void
{
$phone = $this->request->getPost('phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$message = $this->request->getPost('message', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -54,9 +53,9 @@ class Messages extends Secure_Controller
$response = $this->sms_lib->sendSMS($phone, $message);
if ($response) {
return $this->response->setJSON(['success' => true, 'message' => lang('Messages.successfully_sent') . ' ' . esc($phone)]);
echo json_encode(['success' => true, 'message' => lang('Messages.successfully_sent') . ' ' . esc($phone)]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone)]);
echo json_encode(['success' => false, 'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone)]);
}
}
@@ -64,10 +63,10 @@ class Messages extends Secure_Controller
* Sends an SMS message to a user. Used in app/Views/messages/form_sms.php.
*
* @param int $person_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function send_form(int $person_id = NEW_ENTRY): ResponseInterface
public function send_form(int $person_id = NEW_ENTRY): void
{
$phone = $this->request->getPost('phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$message = $this->request->getPost('message', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -75,13 +74,13 @@ class Messages extends Secure_Controller
$response = $this->sms_lib->sendSMS($phone, $message);
if ($response) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Messages.successfully_sent') . ' ' . esc($phone),
'person_id' => $person_id
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone),
'person_id' => NEW_ENTRY

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Module;
use CodeIgniter\HTTP\ResponseInterface;
/**
* Part of the grants mechanism to restrict access to modules that the user doesn't have permission for.
@@ -23,13 +22,13 @@ class No_access extends BaseController
/**
* @param string $module_id
* @param string $permission_id
* @return string
* @return void
*/
public function getIndex(string $module_id = '', string $permission_id = ''): string
public function getIndex(string $module_id = '', string $permission_id = ''): void
{
$data['module_name'] = $this->module->get_module_name($module_id);
$data['permission_id'] = $permission_id;
return view('no_access', $data);
echo view('no_access', $data);
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Employee;
use CodeIgniter\HTTP\ResponseInterface;
/**
* @property Employee employee
@@ -18,11 +17,11 @@ class Office extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
return view('home/office');
echo view('home/office');
}
/**

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Person;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
use function Tamtamchik\NameCase\str_name_case;
@@ -22,36 +21,34 @@ abstract class Persons extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_people_manage_table_headers();
return view('people/manage', $data);
echo view('people/manage', $data);
}
/**
* Gives search suggestions based on what is being searched for
* @return ResponseInterface
*/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->person->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Gets one row for a person manage table. This is called using AJAX to update one row.
* @return ResponseInterface
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_person_data_row($this->person->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**

View File

@@ -1,99 +0,0 @@
<?php
namespace App\Controllers\Plugins;
use App\Controllers\Secure_Controller;
use App\Libraries\Plugins\PluginManager;
use CodeIgniter\HTTP\ResponseInterface;
class Manage extends Secure_Controller
{
private PluginManager $pluginManager;
public function __construct()
{
parent::__construct('plugins');
$this->pluginManager = new PluginManager();
$this->pluginManager->discoverPlugins();
}
public function getIndex(): string
{
$plugins = $this->pluginManager->getAllPlugins();
$enabledPlugins = $this->pluginManager->getEnabledPlugins();
$pluginData = [];
foreach ($plugins as $pluginId => $plugin) {
$pluginData[$pluginId] = [
'id' => $plugin->getPluginId(),
'name' => $plugin->getPluginName(),
'description' => $plugin->getPluginDescription(),
'version' => $plugin->getVersion(),
'enabled' => isset($enabledPlugins[$pluginId]),
'has_config' => $plugin->getConfigView() !== null,
];
}
echo view('plugins/manage', ['plugins' => $pluginData]);
return '';
}
public function postEnable(string $pluginId): ResponseInterface
{
if ($this->pluginManager->enablePlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_enabled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_enable_failed')]);
}
public function postDisable(string $pluginId): ResponseInterface
{
if ($this->pluginManager->disablePlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_disabled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_disable_failed')]);
}
public function postUninstall(string $pluginId): ResponseInterface
{
if ($this->pluginManager->uninstallPlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.plugin_uninstalled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_uninstall_failed')]);
}
public function getConfig(string $pluginId): ResponseInterface
{
$plugin = $this->pluginManager->getPlugin($pluginId);
if (!$plugin) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_not_found')]);
}
$configView = $plugin->getConfigView();
if (!$configView) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_no_config')]);
}
$settings = $plugin->getSettings();
echo view($configView, ['settings' => $settings, 'plugin' => $plugin]);
return $this->response;
}
public function postSaveConfig(string $pluginId): ResponseInterface
{
$plugin = $this->pluginManager->getPlugin($pluginId);
if (!$plugin) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.plugin_not_found')]);
}
$settings = $this->request->getPost();
unset($settings['_method'], $settings['csrf_token_name']);
if ($plugin->saveSettings($settings)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.settings_saved')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.settings_save_failed')]);
}
}

View File

@@ -11,7 +11,6 @@ use App\Models\Item_kit;
use App\Models\Receiving;
use App\Models\Stock_location;
use App\Models\Supplier;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
use ReflectionException;
@@ -47,66 +46,66 @@ class Receivings extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
return $this->_reload();
$this->_reload();
}
/**
* Returns search suggestions for an item. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getItemSearch(): ResponseInterface
public function getItemSearch(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true);
$suggestions = array_merge($suggestions, $this->item_kit->get_search_suggestions($search));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Gets search suggestions for a stock item. Used in app/Views/receivings/receiving.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getStockItemSearch(): ResponseInterface
public function getStockItemSearch(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->item->get_stock_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true);
$suggestions = array_merge($suggestions, $this->item_kit->get_search_suggestions($search));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Set supplier if it exists in the database. Used in app/Views/receivings/receiving.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function postSelectSupplier(): string
public function postSelectSupplier(): void
{
$supplier_id = $this->request->getPost('supplier', FILTER_SANITIZE_NUMBER_INT);
if ($this->supplier->exists($supplier_id)) {
$this->receiving_lib->set_supplier($supplier_id);
}
return $this->_reload(); // TODO: Hungarian notation
$this->_reload(); // TODO: Hungarian notation
}
/**
* Change receiving mode for current receiving. Used in app/Views/receivings/receiving.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function postChangeMode(): string
public function postChangeMode(): void
{
$stock_destination = $this->request->getPost('stock_destination', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$stock_source = $this->request->getPost('stock_source', FILTER_SANITIZE_NUMBER_INT);
@@ -122,49 +121,49 @@ class Receivings extends Secure_Controller
$this->receiving_lib->set_stock_destination($stock_destination);
}
return $this->_reload(); // TODO: Hungarian notation
$this->_reload(); // TODO: Hungarian notation
}
/**
* Sets receiving comment. Used in app/Views/receivings/receiving.php
* @return ResponseInterface
*
* @return void
* @noinspection PhpUnused
*/
public function postSetComment(): ResponseInterface
public function postSetComment(): void
{
$this->receiving_lib->set_comment($this->request->getPost('comment', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
return $this->response->setJSON(['success' => true]);
}
/**
* Sets the print after sale flag for the receiving. Used in app/Views/receivings/receiving.php
* @return ResponseInterface
*
* @return void
* @noinspection PhpUnused
*/
public function postSetPrintAfterSale(): ResponseInterface
public function postSetPrintAfterSale(): void
{
$this->receiving_lib->set_print_after_sale($this->request->getPost('recv_print_after_sale') != null);
return $this->response->setJSON(['success' => true]);
}
/**
* Sets the reference number for the receiving. Used in app/Views/receivings/receiving.php
* @return ResponseInterface
*
* @return void
* @noinspection PhpUnused
*/
public function postSetReference(): ResponseInterface
public function postSetReference(): void
{
$this->receiving_lib->set_reference($this->request->getPost('recv_reference', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
return $this->response->setJSON(['success' => true]);
}
/**
* Add an item to the receiving. Used in app/Views/receivings/receiving.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function postAdd(): string
public function postAdd(): void
{
$data = [];
@@ -184,17 +183,17 @@ class Receivings extends Secure_Controller
$data['error'] = lang('Receivings.unable_to_add_item');
}
return $this->_reload($data); // TODO: Hungarian notation
$this->_reload($data); // TODO: Hungarian notation
}
/**
* Edit line item in current receiving. Used in app/Views/receivings/receiving.php
*
* @param string|int|null $item_id
* @return string
* @param $item_id
* @return void
* @noinspection PhpUnused
*/
public function postEditItem($item_id): string
public function postEditItem($item_id): void
{
$data = [];
@@ -223,16 +222,17 @@ class Receivings extends Secure_Controller
$data['error'] = lang('Receivings.error_editing_item');
}
return $this->_reload($data); // TODO: Hungarian notation
$this->_reload($data); // TODO: Hungarian notation
}
/**
* Edit a receiving. Used in app/Controllers/Receivings.php
*
* @param $receiving_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getEdit($receiving_id): string
public function getEdit($receiving_id): void
{
$data = [];
@@ -251,65 +251,63 @@ class Receivings extends Secure_Controller
$data['selected_supplier_id'] = $receiving_info['supplier_id'];
$data['receiving_info'] = $receiving_info;
return view('receivings/form', $data);
echo view('receivings/form', $data);
}
/**
* Deletes an item from the current receiving. Used in app/Views/receivings/receiving.php
*
* @param $item_number
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getDeleteItem($item_number): string
public function getDeleteItem($item_number): void
{
$this->receiving_lib->delete_item($item_number);
return $this->_reload(); // TODO: Hungarian notation
$this->_reload(); // TODO: Hungarian notation
}
/**
* @throws ReflectionException
* @return ResponseInterface
*/
public function postDelete(int $receiving_id = -1, bool $update_inventory = true): ResponseInterface
public function postDelete(int $receiving_id = -1, bool $update_inventory = true): void
{
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$receiving_ids = $receiving_id == -1 ? $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT) : [$receiving_id]; // TODO: Replace -1 with constant
if ($this->receiving->delete_list($receiving_ids, $employee_id, $update_inventory)) { // TODO: Likely need to surround this block of code in a try-catch to catch the ReflectionException
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Receivings.successfully_deleted') . ' ' . count($receiving_ids) . ' ' . lang('Receivings.one_or_multiple'),
'ids' => $receiving_ids
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Receivings.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Receivings.cannot_be_deleted')]);
}
}
/**
* Removes a supplier from a receiving. Used in app/Views/receivings/receiving.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getRemoveSupplier(): string
public function getRemoveSupplier(): void
{
$this->receiving_lib->clear_reference();
$this->receiving_lib->remove_supplier();
return $this->_reload(); // TODO: Hungarian notation
$this->_reload(); // TODO: Hungarian notation
}
/**
* Complete and finalize receiving. Used in app/Views/receivings/receiving.php
*
* @return string
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postComplete(): string
public function postComplete(): void
{
$data = [];
@@ -358,21 +356,18 @@ class Receivings extends Secure_Controller
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
$view = view("receivings/receipt", $data);
echo view("receivings/receipt", $data);
$this->receiving_lib->clear_all();
return $view;
}
/**
* Complete a receiving requisition. Used in app/Views/receivings/receiving.php.
*
* @return string
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postRequisitionComplete(): string
public function postRequisitionComplete(): void
{
if ($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination()) {
foreach ($this->receiving_lib->get_cart() as $item) {
@@ -381,11 +376,11 @@ class Receivings extends Secure_Controller
$this->receiving_lib->add_item($item['item_id'], -$item['quantity'], $this->receiving_lib->get_stock_source(), $item['discount_type']);
}
return $this->postComplete();
$this->postComplete();
} else {
$data['error'] = lang('Receivings.error_requisition');
return $this->_reload($data); // TODO: Hungarian notation
$this->_reload($data); // TODO: Hungarian notation
}
}
@@ -393,10 +388,10 @@ class Receivings extends Secure_Controller
* Gets the receipt for a receiving. Used in app/Views/receivings/form.php
*
* @param $receiving_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getReceipt($receiving_id): string
public function getReceipt($receiving_id): void
{
$receiving_info = $this->receiving->get_info($receiving_id)->getRowArray();
$this->receiving_lib->copy_entire_receiving($receiving_id);
@@ -429,18 +424,16 @@ class Receivings extends Secure_Controller
$data['print_after_sale'] = false;
$view = view("receivings/receipt", $data);
echo view("receivings/receipt", $data);
$this->receiving_lib->clear_all();
return $view;
}
/**
* @param array $data
* @return string
* @return void
*/
private function _reload(array $data = []): string // TODO: Hungarian notation
private function _reload(array $data = []): void // TODO: Hungarian notation
{
$data['cart'] = $this->receiving_lib->get_cart();
$data['modes'] = ['receive' => lang('Receivings.receiving'), 'return' => lang('Receivings.return')];
@@ -477,14 +470,13 @@ class Receivings extends Secure_Controller
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
return view("receivings/receiving", $data);
echo view("receivings/receiving", $data);
}
/**
* @return ResponseInterface
* @throws ReflectionException
*/
public function postSave(int $receiving_id = -1): ResponseInterface // TODO: Replace -1 with a constant
public function postSave(int $receiving_id = -1): void // TODO: Replace -1 with a constant
{
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // TODO: newdate does not follow naming conventions
@@ -501,13 +493,13 @@ class Receivings extends Secure_Controller
$this->inventory->update('RECV ' . $receiving_id, ['trans_date' => $receiving_time]);
if ($this->receiving->update($receiving_id, $receiving_data)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Receivings.successfully_updated'),
'id' => $receiving_id
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Receivings.unsuccessfully_updated'),
'id' => $receiving_id
@@ -518,13 +510,13 @@ class Receivings extends Secure_Controller
/**
* Cancel an in-process receiving. Used in app/Views/receivings/receiving.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function postCancelReceiving(): string
public function postCancelReceiving(): void
{
$this->receiving_lib->clear_all();
return $this->_reload(); // TODO: Hungarian Notation
$this->_reload(); // TODO: Hungarian Notation
}
}

View File

@@ -25,7 +25,6 @@ use App\Models\Reports\Summary_sales;
use App\Models\Reports\Summary_sales_taxes;
use App\Models\Reports\Summary_suppliers;
use App\Models\Reports\Summary_taxes;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -85,8 +84,7 @@ class Reports extends Secure_Controller
// Check access to report submodule
if (!$this->employee->has_grant('reports_' . $submodule_id, $this->employee->get_logged_in_employee_info()->person_id)) {
header('Location: ' . base_url('no_access/reports/reports_' . $submodule_id));
exit();
redirect('no_access/reports/reports_' . $submodule_id);
}
}
@@ -103,9 +101,8 @@ class Reports extends Secure_Controller
/**
* Initial Report listing screen
* @return string
*/
public function getIndex(): string
public function getIndex(): void
{
$person_id = $this->session->get('person_id');
$grants = $this->employee->get_employee_grants($this->session->get('person_id'));
@@ -117,7 +114,7 @@ class Reports extends Secure_Controller
'permission_ids' => $permissions_ids,
];
return view('reports/listing', $data);
echo view('reports/listing', $data);
}
/**
@@ -126,9 +123,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string // TODO: Perhaps these need to be passed as an array? Too many parameters in the signature.
public function summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void // TODO: Perhaps these need to be passed as an array? Too many parameters in the signature.
{ // TODO: Duplicated code
$this->clearCache();
@@ -164,7 +161,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -173,9 +170,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated code
$this->clearCache();
@@ -210,7 +207,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -218,9 +215,9 @@ class Reports extends Secure_Controller
* @param string $start_date
* @param string $end_date
* @param string $sale_type
* @return string
* @return void
*/
public function summary_expenses_categories(string $start_date, string $end_date, string $sale_type): string
public function summary_expenses_categories(string $start_date, string $end_date, string $sale_type): void
{
$this->clearCache();
@@ -247,7 +244,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -256,9 +253,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -295,7 +292,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -304,9 +301,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -341,7 +338,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -350,9 +347,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -391,7 +388,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -400,9 +397,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -439,7 +436,7 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -448,9 +445,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicate Code
$this->clearCache();
@@ -485,14 +482,13 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
* Summary Sales Taxes report
* @return string
*/
public function summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated code
$this->clearCache();
@@ -525,16 +521,16 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
* Summary Discounts report input. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function summary_discounts_input(): string
public function summary_discounts_input(): void
{
$this->clearCache();
@@ -545,14 +541,13 @@ class Reports extends Secure_Controller
$data['discount_type_options'] = ['0' => lang('Reports.discount_percent'), '1' => lang('Reports.discount_fixed')];
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/date_input', $data);
echo view('reports/date_input', $data);
}
/**
* Summary Discounts report
* @return string
**/
public function summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): string
public function summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -584,14 +579,13 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
* Summary Payments report
* @return string
*/
public function summary_payments(string $start_date, string $end_date): string
public function summary_payments(string $start_date, string $end_date): void
{
$this->clearCache();
@@ -643,16 +637,16 @@ class Reports extends Secure_Controller
'summary_data' => $summary
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
* Input for reports that require only a date range. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function date_input(): string
public function date_input(): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -662,30 +656,30 @@ class Reports extends Secure_Controller
$data['mode'] = 'sale';
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/date_input', $data);
echo view('reports/date_input', $data);
}
/**
* Input for reports that require only a date range. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function date_input_only(): string
public function date_input_only(): void
{
$this->clearCache();
$data = [];
return view('reports/date_input', $data);
echo view('reports/date_input', $data);
}
/**
* Input for reports that require only a date range. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function date_input_sales(): string
public function date_input_sales(): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -695,23 +689,23 @@ class Reports extends Secure_Controller
$data['mode'] = 'sale';
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/date_input', $data);
echo view('reports/date_input', $data);
}
/**
* Receivings date input. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function date_input_recv(): string
public function date_input_recv(): void
{
$stock_locations = $data = $this->stock_location->get_allowed_locations('receivings');
$stock_locations['all'] = lang('Reports.all');
$data['stock_locations'] = array_reverse($stock_locations, true);
$data['mode'] = 'receiving';
return view('reports/date_input', $data);
echo view('reports/date_input', $data);
}
/**
@@ -720,10 +714,10 @@ class Reports extends Secure_Controller
* @param string $start_date
* @param string $end_date
* @param string $sale_type
* @return string
* @return void
* @noinspection PhpUnused
*/
public function graphical_summary_expenses_categories(string $start_date, string $end_date, string $sale_type): string
public function graphical_summary_expenses_categories(string $start_date, string $end_date, string $sale_type): void
{
$this->clearCache();
@@ -756,7 +750,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -766,9 +760,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -802,7 +796,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -812,9 +806,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -849,7 +843,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -859,9 +853,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -892,7 +886,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -902,9 +896,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -937,7 +931,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -947,9 +941,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -981,7 +975,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -991,9 +985,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -1025,7 +1019,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -1035,9 +1029,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -1069,7 +1063,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -1079,9 +1073,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -1115,7 +1109,7 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -1126,10 +1120,9 @@ class Reports extends Secure_Controller
* @param string $sale_type
* @param string $location_id ID of the location to be reported or 'all' if none is specified
* @param int $discount_type
* @return string
* @noinspection PhpUnused
*/
public function graphical_summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): string
public function graphical_summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): void
{ // TODO: Duplicated Code
$this->clearCache();
@@ -1164,7 +1157,7 @@ class Reports extends Secure_Controller
'show_currency' => false
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
@@ -1174,9 +1167,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function graphical_summary_payments(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function graphical_summary_payments(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -1210,16 +1203,16 @@ class Reports extends Secure_Controller
'show_currency' => true
];
return view('reports/graphical', $data);
echo view('reports/graphical', $data);
}
/**
* Gets the specific customer input view. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_customer_input(): string
public function specific_customer_input(): void
{
$this->clearCache();
@@ -1237,7 +1230,7 @@ class Reports extends Secure_Controller
$data['sale_type_options'] = $this->get_sale_type_options();
$data['payment_type'] = $this->get_payment_type();
return view('reports/specific_customer_input', $data);
echo view('reports/specific_customer_input', $data);
}
/**
@@ -1264,10 +1257,10 @@ class Reports extends Secure_Controller
* @param string $customer_id
* @param string $sale_type
* @param string $payment_type
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_customers(string $start_date, string $end_date, string $customer_id, string $sale_type, string $payment_type): string
public function specific_customers(string $start_date, string $end_date, string $customer_id, string $sale_type, string $payment_type): void
{
$this->clearCache();
@@ -1358,16 +1351,16 @@ class Reports extends Secure_Controller
'overall_summary_data' => $specific_customer->getSummaryData($inputs)
];
return view('reports/tabular_details', $data);
echo view('reports/tabular_details', $data);
}
/**
* Detailed employee report input form. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_employee_input(): string
public function specific_employee_input(): void
{
$this->clearCache();
@@ -1381,7 +1374,7 @@ class Reports extends Secure_Controller
$data['specific_input_data'] = $employees;
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/specific_input', $data);
echo view('reports/specific_input', $data);
}
/**
@@ -1391,10 +1384,10 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $employee_id
* @param string $sale_type
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_employees(string $start_date, string $end_date, string $employee_id, string $sale_type): string
public function specific_employees(string $start_date, string $end_date, string $employee_id, string $sale_type): void
{
$this->clearCache();
@@ -1481,16 +1474,16 @@ class Reports extends Secure_Controller
'overall_summary_data' => $specific_employee->getSummaryData($inputs)
];
return view('reports/tabular_details', $data);
echo view('reports/tabular_details', $data);
}
/**
* Detailed discount report. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_discount_input(): string
public function specific_discount_input(): void
{
$this->clearCache();
@@ -1505,7 +1498,7 @@ class Reports extends Secure_Controller
$data['discount_type_options'] = ['0' => lang('Reports.discount_percent'), '1' => lang('Reports.discount_fixed')];
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/specific_input', $data);
echo view('reports/specific_input', $data);
}
/**
@@ -1516,10 +1509,10 @@ class Reports extends Secure_Controller
* @param string $discount
* @param string $sale_type
* @param string $discount_type
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_discounts(string $start_date, string $end_date, string $discount, string $sale_type, string $discount_type): string
public function specific_discounts(string $start_date, string $end_date, string $discount, string $sale_type, string $discount_type): void
{
$this->clearCache();
@@ -1612,17 +1605,17 @@ class Reports extends Secure_Controller
'overall_summary_data' => $specific_discount->getSummaryData($inputs)
];
return view('reports/tabular_details', $data);
echo view('reports/tabular_details', $data);
}
/**
* Gets the detailed sales data row for given sale_id. Used in app/Views/reports/tabular_details.php
*
* @param string $sale_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getGet_detailed_sales_row(string $sale_id): ResponseInterface
public function getGet_detailed_sales_row(string $sale_id): void
{
$this->clearCache();
@@ -1665,16 +1658,16 @@ class Reports extends Secure_Controller
)
];
return $this->response->setJSON([$sale_id => $summary_data]);
echo json_encode([$sale_id => $summary_data]);
}
/**
* Detailed Supplier report input form. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function specific_supplier_input(): string
public function specific_supplier_input(): void
{
$this->clearCache();
@@ -1688,7 +1681,7 @@ class Reports extends Secure_Controller
$data['specific_input_data'] = $suppliers;
$data['sale_type_options'] = $this->get_sale_type_options();
return view('reports/specific_input', $data);
echo view('reports/specific_input', $data);
}
/**
@@ -1698,9 +1691,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $supplier_id
* @param string $sale_type
* @return string
* @return void
*/
public function specific_suppliers(string $start_date, string $end_date, string $supplier_id, string $sale_type): string
public function specific_suppliers(string $start_date, string $end_date, string $supplier_id, string $sale_type): void
{
$inputs = [
'start_date' => $start_date,
@@ -1743,7 +1736,7 @@ class Reports extends Secure_Controller
'summary_data' => $specific_supplier->getSummaryData($inputs)
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
@@ -1770,9 +1763,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $sale_type
* @param string $location_id
* @return string
* @return void
*/
public function detailed_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
public function detailed_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -1876,17 +1869,17 @@ class Reports extends Secure_Controller
'details_data_rewards' => $details_data_rewards,
'overall_summary_data' => $this->detailed_sales->getSummaryData($inputs)
];
return view('reports/tabular_details', $data);
echo view('reports/tabular_details', $data);
}
/**
* Returns detailed receivings row for given receiving_id. Used in app/Views/reports/tabular_details.php
*
* @param string $receiving_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getGet_detailed_receivings_row(string $receiving_id): ResponseInterface
public function getGet_detailed_receivings_row(string $receiving_id): void
{
$inputs = ['receiving_id' => $receiving_id];
@@ -1916,7 +1909,7 @@ class Reports extends Secure_Controller
)
];
return $this->response->setJSON([$receiving_id => $summary_data]);
echo json_encode([$receiving_id => $summary_data]);
}
/**
@@ -1924,9 +1917,9 @@ class Reports extends Secure_Controller
* @param string $end_date
* @param string $receiving_type
* @param string $location_id
* @return string
* @return void
*/
public function detailed_receivings(string $start_date, string $end_date, string $receiving_type, string $location_id = 'all'): string
public function detailed_receivings(string $start_date, string $end_date, string $receiving_type, string $location_id = 'all'): void
{
$this->clearCache();
@@ -2000,13 +1993,13 @@ class Reports extends Secure_Controller
'overall_summary_data' => $this->detailed_receivings->getSummaryData($inputs)
];
return view('reports/tabular_details', $data);
echo view('reports/tabular_details', $data);
}
/**
* @return string
* @return void
*/
public function inventory_low(): string
public function inventory_low(): void
{
$this->clearCache();
@@ -2035,16 +2028,16 @@ class Reports extends Secure_Controller
'summary_data' => $inventory_low->getSummaryData($inputs)
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**
* Gets the inventory summary input view. Used in app/Config/Routes.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function inventory_summary_input(): string
public function inventory_summary_input(): void
{
$this->clearCache();
@@ -2055,15 +2048,15 @@ class Reports extends Secure_Controller
$stock_locations['all'] = lang('Reports.all');
$data['stock_locations'] = array_reverse($stock_locations, true);
return view('reports/inventory_summary_input', $data);
echo view('reports/inventory_summary_input', $data);
}
/**
* @param string $location_id
* @param string $item_count
* @return string
* @return void
*/
public function inventory_summary(string $location_id = 'all', string $item_count = 'all'): string
public function inventory_summary(string $location_id = 'all', string $item_count = 'all'): void
{
$this->clearCache();
@@ -2095,7 +2088,7 @@ class Reports extends Secure_Controller
'summary_data' => $this->inventory_summary->getSummaryData($report_data)
];
return view('reports/tabular', $data);
echo view('reports/tabular', $data);
}
/**

View File

@@ -20,7 +20,6 @@ use App\Models\Stock_location;
use App\Models\Tokens\Token_invoice_count;
use App\Models\Tokens\Token_customer;
use App\Models\Tokens\Token_invoice_sequence;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
use Config\OSPOS;
use ReflectionException;
@@ -66,19 +65,22 @@ class Sales extends Secure_Controller
$this->employee = model(Employee::class);
}
public function getIndex(): ResponseInterface|string
/**
* @return void
*/
public function getIndex(): void
{
$this->session->set('allow_temp_items', 1);
return $this->_reload(); // TODO: Hungarian Notation
$this->_reload(); // TODO: Hungarian Notation
}
/**
* Load the sale edit modal. Used in app/Views/sales/register.php.
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getManage(): string
public function getManage(): void
{
$person_id = $this->session->get('person_id');
@@ -105,26 +107,26 @@ class Sales extends Secure_Controller
}
$data['selected_filters'] = $selected_filters;
return view('sales/manage', $data);
echo view('sales/manage', $data);
}
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$sale_info = $this->sale->get_info($row_id)->getRow();
$data_row = get_sale_data_row($sale_info);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -164,16 +166,16 @@ class Sales extends Secure_Controller
$data_rows[] = get_sale_data_last_row($sales);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
}
/**
* Gets search suggestions for an item or item kit. Used in app/Views/sales/register.php.
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getItemSearch(): ResponseInterface
public function getItemSearch(): void
{
$suggestions = [];
$receipt = $search = $this->request->getGet('term') != ''
@@ -187,13 +189,13 @@ class Sales extends Secure_Controller
$suggestions = array_merge($suggestions, $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true));
$suggestions = array_merge($suggestions, $this->item_kit->get_search_suggestions($search));
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term') != ''
? $this->request->getPost('term')
@@ -201,16 +203,16 @@ class Sales extends Secure_Controller
$suggestions = $this->sale->get_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Set a given customer. Used in app/Views/sales/register.php.
*
* @return ResponseInterface|string
* @return void
* @noinspection PhpUnused
*/
public function postSelectCustomer(): ResponseInterface|string
public function postSelectCustomer(): void
{
$customer_id = (int)$this->request->getPost('customer', FILTER_SANITIZE_NUMBER_INT);
if ($this->customer->exists($customer_id)) {
@@ -224,16 +226,16 @@ class Sales extends Secure_Controller
}
}
return $this->_reload();
$this->_reload();
}
/**
* Changes the sale mode in the register to carry out different types of sales
*
* @return ResponseInterface|string
* @return void
* @noinspection PhpUnused
*/
public function postChangeMode(): ResponseInterface|string
public function postChangeMode(): void
{
$mode = $this->request->getPost('mode', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$this->sale_lib->set_mode($mode);
@@ -274,14 +276,14 @@ class Sales extends Secure_Controller
$this->sale_lib->empty_payments();
return $this->_reload();
$this->_reload();
}
/**
* @param int $sale_type
* @return ResponseInterface|string
* @return void
*/
public function change_register_mode(int $sale_type): ResponseInterface|string
public function change_register_mode(int $sale_type): void
{
$mode = match ($sale_type) {
SALE_TYPE_QUOTE => 'sale_quote',
@@ -292,87 +294,81 @@ class Sales extends Secure_Controller
};
$this->sale_lib->set_mode($mode);
return $this->_reload();
}
/**
* Sets the sales comment. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSetComment(): ResponseInterface
public function postSetComment(): void
{
$this->sale_lib->set_comment($this->request->getPost('comment', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
return $this->response->setJSON(['success' => true]);
}
/**
* Sets the invoice number. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSetInvoiceNumber(): ResponseInterface|string
public function postSetInvoiceNumber(): void
{
$this->sale_lib->set_invoice_number($this->request->getPost('sales_invoice_number', FILTER_SANITIZE_NUMBER_INT));
return $this->response->setJSON(['success' => true]);
}
/**
* @return ResponseInterface
* @return void
*/
public function postSetPaymentType(): ResponseInterface|string // TODO: This function does not appear to be called anywhere in the code.
public function postSetPaymentType(): void // TODO: This function does not appear to be called anywhere in the code.
{
$this->sale_lib->set_payment_type($this->request->getPost('selected_payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
return $this->_reload(); // TODO: Hungarian notation.
$this->_reload(); // TODO: Hungarian notation.
}
/**
* Sets PrintAfterSale flag. Used in app/Views/sales/register.php
*
* @return ResponseInterface|string
* @return void
* @noinspection PhpUnused
*/
public function postSetPrintAfterSale(): ResponseInterface
public function postSetPrintAfterSale(): void
{
$this->sale_lib->set_print_after_sale($this->request->getPost('sales_print_after_sale') != 'false');
return $this->response->setJSON(['success' => true]);
}
/**
* Sets the flag to include prices in the work order. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSetPriceWorkOrders(): ResponseInterface
public function postSetPriceWorkOrders(): void
{
$price_work_orders = parse_decimals($this->request->getPost('price_work_orders'));
$this->sale_lib->set_price_work_orders($price_work_orders);
return $this->response->setJSON(['success' => true]);
}
/**
* Sets the flag to email receipt to the customer. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSetEmailReceipt(): ResponseInterface
public function postSetEmailReceipt(): void
{
$this->sale_lib->set_email_receipt($this->request->getPost('email_receipt', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
return $this->response->setJSON(['success' => true]);
}
/**
* Add a payment to the sale. Used in app/Views/sales/register.php
*
* @return ResponseInterface|string
* @return void
* @noinspection PhpUnused
*/
public function postAddPayment(): ResponseInterface|string
public function postAddPayment(): void
{
$data = [];
$giftcard = model(Giftcard::class);
@@ -457,32 +453,32 @@ class Sales extends Secure_Controller
}
}
return $this->_reload($data);
$this->_reload($data);
}
/**
* Multiple Payments. Used in app/Views/sales/register.php
*
* @param string $payment_id
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getDeletePayment(string $payment_id): ResponseInterface|string
public function getDeletePayment(string $payment_id): void
{
helper('url');
$this->sale_lib->delete_payment(base64url_decode($payment_id));
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Add an item to the sale. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postAdd(): ResponseInterface|string
public function postAdd(): void
{
$data = [];
@@ -553,17 +549,17 @@ class Sales extends Secure_Controller
}
}
return $this->_reload($data);
$this->_reload($data);
}
/**
* Edit an item in the sale. Used in app/Views/sales/register.php
*
* @param string $line
* @return ResponseInterface|string
* @return void
* @noinspection PhpUnused
*/
public function postEditItem(string $line): ResponseInterface|string
public function postEditItem(string $line): void
{
$data = [];
@@ -598,33 +594,33 @@ class Sales extends Secure_Controller
$data['error'] = lang('Sales.error_editing_item');
}
return $this->_reload($data);
$this->_reload($data);
}
/**
* Deletes an item specified in the parameter from the shopping cart. Used in app/Views/sales/register.php
*
* @param int $item_id
* @return ResponseInterface
* @return void
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function getDeleteItem(int $item_id): ResponseInterface|string
public function getDeleteItem(int $item_id): void
{
$this->sale_lib->delete_item($item_id);
$this->sale_lib->empty_payments();
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Remove the current customer from the sale. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getRemoveCustomer(): ResponseInterface|string
public function getRemoveCustomer(): void
{
$this->sale_lib->clear_giftcard_remainder();
$this->sale_lib->clear_rewards_remainder();
@@ -633,17 +629,17 @@ class Sales extends Secure_Controller
$this->sale_lib->clear_quote_number();
$this->sale_lib->remove_customer();
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Complete and finalize a sale. Used in app/Views/sales/register.php
*
* @return string
* @return void
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postComplete(): string // TODO: this function is huge. Probably should be refactored.
public function postComplete(): void // TODO: this function is huge. Probably should be refactored.
{
$sale_id = $this->sale_lib->get_sale_id();
$data = [];
@@ -755,11 +751,8 @@ class Sales extends Secure_Controller
$data['sale_status'] = COMPLETED;
$sale_type = SALE_TYPE_INVOICE;
$invoice_type = $this->config['invoice_type'];
if (!Sale_lib::isValidInvoiceType($invoice_type)) {
$invoice_type = 'invoice';
}
$invoice_view = $invoice_type;
// The PHP file name is the same as the invoice_type key
$invoice_view = $this->config['invoice_type'];
// Save the data to the sales table
$data['sale_id_num'] = $this->sale->save_value($sale_id, $data['sale_status'], $data['cart'], $customer_id, $employee_id, $data['comments'], $invoice_number, $work_order_number, $quote_number, $sale_type, $data['payments'], $data['dinner_table'], $tax_details);
@@ -772,7 +765,7 @@ class Sales extends Secure_Controller
$data['error_message'] = lang('Sales.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
return view('sales/' . $invoice_view, $data);
echo view('sales/' . $invoice_view, $data);
$this->sale_lib->clear_all();
}
}
@@ -806,7 +799,7 @@ class Sales extends Secure_Controller
$data['barcode'] = null;
return view('sales/work_order', $data);
echo view('sales/work_order', $data);
$this->sale_lib->clear_mode();
$this->sale_lib->clear_all();
}
@@ -834,7 +827,7 @@ class Sales extends Secure_Controller
$data['cart'] = $this->sale_lib->sort_and_filter_cart($data['cart']);
$data['barcode'] = null;
return view('sales/quote', $data);
echo view('sales/quote', $data);
$this->sale_lib->clear_mode();
$this->sale_lib->clear_all();
}
@@ -857,7 +850,7 @@ class Sales extends Secure_Controller
$data['error_message'] = lang('Sales.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['sale_id']);
return view('sales/receipt', $data);
echo view('sales/receipt', $data);
$this->sale_lib->clear_all();
}
}
@@ -868,10 +861,10 @@ class Sales extends Secure_Controller
*
* @param int $sale_id
* @param string $type
* @return ResponseInterface
* @return bool
* @noinspection PhpUnused
*/
public function getSendPdf(int $sale_id, string $type = 'invoice'): ResponseInterface
public function getSendPdf(int $sale_id, string $type = 'invoice'): bool
{
$sale_data = $this->_load_sale_data($sale_id);
@@ -906,19 +899,21 @@ class Sales extends Secure_Controller
$message = lang($result ? "Sales." . $type . "_sent" : "Sales." . $type . "_unsent") . ' ' . $to;
}
echo json_encode(['success' => $result, 'message' => $message, 'id' => $sale_id]);
$this->sale_lib->clear_all();
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
return $result;
}
/**
* Emails sales receipt to customer. Used in app/Views/sales/receipt.php
*
* @param int $sale_id
* @return ResponseInterface
* @return bool
* @noinspection PhpUnused
*/
public function getSendReceipt(int $sale_id): ResponseInterface
public function getSendReceipt(int $sale_id): bool
{
$sale_data = $this->_load_sale_data($sale_id);
@@ -927,13 +922,6 @@ class Sales extends Secure_Controller
if (!empty($sale_data['customer_email'])) {
$sale_data['barcode'] = $this->barcode_lib->generate_receipt_barcode($sale_data['sale_id']);
$sale_data['img_tag'] = '';
$logo_path = FCPATH . 'uploads/' . $this->config['company_logo'];
if (!empty($this->config['company_logo']) && file_exists($logo_path)) {
$logo_data = base64_encode(file_get_contents($logo_path));
$sale_data['img_tag'] = '<img id="image" src="data:image/png;base64,' . $logo_data . '" alt="company_logo">';
}
$to = $sale_data['customer_email'];
$subject = lang('Sales.receipt');
@@ -946,9 +934,11 @@ class Sales extends Secure_Controller
$message = lang($result ? 'Sales.receipt_sent' : 'Sales.receipt_unsent') . ' ' . $to;
}
echo json_encode(['success' => $result, 'message' => $message, 'id' => $sale_id]);
$this->sale_lib->clear_all();
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
return $result;
}
/**
@@ -1110,9 +1100,6 @@ class Sales extends Secure_Controller
}
$invoice_type = $this->config['invoice_type'];
if (!Sale_lib::isValidInvoiceType($invoice_type)) {
$invoice_type = 'invoice';
}
$data['invoice_view'] = $invoice_type;
return $data;
@@ -1122,7 +1109,7 @@ class Sales extends Secure_Controller
* @param array $data
* @return void
*/
private function _reload(array $data = []): ResponseInterface|string // TODO: Hungarian notation
private function _reload(array $data = []): void // TODO: Hungarian notation
{
$sale_id = $this->session->get('sale_id'); // TODO: This variable is never used
@@ -1228,47 +1215,40 @@ class Sales extends Secure_Controller
$data['customer_required'] = lang('Sales.customer_optional');
}
return view("sales/register", $data);
echo view("sales/register", $data);
}
/**
* Load the sales receipt for a sale. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getReceipt(int $sale_id): string
public function getReceipt(int $sale_id): void
{
$data = $this->_load_sale_data($sale_id);
echo view('sales/receipt', $data);
$this->sale_lib->clear_all();
return view('sales/receipt', $data);
}
/**
* Loads the sales invoice for a sale. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @return string
* @noinspection PhpUnused
* @return void
*/
public function getInvoice(int $sale_id): string
public function getInvoice(int $sale_id): void
{
$data = $this->_load_sale_data($sale_id);
$this->sale_lib->clear_all();
return view('sales/' . $data['invoice_view'], $data);
echo view('sales/' . $data['invoice_view'], $data);
$this->sale_lib->clear_all();
}
/**
* Edits an existing sale or work order. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @return string
* @throws ReflectionException
* @return void
*/
public function getEdit(int $sale_id): string
public function getEdit(int $sale_id): void
{
$data = [];
@@ -1313,32 +1293,30 @@ class Sales extends Secure_Controller
$data['new_payment_options'] = $payment_options;
return view('sales/form', $data);
echo view('sales/form', $data);
}
/**
* @param int $sale_id
* @return ResponseInterface
* @throws ReflectionException
*/
public function postDelete(int $sale_id = NEW_ENTRY, bool $update_inventory = true): ResponseInterface
public function postDelete(int $sale_id = NEW_ENTRY, bool $update_inventory = true): void
{
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
if (!$has_grant) {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
echo json_encode(['success' => false, 'message' => lang('Sales.not_authorized')]);
} else {
$sale_ids = $sale_id == NEW_ENTRY ? $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT) : [$sale_id];
if ($this->sale->delete_list($sale_ids, $employee_id, $update_inventory)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Sales.successfully_deleted') . ' ' . count($sale_ids) . ' ' . lang('Sales.one_or_multiple'),
'ids' => $sale_ids
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_deleted')]);
}
}
}
@@ -1346,26 +1324,26 @@ class Sales extends Secure_Controller
/**
* @param int $sale_id
* @param bool $update_inventory
* @return ResponseInterface
* @return void
*/
public function restore(int $sale_id = NEW_ENTRY, bool $update_inventory = true): ResponseInterface
public function restore(int $sale_id = NEW_ENTRY, bool $update_inventory = true): void
{
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
if (!$has_grant) {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
echo json_encode(['success' => false, 'message' => lang('Sales.not_authorized')]);
} else {
$sale_ids = $sale_id == NEW_ENTRY ? $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT) : [$sale_id];
if ($this->sale->restore_list($sale_ids, $employee_id, $update_inventory)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Sales.successfully_restored') . ' ' . count($sale_ids) . ' ' . lang('Sales.one_or_multiple'),
'ids' => $sale_ids
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_restored')]);
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_restored')]);
}
}
}
@@ -1374,10 +1352,9 @@ class Sales extends Secure_Controller
* This saves the sale from the update sale view (sales/form).
* It only updates the sales table and payments.
* @param int $sale_id
* @return ResponseInterface
* @throws ReflectionException
*/
public function postSave(int $sale_id = NEW_ENTRY): ResponseInterface
public function postSave(int $sale_id = NEW_ENTRY): void
{
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
@@ -1458,9 +1435,9 @@ class Sales extends Secure_Controller
$inventory->update('POS ' . $sale_id, ['trans_date' => $sale_time]); // TODO: Reflection Exception
if ($this->sale->update($sale_id, $sale_data)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $sale_id]);
echo json_encode(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $sale_id]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $sale_id]);
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $sale_id]);
}
}
@@ -1470,11 +1447,10 @@ class Sales extends Secure_Controller
* Work orders can be canceled but are not physically removed from the sales history.
* Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postCancel(): ResponseInterface|string
public function postCancel(): void
{
$sale_id = $this->sale_lib->get_sale_id();
if ($sale_id != NEW_ENTRY && $sale_id != '') {
@@ -1496,32 +1472,32 @@ class Sales extends Secure_Controller
}
$this->sale_lib->clear_all();
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Discards the suspended sale. Used in app/Views/sales/quote.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getDiscardSuspendedSale(): ResponseInterface|string
public function getDiscardSuspendedSale(): void
{
$suspended_id = $this->sale_lib->get_suspended_id();
$this->sale_lib->clear_all();
$this->sale->delete_suspended_sale($suspended_id);
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Suspend the current sale.
* If the current sale is already suspended then update the existing suspended sale otherwise create
* it as a new suspended sale. Used in app/Views/sales/register.php
* it as a new suspended sale. Used in app/Views/sales/register.php.
*
* @return ResponseInterface|string
* @throws ReflectionException
* @noinspection PhpUnused
*/
public function postSuspend(): ResponseInterface|string
public function postSuspend(): void
{
$sale_id = $this->sale_lib->get_sale_id();
$dinner_table = $this->sale_lib->get_dinner_table();
@@ -1552,29 +1528,28 @@ class Sales extends Secure_Controller
$this->sale_lib->clear_all();
return $this->_reload($data);
$this->_reload($data); // TODO: Hungarian notation
}
/**
* List suspended sales
* @return string
*/
public function getSuspended(): string
public function getSuspended(): void
{
$data = [];
$customer_id = $this->sale_lib->get_customer();
$data['suspended_sales'] = $this->sale->get_all_suspended($customer_id);
return view('sales/suspended', $data);
echo view('sales/suspended', $data);
}
/**
* Unsuspended sales are now left in the tables and are only removed
* when they are intentionally cancelled. Used in app/Views/sales/suspended.php.
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postUnsuspend(): ResponseInterface|string
public function postUnsuspend(): void
{
$sale_id = $this->request->getPost('suspended_sale_id', FILTER_SANITIZE_NUMBER_INT);
$this->sale_lib->clear_all();
@@ -1586,32 +1561,32 @@ class Sales extends Secure_Controller
// Set current register mode to reflect that of unsuspended order type
$this->change_register_mode($this->sale_lib->get_sale_type());
return $this->_reload();
$this->_reload(); // TODO: Hungarian notation
}
/**
* Show Keyboard shortcut modal. Used in app/Views/sales/register.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getSalesKeyboardHelp(): string
public function getSalesKeyboardHelp(): void
{
return view('sales/help');
echo view('sales/help');
}
/**
* Check the validity of an invoice number. Used in app/Views/sales/form.php.
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postCheckInvoiceNumber(): ResponseInterface
public function postCheckInvoiceNumber(): void
{
$sale_id = $this->request->getPost('sale_id', FILTER_SANITIZE_NUMBER_INT);
$invoice_number = $this->request->getPost('invoice_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$exists = !empty($invoice_number) && $this->sale->check_invoice_number_exists($invoice_number, $sale_id);
return $this->response->setJSON(!$exists ? 'true' : 'false');
echo !$exists ? 'true' : 'false';
}
/**
@@ -1638,10 +1613,10 @@ class Sales extends Secure_Controller
/**
* Update the item number in the register. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postChangeItemNumber(): ResponseInterface
public function postChangeItemNumber(): void
{
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
$item_number = $this->request->getPost('item_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -1657,10 +1632,10 @@ class Sales extends Secure_Controller
/**
* Change a given item name. Used in app/Views/sales/register.php.
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postChangeItemName(): ResponseInterface
public function postChangeItemName(): void
{
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
$name = $this->request->getPost('item_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -1680,10 +1655,10 @@ class Sales extends Secure_Controller
/**
* Update the given item description. Used in app/Views/sales/register.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postChangeItemDescription(): ResponseInterface
public function postChangeItemDescription(): void
{
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
$description = $this->request->getPost('item_description', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

View File

@@ -4,7 +4,7 @@ namespace App\Controllers;
use App\Models\Employee;
use App\Models\Module;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Model;
use CodeIgniter\Session\Session;
use Config\OSPOS;
@@ -85,17 +85,18 @@ class Secure_Controller extends BaseController
/**
* AJAX function used to confirm whether values sent in the request are numeric
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getCheckNumeric(): ResponseInterface
public function getCheckNumeric(): void
{
foreach ($this->request->getGet() as $value) {
if (parse_decimals($value) === false) {
return $this->response->setJSON('false');
echo 'false';
return;
}
}
return $this->response->setJSON('true');
echo 'true';
}
/**

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Supplier;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
class Suppliers extends Persons
@@ -18,33 +17,33 @@ class Suppliers extends Persons
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_suppliers_manage_table_headers();
return view('people/manage', $data);
echo view('people/manage', $data);
}
/**
* Gets one row for a supplier manage table. This is called using AJAX to update one row.
* @param $row_id
* @return ResponseInterface
* @return void
*/
public function getRow($row_id): ResponseInterface
public function getRow($row_id): void
{
$data_row = get_supplier_data_row($this->supplier->get_info($row_id));
$data_row['category'] = $this->supplier->get_category_name($data_row['category']);
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* Returns Supplier table data rows. This will be called with AJAX.
* @return void
**/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -63,39 +62,38 @@ class Suppliers extends Persons
$data_rows[] = $row;
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* Gives search suggestions based on what is being searched for
* @return ResponseInterface
**/
public function getSuggest(): ResponseInterface
public function getSuggest(): void
{
$search = $this->request->getGet('term');
$suggestions = $this->supplier->get_search_suggestions($search, true);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @return ResponseInterface
* @return void
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->supplier->get_search_suggestions($search, false);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Loads the supplier edit form
*
* @param int $supplier_id
* @return string
* @return void
*/
public function getView(int $supplier_id = NEW_ENTRY): string
public function getView(int $supplier_id = NEW_ENTRY): void
{
$info = $this->supplier->get_info($supplier_id);
foreach (get_object_vars($info) as $property => $value) {
@@ -104,16 +102,16 @@ class Suppliers extends Persons
$data['person_info'] = $info;
$data['categories'] = $this->supplier->get_categories();
return view("suppliers/form", $data);
echo view("suppliers/form", $data);
}
/**
* Inserts/updates a supplier
*
* @param int $supplier_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $supplier_id = NEW_ENTRY): ResponseInterface
public function postSave(int $supplier_id = NEW_ENTRY): void
{
$first_name = $this->request->getPost('first_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // TODO: Duplicate code
$last_name = $this->request->getPost('last_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -149,21 +147,21 @@ class Suppliers extends Persons
if ($this->supplier->save_supplier($person_data, $supplier_data, $supplier_id)) {
// New supplier
if ($supplier_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Suppliers.successful_adding') . ' ' . $supplier_data['company_name'],
'id' => $supplier_data['person_id']
]);
} else { // Existing supplier
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Suppliers.successful_updating') . ' ' . $supplier_data['company_name'],
'id' => $supplier_id
]);
}
} else { // Failure
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Suppliers.error_adding_updating') . ' ' . $supplier_data['company_name'],
'id' => NEW_ENTRY
@@ -174,19 +172,19 @@ class Suppliers extends Persons
/**
* This deletes suppliers from the suppliers table
*
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$suppliers_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
if ($this->supplier->delete_list($suppliers_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Suppliers.successful_deleted') . ' ' . count($suppliers_to_delete) . ' ' . lang('Suppliers.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Suppliers.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Suppliers.cannot_be_deleted')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Tax_category;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
/**
@@ -21,13 +20,13 @@ class Tax_categories extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['tax_categories_table_headers'] = get_tax_categories_table_headers();
return view('taxes/tax_categories', $data);
echo view('taxes/tax_categories', $data);
}
/**
@@ -35,7 +34,7 @@ class Tax_categories extends Secure_Controller
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -51,37 +50,37 @@ class Tax_categories extends Secure_Controller
$data_rows[] = get_tax_categories_data_row($tax_category);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @param $row_id
* @return ResponseInterface
* @return void
*/
public function getRow($row_id): ResponseInterface
public function getRow($row_id): void
{
$data_row = get_tax_categories_data_row($this->tax_category->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $tax_category_id
* @return string
* @return void
*/
public function getView(int $tax_category_id = NEW_ENTRY): string
public function getView(int $tax_category_id = NEW_ENTRY): void
{
$data['tax_category_info'] = $this->tax_category->get_info($tax_category_id);
return view("taxes/tax_category_form", $data);
echo view("taxes/tax_category_form", $data);
}
/**
* @param int $tax_category_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $tax_category_id = NEW_ENTRY): ResponseInterface
public function postSave(int $tax_category_id = NEW_ENTRY): void
{
$tax_category_data = [
'tax_category' => $this->request->getPost('tax_category', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -92,20 +91,20 @@ class Tax_categories extends Secure_Controller
if ($this->tax_category->save_value($tax_category_data, $tax_category_id)) {
// New tax_category_id
if ($tax_category_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_categories.successful_adding'),
'id' => $tax_category_data['tax_category_id']
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_categories.successful_updating'),
'id' => $tax_category_id
]);
}
} else {
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Tax_categories.error_adding_updating') . ' ' . $tax_category_data['tax_category'],
'id' => NEW_ENTRY
@@ -114,19 +113,19 @@ class Tax_categories extends Secure_Controller
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$tax_categories_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
if ($this->tax_category->delete_list($tax_categories_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_categories.successful_deleted') . ' ' . count($tax_categories_to_delete) . ' ' . lang('Tax_categories.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_categories.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Tax_categories.cannot_be_deleted')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Tax_code;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
/**
@@ -23,11 +22,11 @@ class Tax_codes extends Secure_Controller
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
return view('taxes/tax_codes', $this->get_data());
echo view('taxes/tax_codes', $this->get_data());
}
/**
@@ -45,7 +44,7 @@ class Tax_codes extends Secure_Controller
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -62,37 +61,37 @@ class Tax_codes extends Secure_Controller
$data_rows[] = get_tax_code_data_row($tax_code);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_tax_code_data_row($this->tax_code->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $tax_code_id
* @return string
* @return void
*/
public function getView(int $tax_code_id = NEW_ENTRY): string
public function getView(int $tax_code_id = NEW_ENTRY): void
{
$data['tax_code_info'] = $this->tax_code->get_info($tax_code_id);
return view("taxes/tax_code_form", $data);
echo view("taxes/tax_code_form", $data);
}
/**
* @param int $tax_code_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $tax_code_id = NEW_ENTRY): ResponseInterface
public function postSave(int $tax_code_id = NEW_ENTRY): void
{
$tax_code_data = [
'tax_code' => $this->request->getPost('tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -103,20 +102,20 @@ class Tax_codes extends Secure_Controller
if ($this->tax_code->save($tax_code_data)) {
if ($tax_code_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_codes.successful_adding'),
'id' => $tax_code_data['tax_code_id']
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_codes.successful_updating'),
'id' => $tax_code_id
]);
}
} else {
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Tax_codes.error_adding_updating') . ' ' . $tax_code_data['tax_code_id'],
'id' => NEW_ENTRY
@@ -125,19 +124,19 @@ class Tax_codes extends Secure_Controller
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$tax_codes_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
if ($this->tax_code->delete_list($tax_codes_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_codes.successful_deleted') . ' ' . count($tax_codes_to_delete) . ' ' . lang('Tax_codes.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_codes.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Tax_codes.cannot_be_deleted')]);
}
}
}

View File

@@ -3,7 +3,6 @@
namespace App\Controllers;
use App\Models\Tax_jurisdiction;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
/**
@@ -24,13 +23,13 @@ class Tax_jurisdictions extends Secure_Controller
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['table_headers'] = get_tax_jurisdictions_table_headers();
return view('taxes/tax_jurisdictions', $data);
echo view('taxes/tax_jurisdictions', $data);
}
/**
@@ -38,7 +37,7 @@ class Tax_jurisdictions extends Secure_Controller
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -54,37 +53,37 @@ class Tax_jurisdictions extends Secure_Controller
$data_rows[] = get_tax_jurisdictions_data_row($tax_jurisdiction);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_tax_jurisdictions_data_row($this->tax_jurisdiction->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $tax_jurisdiction_id
* @return string
* @return void
*/
public function getView(int $tax_jurisdiction_id = NEW_ENTRY): string
public function getView(int $tax_jurisdiction_id = NEW_ENTRY): void
{
$data['tax_jurisdiction_info'] = $this->tax_jurisdiction->get_info($tax_jurisdiction_id);
return view("taxes/tax_jurisdiction_form", $data);
echo view("taxes/tax_jurisdiction_form", $data);
}
/**
* @param int $jurisdiction_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $jurisdiction_id = NEW_ENTRY): ResponseInterface
public function postSave(int $jurisdiction_id = NEW_ENTRY): void
{
$tax_jurisdiction_data = [
'jurisdiction_name' => $this->request->getPost('jurisdiction_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -93,20 +92,20 @@ class Tax_jurisdictions extends Secure_Controller
if ($this->tax_jurisdiction->save_value($tax_jurisdiction_data)) {
if ($jurisdiction_id == NEW_ENTRY) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_jurisdictions.successful_adding'),
'id' => $tax_jurisdiction_data['jurisdiction_id']
]);
} else {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_jurisdictions.successful_updating'),
'id' => $jurisdiction_id
]);
}
} else {
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Tax_jurisdictions.error_adding_updating') . ' ' . $tax_jurisdiction_data['jurisdiction_name'],
'id' => NEW_ENTRY
@@ -115,19 +114,19 @@ class Tax_jurisdictions extends Secure_Controller
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$tax_jurisdictions_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
if ($this->tax_jurisdiction->delete_list($tax_jurisdictions_to_delete)) {
return $this->response->setJSON([
echo json_encode([
'success' => true,
'message' => lang('Tax_jurisdictions.successful_deleted') . ' ' . count($tax_jurisdictions_to_delete) . ' ' . lang('Tax_jurisdictions.one_or_multiple')
]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_jurisdictions.cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Tax_jurisdictions.cannot_be_deleted')]);
}
}
}

View File

@@ -8,7 +8,6 @@ use App\Models\Tax;
use App\Models\Tax_category;
use App\Models\Tax_code;
use App\Models\Tax_jurisdiction;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -37,9 +36,9 @@ class Taxes extends Secure_Controller
}
/**
* @return string
* @return void
*/
public function getIndex(): string
public function getIndex(): void
{
$data['tax_codes'] = $this->tax_code->get_all()->getResultArray();
if (count($data['tax_codes']) == 0) {
@@ -68,7 +67,7 @@ class Taxes extends Secure_Controller
$data['tax_type_options'] = $this->tax_lib->get_tax_type_options($data['default_tax_type']);
return view('taxes/manage', $data);
echo view('taxes/manage', $data);
}
/**
@@ -76,7 +75,7 @@ class Taxes extends Secure_Controller
*
* @return void
*/
public function getSearch(): ResponseInterface
public function getSearch(): void
{
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
@@ -93,50 +92,50 @@ class Taxes extends Secure_Controller
$data_rows[] = get_tax_rates_data_row($tax_rate_row);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
}
/**
* Gives search suggestions based on what is being searched for
* @return ResponseInterface
*/
public function suggest_search(): ResponseInterface
public function suggest_search(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->tax->get_search_suggestions($search); // TODO: There is no get_search_suggestions function in the tax model
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Provides list of tax categories to select from
* @return ResponseInterface
*
* @return void
*/
public function suggest_tax_categories(): ResponseInterface
public function suggest_tax_categories(): void
{
$search = $this->request->getPost('term');
$suggestions = $this->tax_category->get_tax_category_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* @param int $row_id
* @return ResponseInterface
* @return void
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $row_id): void
{
$data_row = get_tax_rates_data_row($this->tax->get_info($row_id));
return $this->response->setJSON($data_row);
echo json_encode($data_row);
}
/**
* @param int $tax_code
* @return string
* @return void
*/
public function getView_tax_codes(int $tax_code = NEW_ENTRY): string
public function getView_tax_codes(int $tax_code = NEW_ENTRY): void
{
$tax_code_info = $this->tax->get_info($tax_code);
@@ -193,15 +192,15 @@ class Taxes extends Secure_Controller
$data['tax_rates'] = $tax_rates;
return view('taxes/tax_code_form', $data);
echo view('taxes/tax_code_form', $data);
}
/**
* @param int $tax_rate_id
* @return string
* @return void
*/
public function getView(int $tax_rate_id = NEW_ENTRY): string
public function getView(int $tax_rate_id = NEW_ENTRY): void
{
$tax_rate_info = $this->tax->get_info($tax_rate_id);
@@ -227,14 +226,14 @@ class Taxes extends Secure_Controller
$data['tax_rate'] = $tax_rate_info->tax_rate;
}
return view('taxes/tax_rates_form', $data);
echo view('taxes/tax_rates_form', $data);
}
/**
* @param int $tax_code
* @return string
* @return void
*/
public function getView_tax_categories(int $tax_code = NEW_ENTRY): string // TODO: This appears to be called no where in the code.
public function getView_tax_categories(int $tax_code = NEW_ENTRY): void // TODO: This appears to be called no where in the code.
{
$tax_code_info = $this->tax->get_info($tax_code); // TODO: Duplicated Code
@@ -291,14 +290,14 @@ class Taxes extends Secure_Controller
$data['tax_rates'] = $tax_rates;
return view('taxes/tax_category_form', $data);
echo view('taxes/tax_category_form', $data);
}
/**
* @param int $tax_code
* @return string
* @return void
*/
public function getView_tax_jurisdictions(int $tax_code = NEW_ENTRY): string // TODO: This appears to be called no where in the code.
public function getView_tax_jurisdictions(int $tax_code = NEW_ENTRY): void // TODO: This appears to be called no where in the code.
{
$tax_code_info = $this->tax->get_info($tax_code); // TODO: Duplicated code
@@ -355,7 +354,7 @@ class Taxes extends Secure_Controller
$data['tax_rates'] = $tax_rates;
return view('taxes/tax_jurisdiction_form', $data);
echo view('taxes/tax_jurisdiction_form', $data);
}
/**
@@ -368,9 +367,9 @@ class Taxes extends Secure_Controller
/**
* @param int $tax_rate_id
* @return ResponseInterface
* @return void
*/
public function postSave(int $tax_rate_id = NEW_ENTRY): ResponseInterface
public function postSave(int $tax_rate_id = NEW_ENTRY): void
{
$tax_category_id = $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT);
$tax_rate = parse_tax($this->request->getPost('tax_rate'));
@@ -389,50 +388,50 @@ class Taxes extends Secure_Controller
if ($this->tax->save_value($tax_rate_data, $tax_rate_id)) {
if ($tax_rate_id == NEW_ENTRY) { // TODO: this needs to be replaced with ternary notation
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_rate_successfully_added')]);
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_rate_successfully_added')]);
} else { // Existing tax_code
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_rate_successful_updated')]);
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_rate_successful_updated')]);
}
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Taxes.tax_rate_error_adding_updating')]);
echo json_encode(['success' => false, 'message' => lang('Taxes.tax_rate_error_adding_updating')]);
}
}
/**
* @return ResponseInterface
* @return void
*/
public function postDelete(): ResponseInterface
public function postDelete(): void
{
$tax_codes_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
if ($this->tax->delete_list($tax_codes_to_delete)) { // TODO: this needs to be replaced with ternary notation
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_code_successful_deleted')]);
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_code_successful_deleted')]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Taxes.tax_code_cannot_be_deleted')]);
echo json_encode(['success' => false, 'message' => lang('Taxes.tax_code_cannot_be_deleted')]);
}
}
/**
* Get search suggestions for tax codes. Used in app/Views/customers/form.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function getSuggestTaxCodes(): ResponseInterface
public function getSuggestTaxCodes(): void
{
$search = $this->request->getPostGet('term');
$suggestions = $this->tax_code->get_tax_codes_search_suggestions($search);
return $this->response->setJSON($suggestions);
echo json_encode($suggestions);
}
/**
* Saves Tax Codes. Used in app/Views/taxes/tax_codes.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSave_tax_codes(): ResponseInterface
public function postSave_tax_codes(): void
{
$tax_code_id = $this->request->getPost('tax_code_id', FILTER_SANITIZE_NUMBER_INT);
$tax_code = $this->request->getPost('tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -453,7 +452,7 @@ class Taxes extends Secure_Controller
$success = $this->tax_code->save_tax_codes($array_save);
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Taxes.tax_codes_saved_' . ($success ? '' : 'un') . 'successfully')
]);
@@ -462,10 +461,10 @@ class Taxes extends Secure_Controller
/**
* Saves given tax jurisdiction. Used in app/Views/taxes/tax_jurisdictions.php.
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSave_tax_jurisdictions(): ResponseInterface
public function postSave_tax_jurisdictions(): void
{
$jurisdiction_id = $this->request->getPost('jurisdiction_id', FILTER_SANITIZE_NUMBER_INT);
$jurisdiction_name = $this->request->getPost('jurisdiction_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -490,10 +489,11 @@ class Taxes extends Secure_Controller
];
if (in_array($tax_group[$key], $unique_tax_groups)) { // TODO: This can be replaced with `in_array($tax_group[$key], $unique_tax_groups)`
return $this->response->setJSON([
echo json_encode([
'success' => false,
'message' => lang('Taxes.tax_group_not_unique', [$tax_group[$key]])
]);
return;
} else {
$unique_tax_groups[] = $tax_group[$key];
}
@@ -501,7 +501,7 @@ class Taxes extends Secure_Controller
$success = $this->tax_jurisdiction->save_jurisdictions($array_save);
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Taxes.tax_jurisdictions_saved_' . ($success ? '' : 'un') . 'successfully')
]);
@@ -510,10 +510,10 @@ class Taxes extends Secure_Controller
/**
* Saves tax categories. Used in app/Views/taxes/tax_categories.php
*
* @return ResponseInterface
* @return void
* @noinspection PhpUnused
*/
public function postSave_tax_categories(): ResponseInterface
public function postSave_tax_categories(): void
{
$tax_category_id = $this->request->getPost('tax_category_id', FILTER_SANITIZE_NUMBER_INT);
$tax_category = $this->request->getPost('tax_category', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
@@ -531,7 +531,7 @@ class Taxes extends Secure_Controller
$success = $this->tax_category->save_categories($array_save);
return $this->response->setJSON([
echo json_encode([
'success' => $success,
'message' => lang('Taxes.tax_categories_saved_' . ($success ? '' : 'un') . 'successfully')
]);
@@ -540,36 +540,36 @@ class Taxes extends Secure_Controller
/**
* Gets tax codes partial view. Used in app/Views/taxes/tax_codes.php.
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getAjax_tax_codes(): string
public function getAjax_tax_codes(): void
{
$tax_codes = $this->tax_code->get_all()->getResultArray();
return view('partial/tax_codes', ['tax_codes' => $tax_codes]);
echo view('partial/tax_codes', ['tax_codes' => $tax_codes]);
}
/**
* Gets current tax categories. Used in app/Views/taxes/tax_categories.php
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getAjax_tax_categories(): string
public function getAjax_tax_categories(): void
{
$tax_categories = $this->tax_category->get_all()->getResultArray();
return view('partial/tax_categories', ['tax_categories' => $tax_categories]);
echo view('partial/tax_categories', ['tax_categories' => $tax_categories]);
}
/**
* Gets the tax jurisdiction partial view. Used in app/Views/taxes/tax_jurisdictions.php.
*
* @return string
* @return void
* @noinspection PhpUnused
*/
public function getAjax_tax_jurisdictions(): string
public function getAjax_tax_jurisdictions(): void
{
$tax_jurisdictions = $this->tax_jurisdiction->get_all()->getResultArray();
@@ -581,7 +581,7 @@ class Taxes extends Secure_Controller
$tax_types = $this->tax_lib->get_tax_types();
return view('partial/tax_jurisdictions', [
echo view('partial/tax_jurisdictions', [
'tax_jurisdictions' => $tax_jurisdictions,
'tax_types' => $tax_types,
'default_tax_type' => $default_tax_type

View File

@@ -267,8 +267,6 @@ class Migration_Sales_Tax_Data extends Migration
*/
public function round_number(int $rounding_mode, string $amount, int $decimals): float
{
$amount = (float)$amount;
if ($rounding_mode == Migration_Sales_Tax_Data::ROUND_UP) {
$fig = pow(10, $decimals);
$rounded_total = (ceil($fig * $amount) + ceil($fig * $amount - ceil($fig * $amount))) / $fig;
@@ -378,7 +376,7 @@ class Migration_Sales_Tax_Data extends Migration
$decimals = totals_decimals();
foreach ($sales_taxes as $row_number => $sales_tax) {
$sale_tax_amount = (float)$sales_tax['sale_tax_amount'];
$sale_tax_amount = $sales_tax['sale_tax_amount'];
$rounding_code = $sales_tax['rounding_code'];
$rounded_sale_tax_amount = $sale_tax_amount;

View File

@@ -21,6 +21,6 @@ class Migration_receipttaxindicator extends Migration
*/
public function down(): void
{
$this->db->query('DELETE FROM ' . $this->db->prefixTable('app_config') . ' WHERE `key` = \'receipt_show_tax_ind\'');
$this->db->query('DELETE FROM ' . $this->db->prefixTable('app_config') . ' WHERE key = \'receipt_show_tax_ind\'');
}
}

View File

@@ -243,8 +243,6 @@ class Migration_TaxAmount extends Migration
*/
public function round_number(int $rounding_mode, string $amount, int $decimals): float // TODO: is this currency safe?
{ // TODO: This needs to be converted to a switch
$amount = (float)$amount;
if ($rounding_mode == Migration_TaxAmount::ROUND_UP) { // TODO: === ?
$fig = pow(10, $decimals);
$rounded_total = (ceil($fig * $amount) + ceil($fig * $amount - ceil($fig * $amount))) / $fig;
@@ -356,7 +354,7 @@ class Migration_TaxAmount extends Migration
$decimals = totals_decimals();
foreach ($sales_taxes as $row_number => $sales_tax) {
$sale_tax_amount = (float)$sales_tax['sale_tax_amount'];
$sale_tax_amount = $sales_tax['sale_tax_amount'];
$rounding_code = $sales_tax['rounding_code'];
$rounded_sale_tax_amount = $sale_tax_amount;

View File

@@ -20,7 +20,7 @@ class Migration_database_optimizations extends Migration
$attribute = model(Attribute::class);
$attribute->delete_orphaned_values();
$attribute->deleteOrphanedValues();
$this->migrate_duplicate_attribute_values(DECIMAL);
$this->migrate_duplicate_attribute_values(DATE);

View File

@@ -1,65 +0,0 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
/**
* Migration to sanitize existing image filenames by replacing spaces with underscores
* This fixes issue #4372 where thumbnails failed to load for images with spaces in filenames
*/
class FixImageFilenameSpaces extends Migration
{
/**
* Perform a migration.
*/
public function up(): void
{
$db = \Config\Database::connect();
$builder = $db->table('ospos_items');
// Get all items with pic_filename containing spaces
$query = $builder->like('pic_filename', ' ', 'both')->get();
$items = $query->getResult();
foreach ($items as $item) {
$old_filename = $item->pic_filename;
$ext = pathinfo($old_filename, PATHINFO_EXTENSION);
$base_name = pathinfo($old_filename, PATHINFO_FILENAME);
// Sanitize the filename by replacing spaces and special characters
$sanitized_name = preg_replace('/[^a-zA-Z0-9_\-\.]/', '_', $base_name);
$new_filename = $sanitized_name . '.' . $ext;
// Rename the file on the filesystem
$old_path = FCPATH . 'uploads/item_pics/' . $old_filename;
$new_path = FCPATH . 'uploads/item_pics/' . $new_filename;
if (file_exists($old_path)) {
// Rename the original file
if (rename($old_path, $new_path)) {
// Check if thumbnail exists and rename it too
$old_thumb = FCPATH . 'uploads/item_pics/' . $base_name . '_thumb.' . $ext;
$new_thumb = FCPATH . 'uploads/item_pics/' . $sanitized_name . '_thumb.' . $ext;
if (file_exists($old_thumb)) {
rename($old_thumb, $new_thumb);
}
// Update database record
$builder->where('item_id', $item->item_id)
->update(['pic_filename' => $new_filename]);
}
}
}
}
/**
* Revert a migration.
* Note: This migration does not support rollback as the original filenames are lost
*/
public function down(): void
{
// This migration cannot be safely reversed as the original filenames are lost
// after sanitization.
}
}

View File

@@ -1,20 +0,0 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class PluginConfigTableCreate extends Migration
{
public function up(): void
{
log_message('info', 'Migrating plugin_config table started');
execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.1_PluginConfigTableCreate.sql');
}
public function down(): void
{
$this->forge->dropTable('plugin_config', true);
}
}

View File

@@ -1,7 +0,0 @@
CREATE TABLE IF NOT EXISTS `ospos_plugin_config` (
`key` varchar(100) NOT NULL,
`value` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@@ -1,5 +1,5 @@
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
key_buffer = 16M
max_allowed_packet = 1M

View File

@@ -0,0 +1,33 @@
<?php
/**
* Translates the attribute type to the corresponding database column name.
*
* Maps attribute type constants to their corresponding attribute_values table columns.
* Defaults to 'attribute_value' for TEXT, DROPDOWN and CHECKBOX attribute types.
*
* @param string $input The attribute type constant (DATE, DECIMAL, etc.)
* @return string The database column name for storing this attribute type
*/
function getAttributeDataType(string $input): string
{
$columnMap = [
DATE => 'attribute_date',
DECIMAL => 'attribute_decimal',
];
return $columnMap[$input] ?? 'attribute_value';
}
/**
* Validates that the provided data type is an allowed attribute value type.
*
* @param string $dataType
* @return void
*/
function validateAttributeValueType(string $dataType): void
{
if (!in_array($dataType, ATTRIBUTE_VALUE_TYPES, true)) {
throw new InvalidArgumentException('Invalid data type');
}
}

View File

@@ -1,10 +1,10 @@
<?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

View File

@@ -89,8 +89,6 @@ function get_languages(): array
'pt-BR:portuguese' => 'Portuguese (Brazil)',
'ro:romanian' => 'Romanian',
'ru:russian' => 'Russian',
'sw-KE:swahili' => 'Swahili (Kenya)',
'sw-TZ:swahili' => 'Swahili (Tanzania)',
'sv:swedish' => 'Swedish',
'ta:tamil' => 'Tamil',
'th:thai' => 'Thai',

View File

@@ -1,24 +0,0 @@
<?php
use CodeIgniter\Events\Events;
if (!function_exists('plugin_content')) {
function plugin_content(string $section, array $data = []): string
{
$results = Events::trigger("view:{$section}", $data);
if (is_array($results)) {
return implode('', array_filter($results, fn($r) => is_string($r)));
}
return is_string($results) ? $results : '';
}
}
if (!function_exists('plugin_content_exists')) {
function plugin_content_exists(string $section): bool
{
$observers = Events::listRegistered("view:{$section}");
return !empty($observers);
}
}

View File

@@ -108,4 +108,3 @@ function remove_backup(): void
}
log_message('info', "File $backup_path has been removed");
}

View File

@@ -48,7 +48,7 @@ function transform_headers(array $headers, bool $readonly = false, bool $editabl
'field' => key($element),
'title' => current($element),
'switchable' => $element['switchable'] ?? !preg_match('(^$|&nbsp)', current($element)),
'escape' => !preg_match("/(edit|email|messages|item_pic)/", key($element)) && !(isset($element['escape']) && !$element['escape']),
'escape' => !preg_match("/(edit|email|messages|item_pic|customer_name|note)/", key($element)) && !(isset($element['escape']) && !$element['escape']),
'sortable' => $element['sortable'] ?? current($element) != '',
'checkbox' => $element['checkbox'] ?? false,
'class' => isset($element['checkbox']) || preg_match('(^$|&nbsp)', current($element)) ? 'print_hide' : '',
@@ -470,8 +470,7 @@ function get_item_data_row(object $item): array
: glob("./uploads/item_pics/$item->pic_filename");
if (sizeof($images) > 0) {
$image_path = ltrim($images[0], './');
$image .= '<a class="rollover" href="' . base_url(implode('/', array_map('rawurlencode', explode('/', $image_path)))) . '"><img alt="Image thumbnail" src="' . site_url('items/PicThumb/' . rawurlencode(pathinfo($images[0], PATHINFO_BASENAME))) . '"></a>';
$image .= '<a class="rollover" href="' . base_url($images[0]) . '"><img alt="Image thumbnail" src="' . site_url('items/PicThumb/' . pathinfo($images[0], PATHINFO_BASENAME)) . '"></a>';
}
}

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "كلمة المرور الحالية غير صحيحة.",
"employee" => "موظف",
"error_adding_updating" => "خطاء فى إضافة/تعديل موظف.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "لايمكن حذف المستخدم admin الخاص بنسخة العرض.",
"error_updating_demo_admin" => "لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.",
"language" => "اللغة",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "سعر التكلفة مطلوب.",
"count" => "تحديث المخزون",
"csv_import_failed" => "فشل الإستيراد من اكسل",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "الملف الذى رفعته إما فارغ أو أنه مختلف البنية.",
"csv_import_partially_failed" => "يوجد خطأ بنسبة {0} في استيراد الاصناف في السطر: {1}. لم يتم استيرادهم.",
"csv_import_success" => "تم استيراد الأصناف بنجاح.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "ابداء بكتابة اسم المورد....",
"stock" => "المخزون",
"stock_destination" => "المخزون المحول له",
"stock_location" => "مكان المخزون",
"stock_locaiton" => "مكان المخزون",
"stock_source" => "مصدر المخزون",
"successfully_deleted" => "لقد تم الحذف",
"successfully_updated" => "لقد تم التحديث",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "كلمة المرور الحالية غير صحيحة.",
"employee" => "موظف",
"error_adding_updating" => "خطاء فى إضافة/تعديل موظف.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "لايمكن حذف المستخدم admin الخاص بنسخة العرض.",
"error_updating_demo_admin" => "لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.",
"language" => "اللغة",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "سعر التكلفة مطلوب.",
"count" => "تحديث المخزون",
"csv_import_failed" => "فشل الإستيراد من اكسل",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "الملف الذى رفعته إما فارغ أو أنه مختلف البنية.",
"csv_import_partially_failed" => "يوجد خطأ بنسبة {0} في استيراد الاصناف في السطر: {1}. لم يتم استيرادهم.",
"csv_import_success" => "تم استيراد الأصناف بنجاح.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "ابداء بكتابة اسم المورد....",
"stock" => "المخزون",
"stock_destination" => "المخزون المحول له",
"stock_location" => "مكان المخزون",
"stock_locaiton" => "مكان المخزون",
"stock_source" => "مصدر المخزون",
"successfully_deleted" => "لقد تم الحذف",
"successfully_updated" => "لقد تم التحديث",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Hazirki Şifrə düzgün deyil.",
"employee" => "Əməkdaş",
"error_adding_updating" => "Əməkdaş əlavə etməsk və ya yeniləməsi baş vermədi.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Demo administrator istifadəçisini silə bilməzsiniz.",
"error_updating_demo_admin" => "Demo administrator istifadəçisini dəyişə bilməzsiniz.",
"language" => "Dil",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Topdan satiış - doldurulması vacib sahə.",
"count" => "inventorun yenilənməsi",
"csv_import_failed" => "səhv csv import",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Yüklənmiş faylda məlumat yoxdur və ya düzgün formatlanmır.",
"csv_import_partially_failed" => "Xətlərdə {0} element idxalı uğursuzluq (lar) var: {1}. Heç bir sıra idxal edilmədi.",
"csv_import_success" => "Malların İdxalı Uğurla Həyata Keçdi.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Təchizatçıın adını yazmağa başlayın ...",
"stock" => "Ehtiyyat",
"stock_destination" => "Ehtiyyatın Hədəfi",
"stock_location" => "Ehtiyyatın Yeri",
"stock_locaiton" => "Ehtiyyatın Yeri",
"stock_source" => "Ehtiyyatın Mənbəyi",
"successfully_deleted" => "cəmi",
"successfully_updated" => "alışda sehv var",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Текущата парола е невалидна.",
"employee" => "Служител",
"error_adding_updating" => "Добавянето или актуализирането на служителите е неуспешно.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Не може да изтриете Пробният Администратор.",
"error_updating_demo_admin" => "Не може да промените Пробният Администратор.",
"language" => "Език",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Wholesale Price is a required field.",
"count" => "Update Inventory",
"csv_import_failed" => "CSV import failed",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "The uploaded file has no data or is formatted incorrectly.",
"csv_import_partially_failed" => "Item import successful with some failures:",
"csv_import_success" => "Item import successful.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Start Typing Supplier's name...",
"stock" => "",
"stock_destination" => "Stock Destination",
"stock_location" => "Stock Location",
"stock_locaiton" => "Stock Location",
"stock_source" => "Stock Source",
"successfully_deleted" => "You have successfully deleted",
"successfully_updated" => "Receiving successfully updated",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Trenutna lozinka je nevažeća.",
"employee" => "Zaposlenik",
"error_adding_updating" => "Dodavanje ili ažuriranje zaposlenika nije uspjelo.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Ne možete izbrisati demo korisnika administratora.",
"error_updating_demo_admin" => "Ne možete promijeniti korisnika demo administratora.",
"language" => "Jezik",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Fakturna cijena je obavezno polje.",
"count" => "Ažuriraj zalihu",
"csv_import_failed" => "Uvoz CSV-a nije uspio",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Učitana CSV datoteka nema podatke ili je pogrešno formatirana.",
"csv_import_partially_failed" => "Bilo je {0} grešaka pri uvozu stavke na liniji: {1}. Nijedan red nije uvezen.",
"csv_import_success" => "Uvoz CSV stavke je uspješan.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Počnite upisivati ime dobavljača ...",
"stock" => "Skladište",
"stock_destination" => "Destinacija skladišta",
"stock_location" => "Lokacija zaliha",
"stock_locaiton" => "Lokacija zaliha",
"stock_source" => "Izvor zaliha",
"successfully_deleted" => "Uspješno ste izbrisali prijem",
"successfully_updated" => "Uspješno ste ažurirali prijem",

View File

@@ -14,8 +14,6 @@ return [
'current_password_invalid' => "وشەی نهێنی ئێستا نادروستە.",
'employee' => "فەرمانبەر",
'error_adding_updating' => "زیادکردن یان نوێکردنەوەی کارمەند سەرکەوتوو نەبوو.",
'error_deleting_admin' => "",
'error_updating_admin' => "",
'error_deleting_demo_admin' => "ناتوانیت بەکارهێنەری ئەدمینی تاقیکردنەوەیی بسڕیتەوە.",
'error_updating_demo_admin' => "ناتوانیت بەکارهێنەری ئەدمین تاقیکردنەوەیی بگۆڕیت.",
'language' => "زمان",

View File

@@ -26,7 +26,6 @@ return [
'cost_price_required' => "نرخی جوملە خانەیەکی پێویستە.",
'count' => "جەرد نوێ بکەوە",
'csv_import_failed' => "هاوردەکردنی CSV سەرکەوتوو نەبوو",
'csv_import_invalid_location' => "",
'csv_import_nodata_wrongformat' => "پەڕگەی CSV بارکراو هیچ داتایەکی نییە یان بە هەڵە فۆرمات کراوە.",
'csv_import_partially_failed' => "{0} شکستی هاوردەکردنی بابەتی لەسەر هێڵەکان هەبوو: {1}. هیچ ڕیزێک هاوردە نەکرا.",
'csv_import_success' => "بابەتی هاوردەکردنی CSV سەرکەوتوو بوو.",

View File

@@ -43,7 +43,7 @@ return [
'start_typing_supplier_name' => "دەست بکە بە نووسینی ناوی دابینکەر...",
'stock' => "کۆگا",
'stock_destination' => "شوێنی مەبەستی کۆگا",
'stock_location' => "شوێنی کۆگا",
'stock_locaiton' => "شوێنی کۆگا",
'stock_source' => "سەرچاوەی کۆگا",
'successfully_deleted' => "بەسەرکەوتوویی سڕیتەوە",
'successfully_updated' => "وەرگرتن بە سەرکەوتوویی نوێ کراوەتەوە",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Musíte zadat nákupní cenu.",
"count" => "Upravit množství",
"csv_import_failed" => "Import z CSVu se nepovedl",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Nahraný soubor neobsahuje žádná data nebo má špatný formát.",
"csv_import_partially_failed" => "Při importu položek došlo k několika chybám:",
"csv_import_success" => "Import položek proběhl bez chyby.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Začněte psát jméno dodavatele...",
"stock" => "Sklad",
"stock_destination" => "Cílový sklad",
"stock_location" => "Umístění skladu",
"stock_locaiton" => "Umístění skladu",
"stock_source" => "",
"successfully_deleted" => "Smazáno",
"successfully_updated" => "Upraveno",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "You can not delete the demo admin user.",
"error_updating_demo_admin" => "You can not change the demo admin user.",
"language" => "Language",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "",
"count" => "",
"csv_import_failed" => "",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "",
"stock" => "",
"stock_destination" => "",
"stock_location" => "",
"stock_locaiton" => "",
"stock_source" => "",
"successfully_deleted" => "",
"successfully_updated" => "",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "",
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Sie können den Admin nicht löschen",
"error_updating_demo_admin" => "Sie können den Admin nicht ändern",
"language" => "",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Einstandspreis ist erforderlich",
"count" => "Ändere Bestand",
"csv_import_failed" => "CSV Import fehlerhaft",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Your uploaded file has no data or wrong format",
"csv_import_partially_failed" => "Most Items imported. But some were not, here is the list",
"csv_import_success" => "Import of Items successful",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Lieferantenname eingeben",
"stock" => "",
"stock_destination" => "Lagerort (Ziel)",
"stock_location" => "Lagerort",
"stock_locaiton" => "Lagerort",
"stock_source" => "Lagerort (Quelle)",
"successfully_deleted" => "Löschung erfolgreich",
"successfully_updated" => "Änderung erfolgreich",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Aktuelles Passwort ist ungültig.",
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Sie können den Demo-Administrator nicht löschen.",
"error_updating_demo_admin" => "Sie können den Demo-Administrator nicht verändern.",
"language" => "Sprache",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Der Großhandelspreis ist ein Pflichtfeld.",
"count" => "Ändere Bestand",
"csv_import_failed" => "CSV Import fehlgeschlagen",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Die hochgeladene Datei enthält keine Daten oder ist falsch formatiert.",
"csv_import_partially_failed" => "{0} Artikel-Import Fehler in Zeile: {1}. Keine Reihen wurden importiert.",
"csv_import_success" => "Artikelimport erfolgreich.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Eintippen des Namens des Lieferanten beginnen...",
"stock" => "Lager",
"stock_destination" => "Lagerort (Ziel)",
"stock_location" => "Lagerort",
"stock_locaiton" => "Lagerort",
"stock_source" => "Lagerort (Quelle)",
"successfully_deleted" => "Löschung erfolgreich",
"successfully_updated" => "Änderung erfolgreich",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "",
"count" => "",
"csv_import_failed" => "",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Πληκτρολογήστε το όνομα του Προμηθευτή...",
"stock" => "Απόθεμα",
"stock_destination" => "Προορισμός Αποθέματος",
"stock_location" => "Τοποθεσία Αποθέματος",
"stock_locaiton" => "Τοποθεσία Αποθέματος",
"stock_source" => "Προέλευση Αποθέματος",
"successfully_deleted" => "Έχετε διαγράψει επιτυχώς",
"successfully_updated" => "Επιτυχής ενημέρωση Παραλαβής",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Start Typing Supplier's name...",
"stock" => "Stock",
"stock_destination" => "Stock Destination",
"stock_location" => "Stock Location",
"stock_locaiton" => "Stock Location",
"stock_source" => "Stock Source",
"successfully_deleted" => "You have successfully deleted receiving",
"successfully_updated" => "Receiving successfully updated",

View File

@@ -14,9 +14,7 @@ return [
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_admin" => "You cannot delete an admin user.",
"error_deleting_demo_admin" => "You can not delete the demo admin user.",
"error_updating_admin" => "You cannot modify an admin user.",
"error_updating_demo_admin" => "You can not change the demo admin user.",
"language" => "Language",
"login_info" => "Login",

View File

@@ -1,27 +0,0 @@
<?php
return [
// Plugin Management
"plugins" => "Plugins",
"plugin_management" => "Plugin Management",
"plugin_name" => "Plugin Name",
"plugin_description" => "Description",
"plugin_version" => "Version",
"plugin_status" => "Status",
"plugin_enabled" => "Plugin enabled successfully",
"plugin_enable_failed" => "Failed to enable plugin",
"plugin_disabled" => "Plugin disabled successfully",
"plugin_disable_failed" => "Failed to disable plugin",
"plugin_uninstalled" => "Plugin uninstalled successfully",
"plugin_uninstall_failed" => "Failed to uninstall plugin",
"plugin_not_found" => "Plugin not found",
"plugin_no_config" => "This plugin has no configuration options",
"settings_saved" => "Plugin settings saved successfully",
"settings_save_failed" => "Failed to save plugin settings",
"enable" => "Enable",
"disable" => "Disable",
"configure" => "Configure",
"uninstall" => "Uninstall",
"no_plugins_found" => "No plugins found",
"active" => "Active",
"inactive" => "Inactive",
];

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Start Typing Supplier's name...",
"stock" => "Stock",
"stock_destination" => "Stock Destination",
"stock_location" => "Stock Location",
"stock_locaiton" => "Stock Location",
"stock_source" => "Stock Source",
"successfully_deleted" => "You have successfully deleted",
"successfully_updated" => "Receiving successfully updated",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Contraseña Actual Inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Error al agregar/actualizar empleado.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "No puedes borrar el usuario admin del demo.",
"error_updating_demo_admin" => "No puedes cambiar el usuario admin del demo.",
"language" => "Idioma",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Precio al Por Mayor es un campo requerido.",
"count" => "Actualizar Inventario",
"csv_import_failed" => "Falló la importación de Hoja de Cálculo",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "El archivo subido no tiene datos o el formato es incorrecto.",
"csv_import_partially_failed" => "Hubo {0} falla(s) en la importación de producto(s) en la(s) línea(s): {1}. Ninguna fila ha sido importada.",
"csv_import_success" => "Se importaron los articulos exitosamente.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Empieza a escribir el nombre del proveedor...",
"stock" => "Inventario",
"stock_destination" => "Inventario de Destino",
"stock_location" => "Ubicación de Inventario",
"stock_locaiton" => "Ubicación de Inventario",
"stock_source" => "Inventario de Origen",
"successfully_deleted" => "Borro exitosamente",
"successfully_updated" => "Recepción exitosamente actualizada",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "La contraseña actual es inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Agregar ó Actualizar empleado ha fallado.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "No puede borrar el usuario demo de administrador.",
"error_updating_demo_admin" => "No puede cambiar el usuario demo de administrador.",
"language" => "Idioma",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "El precio de mayoreo es requerido.",
"count" => "Actualizar inventario",
"csv_import_failed" => "",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Empiece a escribir el nombre del Proveedor...",
"stock" => "Existencia",
"stock_destination" => "Destino del Inventario",
"stock_location" => "Ubicación del Inventario",
"stock_locaiton" => "Ubicación del Inventario",
"stock_source" => "Origen del Inventario",
"successfully_deleted" => "Se ha borrado exitosamente",
"successfully_updated" => "Recepción actualizada exitosamente",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "گذرواژه فعلی نامعتبر است.",
"employee" => "کارمند",
"error_adding_updating" => "افزودن یا به روزرسانی کارکنان انجام نشد.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "شما نمی توانید کاربر مدیر نسخه ی نمایشی را حذف کنید.",
"error_updating_demo_admin" => "شما نمی توانید کاربر مدیر نسخه ی نمایشی را تغییر دهید.",
"language" => "زبان",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "قیمت عمده فروشی یک زمینه ضروری است.",
"count" => "به روزرسانی موجودی",
"csv_import_failed" => "واردات سی‌اس‌وی انجام نشد",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "پرونده سی‌اس‌وی آپلود شده داده ای ندارد یا به طور نادرست قالب بندی شده است.",
"csv_import_partially_failed" => "در خط (ها){0} شکست واردات کالا وجود دارد:{1}. هیچ سطر وارد نشده است.",
"csv_import_success" => "وارد کردن سی‌اس‌وی مورد موفقیت آمیز است.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "شروع به تایپ کردن نام ارائه دهنده ...",
"stock" => "موجودی",
"stock_destination" => "مقصد سهام",
"stock_location" => "موقعیت مکانی سهام",
"stock_locaiton" => "موقعیت مکانی سهام",
"stock_source" => "منبع سهام",
"successfully_deleted" => "شما با موفقیت حذف شده اید",
"successfully_updated" => "دریافت با موفقیت به روز شد",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "Le mot de passe actuel est invalide.",
"employee" => "Employé",
"error_adding_updating" => "Erreur d'ajout/édition d'employé.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Vous ne pouvez pas supprimer l'utilisateur de démonstration admin.",
"error_updating_demo_admin" => "Vous ne pouvez pas modifier l'utilisateur de démonstration admin.",
"language" => "Langue",

View File

@@ -26,7 +26,6 @@ return [
"cost_price_required" => "Le prix de gros est requis.",
"count" => "Mise à jour de l'inventaire",
"csv_import_failed" => "Échec d'import CSV",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Le CSV envoyé ne contient aucune donnée, ou elles sont dans un format erroné.",
"csv_import_partially_failed" => "Il y a eu {0} importation(s) d'articles échoué(s) au(x) ligne(s) : {1}. Aucune ligne n'a été importée.",
"csv_import_success" => "Importation des articles réussie.",

View File

@@ -43,7 +43,7 @@ return [
"start_typing_supplier_name" => "Commencez à saisir le nom du fournisseur...",
"stock" => "Inventaire",
"stock_destination" => "Destination de stock",
"stock_location" => "Emplacement du stock",
"stock_locaiton" => "Emplacement du stock",
"stock_source" => "Source de stock",
"successfully_deleted" => "Suppression réussie",
"successfully_updated" => "Réception correctement mise à jour",

View File

@@ -14,8 +14,6 @@ return [
"current_password_invalid" => "הסיסמה הנוכחית אינה חוקית.",
"employee" => "עובד",
"error_adding_updating" => "הוספה או עדכון של עובד נכשלה.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "לא ניתן למחוק את משתמש המנהל ההדגמה.",
"error_updating_demo_admin" => "לא ניתן לשנות את משתמש המנהל ההדגמה.",
"language" => "שפה",

Some files were not shown because too many files have changed in this diff Show More