mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-05-25 00:44:03 -04:00
Compare commits
16 Commits
feature/ub
...
feature/re
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12146275f4 | ||
|
|
e45af91e2e | ||
|
|
31d25e06dc | ||
|
|
b1819b3b36 | ||
|
|
6705420373 | ||
|
|
d6b767c80a | ||
|
|
19eb43270a | ||
|
|
df4549bb0b | ||
|
|
bdc965be23 | ||
|
|
5c8905aa1b | ||
|
|
690f43578d | ||
|
|
0858a1c23c | ||
|
|
3c217bbddd | ||
|
|
87a0606141 | ||
|
|
b6a90f7880 | ||
|
|
b93359bcaf |
33
.github/workflows/opencode.yml
vendored
Normal file
33
.github/workflows/opencode.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
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
|
||||
118
.github/workflows/phpunit.yml
vendored
Normal file
118
.github/workflows/phpunit.yml
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
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
|
||||
|
||||
- name: Stop MariaDB
|
||||
if: always()
|
||||
run: docker stop mysql && docker rm mysql
|
||||
@@ -28,7 +28,7 @@ script:
|
||||
env:
|
||||
global:
|
||||
- BRANCH=$(echo ${TRAVIS_BRANCH} | sed s/feature\\///)
|
||||
- TAG=${TRAVIS_TAG:-$BRANCH}
|
||||
- TAG=$(echo "${TRAVIS_TAG:-$BRANCH}" | tr '/' '-')
|
||||
- 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"
|
||||
|
||||
@@ -1,38 +1,23 @@
|
||||
<?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 can’t 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
|
||||
|--------------------------------------------------------------------------
|
||||
| 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);
|
||||
*/
|
||||
defined('CI_DEBUG') || define('CI_DEBUG', true);
|
||||
@@ -12,18 +12,10 @@ use CodeIgniter\Filters\InvalidChars;
|
||||
use CodeIgniter\Filters\PageCache;
|
||||
use CodeIgniter\Filters\PerformanceMetrics;
|
||||
use CodeIgniter\Filters\SecureHeaders;
|
||||
use App\Filters\ApiAuth;
|
||||
|
||||
class Filters extends BaseFilters
|
||||
{
|
||||
/**
|
||||
* Configures aliases for Filter classes to
|
||||
* make reading things nicer and simpler.
|
||||
*
|
||||
* @var array<string, class-string|list<class-string>>
|
||||
*
|
||||
* [filter_name => classname]
|
||||
* or [filter_name => [classname1, classname2, ...]]
|
||||
*/
|
||||
public array $aliases = [
|
||||
'csrf' => CSRF::class,
|
||||
'toolbar' => DebugToolbar::class,
|
||||
@@ -34,6 +26,7 @@ class Filters extends BaseFilters
|
||||
'forcehttps' => ForceHTTPS::class,
|
||||
'pagecache' => PageCache::class,
|
||||
'performance' => PerformanceMetrics::class,
|
||||
'apiauth' => ApiAuth::class,
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -70,7 +63,7 @@ class Filters extends BaseFilters
|
||||
public array $globals = [
|
||||
'before' => [
|
||||
'honeypot',
|
||||
'csrf' => ['except' => 'login'],
|
||||
'csrf' => ['except' => ['login', 'api/*']],
|
||||
'invalidchars',
|
||||
],
|
||||
'after' => [
|
||||
@@ -100,9 +93,25 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,3 +39,50 @@ $routes->add('reports/specific_customers', 'Reports::specific_customer_input');
|
||||
$routes->add('reports/specific_employees', 'Reports::specific_employee_input');
|
||||
$routes->add('reports/specific_discounts', 'Reports::specific_discount_input');
|
||||
$routes->add('reports/specific_suppliers', 'Reports::specific_supplier_input');
|
||||
|
||||
$routes->group('office/api-keys', ['filter' => 'session'], static function(RouteCollection $routes): void {
|
||||
$routes->get('/', 'ApiKeys::index');
|
||||
$routes->post('generate', 'ApiKeys::generate');
|
||||
$routes->post('revoke/(:num)', 'ApiKeys::revoke/$1');
|
||||
$routes->post('regenerate/(:num)', 'ApiKeys::regenerate/$1');
|
||||
});
|
||||
|
||||
$routes->group('api/v1', ['filter' => 'apiauth'], static function(RouteCollection $routes): void {
|
||||
$routes->get('customers', 'Api\Customers::index');
|
||||
$routes->get('customers/(:num)', 'Api\Customers::show/$1');
|
||||
$routes->post('customers', 'Api\Customers::create');
|
||||
$routes->put('customers/(:num)', 'Api\Customers::update/$1');
|
||||
$routes->delete('customers/(:num)', 'Api\Customers::delete/$1');
|
||||
$routes->post('customers/batch-delete', 'Api\Customers::batchDelete');
|
||||
$routes->get('customers/suggest', 'Api\Customers::suggest');
|
||||
|
||||
$routes->get('suppliers', 'Api\Suppliers::index');
|
||||
$routes->get('suppliers/(:num)', 'Api\Suppliers::show/$1');
|
||||
$routes->post('suppliers', 'Api\Suppliers::create');
|
||||
$routes->put('suppliers/(:num)', 'Api\Suppliers::update/$1');
|
||||
$routes->delete('suppliers/(:num)', 'Api\Suppliers::delete/$1');
|
||||
$routes->post('suppliers/batch-delete', 'Api\Suppliers::batchDelete');
|
||||
$routes->get('suppliers/suggest', 'Api\Suppliers::suggest');
|
||||
|
||||
$routes->get('items', 'Api\Items::index');
|
||||
$routes->get('items/(:num)', 'Api\Items::show/$1');
|
||||
$routes->post('items', 'Api\Items::create');
|
||||
$routes->put('items/(:num)', 'Api\Items::update/$1');
|
||||
$routes->delete('items/(:num)', 'Api\Items::delete/$1');
|
||||
$routes->post('items/batch-delete', 'Api\Items::batchDelete');
|
||||
$routes->get('items/suggest', 'Api\Items::suggest');
|
||||
$routes->get('items/(:num)/quantities', 'Api\Items::quantities/$1');
|
||||
|
||||
$routes->get('inventory', 'Api\Inventory::index');
|
||||
$routes->post('inventory', 'Api\Inventory::create');
|
||||
$routes->post('inventory/bulk', 'Api\Inventory::create');
|
||||
|
||||
$routes->get('sales', 'Api\Sales::index');
|
||||
$routes->get('sales/(:num)', 'Api\Sales::show/$1');
|
||||
$routes->get('sales/(:num)/items', 'Api\Sales::items/$1');
|
||||
$routes->get('sales/(:num)/payments', 'Api\Sales::payments/$1');
|
||||
|
||||
$routes->get('receivings', 'Api\Receivings::index');
|
||||
$routes->get('receivings/(:num)', 'Api\Receivings::show/$1');
|
||||
$routes->get('receivings/(:num)/items', 'Api\Receivings::items/$1');
|
||||
});
|
||||
|
||||
@@ -13,9 +13,9 @@ class Security extends BaseConfig
|
||||
*
|
||||
* Protection Method for Cross Site Request Forgery protection.
|
||||
*
|
||||
* @var string 'cookie' or 'session'
|
||||
* @var string|false 'cookie', 'session', or false
|
||||
*/
|
||||
public string $csrfProtection = 'session';
|
||||
public string|false $csrfProtection = 'session';
|
||||
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
|
||||
129
app/Controllers/Api/BaseController.php
Normal file
129
app/Controllers/Api/BaseController.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Api;
|
||||
|
||||
use App\Models\Employee;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use CodeIgniter\RESTful\ResourceController;
|
||||
|
||||
class BaseController extends ResourceController
|
||||
{
|
||||
protected Employee $employee;
|
||||
protected int $employeeId = 0;
|
||||
protected $format = 'json';
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger): void
|
||||
{
|
||||
parent::initController($request, $response, $logger);
|
||||
|
||||
$this->employee = model(Employee::class);
|
||||
$this->employeeId = $request->employeeId ?? 0;
|
||||
}
|
||||
|
||||
protected function hasPermission(string $moduleId): bool
|
||||
{
|
||||
return $this->employee->has_grant($moduleId, $this->employeeId);
|
||||
}
|
||||
|
||||
protected function respondSuccess(array $data = [], int $code = 200, string $message = 'Success'): ResponseInterface
|
||||
{
|
||||
$response = ['success' => true];
|
||||
|
||||
if ($message) {
|
||||
$response['message'] = $message;
|
||||
}
|
||||
|
||||
$response = array_merge($response, $data);
|
||||
|
||||
return $this->respond($response, $code);
|
||||
}
|
||||
|
||||
protected function respondCreated(array $data = [], string $message = 'Resource created'): ResponseInterface
|
||||
{
|
||||
return $this->respondSuccess($data, 201, $message);
|
||||
}
|
||||
|
||||
protected function respondError(string $message, int $code = 400): ResponseInterface
|
||||
{
|
||||
return $this->respond([
|
||||
'success' => false,
|
||||
'message' => $message
|
||||
], $code);
|
||||
}
|
||||
|
||||
protected function respondNotFound(string $message = 'Resource not found'): ResponseInterface
|
||||
{
|
||||
return $this->respondError($message, 404);
|
||||
}
|
||||
|
||||
protected function respondUnauthorized(string $message = 'Unauthorized'): ResponseInterface
|
||||
{
|
||||
return $this->respondError($message, 403);
|
||||
}
|
||||
|
||||
protected function respondValidationError(array $errors): ResponseInterface
|
||||
{
|
||||
return $this->respond([
|
||||
'success' => false,
|
||||
'message' => 'Validation failed',
|
||||
'errors' => $errors
|
||||
], 422);
|
||||
}
|
||||
|
||||
protected function getPagination(): array
|
||||
{
|
||||
$offset = (int) ($this->request->getGet('offset') ?? 0);
|
||||
$limit = (int) ($this->request->getGet('limit') ?? 25);
|
||||
$limit = min(max($limit, 1), 100);
|
||||
$offset = max($offset, 0);
|
||||
|
||||
return ['offset' => $offset, 'limit' => $limit];
|
||||
}
|
||||
|
||||
protected function getSort(array $allowedFields, string $default = 'id', string $defaultOrder = 'asc'): array
|
||||
{
|
||||
$sort = $this->request->getGet('sort') ?? $default;
|
||||
$order = strtolower($this->request->getGet('order') ?? $defaultOrder);
|
||||
|
||||
if (!in_array($sort, $allowedFields)) {
|
||||
$sort = $default;
|
||||
}
|
||||
|
||||
if (!in_array($order, ['asc', 'desc'])) {
|
||||
$order = $defaultOrder;
|
||||
}
|
||||
|
||||
return ['sort' => $sort, 'order' => $order];
|
||||
}
|
||||
|
||||
protected function toCamelCase(array $data): array
|
||||
{
|
||||
$result = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$camelKey = lcfirst(str_replace('_', '', ucwords($key, '_')));
|
||||
$result[$camelKey] = $value;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function toSnakeCase(array $data): array
|
||||
{
|
||||
$result = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$snakeKey = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key));
|
||||
$result[$snakeKey] = $value;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function transformItem(object|array $item, array $additional = []): array
|
||||
{
|
||||
$item = is_object($item) ? (array) $item : $item;
|
||||
return $this->toCamelCase(array_merge($item, $additional));
|
||||
}
|
||||
|
||||
protected function transformCollection(array $items): array
|
||||
{
|
||||
return array_map([$this, 'transformItem'], $items);
|
||||
}
|
||||
}
|
||||
251
app/Controllers/Api/Customers.php
Normal file
251
app/Controllers/Api/Customers.php
Normal file
@@ -0,0 +1,251 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Api;
|
||||
|
||||
use App\Models\Customer;
|
||||
use App\Models\Person;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Customers extends BaseController
|
||||
{
|
||||
protected Customer $customerModel;
|
||||
protected Person $personModel;
|
||||
|
||||
protected array $allowedSortFields = ['person_id', 'last_name', 'first_name', 'email', 'company_name'];
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger): void
|
||||
{
|
||||
parent::initController($request, $response, $logger);
|
||||
$this->customerModel = model(Customer::class);
|
||||
$this->personModel = model(Person::class);
|
||||
}
|
||||
|
||||
public function index(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$search = $this->request->getGet('search');
|
||||
$pagination = $this->getPagination();
|
||||
$sort = $this->getSort($this->allowedSortFields, 'last_name');
|
||||
|
||||
$builder = $this->customerModel->builder();
|
||||
$builder->select('customers.*, people.*');
|
||||
$builder->join('people', 'people.person_id = customers.person_id');
|
||||
$builder->where('customers.deleted', 0);
|
||||
|
||||
if ($search) {
|
||||
$builder->groupStart();
|
||||
$builder->like('people.first_name', $search);
|
||||
$builder->orLike('people.last_name', $search);
|
||||
$builder->orLike('people.email', $search);
|
||||
$builder->orLike('customers.account_number', $search);
|
||||
$builder->orLike('customers.company_name', $search);
|
||||
$builder->groupEnd();
|
||||
}
|
||||
|
||||
$total = $builder->countAllResults(false);
|
||||
|
||||
$dbSort = $this->mapSortField($sort['sort']);
|
||||
$builder->orderBy($dbSort, $sort['order']);
|
||||
$builder->limit($pagination['limit'], $pagination['offset']);
|
||||
|
||||
$customers = $builder->get()->getResultArray();
|
||||
|
||||
return $this->respondSuccess([
|
||||
'total' => $total,
|
||||
'offset' => $pagination['offset'],
|
||||
'limit' => $pagination['limit'],
|
||||
'rows' => $this->transformCollection($customers)
|
||||
]);
|
||||
}
|
||||
|
||||
public function show($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$customer = $this->customerModel->get_info($id);
|
||||
|
||||
if (empty($customer) || $customer->deleted) {
|
||||
return $this->respondNotFound('Customer not found');
|
||||
}
|
||||
|
||||
$person = (array) $this->personModel->get_info($id);
|
||||
$customer = (array) $customer;
|
||||
$data = array_merge($person, $customer);
|
||||
|
||||
return $this->respondSuccess($this->transformItem($data));
|
||||
}
|
||||
|
||||
public function create(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getPost();
|
||||
}
|
||||
|
||||
$data = $this->toSnakeCase($data);
|
||||
|
||||
$rules = [
|
||||
'first_name' => 'required|max_length[255]',
|
||||
'last_name' => 'required|max_length[255]',
|
||||
];
|
||||
|
||||
$snakeData = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$snakeKey = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key));
|
||||
$snakeData[$snakeKey] = $value;
|
||||
}
|
||||
|
||||
$personData = array_intersect_key($snakeData, array_flip([
|
||||
'first_name', 'last_name', 'gender', 'phone_number', 'email',
|
||||
'address_1', 'address_2', 'city', 'state', 'zip', 'country', 'comments'
|
||||
]));
|
||||
|
||||
$customerData = array_intersect_key($snakeData, array_flip([
|
||||
'account_number', 'taxable', 'tax_id', 'sales_tax_code_id',
|
||||
'discount', 'discount_type', 'company_name', 'package_id', 'consent'
|
||||
]));
|
||||
$customerData['employee_id'] = $this->employeeId;
|
||||
|
||||
$personId = false;
|
||||
$success = $this->personModel->save_value($personData);
|
||||
|
||||
if ($success && isset($personData['person_id'])) {
|
||||
$personId = $personData['person_id'];
|
||||
$customerData['person_id'] = $personId;
|
||||
$success = $this->customerModel->save_value($customerData);
|
||||
}
|
||||
|
||||
if ($success) {
|
||||
return $this->respondCreated(['id' => $personId], 'Customer created successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to create customer');
|
||||
}
|
||||
|
||||
public function update($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$customer = $this->customerModel->get_info($id);
|
||||
|
||||
if (empty($customer) || $customer->deleted) {
|
||||
return $this->respondNotFound('Customer not found');
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getRawInput();
|
||||
}
|
||||
|
||||
$snakeData = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$snakeKey = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key));
|
||||
$snakeData[$snakeKey] = $value;
|
||||
}
|
||||
|
||||
$personData = array_intersect_key($snakeData, array_flip([
|
||||
'first_name', 'last_name', 'gender', 'phone_number', 'email',
|
||||
'address_1', 'address_2', 'city', 'state', 'zip', 'country', 'comments'
|
||||
]));
|
||||
|
||||
$customerData = array_intersect_key($snakeData, array_flip([
|
||||
'account_number', 'taxable', 'tax_id', 'sales_tax_code_id',
|
||||
'discount', 'discount_type', 'company_name', 'package_id', 'consent'
|
||||
]));
|
||||
|
||||
if (!empty($personData)) {
|
||||
$this->personModel->save_value($personData, $id);
|
||||
}
|
||||
|
||||
if (!empty($customerData)) {
|
||||
$this->customerModel->save_value($customerData, $id);
|
||||
}
|
||||
|
||||
return $this->respondSuccess([], 200, 'Customer updated successfully');
|
||||
}
|
||||
|
||||
public function delete($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$customer = $this->customerModel->get_info($id);
|
||||
|
||||
if (empty($customer) || $customer->deleted) {
|
||||
return $this->respondNotFound('Customer not found');
|
||||
}
|
||||
|
||||
$success = $this->customerModel->delete($id);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Customer deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete customer');
|
||||
}
|
||||
|
||||
public function batchDelete(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
$ids = $data['ids'] ?? [];
|
||||
|
||||
if (empty($ids)) {
|
||||
return $this->respondError('No customer IDs provided');
|
||||
}
|
||||
|
||||
$success = $this->customerModel->delete_list($ids);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Customers deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete customers');
|
||||
}
|
||||
|
||||
public function suggest(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('customers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$term = $this->request->getGet('term');
|
||||
$limit = (int) ($this->request->getGet('limit') ?? 25);
|
||||
|
||||
if (empty($term)) {
|
||||
return $this->respondSuccess(['suggestions' => []]);
|
||||
}
|
||||
|
||||
$suggestions = $this->customerModel->get_search_suggestions($term, $limit);
|
||||
|
||||
return $this->respondSuccess(['suggestions' => $suggestions]);
|
||||
}
|
||||
|
||||
private function mapSortField(string $field): string
|
||||
{
|
||||
$map = [
|
||||
'personId' => 'people.person_id',
|
||||
'lastName' => 'people.last_name',
|
||||
'firstName' => 'people.first_name',
|
||||
'email' => 'people.email',
|
||||
'companyName' => 'customers.company_name'
|
||||
];
|
||||
|
||||
return $map[$field] ?? 'people.last_name';
|
||||
}
|
||||
}
|
||||
212
app/Controllers/Api/Inventory.php
Normal file
212
app/Controllers/Api/Inventory.php
Normal file
@@ -0,0 +1,212 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Api;
|
||||
|
||||
use App\Models\Inventory as InventoryModel;
|
||||
use App\Models\Item;
|
||||
use App\Models\Item_quantity;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Inventory extends BaseController
|
||||
{
|
||||
protected InventoryModel $inventory;
|
||||
protected Item $item;
|
||||
protected Item_quantity $itemQuantity;
|
||||
|
||||
protected array $allowedSortFields = ['trans_id', 'trans_date', 'trans_items'];
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger): void
|
||||
{
|
||||
parent::initController($request, $response, $logger);
|
||||
$this->inventory = model(InventoryModel::class);
|
||||
$this->item = model(Item::class);
|
||||
$this->itemQuantity = model(Item_quantity::class);
|
||||
}
|
||||
|
||||
public function index(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$itemId = $this->request->getGet('itemId');
|
||||
$locationId = $this->request->getGet('locationId');
|
||||
$pagination = $this->getPagination();
|
||||
$sort = $this->getSort($this->allowedSortFields, 'trans_date');
|
||||
|
||||
$builder = $this->inventory->builder();
|
||||
|
||||
if ($itemId) {
|
||||
$builder->where('trans_items', $itemId);
|
||||
}
|
||||
|
||||
if ($locationId) {
|
||||
$builder->where('trans_location', $locationId);
|
||||
}
|
||||
|
||||
$total = $builder->countAllResults(false);
|
||||
|
||||
$builder->orderBy($sort['sort'], $sort['order']);
|
||||
$builder->limit($pagination['limit'], $pagination['offset']);
|
||||
|
||||
$transactions = $builder->get()->getResultArray();
|
||||
|
||||
return $this->respondSuccess([
|
||||
'total' => $total,
|
||||
'offset' => $pagination['offset'],
|
||||
'limit' => $pagination['limit'],
|
||||
'rows' => $this->transformCollection($transactions)
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
|
||||
if (isset($data['adjustments']) && is_array($data['adjustments'])) {
|
||||
return $this->bulkAdjust($data['adjustments']);
|
||||
}
|
||||
|
||||
return $this->singleAdjust($data);
|
||||
}
|
||||
|
||||
private function singleAdjust(array $data): ResponseInterface
|
||||
{
|
||||
if (empty($data['itemId'])) {
|
||||
return $this->respondError('itemId is required');
|
||||
}
|
||||
|
||||
if (!isset($data['quantity'])) {
|
||||
return $this->respondError('quantity is required');
|
||||
}
|
||||
|
||||
$mode = $data['mode'] ?? 'adjust';
|
||||
|
||||
if (!in_array($mode, ['adjust', 'set'])) {
|
||||
return $this->respondError('mode must be "adjust" or "set"');
|
||||
}
|
||||
|
||||
$item = $this->item->find($data['itemId']);
|
||||
if (!$item || $item->deleted) {
|
||||
return $this->respondNotFound('Item not found');
|
||||
}
|
||||
|
||||
$locationId = $data['locationId'] ?? 1;
|
||||
$comment = $data['comment'] ?? 'API inventory adjustment';
|
||||
$quantity = (float) $data['quantity'];
|
||||
|
||||
if ($mode === 'set') {
|
||||
$currentQty = $this->itemQuantity->get_item_quantity($data['itemId'], $locationId);
|
||||
$currentQty = $currentQty ? (float) $currentQty->quantity : 0;
|
||||
$adjustment = $quantity - $currentQty;
|
||||
|
||||
if ($adjustment == 0) {
|
||||
return $this->respondSuccess([
|
||||
'itemId' => (int) $data['itemId'],
|
||||
'locationId' => (int) $locationId,
|
||||
'newQuantity' => $quantity,
|
||||
'mode' => $mode
|
||||
], 200, 'Quantity already at requested level');
|
||||
}
|
||||
} else {
|
||||
$adjustment = $quantity;
|
||||
}
|
||||
|
||||
$invData = [
|
||||
'trans_date' => date('Y-m-d H:i:s'),
|
||||
'trans_items' => $data['itemId'],
|
||||
'trans_user' => $this->employeeId,
|
||||
'trans_location' => $locationId,
|
||||
'trans_comment' => $comment,
|
||||
'trans_inventory' => $adjustment
|
||||
];
|
||||
|
||||
$this->inventory->insert($invData);
|
||||
$this->itemQuantity->change_quantity($data['itemId'], $locationId, $adjustment);
|
||||
|
||||
$newQty = $this->itemQuantity->get_item_quantity($data['itemId'], $locationId);
|
||||
|
||||
return $this->respondSuccess([
|
||||
'itemId' => (int) $data['itemId'],
|
||||
'locationId' => (int) $locationId,
|
||||
'adjustment' => $adjustment,
|
||||
'newQuantity' => $newQty ? (float) $newQty->quantity : 0,
|
||||
'mode' => $mode
|
||||
], 200, 'Inventory adjusted successfully');
|
||||
}
|
||||
|
||||
private function bulkAdjust(array $adjustments): ResponseInterface
|
||||
{
|
||||
$results = [];
|
||||
$processed = 0;
|
||||
$errors = [];
|
||||
|
||||
$this->inventory->db->transStart();
|
||||
|
||||
foreach ($adjustments as $adjustment) {
|
||||
$itemId = $adjustment['itemId'] ?? $adjustment['item_id'] ?? null;
|
||||
|
||||
if (!$itemId) {
|
||||
$errors[] = ['itemId' => null, 'success' => false, 'error' => 'itemId is required'];
|
||||
continue;
|
||||
}
|
||||
|
||||
$item = $this->item->find($itemId);
|
||||
if (!$item || $item->deleted) {
|
||||
$errors[] = ['itemId' => $itemId, 'success' => false, 'error' => 'Item not found'];
|
||||
continue;
|
||||
}
|
||||
|
||||
$mode = $adjustment['mode'] ?? 'adjust';
|
||||
$locationId = $adjustment['locationId'] ?? $adjustment['location_id'] ?? 1;
|
||||
$quantity = (float) ($adjustment['quantity'] ?? 0);
|
||||
$comment = $adjustment['comment'] ?? 'Bulk API inventory adjustment';
|
||||
|
||||
if ($mode === 'set') {
|
||||
$currentQty = $this->itemQuantity->get_item_quantity($itemId, $locationId);
|
||||
$currentQty = $currentQty ? (float) $currentQty->quantity : 0;
|
||||
$adjustmentQty = $quantity - $currentQty;
|
||||
} else {
|
||||
$adjustmentQty = $quantity;
|
||||
}
|
||||
|
||||
$invData = [
|
||||
'trans_date' => date('Y-m-d H:i:s'),
|
||||
'trans_items' => $itemId,
|
||||
'trans_user' => $this->employeeId,
|
||||
'trans_location' => $locationId,
|
||||
'trans_comment' => $comment,
|
||||
'trans_inventory' => $adjustmentQty
|
||||
];
|
||||
|
||||
$this->inventory->insert($invData);
|
||||
$this->itemQuantity->change_quantity($itemId, $locationId, $adjustmentQty);
|
||||
|
||||
$results[] = ['itemId' => $itemId, 'success' => true];
|
||||
$processed++;
|
||||
}
|
||||
|
||||
$this->inventory->db->transComplete();
|
||||
|
||||
$response = [
|
||||
'processed' => $processed,
|
||||
'total' => count($adjustments),
|
||||
'results' => $results
|
||||
];
|
||||
|
||||
if (!empty($errors)) {
|
||||
$response['errors'] = $errors;
|
||||
$response['success'] = false;
|
||||
$response['message'] = 'Some adjustments failed';
|
||||
} else {
|
||||
$response['success'] = true;
|
||||
$response['message'] = 'All adjustments processed successfully';
|
||||
}
|
||||
|
||||
return $this->respondSuccess($response);
|
||||
}
|
||||
}
|
||||
237
app/Controllers/Api/Items.php
Normal file
237
app/Controllers/Api/Items.php
Normal file
@@ -0,0 +1,237 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Api;
|
||||
|
||||
use App\Models\Item;
|
||||
use App\Models\Item_quantity;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Items extends BaseController
|
||||
{
|
||||
protected Item $itemModel;
|
||||
protected Item_quantity $itemQuantityModel;
|
||||
|
||||
protected array $allowedSortFields = ['item_id', 'name', 'category', 'cost_price', 'unit_price'];
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger): void
|
||||
{
|
||||
parent::initController($request, $response, $logger);
|
||||
$this->itemModel = model(Item::class);
|
||||
$this->itemQuantityModel = model(Item_quantity::class);
|
||||
}
|
||||
|
||||
public function index(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$search = $this->request->getGet('search');
|
||||
$pagination = $this->getPagination();
|
||||
$sort = $this->getSort($this->allowedSortFields, 'name');
|
||||
$stockLocation = $this->request->getGet('stockLocation');
|
||||
|
||||
$builder = $this->itemModel->builder();
|
||||
$builder->where('deleted', 0);
|
||||
|
||||
if ($search) {
|
||||
$builder->groupStart();
|
||||
$builder->like('name', $search);
|
||||
$builder->orLike('item_number', $search);
|
||||
$builder->orLike('category', $search);
|
||||
$builder->orLike('description', $search);
|
||||
$builder->groupEnd();
|
||||
}
|
||||
|
||||
$total = $builder->countAllResults(false);
|
||||
|
||||
$dbSort = $this->mapSortField($sort['sort']);
|
||||
$builder->orderBy($dbSort, $sort['order']);
|
||||
$builder->limit($pagination['limit'], $pagination['offset']);
|
||||
|
||||
$items = $builder->get()->getResultArray();
|
||||
|
||||
return $this->respondSuccess([
|
||||
'total' => $total,
|
||||
'offset' => $pagination['offset'],
|
||||
'limit' => $pagination['limit'],
|
||||
'rows' => $this->transformCollection($items)
|
||||
]);
|
||||
}
|
||||
|
||||
public function show($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$item = $this->itemModel->find($id);
|
||||
|
||||
if (!$item || $item->deleted) {
|
||||
return $this->respondNotFound('Item not found');
|
||||
}
|
||||
|
||||
return $this->respondSuccess($this->transformItem($item));
|
||||
}
|
||||
|
||||
public function create(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getPost();
|
||||
}
|
||||
|
||||
$snakeData = $this->toSnakeCase($data);
|
||||
|
||||
if (!empty($snakeData['item_number'])) {
|
||||
if ($this->itemModel->item_number_exists($snakeData['item_number'])) {
|
||||
return $this->respondError('Item number already exists', 409);
|
||||
}
|
||||
}
|
||||
|
||||
$itemId = $this->itemModel->save_value($snakeData);
|
||||
|
||||
if ($itemId) {
|
||||
return $this->respondCreated(['id' => $itemId], 'Item created successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to create item');
|
||||
}
|
||||
|
||||
public function update($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$item = $this->itemModel->find($id);
|
||||
|
||||
if (!$item || $item->deleted) {
|
||||
return $this->respondNotFound('Item not found');
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getRawInput();
|
||||
}
|
||||
|
||||
$snakeData = $this->toSnakeCase($data);
|
||||
$snakeData['item_id'] = $id;
|
||||
|
||||
$success = $this->itemModel->save_value($snakeData);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Item updated successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to update item');
|
||||
}
|
||||
|
||||
public function delete($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$item = $this->itemModel->find($id);
|
||||
|
||||
if (!$item || $item->deleted) {
|
||||
return $this->respondNotFound('Item not found');
|
||||
}
|
||||
|
||||
$success = $this->itemModel->delete($id);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Item deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete item');
|
||||
}
|
||||
|
||||
public function batchDelete(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
$ids = $data['ids'] ?? [];
|
||||
|
||||
if (empty($ids)) {
|
||||
return $this->respondError('No item IDs provided');
|
||||
}
|
||||
|
||||
$success = $this->itemModel->delete_list($ids);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Items deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete items');
|
||||
}
|
||||
|
||||
public function quantities($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$item = $this->itemModel->find($id);
|
||||
|
||||
if (!$item || $item->deleted) {
|
||||
return $this->respondNotFound('Item not found');
|
||||
}
|
||||
|
||||
$locations = model('App\Models\Stock_location')->get_all();
|
||||
$quantities = [];
|
||||
|
||||
foreach ($locations as $location) {
|
||||
$qty = $this->itemQuantityModel->get_item_quantity($id, $location->location_id);
|
||||
$quantities[] = [
|
||||
'locationId' => (int) $location->location_id,
|
||||
'locationName' => $location->location_name,
|
||||
'quantity' => $qty ? (float) $qty->quantity : 0
|
||||
];
|
||||
}
|
||||
|
||||
return $this->respondSuccess([
|
||||
'itemId' => (int) $id,
|
||||
'quantities' => $quantities
|
||||
]);
|
||||
}
|
||||
|
||||
public function suggest(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('items')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$term = $this->request->getGet('term');
|
||||
$limit = (int) ($this->request->getGet('limit') ?? 25);
|
||||
|
||||
if (empty($term)) {
|
||||
return $this->respondSuccess(['suggestions' => []]);
|
||||
}
|
||||
|
||||
$suggestions = $this->itemModel->get_search_suggestions($term, $limit);
|
||||
|
||||
return $this->respondSuccess(['suggestions' => $suggestions]);
|
||||
}
|
||||
|
||||
private function mapSortField(string $field): string
|
||||
{
|
||||
$map = [
|
||||
'itemId' => 'item_id',
|
||||
'name' => 'name',
|
||||
'category' => 'category',
|
||||
'costPrice' => 'cost_price',
|
||||
'unitPrice' => 'unit_price'
|
||||
];
|
||||
|
||||
return $map[$field] ?? 'name';
|
||||
}
|
||||
}
|
||||
239
app/Controllers/Api/Suppliers.php
Normal file
239
app/Controllers/Api/Suppliers.php
Normal file
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers\Api;
|
||||
|
||||
use App\Models\Supplier;
|
||||
use App\Models\Person;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Suppliers extends BaseController
|
||||
{
|
||||
protected Supplier $supplierModel;
|
||||
protected Person $personModel;
|
||||
|
||||
protected array $allowedSortFields = ['person_id', 'last_name', 'company_name'];
|
||||
|
||||
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger): void
|
||||
{
|
||||
parent::initController($request, $response, $logger);
|
||||
$this->supplierModel = model(Supplier::class);
|
||||
$this->personModel = model(Person::class);
|
||||
}
|
||||
|
||||
public function index(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$search = $this->request->getGet('search');
|
||||
$pagination = $this->getPagination();
|
||||
$sort = $this->getSort($this->allowedSortFields, 'companyName');
|
||||
|
||||
$builder = $this->supplierModel->builder();
|
||||
$builder->select('suppliers.*, people.*');
|
||||
$builder->join('people', 'people.person_id = suppliers.person_id');
|
||||
$builder->where('suppliers.deleted', 0);
|
||||
|
||||
if ($search) {
|
||||
$builder->groupStart();
|
||||
$builder->like('people.first_name', $search);
|
||||
$builder->orLike('people.last_name', $search);
|
||||
$builder->orLike('people.email', $search);
|
||||
$builder->orLike('suppliers.account_number', $search);
|
||||
$builder->orLike('suppliers.company_name', $search);
|
||||
$builder->groupEnd();
|
||||
}
|
||||
|
||||
$total = $builder->countAllResults(false);
|
||||
|
||||
$dbSort = $this->mapSortField($sort['sort']);
|
||||
$builder->orderBy($dbSort, $sort['order']);
|
||||
$builder->limit($pagination['limit'], $pagination['offset']);
|
||||
|
||||
$suppliers = $builder->get()->getResultArray();
|
||||
|
||||
return $this->respondSuccess([
|
||||
'total' => $total,
|
||||
'offset' => $pagination['offset'],
|
||||
'limit' => $pagination['limit'],
|
||||
'rows' => $this->transformCollection($suppliers)
|
||||
]);
|
||||
}
|
||||
|
||||
public function show($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$supplier = $this->supplierModel->get_info($id);
|
||||
|
||||
if (empty($supplier) || $supplier->deleted) {
|
||||
return $this->respondNotFound('Supplier not found');
|
||||
}
|
||||
|
||||
$person = (array) $this->personModel->get_info($id);
|
||||
$supplier = (array) $supplier;
|
||||
$data = array_merge($person, $supplier);
|
||||
|
||||
return $this->respondSuccess($this->transformItem($data));
|
||||
}
|
||||
|
||||
public function create(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getPost();
|
||||
}
|
||||
|
||||
$snakeData = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$snakeKey = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key));
|
||||
$snakeData[$snakeKey] = $value;
|
||||
}
|
||||
|
||||
$personData = array_intersect_key($snakeData, array_flip([
|
||||
'first_name', 'last_name', 'gender', 'phone_number', 'email',
|
||||
'address_1', 'address_2', 'city', 'state', 'zip', 'country', 'comments'
|
||||
]));
|
||||
|
||||
$supplierData = array_intersect_key($snakeData, array_flip([
|
||||
'company_name', 'account_number', 'tax_id', 'agency_name', 'category'
|
||||
]));
|
||||
|
||||
$personId = false;
|
||||
$success = $this->personModel->save_value($personData);
|
||||
|
||||
if ($success && isset($personData['person_id'])) {
|
||||
$personId = $personData['person_id'];
|
||||
$supplierData['person_id'] = $personId;
|
||||
$success = $this->supplierModel->save_value($supplierData);
|
||||
}
|
||||
|
||||
if ($success) {
|
||||
return $this->respondCreated(['id' => $personId], 'Supplier created successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to create supplier');
|
||||
}
|
||||
|
||||
public function update($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$supplier = $this->supplierModel->get_info($id);
|
||||
|
||||
if (empty($supplier) || $supplier->deleted) {
|
||||
return $this->respondNotFound('Supplier not found');
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
if (empty($data)) {
|
||||
$data = $this->request->getRawInput();
|
||||
}
|
||||
|
||||
$snakeData = [];
|
||||
foreach ($data as $key => $value) {
|
||||
$snakeKey = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', $key));
|
||||
$snakeData[$snakeKey] = $value;
|
||||
}
|
||||
|
||||
$personData = array_intersect_key($snakeData, array_flip([
|
||||
'first_name', 'last_name', 'gender', 'phone_number', 'email',
|
||||
'address_1', 'address_2', 'city', 'state', 'zip', 'country', 'comments'
|
||||
]));
|
||||
|
||||
$supplierData = array_intersect_key($snakeData, array_flip([
|
||||
'company_name', 'account_number', 'tax_id', 'agency_name', 'category'
|
||||
]));
|
||||
|
||||
if (!empty($personData)) {
|
||||
$this->personModel->save_value($personData, $id);
|
||||
}
|
||||
|
||||
if (!empty($supplierData)) {
|
||||
$this->supplierModel->save_value($supplierData, $id);
|
||||
}
|
||||
|
||||
return $this->respondSuccess([], 200, 'Supplier updated successfully');
|
||||
}
|
||||
|
||||
public function delete($id = null): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$supplier = $this->supplierModel->get_info($id);
|
||||
|
||||
if (empty($supplier) || $supplier->deleted) {
|
||||
return $this->respondNotFound('Supplier not found');
|
||||
}
|
||||
|
||||
$success = $this->supplierModel->delete($id);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Supplier deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete supplier');
|
||||
}
|
||||
|
||||
public function batchDelete(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$data = $this->request->getJSON(true);
|
||||
$ids = $data['ids'] ?? [];
|
||||
|
||||
if (empty($ids)) {
|
||||
return $this->respondError('No supplier IDs provided');
|
||||
}
|
||||
|
||||
$success = $this->supplierModel->delete_list($ids);
|
||||
|
||||
if ($success) {
|
||||
return $this->respondSuccess([], 200, 'Suppliers deleted successfully');
|
||||
}
|
||||
|
||||
return $this->respondError('Failed to delete suppliers');
|
||||
}
|
||||
|
||||
public function suggest(): ResponseInterface
|
||||
{
|
||||
if (!$this->hasPermission('suppliers')) {
|
||||
return $this->respondUnauthorized();
|
||||
}
|
||||
|
||||
$term = $this->request->getGet('term');
|
||||
$limit = (int) ($this->request->getGet('limit') ?? 25);
|
||||
|
||||
if (empty($term)) {
|
||||
return $this->respondSuccess(['suggestions' => []]);
|
||||
}
|
||||
|
||||
$suggestions = $this->supplierModel->get_search_suggestions($term, $limit);
|
||||
|
||||
return $this->respondSuccess(['suggestions' => $suggestions]);
|
||||
}
|
||||
|
||||
private function mapSortField(string $field): string
|
||||
{
|
||||
$map = [
|
||||
'personId' => 'people.person_id',
|
||||
'lastName' => 'people.last_name',
|
||||
'companyName' => 'suppliers.company_name'
|
||||
];
|
||||
|
||||
return $map[$field] ?? 'suppliers.company_name';
|
||||
}
|
||||
}
|
||||
84
app/Controllers/ApiKeys.php
Normal file
84
app/Controllers/ApiKeys.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\ApiKey;
|
||||
use App\Models\Employee;
|
||||
|
||||
class ApiKeys extends Secure_Controller
|
||||
{
|
||||
protected ApiKey $apiKeyModel;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct('api_keys');
|
||||
$this->apiKeyModel = model(ApiKey::class);
|
||||
}
|
||||
|
||||
public function index(): void
|
||||
{
|
||||
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
$keys = $this->apiKeyModel->getKeysForEmployee($employeeId);
|
||||
|
||||
echo view('api_keys/manage', [
|
||||
'keys' => $keys,
|
||||
'employee_info' => $this->employee->get_logged_in_employee_info()
|
||||
]);
|
||||
}
|
||||
|
||||
public function generate(): void
|
||||
{
|
||||
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
$name = $this->request->getPost('name');
|
||||
$expiresAt = $this->request->getPost('expires_at') ?: null;
|
||||
|
||||
$apiKey = $this->apiKeyModel->generateKey($employeeId, $name, $expiresAt);
|
||||
|
||||
if ($apiKey) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => lang('Api_keys.key_generated'),
|
||||
'apiKey' => $apiKey,
|
||||
'keyPrefix' => substr($apiKey, 0, 12) . '...'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => lang('Api_keys.key_generation_failed')
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function revoke(int $apiKeyId): void
|
||||
{
|
||||
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
|
||||
$success = $this->apiKeyModel->revokeKey($apiKeyId, $employeeId);
|
||||
|
||||
echo json_encode([
|
||||
'success' => $success,
|
||||
'message' => $success ? lang('Api_keys.key_revoked') : lang('Api_keys.key_revoke_failed')
|
||||
]);
|
||||
}
|
||||
|
||||
public function regenerate(int $apiKeyId): void
|
||||
{
|
||||
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
|
||||
$newKey = $this->apiKeyModel->regenerateKey($apiKeyId, $employeeId);
|
||||
|
||||
if ($newKey) {
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'message' => lang('Api_keys.key_regenerated'),
|
||||
'apiKey' => $newKey,
|
||||
'keyPrefix' => substr($newKey, 0, 12) . '...'
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'success' => false,
|
||||
'message' => lang('Api_keys.key_regeneration_failed')
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Attribute;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
require_once('Secure_Controller.php');
|
||||
@@ -24,19 +25,19 @@ class Attributes extends Secure_Controller
|
||||
/**
|
||||
* Gets and sends the main view for Attributes to the browser.
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
**/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_attribute_definition_manage_table_headers();
|
||||
|
||||
echo view('attributes/manage', $data);
|
||||
return view('attributes/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns attribute table data rows. This will be called with AJAX.
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -53,15 +54,15 @@ class Attributes extends Secure_Controller
|
||||
$data_rows[] = get_attribute_definition_data_row($attribute_row);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX called function which saves the attribute value sent via POST by using the model save function.
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveAttributeValue(): void
|
||||
public function postSaveAttributeValue(): ResponseInterface
|
||||
{
|
||||
$success = $this->attribute->saveAttributeValue(
|
||||
html_entity_decode($this->request->getPost('attribute_value')),
|
||||
@@ -70,32 +71,32 @@ class Attributes extends Secure_Controller
|
||||
$this->request->getPost('attribute_id', FILTER_SANITIZE_NUMBER_INT) ?? false
|
||||
);
|
||||
|
||||
echo json_encode(['success' => $success != 0]);
|
||||
return $this->response->setJSON(['success' => $success != 0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX called function deleting an attribute value using the model delete function.
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postDeleteDropdownAttributeValue(): void
|
||||
public function postDeleteDropdownAttributeValue(): ResponseInterface
|
||||
{
|
||||
$success = $this->attribute->deleteDropdownAttributeValue(
|
||||
html_entity_decode($this->request->getPost('attribute_value')),
|
||||
$this->request->getPost('definition_id', FILTER_SANITIZE_NUMBER_INT)
|
||||
);
|
||||
|
||||
echo json_encode(['success' => $success]);
|
||||
return $this->response->setJSON(['success' => $success]);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX called function which saves the attribute definition.
|
||||
*
|
||||
* @param int $definition_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveDefinition(int $definition_id = NO_DEFINITION_ID): void
|
||||
public function postSaveDefinition(int $definition_id = NO_DEFINITION_ID): ResponseInterface
|
||||
{
|
||||
$definition_flags = 0;
|
||||
|
||||
@@ -128,20 +129,20 @@ class Attributes extends Secure_Controller
|
||||
$this->attribute->saveAttributeValue($definition_value, $definition_data['definition_id']);
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Attributes.definition_successful_adding') . ' ' . $definition_name,
|
||||
'id' => $definition_data['definition_id']
|
||||
]);
|
||||
} else { // Existing definition
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Attributes.definition_successful_updating') . ' ' . $definition_name,
|
||||
'id' => $definition_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Attributes.definition_error_adding_updating', [$definition_name]),
|
||||
'id' => NEW_ENTRY
|
||||
@@ -152,27 +153,27 @@ class Attributes extends Secure_Controller
|
||||
/**
|
||||
*
|
||||
* @param int $definition_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestAttribute(int $definition_id): void
|
||||
public function getSuggestAttribute(int $definition_id): ResponseInterface
|
||||
{
|
||||
$suggestions = $this->attribute->get_suggestions($definition_id, html_entity_decode($this->request->getGet('term')));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -192,9 +193,9 @@ class Attributes extends Secure_Controller
|
||||
|
||||
/**
|
||||
* @param int $definition_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $definition_id = NO_DEFINITION_ID): void
|
||||
public function getView(int $definition_id = NO_DEFINITION_ID): string
|
||||
{
|
||||
$info = $this->attribute->getAttributeInfo($definition_id);
|
||||
foreach (get_object_vars($info) as $property => $value) {
|
||||
@@ -212,22 +213,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);
|
||||
|
||||
echo view('attributes/form', $data);
|
||||
return view('attributes/form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an attribute definition
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$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');
|
||||
echo json_encode(['success' => true, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => $message]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Attributes.definition_cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Attributes.definition_cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ 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;
|
||||
|
||||
@@ -26,22 +27,22 @@ class Cashups extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$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')];
|
||||
|
||||
echo view('cashups/manage', $data);
|
||||
return view('cashups/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -64,14 +65,14 @@ class Cashups extends Secure_Controller
|
||||
$data_rows[] = get_cash_up_data_row($cash_up);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $cashup_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $cashup_id = NEW_ENTRY): void
|
||||
public function getView(int $cashup_id = NEW_ENTRY): string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -180,26 +181,26 @@ class Cashups extends Secure_Controller
|
||||
|
||||
$data['cash_ups_info'] = $cash_ups_info;
|
||||
|
||||
echo view("cashups/form", $data);
|
||||
return view("cashups/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$cash_ups_info = $this->cashup->get_info($row_id);
|
||||
$data_row = get_cash_up_data_row($cash_ups_info);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $cashup_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $cashup_id = NEW_ENTRY): void
|
||||
public function postSave(int $cashup_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$open_date = $this->request->getPost('open_date');
|
||||
$open_date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $open_date);
|
||||
@@ -227,36 +228,36 @@ class Cashups extends Secure_Controller
|
||||
if ($this->cashup->save_value($cash_up_data, $cashup_id)) {
|
||||
// New cashup_id
|
||||
if ($cashup_id == NEW_ENTRY) {
|
||||
echo json_encode(['success' => true, 'message' => lang('Cashups.successful_adding'), 'id' => $cash_up_data['cashup_id']]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Cashups.successful_adding'), 'id' => $cash_up_data['cashup_id']]);
|
||||
} else { // Existing Cashup
|
||||
echo json_encode(['success' => true, 'message' => lang('Cashups.successful_updating'), 'id' => $cashup_id]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Cashups.successful_updating'), 'id' => $cashup_id]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode(['success' => false, 'message' => lang('Cashups.error_adding_updating'), 'id' => NEW_ENTRY]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Cashups.error_adding_updating'), 'id' => NEW_ENTRY]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$cash_ups_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
if ($this->cashup->delete_list($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]);
|
||||
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]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Cashups.cannot_be_deleted'), 'ids' => $cash_ups_to_delete]);
|
||||
return $this->response->setJSON(['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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postAjax_cashup_total(): void
|
||||
public function postAjax_cashup_total(): ResponseInterface
|
||||
{
|
||||
$open_amount_cash = parse_decimals($this->request->getPost('open_amount_cash'));
|
||||
$transfer_amount_cash = parse_decimals($this->request->getPost('transfer_amount_cash'));
|
||||
@@ -267,7 +268,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
|
||||
|
||||
echo json_encode(['total' => to_currency_no_money($total)]);
|
||||
return $this->response->setJSON(['total' => to_currency_no_money($total)]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,6 +17,7 @@ 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;
|
||||
@@ -215,8 +216,9 @@ class Config extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['stock_locations'] = $this->stock_location->get_all()->getResultArray();
|
||||
$data['dinner_tables'] = $this->dinner_table->get_all()->getResultArray();
|
||||
@@ -224,6 +226,7 @@ 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();
|
||||
@@ -272,17 +275,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$data['mailchimp']['lists'] = $this->_mailchimp();
|
||||
|
||||
echo view('configs/manage', $data);
|
||||
return view('configs/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves company information. Used in app/Views/configs/info_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveInfo(): void
|
||||
public function postSaveInfo(): ResponseInterface
|
||||
{
|
||||
$upload_data = $this->upload_logo();
|
||||
$upload_success = empty($upload_data['error']);
|
||||
@@ -306,7 +309,7 @@ class Config extends Secure_Controller
|
||||
$message = lang('Config.saved_' . ($success ? '' : 'un') . 'successfully');
|
||||
$message = $upload_success ? $message : strip_tags($upload_data['error']);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => $message]);
|
||||
}
|
||||
|
||||
|
||||
@@ -358,9 +361,10 @@ 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(): void
|
||||
public function postSaveGeneral(): ResponseInterface
|
||||
{
|
||||
$batch_save_data = [
|
||||
'theme' => $this->request->getPost('theme'),
|
||||
@@ -407,16 +411,16 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckNumberLocale(): void
|
||||
public function postCheckNumberLocale(): ResponseInterface
|
||||
{
|
||||
$number_locale = $this->request->getPost('number_locale');
|
||||
$save_number_locale = $this->request->getPost('save_number_locale');
|
||||
@@ -438,7 +442,7 @@ class Config extends Secure_Controller
|
||||
$fmt->setSymbol(NumberFormatter::CURRENCY_SYMBOL, $currency_symbol);
|
||||
$number_local_example = $fmt->format(1234567890.12300);
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => $number_local_example != false,
|
||||
'save_number_locale' => $save_number_locale,
|
||||
'number_locale_example' => $number_local_example,
|
||||
@@ -451,10 +455,10 @@ class Config extends Secure_Controller
|
||||
* Saves locale configuration. Used in app/Views/configs/locale_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveLocale(): void
|
||||
public function postSaveLocale(): ResponseInterface
|
||||
{
|
||||
$exploded = explode(":", $this->request->getPost('language'));
|
||||
$batch_save_data = [
|
||||
@@ -480,17 +484,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves email configuration. Used in app/Views/configs/email_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveEmail(): void
|
||||
public function postSaveEmail(): ResponseInterface
|
||||
{
|
||||
$password = '';
|
||||
|
||||
@@ -511,17 +515,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves SMS message configuration. Used in app/Views/configs/message_config.php.
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveMessage(): void
|
||||
public function postSaveMessage(): ResponseInterface
|
||||
{
|
||||
$password = '';
|
||||
|
||||
@@ -538,7 +542,7 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -565,15 +569,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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckMailchimpApiKey(): void
|
||||
public function postCheckMailchimpApiKey(): ResponseInterface
|
||||
{
|
||||
$lists = $this->_mailchimp($this->request->getPost('mailchimp_api_key'));
|
||||
$success = count($lists) > 0;
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => $success,
|
||||
'message' => lang('Config.mailchimp_key_' . ($success ? '' : 'un') . 'successfully'),
|
||||
'mailchimp_lists' => $lists
|
||||
@@ -584,10 +588,10 @@ class Config extends Secure_Controller
|
||||
* Saves Mailchimp configuration. Used in app/Views/configs/integrations_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveMailchimp(): void
|
||||
public function postSaveMailchimp(): ResponseInterface
|
||||
{
|
||||
$api_key = '';
|
||||
$list_id = '';
|
||||
@@ -608,56 +612,56 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all stock locations. Used in app/Views/configs/stock_config.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getStockLocations(): void
|
||||
public function getStockLocations(): string
|
||||
{
|
||||
$stock_locations = $this->stock_location->get_all()->getResultArray();
|
||||
|
||||
echo view('partial/stock_locations', ['stock_locations' => $stock_locations]);
|
||||
return view('partial/stock_locations', ['stock_locations' => $stock_locations]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getDinnerTables(): void
|
||||
public function getDinnerTables(): string
|
||||
{
|
||||
$dinner_tables = $this->dinner_table->get_all()->getResultArray();
|
||||
|
||||
echo view('partial/dinner_tables', ['dinner_tables' => $dinner_tables]);
|
||||
return view('partial/dinner_tables', ['dinner_tables' => $dinner_tables]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets all tax categories.
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function ajax_tax_categories(): void // TODO: Is this function called anywhere in the code?
|
||||
public function ajax_tax_categories(): string // TODO: Is this function called anywhere in the code?
|
||||
{
|
||||
$tax_categories = $this->tax->get_all_tax_categories()->getResultArray();
|
||||
|
||||
echo view('partial/tax_categories', ['tax_categories' => $tax_categories]);
|
||||
return view('partial/tax_categories', ['tax_categories' => $tax_categories]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all customer rewards. Used in app/Views/configs/reward_config.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCustomerRewards(): void
|
||||
public function getCustomerRewards(): string
|
||||
{
|
||||
$customer_rewards = $this->customer_rewards->get_all()->getResultArray();
|
||||
|
||||
echo view('partial/customer_rewards', ['customer_rewards' => $customer_rewards]);
|
||||
return view('partial/customer_rewards', ['customer_rewards' => $customer_rewards]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -677,10 +681,10 @@ class Config extends Secure_Controller
|
||||
/**
|
||||
* Saves stock locations. Used in app/Views/configs/stock_config.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveLocations(): void
|
||||
public function postSaveLocations(): ResponseInterface
|
||||
{
|
||||
$this->db->transStart();
|
||||
|
||||
@@ -712,17 +716,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->db->transStatus();
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves all dinner tables. Used in app/Views/configs/table_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveTables(): void
|
||||
public function postSaveTables(): ResponseInterface
|
||||
{
|
||||
$this->db->transStart();
|
||||
|
||||
@@ -759,17 +763,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->db->transStatus();
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves tax configuration. Used in app/Views/configs/tax_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveTax(): void
|
||||
public function postSaveTax(): ResponseInterface
|
||||
{
|
||||
$default_tax_1_rate = $this->request->getPost('default_tax_1_rate');
|
||||
$default_tax_2_rate = $this->request->getPost('default_tax_2_rate');
|
||||
@@ -791,17 +795,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$message = lang('Config.saved_' . ($success ? '' : 'un') . 'successfully');
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => $message]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves customer rewards configuration. Used in app/Views/configs/reward_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveRewards(): void
|
||||
* @throws ReflectionException
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveRewards(): ResponseInterface
|
||||
{
|
||||
$this->db->transStart();
|
||||
|
||||
@@ -845,17 +849,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->db->transStatus();
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves barcode configuration. Used in app/Views/configs/barcode_config.php
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveBarcode(): void
|
||||
public function postSaveBarcode(): ResponseInterface
|
||||
{
|
||||
$batch_save_data = [
|
||||
'barcode_type' => $this->request->getPost('barcode_type'),
|
||||
@@ -877,17 +881,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves receipt configuration. Used in app/Views/configs/receipt_config.php.
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveReceipt(): void
|
||||
public function postSaveReceipt(): ResponseInterface
|
||||
{
|
||||
$batch_save_data = [
|
||||
'receipt_template' => $this->request->getPost('receipt_template'),
|
||||
@@ -912,17 +916,17 @@ class Config extends Secure_Controller
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves invoice configuration. Used in app/Views/configs/invoice_config.php.
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveInvoice(): void
|
||||
public function postSaveInvoice(): ResponseInterface
|
||||
{
|
||||
$batch_save_data = [
|
||||
'invoice_enable' => $this->request->getPost('invoice_enable') != null,
|
||||
@@ -938,7 +942,9 @@ 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' => $this->request->getPost('invoice_type')
|
||||
'invoice_type' => Sale_lib::isValidInvoiceType($this->request->getPost('invoice_type'))
|
||||
? $this->request->getPost('invoice_type')
|
||||
: 'invoice'
|
||||
];
|
||||
|
||||
$success = $this->appconfig->batch_save($batch_save_data);
|
||||
@@ -953,20 +959,20 @@ class Config extends Secure_Controller
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
|
||||
return $this->response->setJSON(['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 void
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postRemoveLogo(): void
|
||||
public function postRemoveLogo(): ResponseInterface
|
||||
{
|
||||
$success = $this->appconfig->save(['company_logo' => '']);
|
||||
|
||||
echo json_encode(['success' => $success]);
|
||||
return $this->response->setJSON(['success' => $success]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ 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;
|
||||
@@ -40,19 +41,20 @@ class Customers extends Persons
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_customer_manage_table_headers();
|
||||
|
||||
echo view('people/manage', $data);
|
||||
return 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): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$person = $this->customer->get_info($row_id);
|
||||
|
||||
@@ -72,7 +74,7 @@ class Customers extends Persons
|
||||
|
||||
$data_row = get_customer_data_row($person, $stats);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +83,7 @@ class Customers extends Persons
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -111,35 +113,37 @@ class Customers extends Persons
|
||||
$data_rows[] = get_customer_data_row($person, $stats);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->customer->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->customer->get_search_suggestions($search, 25, false);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the customer edit form
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $customer_id = NEW_ENTRY): void
|
||||
public function getView(int $customer_id = NEW_ENTRY): string
|
||||
{
|
||||
// Set default values
|
||||
if ($customer_id == null) $customer_id = NEW_ENTRY;
|
||||
@@ -227,13 +231,14 @@ class Customers extends Persons
|
||||
}
|
||||
}
|
||||
|
||||
echo view("customers/form", $data);
|
||||
return view("customers/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts/updates a customer
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $customer_id = NEW_ENTRY): void
|
||||
public function postSave(int $customer_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$first_name = $this->request->getPost('first_name');
|
||||
$last_name = $this->request->getPost('last_name');
|
||||
@@ -288,20 +293,20 @@ class Customers extends Persons
|
||||
|
||||
// New customer
|
||||
if ($customer_id == NEW_ENTRY) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Customers.successful_adding') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => $customer_data['person_id']
|
||||
]);
|
||||
} else { // Existing customer
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Customers.successful_updating') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => $customer_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Customers.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => NEW_ENTRY
|
||||
@@ -312,36 +317,37 @@ class Customers extends Persons
|
||||
/**
|
||||
* Verifies if an email address already exists. Used in app/Views/customers/form.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckEmail(): void
|
||||
public function postCheckEmail(): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies if an account number already exists. Used in app/Views/customers/form.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckAccountNumber(): void
|
||||
public function postCheckAccountNumber(): ResponseInterface
|
||||
{
|
||||
$exists = $this->customer->check_account_number_exists($this->request->getPost('account_number'), $this->request->getPost('person_id', FILTER_SANITIZE_NUMBER_INT));
|
||||
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
* This deletes customers from the customers table
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$customers_to_delete = $this->request->getPost('ids');
|
||||
$customers_info = $this->customer->get_multiple_info($customers_to_delete);
|
||||
@@ -358,12 +364,12 @@ class Customers extends Persons
|
||||
}
|
||||
|
||||
if ($count == count($customers_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Customers.successful_deleted') . ' ' . $count . ' ' . lang('Customers.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Customers.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Customers.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -383,24 +389,24 @@ class Customers extends Persons
|
||||
/**
|
||||
* Displays the customer CSV import modal. Used in app/Views/people/manage.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCsvImport(): void
|
||||
public function getCsvImport(): string
|
||||
{
|
||||
echo view('customers/form_csv_import');
|
||||
return view('customers/form_csv_import');
|
||||
}
|
||||
|
||||
/**
|
||||
* Imports a CSV file containing customers. Used in app/Views/customers/form_csv_import.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postImportCsvFile(): void
|
||||
public function postImportCsvFile(): ResponseInterface
|
||||
{
|
||||
if ($_FILES['file_path']['error'] != UPLOAD_ERR_OK) {
|
||||
echo json_encode(['success' => false, 'message' => lang('Customers.csv_import_failed')]);
|
||||
return $this->response->setJSON(['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
|
||||
@@ -467,12 +473,12 @@ class Customers extends Persons
|
||||
if (count($failCodes) > 0) {
|
||||
$message = lang('Customers.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
|
||||
|
||||
echo json_encode(['success' => false, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => $message]);
|
||||
} else {
|
||||
echo json_encode(['success' => true, 'message' => lang('Customers.csv_import_success')]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Customers.csv_import_success')]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Customers.csv_import_nodata_wrongformat')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Customers.csv_import_nodata_wrongformat')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Module;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
/**
|
||||
@@ -25,7 +26,7 @@ class Employees extends Persons
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -41,39 +42,47 @@ class Employees extends Persons
|
||||
$data_rows[] = get_person_data_row($person);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX called function gives search suggestions based on what is being searched for.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->employee->get_search_suggestions($search, 25, true);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->employee->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the employee edit form
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $employee_id = NEW_ENTRY): void
|
||||
public function getView(int $employee_id = NEW_ENTRY): string
|
||||
{
|
||||
$person_info = $this->employee->get_info($employee_id);
|
||||
$current_user = $this->employee->get_logged_in_employee_info();
|
||||
|
||||
if ($employee_id != NEW_ENTRY && !$this->employee->can_modify_employee($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;
|
||||
}
|
||||
@@ -98,14 +107,28 @@ class Employees extends Persons
|
||||
}
|
||||
$data['all_subpermissions'] = $permissions;
|
||||
|
||||
echo view('employees/form', $data);
|
||||
return view('employees/form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts/updates an employee
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $employee_id = NEW_ENTRY): void
|
||||
public function postSave(int $employee_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$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->can_modify_employee($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));
|
||||
@@ -130,11 +153,16 @@ class Employees extends Persons
|
||||
];
|
||||
|
||||
$grants_array = [];
|
||||
$is_admin = $this->employee->is_admin($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 (!$is_admin && !$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;
|
||||
@@ -163,20 +191,25 @@ class Employees extends Persons
|
||||
if ($this->employee->save_employee($person_data, $employee_data, $grants_array, $employee_id)) {
|
||||
// New employee
|
||||
if ($employee_id == NEW_ENTRY) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Employees.successful_adding') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => $employee_data['person_id']
|
||||
]);
|
||||
} else { // Existing employee
|
||||
echo json_encode([
|
||||
$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([
|
||||
'success' => true,
|
||||
'message' => lang('Employees.successful_updating') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => $employee_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Employees.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
|
||||
'id' => NEW_ENTRY
|
||||
@@ -186,18 +219,28 @@ class Employees extends Persons
|
||||
|
||||
/**
|
||||
* This deletes employees from the employees table
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$employees_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$current_user = $this->employee->get_logged_in_employee_info();
|
||||
|
||||
if (!$this->employee->is_admin($current_user->person_id)) {
|
||||
foreach ($employees_to_delete as $emp_id) {
|
||||
if ($this->employee->is_admin((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
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Employees.successful_deleted') . ' ' . count($employees_to_delete) . ' ' . lang('Employees.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Employees.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Employees.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,12 +248,12 @@ class Employees extends Persons
|
||||
* Checks an employee username against the database. Used in app\Views\employees\form.php
|
||||
*
|
||||
* @param $employee_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCheckUsername($employee_id): void
|
||||
public function getCheckUsername($employee_id): ResponseInterface
|
||||
{
|
||||
$exists = $this->employee->username_exists($employee_id, $this->request->getGet('username'));
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Controllers;
|
||||
|
||||
use App\Models\Expense;
|
||||
use App\Models\Expense_category;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\OSPOS;
|
||||
use Config\Services;
|
||||
|
||||
@@ -23,7 +24,7 @@ class Expenses extends Secure_Controller
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_expenses_manage_table_headers();
|
||||
|
||||
@@ -37,13 +38,13 @@ class Expenses extends Secure_Controller
|
||||
'is_deleted' => lang('Expenses.is_deleted')
|
||||
];
|
||||
|
||||
echo view('expenses/manage', $data);
|
||||
return view('expenses/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -78,14 +79,14 @@ class Expenses extends Secure_Controller
|
||||
$data_rows[] = get_expenses_data_last_row($expenses);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $expense_id
|
||||
* @return void
|
||||
*/
|
||||
public function getView(int $expense_id = NEW_ENTRY): void
|
||||
public function getView(int $expense_id = NEW_ENTRY): string
|
||||
{
|
||||
$data = []; // TODO: Duplicated code
|
||||
|
||||
@@ -125,26 +126,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();
|
||||
|
||||
echo view("expenses/form", $data);
|
||||
return view("expenses/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$expense_info = $this->expense->get_info($row_id);
|
||||
$data_row = get_expenses_data_row($expense_info);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $expense_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $expense_id = NEW_ENTRY): void
|
||||
public function postSave(int $expense_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$config = config(OSPOS::class)->settings;
|
||||
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -167,26 +168,26 @@ class Expenses extends Secure_Controller
|
||||
if ($this->expense->save_value($expense_data, $expense_id)) {
|
||||
// New Expense
|
||||
if ($expense_id == NEW_ENTRY) {
|
||||
echo json_encode(['success' => true, 'message' => lang('Expenses.successful_adding'), 'id' => $expense_data['expense_id']]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_adding'), 'id' => $expense_data['expense_id']]);
|
||||
} else { // Existing Expense
|
||||
echo json_encode(['success' => true, 'message' => lang('Expenses.successful_updating'), 'id' => $expense_id]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_updating'), 'id' => $expense_id]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode(['success' => false, 'message' => lang('Expenses.error_adding_updating'), 'id' => NEW_ENTRY]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses.error_adding_updating'), 'id' => NEW_ENTRY]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$expenses_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
if ($this->expense->delete_list($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]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Expenses.successful_deleted') . ' ' . count($expenses_to_delete) . ' ' . lang('Expenses.one_or_multiple'), 'ids' => $expenses_to_delete]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Expenses.cannot_be_deleted'), 'ids' => $expenses_to_delete]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses.cannot_be_deleted'), 'ids' => $expenses_to_delete]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
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?
|
||||
@@ -19,17 +20,17 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_expense_category_manage_table_headers();
|
||||
|
||||
echo view('expenses_categories/manage', $data);
|
||||
return view('expenses_categories/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns expense_category_manage table data rows. This will be called with AJAX.
|
||||
**/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -45,36 +46,36 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
|
||||
$data_rows[] = get_expense_category_data_row($expense_category);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_expense_category_data_row($this->expense_category->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $expense_category_id
|
||||
* @return void
|
||||
*/
|
||||
public function getView(int $expense_category_id = NEW_ENTRY): void
|
||||
public function getView(int $expense_category_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['category_info'] = $this->expense_category->get_info($expense_category_id);
|
||||
|
||||
echo view("expenses_categories/form", $data);
|
||||
return view("expenses_categories/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $expense_category_id
|
||||
* @return void
|
||||
*/
|
||||
public function postSave(int $expense_category_id = NEW_ENTRY): void
|
||||
public function postSave(int $expense_category_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$expense_category_data = [
|
||||
'category_name' => $this->request->getPost('category_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
|
||||
@@ -84,20 +85,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) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Expenses_categories.successful_adding'),
|
||||
'id' => $expense_category_data['expense_category_id']
|
||||
]);
|
||||
} else { // Existing Expense Category
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Expenses_categories.successful_updating'),
|
||||
'id' => $expense_category_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Expenses_categories.error_adding_updating') . ' ' . $expense_category_data['category_name'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -108,17 +109,17 @@ class Expenses_categories extends Secure_Controller // TODO: Is this class ev
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$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.
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Expenses_categories.successful_deleted') . ' ' . count($expense_category_to_delete) . ' ' . lang('Expenses_categories.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Expenses_categories.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Expenses_categories.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Giftcard;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\OSPOS;
|
||||
use Config\Services;
|
||||
|
||||
@@ -18,19 +19,19 @@ class Giftcards extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_giftcards_manage_table_headers();
|
||||
|
||||
echo view('giftcards/manage', $data);
|
||||
return view('giftcards/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Giftcards table data rows. This will be called with AJAX.
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -46,50 +47,50 @@ class Giftcards extends Secure_Controller
|
||||
$data_rows[] = get_giftcard_data_row($giftcard);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets search suggestions for giftcards. Used in app\Views\sales\register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->giftcard->get_search_suggestions($search, true);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->giftcard->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_giftcard_data_row($this->giftcard->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $giftcard_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $giftcard_id = NEW_ENTRY): void
|
||||
public function getView(int $giftcard_id = NEW_ENTRY): string
|
||||
{
|
||||
$config = config(OSPOS::class)->settings;
|
||||
$giftcard_info = $this->giftcard->get_info($giftcard_id);
|
||||
@@ -106,14 +107,14 @@ class Giftcards extends Secure_Controller
|
||||
$data['giftcard_id'] = $giftcard_id;
|
||||
$data['giftcard_value'] = $giftcard_info->value;
|
||||
|
||||
echo view("giftcards/form", $data);
|
||||
return view("giftcards/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $giftcard_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $giftcard_id = NEW_ENTRY): void
|
||||
public function postSave(int $giftcard_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$giftcard_number = $this->request->getPost('giftcard_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
@@ -131,20 +132,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
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Giftcards.successful_adding') . ' ' . $giftcard_data['giftcard_number'],
|
||||
'id' => $giftcard_data['giftcard_id']
|
||||
]);
|
||||
} else { // Existing giftcard
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Giftcards.successful_updating') . ' ' . $giftcard_data['giftcard_number'],
|
||||
'id' => $giftcard_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Giftcards.error_adding_updating') . ' ' . $giftcard_data['giftcard_number'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -158,30 +159,30 @@ class Giftcards extends Secure_Controller
|
||||
* @return void
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckNumberGiftcard(): void
|
||||
public function postCheckNumberGiftcard(): ResponseInterface
|
||||
{
|
||||
$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 );
|
||||
|
||||
echo $success ? 'true' : 'false';
|
||||
return $this->response->setJSON($success ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$giftcards_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
if ($this->giftcard->delete_list($giftcards_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Giftcards.successful_deleted') . ' ' . count($giftcards_to_delete) . ' ' . lang('Giftcards.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Giftcards.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Giftcards.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use CodeIgniter\HTTP\RedirectResponse;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Home extends Secure_Controller
|
||||
{
|
||||
@@ -12,12 +13,12 @@ class Home extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$logged_in = $this->employee->is_logged_in();
|
||||
echo view('home/home');
|
||||
return view('home/home');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,9 +36,10 @@ class Home extends Secure_Controller
|
||||
/**
|
||||
* Load "change employee password" form
|
||||
*
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getChangePassword(int $employee_id = -1): void // TODO: Replace -1 with a constant
|
||||
public function getChangePassword(int $employee_id = -1): string // TODO: Replace -1 with a constant
|
||||
{
|
||||
$person_info = $this->employee->get_info($employee_id);
|
||||
foreach (get_object_vars($person_info) as $property => $value) {
|
||||
@@ -45,44 +47,57 @@ class Home extends Secure_Controller
|
||||
}
|
||||
$data['person_info'] = $person_info;
|
||||
|
||||
echo view('home/form_change_password', $data);
|
||||
return view('home/form_change_password', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Change employee password
|
||||
*
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $employee_id = -1): void // TODO: Replace -1 with a constant
|
||||
public function postSave(int $employee_id = -1): ResponseInterface // TODO: Replace -1 with a constant
|
||||
{
|
||||
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' => -1
|
||||
]);
|
||||
}
|
||||
|
||||
$employee_data = [
|
||||
'username' => $this->request->getPost('username', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
|
||||
'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
|
||||
'password' => password_hash($new_password, PASSWORD_DEFAULT),
|
||||
'hash_version' => 2
|
||||
];
|
||||
|
||||
if ($this->employee->change_password($employee_data, $employee_id) && strlen($employee_data['password']) >= 8) {
|
||||
echo json_encode([
|
||||
if ($this->employee->change_password($employee_data, $employee_id)) {
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Employees.successful_change_password'),
|
||||
'id' => $employee_id
|
||||
]);
|
||||
} else { // Failure // TODO: Replace -1 with constant
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Employees.unsuccessful_change_password'),
|
||||
'id' => -1
|
||||
]);
|
||||
}
|
||||
} else { // TODO: Replace -1 with constant
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Employees.current_password_invalid'),
|
||||
'id' => -1
|
||||
]);
|
||||
}
|
||||
} else { // TODO: Replace -1 with constant
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Employees.current_password_invalid'),
|
||||
'id' => -1
|
||||
|
||||
@@ -7,6 +7,7 @@ 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
|
||||
@@ -59,19 +60,19 @@ class Item_kits extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_item_kits_manage_table_headers();
|
||||
|
||||
echo view('item_kits/manage', $data);
|
||||
return view('item_kits/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Item_kit table data rows. This will be called with AJAX.
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search') ?? '';
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -89,37 +90,37 @@ class Item_kits extends Secure_Controller
|
||||
$data_rows[] = get_item_kit_data_row($item_kit);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->item_kit->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
// 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));
|
||||
|
||||
echo json_encode(get_item_kit_data_row($item_kit));
|
||||
return $this->response->setJSON(get_item_kit_data_row($item_kit));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_kit_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $item_kit_id = NEW_ENTRY): void
|
||||
public function getView(int $item_kit_id = NEW_ENTRY): string
|
||||
{
|
||||
$info = $this->item_kit->get_info($item_kit_id);
|
||||
|
||||
@@ -153,14 +154,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 : '';
|
||||
|
||||
echo view("item_kits/form", $data);
|
||||
return view("item_kits/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_kit_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $item_kit_id = NEW_ENTRY): void
|
||||
public function postSave(int $item_kit_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$item_kit_data = [
|
||||
'name' => $this->request->getPost('name'),
|
||||
@@ -201,20 +202,20 @@ class Item_kits extends Secure_Controller
|
||||
}
|
||||
|
||||
if ($new_item) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => $success,
|
||||
'message' => lang('Item_kits.successful_adding') . ' ' . $item_kit_data['name'],
|
||||
'id' => $item_kit_id
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => $success,
|
||||
'message' => lang('Item_kits.successful_updating') . ' ' . $item_kit_data['name'],
|
||||
'id' => $item_kit_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Item_kits.error_adding_updating') . ' ' . $item_kit_data['name'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -223,42 +224,42 @@ class Item_kits extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$item_kits_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
if ($this->item_kit->delete_list($item_kits_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Item_kits.successful_deleted') . ' ' . count($item_kits_to_delete) . ' ' . lang('Item_kits.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Item_kits.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckItemNumber(): void
|
||||
public function postCheckItemNumber(): ResponseInterface
|
||||
{
|
||||
$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));
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$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 void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getGenerateBarcodes(string $item_kit_ids): void
|
||||
public function getGenerateBarcodes(string $item_kit_ids): string
|
||||
{
|
||||
$barcode_lib = new Barcode_lib();
|
||||
$result = [];
|
||||
@@ -289,6 +290,6 @@ class Item_kits extends Secure_Controller
|
||||
$data['barcode_config'] = $barcode_config;
|
||||
|
||||
// Display barcodes
|
||||
echo view("barcodes/barcode_sheet", $data);
|
||||
return view("barcodes/barcode_sheet", $data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ 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;
|
||||
@@ -65,9 +66,9 @@ class Items extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$this->session->set('allow_temp_items', 0);
|
||||
|
||||
@@ -86,14 +87,14 @@ class Items extends Secure_Controller
|
||||
'temporary' => lang('Items.temp')
|
||||
];
|
||||
|
||||
echo view('items/manage', $data);
|
||||
return view('items/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Items table data rows. This will be called with AJAX.
|
||||
* @noinspection PhpUnused
|
||||
**/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -134,16 +135,16 @@ class Items extends Secure_Controller
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX function. Processes thumbnail of image. Called via tabular_helper
|
||||
* @param string $pic_filename
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getPicThumb(string $pic_filename): void
|
||||
public function getPicThumb(string $pic_filename): ResponseInterface
|
||||
{
|
||||
helper('file');
|
||||
|
||||
@@ -164,15 +165,17 @@ 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(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$options = [
|
||||
'search_custom' => $this->request->getPost('search_custom'),
|
||||
@@ -182,71 +185,73 @@ class Items extends Secure_Controller
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->item->get_search_suggestions($search, $options);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX Function used to get search suggestions from the model and return them in JSON format
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestLowSell(): void
|
||||
public function getSuggestLowSell(): ResponseInterface
|
||||
{
|
||||
$suggestions = $this->item->get_low_sell_suggestions($this->request->getPostGet('name'));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestKits(): void
|
||||
public function getSuggestKits(): ResponseInterface
|
||||
{
|
||||
$suggestions = $this->item->get_kit_search_suggestions($this->request->getGet('term'), ['search_custom' => false, 'is_deleted' => false], true);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for. Called from the view.
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestCategory(): void
|
||||
public function getSuggestCategory(): ResponseInterface
|
||||
{
|
||||
$suggestions = $this->item->get_category_suggestions($this->request->getGet('term'));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for.
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestLocation(): void
|
||||
public function getSuggestLocation(): ResponseInterface
|
||||
{
|
||||
$suggestions = $this->item->get_location_suggestions($this->request->getGet('term'));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $item_ids
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(string $item_ids): void // TODO: An array would be better for parameter.
|
||||
public function getRow(string $item_ids): ResponseInterface // TODO: An array would be better for parameter.
|
||||
{
|
||||
$item_infos = $this->item->get_multiple_info(explode(':', $item_ids), $this->item_lib->get_item_location());
|
||||
|
||||
@@ -256,14 +261,14 @@ class Items extends Secure_Controller
|
||||
$result[$item_info->item_id] = get_item_data_row($item_info);
|
||||
}
|
||||
|
||||
echo json_encode($result);
|
||||
return $this->response->setJSON($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $item_id = NEW_ENTRY): void // TODO: Long function. Perhaps we need to refactor out some methods.
|
||||
public function getView(int $item_id = NEW_ENTRY): string // TODO: Long function. Perhaps we need to refactor out some methods.
|
||||
{
|
||||
$item_id ??= NEW_ENTRY;
|
||||
|
||||
@@ -395,17 +400,17 @@ class Items extends Secure_Controller
|
||||
$data['selected_low_sell_item'] = '';
|
||||
}
|
||||
|
||||
echo view('items/form', $data);
|
||||
return view('items/form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX called function which returns the update inventory form view for an item
|
||||
*
|
||||
* @param int $item_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getInventory(int $item_id = NEW_ENTRY): void
|
||||
public function getInventory(int $item_id = NEW_ENTRY): string
|
||||
{
|
||||
$item_info = $this->item->get_info($item_id); // TODO: Duplicate code
|
||||
|
||||
@@ -424,15 +429,15 @@ class Items extends Secure_Controller
|
||||
$data['item_quantities'][$location['location_id']] = $quantity;
|
||||
}
|
||||
|
||||
echo view('items/form_inventory', $data);
|
||||
return view('items/form_inventory', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCountDetails(int $item_id = NEW_ENTRY): void
|
||||
public function getCountDetails(int $item_id = NEW_ENTRY): string
|
||||
{
|
||||
$item_info = $this->item->get_info($item_id); // TODO: Duplicate code
|
||||
|
||||
@@ -451,17 +456,17 @@ class Items extends Secure_Controller
|
||||
$data['item_quantities'][$location['location_id']] = $quantity;
|
||||
}
|
||||
|
||||
echo view('items/form_count_details', $data);
|
||||
return 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 void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
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?
|
||||
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?
|
||||
{
|
||||
$item_ids = explode(':', $item_ids);
|
||||
$result = $this->item->get_multiple_info($item_ids, $this->item_lib->get_item_location())->getResultArray();
|
||||
@@ -477,16 +482,16 @@ class Items extends Secure_Controller
|
||||
}
|
||||
$data['items'] = $result;
|
||||
|
||||
echo view('barcodes/barcode_sheet', $data);
|
||||
return view('barcodes/barcode_sheet', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gathers attribute value information for an item and returns it in a view.
|
||||
*
|
||||
* @param int $item_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getAttributes(int $item_id = NEW_ENTRY): void
|
||||
public function getAttributes(int $item_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['item_id'] = $item_id;
|
||||
$definition_ids = json_decode($this->request->getGet('definition_ids') ?? '', true);
|
||||
@@ -514,15 +519,15 @@ class Items extends Secure_Controller
|
||||
unset($data['definition_names'][$definition_id]);
|
||||
}
|
||||
|
||||
echo view('attributes/item', $data);
|
||||
return view('attributes/item', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postAttributes(int $item_id = NEW_ENTRY): void
|
||||
public function postAttributes(int $item_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['item_id'] = $item_id;
|
||||
$definition_ids = json_decode($this->request->getPost('definition_ids'), true);
|
||||
@@ -550,16 +555,16 @@ class Items extends Secure_Controller
|
||||
unset($data['definition_names'][$definition_id]);
|
||||
}
|
||||
|
||||
echo view('attributes/item', $data);
|
||||
return view('attributes/item', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit multiple items. Used in app/Views/items/manage.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getBulkEdit(): void
|
||||
public function getBulkEdit(): string
|
||||
{
|
||||
$suppliers = ['' => lang('Items.none')];
|
||||
|
||||
@@ -580,14 +585,15 @@ class Items extends Secure_Controller
|
||||
0 => lang('Items.change_all_to_unserialized')
|
||||
];
|
||||
|
||||
echo view('items/form_bulk', $data);
|
||||
return view('items/form_bulk', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $item_id
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function postSave(int $item_id = NEW_ENTRY): void
|
||||
public function postSave(int $item_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$upload_data = $this->upload_image();
|
||||
$upload_success = empty($upload_data['error']);
|
||||
@@ -717,16 +723,16 @@ class Items extends Secure_Controller
|
||||
if ($success && $upload_success) {
|
||||
$message = lang('Items.successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name'];
|
||||
|
||||
echo json_encode(['success' => true, 'message' => $message, 'id' => $item_id]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $item_id]);
|
||||
} else {
|
||||
$message = $upload_success ? lang('Items.error_adding_updating') . ' ' . $item_data['name'] : strip_tags($upload_data['error']);
|
||||
|
||||
echo json_encode(['success' => false, 'message' => $message, 'id' => $item_id]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => $item_id]);
|
||||
}
|
||||
} else {
|
||||
$message = lang('Items.error_adding_updating') . ' ' . $item_data['name'];
|
||||
|
||||
echo json_encode(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -777,49 +783,51 @@ 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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckItemNumber(): void
|
||||
public function postCheckItemNumber(): ResponseInterface
|
||||
{
|
||||
$exists = $this->item->item_number_exists($this->request->getPost('item_number'), $this->request->getPost('item_id'));
|
||||
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if an item kit with the same name as the item already exists.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function check_kit_exists(): void // TODO: This function appears to be never called in the code. Need to confirm.
|
||||
public function check_kit_exists(): ResponseInterface // 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;
|
||||
}
|
||||
echo !$exists ? 'true' : 'false';
|
||||
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $item_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getRemoveLogo($item_id): void
|
||||
public function getRemoveLogo($item_id): ResponseInterface
|
||||
{
|
||||
$item_data = ['pic_filename' => null];
|
||||
$result = $this->item->save_value($item_data, $item_id);
|
||||
|
||||
echo json_encode(['success' => $result]);
|
||||
return $this->response->setJSON(['success' => $result]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSaveInventory($item_id = NEW_ENTRY): void
|
||||
public function postSaveInventory($item_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
$cur_item_info = $this->item->get_info($item_id);
|
||||
@@ -847,19 +855,19 @@ 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";
|
||||
|
||||
echo json_encode(['success' => true, 'message' => $message, 'id' => $item_id]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $item_id]);
|
||||
} else {
|
||||
$message = lang('Items.error_adding_updating') . " $cur_item_info->name";
|
||||
|
||||
echo json_encode(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postBulkUpdate(): void
|
||||
public function postBulkUpdate(): ResponseInterface
|
||||
{
|
||||
$items_to_update = $this->request->getPost('item_ids');
|
||||
$item_data = [];
|
||||
@@ -891,23 +899,24 @@ class Items extends Secure_Controller
|
||||
$this->item_taxes->save_multiple($items_taxes_data, $items_to_update);
|
||||
}
|
||||
|
||||
echo json_encode(['success' => true, 'message' => lang('Items.successful_bulk_edit'), 'id' => $items_to_update]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Items.successful_bulk_edit'), 'id' => $items_to_update]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Items.error_updating_multiple')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Items.error_updating_multiple')]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$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');
|
||||
echo json_encode(['success' => true, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => $message]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Items.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Items.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -929,25 +938,26 @@ class Items extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCsvImport(): void
|
||||
public function getCsvImport(): string
|
||||
{
|
||||
echo view('items/form_csv_import');
|
||||
return view('items/form_csv_import');
|
||||
}
|
||||
|
||||
/**
|
||||
* Imports items from CSV formatted file.
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postImportCsvFile(): void
|
||||
public function postImportCsvFile(): ResponseInterface
|
||||
{
|
||||
helper('importfile_helper');
|
||||
try {
|
||||
if ($_FILES['file_path']['error'] !== UPLOAD_ERR_OK) {
|
||||
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_failed')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Items.csv_import_failed')]);
|
||||
} else {
|
||||
if (file_exists($_FILES['file_path']['tmp_name'])) {
|
||||
set_time_limit(240);
|
||||
@@ -1007,7 +1017,11 @@ class Items extends Secure_Controller
|
||||
}
|
||||
|
||||
if (!$is_failed_row) {
|
||||
$is_failed_row = $this->data_error_check($row, $item_data, $allowed_stock_locations, $attribute_definition_names, $attribute_data);
|
||||
$invalidLocations = $this->validateCSVStockLocations($row, $allowedStockLocations);
|
||||
if (!empty($invalidLocations)) {
|
||||
$isFailedRow = true;
|
||||
log_message('error', 'CSV import: Invalid stock location(s) found: ' . implode(', ', $invalidLocations));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove false, null, '' and empty strings but keep 0
|
||||
@@ -1037,23 +1051,46 @@ class Items extends Secure_Controller
|
||||
if (count($failCodes) > 0) {
|
||||
$message = lang('Items.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
|
||||
$db->transRollback();
|
||||
echo json_encode(['success' => false, 'message' => $message]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => $message]);
|
||||
} else {
|
||||
$db->transCommit();
|
||||
|
||||
echo json_encode(['success' => true, 'message' => lang('Items.csv_import_success')]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Items.csv_import_success')]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
|
||||
return;
|
||||
return $this->response->setJSON(['success' => false, 'message' => $e->getMessage()]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that stock location columns in CSV row are valid locations
|
||||
*
|
||||
* @param array $row
|
||||
* @param array $allowedLocations
|
||||
* @return array Returns array of invalid location names, empty if all valid
|
||||
*/
|
||||
private function validateCSVStockLocations(array $row, array $allowedLocations): array
|
||||
{
|
||||
$invalidLocations = [];
|
||||
$allowedLocationNames = array_values($allowedLocations);
|
||||
|
||||
foreach (array_keys($row) as $key) {
|
||||
if (str_starts_with($key, 'location_')) {
|
||||
$locationName = substr($key, 9);
|
||||
if (!in_array($locationName, $allowedLocationNames)) {
|
||||
$invalidLocations[] = $locationName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $invalidLocations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the entire line of data in an import file for errors
|
||||
*
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Controllers;
|
||||
use App\Libraries\Sms_lib;
|
||||
|
||||
use App\Models\Person;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
class Messages extends Secure_Controller
|
||||
{
|
||||
@@ -18,18 +19,18 @@ class Messages extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
echo view('messages/sms');
|
||||
return view('messages/sms');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $person_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $person_id = NEW_ENTRY): void
|
||||
public function getView(int $person_id = NEW_ENTRY): string
|
||||
{
|
||||
$person = model(Person::class);
|
||||
$info = $person->get_info($person_id);
|
||||
@@ -39,13 +40,13 @@ class Messages extends Secure_Controller
|
||||
}
|
||||
$data['person_info'] = $info;
|
||||
|
||||
echo view('messages/form_sms', $data);
|
||||
return view('messages/form_sms', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function send(): void
|
||||
public function send(): ResponseInterface
|
||||
{
|
||||
$phone = $this->request->getPost('phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$message = $this->request->getPost('message', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -53,9 +54,9 @@ class Messages extends Secure_Controller
|
||||
$response = $this->sms_lib->sendSMS($phone, $message);
|
||||
|
||||
if ($response) {
|
||||
echo json_encode(['success' => true, 'message' => lang('Messages.successfully_sent') . ' ' . esc($phone)]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Messages.successfully_sent') . ' ' . esc($phone)]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone)]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone)]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,10 +64,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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function send_form(int $person_id = NEW_ENTRY): void
|
||||
public function send_form(int $person_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$phone = $this->request->getPost('phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$message = $this->request->getPost('message', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -74,13 +75,13 @@ class Messages extends Secure_Controller
|
||||
$response = $this->sms_lib->sendSMS($phone, $message);
|
||||
|
||||
if ($response) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Messages.successfully_sent') . ' ' . esc($phone),
|
||||
'person_id' => $person_id
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Messages.unsuccessfully_sent') . ' ' . esc($phone),
|
||||
'person_id' => NEW_ENTRY
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
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.
|
||||
@@ -22,13 +23,13 @@ class No_access extends BaseController
|
||||
/**
|
||||
* @param string $module_id
|
||||
* @param string $permission_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(string $module_id = '', string $permission_id = ''): void
|
||||
public function getIndex(string $module_id = '', string $permission_id = ''): string
|
||||
{
|
||||
$data['module_name'] = $this->module->get_module_name($module_id);
|
||||
$data['permission_id'] = $permission_id;
|
||||
|
||||
echo view('no_access', $data);
|
||||
return view('no_access', $data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Employee;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
|
||||
/**
|
||||
* @property Employee employee
|
||||
@@ -17,11 +18,11 @@ class Office extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
echo view('home/office');
|
||||
return view('home/office');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Person;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
use function Tamtamchik\NameCase\str_name_case;
|
||||
|
||||
@@ -21,34 +22,36 @@ abstract class Persons extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_people_manage_table_headers();
|
||||
|
||||
echo view('people/manage', $data);
|
||||
return view('people/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->person->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($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): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_person_data_row($this->person->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,6 +11,7 @@ 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;
|
||||
@@ -46,66 +47,66 @@ class Receivings extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$this->_reload();
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns search suggestions for an item. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getItemSearch(): void
|
||||
public function getItemSearch(): ResponseInterface
|
||||
{
|
||||
$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));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets search suggestions for a stock item. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getStockItemSearch(): void
|
||||
public function getStockItemSearch(): ResponseInterface
|
||||
{
|
||||
$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));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set supplier if it exists in the database. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSelectSupplier(): void
|
||||
public function postSelectSupplier(): string
|
||||
{
|
||||
$supplier_id = $this->request->getPost('supplier', FILTER_SANITIZE_NUMBER_INT);
|
||||
if ($this->supplier->exists($supplier_id)) {
|
||||
$this->receiving_lib->set_supplier($supplier_id);
|
||||
}
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload(); // TODO: Hungarian notation
|
||||
}
|
||||
|
||||
/**
|
||||
* Change receiving mode for current receiving. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postChangeMode(): void
|
||||
public function postChangeMode(): string
|
||||
{
|
||||
$stock_destination = $this->request->getPost('stock_destination', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$stock_source = $this->request->getPost('stock_source', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -121,49 +122,49 @@ class Receivings extends Secure_Controller
|
||||
$this->receiving_lib->set_stock_destination($stock_destination);
|
||||
}
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload(); // TODO: Hungarian notation
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets receiving comment. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetComment(): void
|
||||
public function postSetComment(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetPrintAfterSale(): void
|
||||
public function postSetPrintAfterSale(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetReference(): void
|
||||
public function postSetReference(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postAdd(): void
|
||||
public function postAdd(): string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -183,17 +184,17 @@ class Receivings extends Secure_Controller
|
||||
$data['error'] = lang('Receivings.unable_to_add_item');
|
||||
}
|
||||
|
||||
$this->_reload($data); // TODO: Hungarian notation
|
||||
return $this->_reload($data); // TODO: Hungarian notation
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit line item in current receiving. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @param $item_id
|
||||
* @return void
|
||||
* @param string|int|null $item_id
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postEditItem($item_id): void
|
||||
public function postEditItem($item_id): string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -222,17 +223,16 @@ class Receivings extends Secure_Controller
|
||||
$data['error'] = lang('Receivings.error_editing_item');
|
||||
}
|
||||
|
||||
$this->_reload($data); // TODO: Hungarian notation
|
||||
return $this->_reload($data); // TODO: Hungarian notation
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a receiving. Used in app/Controllers/Receivings.php
|
||||
*
|
||||
* @param $receiving_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getEdit($receiving_id): void
|
||||
public function getEdit($receiving_id): string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -251,63 +251,65 @@ class Receivings extends Secure_Controller
|
||||
$data['selected_supplier_id'] = $receiving_info['supplier_id'];
|
||||
$data['receiving_info'] = $receiving_info;
|
||||
|
||||
echo view('receivings/form', $data);
|
||||
return view('receivings/form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an item from the current receiving. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @param $item_number
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getDeleteItem($item_number): void
|
||||
public function getDeleteItem($item_number): string
|
||||
{
|
||||
$this->receiving_lib->delete_item($item_number);
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload(); // TODO: Hungarian notation
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws ReflectionException
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(int $receiving_id = -1, bool $update_inventory = true): void
|
||||
public function postDelete(int $receiving_id = -1, bool $update_inventory = true): ResponseInterface
|
||||
{
|
||||
$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
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Receivings.successfully_deleted') . ' ' . count($receiving_ids) . ' ' . lang('Receivings.one_or_multiple'),
|
||||
'ids' => $receiving_ids
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Receivings.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Receivings.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a supplier from a receiving. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getRemoveSupplier(): void
|
||||
public function getRemoveSupplier(): string
|
||||
{
|
||||
$this->receiving_lib->clear_reference();
|
||||
$this->receiving_lib->remove_supplier();
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $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(): void
|
||||
public function postComplete(): string
|
||||
{
|
||||
|
||||
$data = [];
|
||||
@@ -356,18 +358,21 @@ class Receivings extends Secure_Controller
|
||||
|
||||
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
|
||||
|
||||
echo view("receivings/receipt", $data);
|
||||
$view = 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(): void
|
||||
public function postRequisitionComplete(): string
|
||||
{
|
||||
if ($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination()) {
|
||||
foreach ($this->receiving_lib->get_cart() as $item) {
|
||||
@@ -376,11 +381,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']);
|
||||
}
|
||||
|
||||
$this->postComplete();
|
||||
return $this->postComplete();
|
||||
} else {
|
||||
$data['error'] = lang('Receivings.error_requisition');
|
||||
|
||||
$this->_reload($data); // TODO: Hungarian notation
|
||||
return $this->_reload($data); // TODO: Hungarian notation
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,10 +393,10 @@ class Receivings extends Secure_Controller
|
||||
* Gets the receipt for a receiving. Used in app/Views/receivings/form.php
|
||||
*
|
||||
* @param $receiving_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getReceipt($receiving_id): void
|
||||
public function getReceipt($receiving_id): string
|
||||
{
|
||||
$receiving_info = $this->receiving->get_info($receiving_id)->getRowArray();
|
||||
$this->receiving_lib->copy_entire_receiving($receiving_id);
|
||||
@@ -424,16 +429,18 @@ class Receivings extends Secure_Controller
|
||||
|
||||
$data['print_after_sale'] = false;
|
||||
|
||||
echo view("receivings/receipt", $data);
|
||||
$view = view("receivings/receipt", $data);
|
||||
|
||||
$this->receiving_lib->clear_all();
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
private function _reload(array $data = []): void // TODO: Hungarian notation
|
||||
private function _reload(array $data = []): string // TODO: Hungarian notation
|
||||
{
|
||||
$data['cart'] = $this->receiving_lib->get_cart();
|
||||
$data['modes'] = ['receive' => lang('Receivings.receiving'), 'return' => lang('Receivings.return')];
|
||||
@@ -470,13 +477,14 @@ class Receivings extends Secure_Controller
|
||||
|
||||
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
|
||||
|
||||
echo view("receivings/receiving", $data);
|
||||
return view("receivings/receiving", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function postSave(int $receiving_id = -1): void // TODO: Replace -1 with a constant
|
||||
public function postSave(int $receiving_id = -1): ResponseInterface // TODO: Replace -1 with a constant
|
||||
{
|
||||
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // TODO: newdate does not follow naming conventions
|
||||
|
||||
@@ -493,13 +501,13 @@ class Receivings extends Secure_Controller
|
||||
|
||||
$this->inventory->update('RECV ' . $receiving_id, ['trans_date' => $receiving_time]);
|
||||
if ($this->receiving->update($receiving_id, $receiving_data)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Receivings.successfully_updated'),
|
||||
'id' => $receiving_id
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Receivings.unsuccessfully_updated'),
|
||||
'id' => $receiving_id
|
||||
@@ -510,13 +518,13 @@ class Receivings extends Secure_Controller
|
||||
/**
|
||||
* Cancel an in-process receiving. Used in app/Views/receivings/receiving.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCancelReceiving(): void
|
||||
public function postCancelReceiving(): string
|
||||
{
|
||||
$this->receiving_lib->clear_all();
|
||||
|
||||
$this->_reload(); // TODO: Hungarian Notation
|
||||
return $this->_reload(); // TODO: Hungarian Notation
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ 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;
|
||||
|
||||
@@ -84,7 +85,8 @@ 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)) {
|
||||
redirect('no_access/reports/reports_' . $submodule_id);
|
||||
header('Location: ' . base_url('no_access/reports/reports_' . $submodule_id));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,8 +103,9 @@ class Reports extends Secure_Controller
|
||||
|
||||
/**
|
||||
* Initial Report listing screen
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$person_id = $this->session->get('person_id');
|
||||
$grants = $this->employee->get_employee_grants($this->session->get('person_id'));
|
||||
@@ -114,7 +117,7 @@ class Reports extends Secure_Controller
|
||||
'permission_ids' => $permissions_ids,
|
||||
];
|
||||
|
||||
echo view('reports/listing', $data);
|
||||
return view('reports/listing', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -123,9 +126,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
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.
|
||||
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.
|
||||
{ // TODO: Duplicated code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -161,7 +164,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -170,9 +173,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -207,7 +210,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -215,9 +218,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $start_date
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_expenses_categories(string $start_date, string $end_date, string $sale_type): void
|
||||
public function summary_expenses_categories(string $start_date, string $end_date, string $sale_type): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -244,7 +247,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -253,9 +256,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -292,7 +295,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -301,9 +304,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -338,7 +341,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -347,9 +350,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -388,7 +391,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -397,9 +400,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -436,7 +439,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -445,9 +448,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicate Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -482,13 +485,14 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return 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'): void
|
||||
public function summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -521,16 +525,16 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Summary Discounts report input. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function summary_discounts_input(): void
|
||||
public function summary_discounts_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -541,13 +545,14 @@ 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();
|
||||
|
||||
echo view('reports/date_input', $data);
|
||||
return 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): void
|
||||
public function summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -579,13 +584,14 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Summary Payments report
|
||||
* @return string
|
||||
*/
|
||||
public function summary_payments(string $start_date, string $end_date): void
|
||||
public function summary_payments(string $start_date, string $end_date): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -637,16 +643,16 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $summary
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Input for reports that require only a date range. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function date_input(): void
|
||||
public function date_input(): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -656,30 +662,30 @@ class Reports extends Secure_Controller
|
||||
$data['mode'] = 'sale';
|
||||
$data['sale_type_options'] = $this->get_sale_type_options();
|
||||
|
||||
echo view('reports/date_input', $data);
|
||||
return view('reports/date_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Input for reports that require only a date range. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function date_input_only(): void
|
||||
public function date_input_only(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
$data = [];
|
||||
echo view('reports/date_input', $data);
|
||||
return view('reports/date_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Input for reports that require only a date range. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function date_input_sales(): void
|
||||
public function date_input_sales(): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -689,23 +695,23 @@ class Reports extends Secure_Controller
|
||||
$data['mode'] = 'sale';
|
||||
$data['sale_type_options'] = $this->get_sale_type_options();
|
||||
|
||||
echo view('reports/date_input', $data);
|
||||
return view('reports/date_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Receivings date input. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function date_input_recv(): void
|
||||
public function date_input_recv(): string
|
||||
{
|
||||
$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';
|
||||
|
||||
echo view('reports/date_input', $data);
|
||||
return view('reports/date_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -714,10 +720,10 @@ class Reports extends Secure_Controller
|
||||
* @param string $start_date
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function graphical_summary_expenses_categories(string $start_date, string $end_date, string $sale_type): void
|
||||
public function graphical_summary_expenses_categories(string $start_date, string $end_date, string $sale_type): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -750,7 +756,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -760,9 +766,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -796,7 +802,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -806,9 +812,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_items(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -843,7 +849,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -853,9 +859,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_categories(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -886,7 +892,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -896,9 +902,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_suppliers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -931,7 +937,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -941,9 +947,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_employees(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -975,7 +981,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -985,9 +991,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1019,7 +1025,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1029,9 +1035,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_sales_taxes(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1063,7 +1069,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1073,9 +1079,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_customers(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1109,7 +1115,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1120,9 +1126,10 @@ 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): void
|
||||
public function graphical_summary_discounts(string $start_date, string $end_date, string $sale_type, string $location_id = 'all', int $discount_type = 0): string
|
||||
{ // TODO: Duplicated Code
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1157,7 +1164,7 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => false
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1167,9 +1174,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function graphical_summary_payments(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function graphical_summary_payments(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1203,16 +1210,16 @@ class Reports extends Secure_Controller
|
||||
'show_currency' => true
|
||||
];
|
||||
|
||||
echo view('reports/graphical', $data);
|
||||
return view('reports/graphical', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the specific customer input view. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_customer_input(): void
|
||||
public function specific_customer_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1230,7 +1237,7 @@ class Reports extends Secure_Controller
|
||||
$data['sale_type_options'] = $this->get_sale_type_options();
|
||||
|
||||
$data['payment_type'] = $this->get_payment_type();
|
||||
echo view('reports/specific_customer_input', $data);
|
||||
return view('reports/specific_customer_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1257,10 +1264,10 @@ class Reports extends Secure_Controller
|
||||
* @param string $customer_id
|
||||
* @param string $sale_type
|
||||
* @param string $payment_type
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_customers(string $start_date, string $end_date, string $customer_id, string $sale_type, string $payment_type): void
|
||||
public function specific_customers(string $start_date, string $end_date, string $customer_id, string $sale_type, string $payment_type): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1351,16 +1358,16 @@ class Reports extends Secure_Controller
|
||||
'overall_summary_data' => $specific_customer->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular_details', $data);
|
||||
return view('reports/tabular_details', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detailed employee report input form. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_employee_input(): void
|
||||
public function specific_employee_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1374,7 +1381,7 @@ class Reports extends Secure_Controller
|
||||
$data['specific_input_data'] = $employees;
|
||||
$data['sale_type_options'] = $this->get_sale_type_options();
|
||||
|
||||
echo view('reports/specific_input', $data);
|
||||
return view('reports/specific_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1384,10 +1391,10 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $employee_id
|
||||
* @param string $sale_type
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_employees(string $start_date, string $end_date, string $employee_id, string $sale_type): void
|
||||
public function specific_employees(string $start_date, string $end_date, string $employee_id, string $sale_type): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1474,16 +1481,16 @@ class Reports extends Secure_Controller
|
||||
'overall_summary_data' => $specific_employee->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular_details', $data);
|
||||
return view('reports/tabular_details', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detailed discount report. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_discount_input(): void
|
||||
public function specific_discount_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1498,7 +1505,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();
|
||||
|
||||
echo view('reports/specific_input', $data);
|
||||
return view('reports/specific_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1509,10 +1516,10 @@ class Reports extends Secure_Controller
|
||||
* @param string $discount
|
||||
* @param string $sale_type
|
||||
* @param string $discount_type
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_discounts(string $start_date, string $end_date, string $discount, string $sale_type, string $discount_type): void
|
||||
public function specific_discounts(string $start_date, string $end_date, string $discount, string $sale_type, string $discount_type): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1605,17 +1612,17 @@ class Reports extends Secure_Controller
|
||||
'overall_summary_data' => $specific_discount->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular_details', $data);
|
||||
return 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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getGet_detailed_sales_row(string $sale_id): void
|
||||
public function getGet_detailed_sales_row(string $sale_id): ResponseInterface
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1658,16 +1665,16 @@ class Reports extends Secure_Controller
|
||||
)
|
||||
];
|
||||
|
||||
echo json_encode([$sale_id => $summary_data]);
|
||||
return $this->response->setJSON([$sale_id => $summary_data]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detailed Supplier report input form. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function specific_supplier_input(): void
|
||||
public function specific_supplier_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1681,7 +1688,7 @@ class Reports extends Secure_Controller
|
||||
$data['specific_input_data'] = $suppliers;
|
||||
$data['sale_type_options'] = $this->get_sale_type_options();
|
||||
|
||||
echo view('reports/specific_input', $data);
|
||||
return view('reports/specific_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1691,9 +1698,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $supplier_id
|
||||
* @param string $sale_type
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function specific_suppliers(string $start_date, string $end_date, string $supplier_id, string $sale_type): void
|
||||
public function specific_suppliers(string $start_date, string $end_date, string $supplier_id, string $sale_type): string
|
||||
{
|
||||
$inputs = [
|
||||
'start_date' => $start_date,
|
||||
@@ -1736,7 +1743,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $specific_supplier->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1763,9 +1770,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $sale_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function detailed_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): void
|
||||
public function detailed_sales(string $start_date, string $end_date, string $sale_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1869,17 +1876,17 @@ class Reports extends Secure_Controller
|
||||
'details_data_rewards' => $details_data_rewards,
|
||||
'overall_summary_data' => $this->detailed_sales->getSummaryData($inputs)
|
||||
];
|
||||
echo view('reports/tabular_details', $data);
|
||||
return 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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getGet_detailed_receivings_row(string $receiving_id): void
|
||||
public function getGet_detailed_receivings_row(string $receiving_id): ResponseInterface
|
||||
{
|
||||
$inputs = ['receiving_id' => $receiving_id];
|
||||
|
||||
@@ -1909,7 +1916,7 @@ class Reports extends Secure_Controller
|
||||
)
|
||||
];
|
||||
|
||||
echo json_encode([$receiving_id => $summary_data]);
|
||||
return $this->response->setJSON([$receiving_id => $summary_data]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1917,9 +1924,9 @@ class Reports extends Secure_Controller
|
||||
* @param string $end_date
|
||||
* @param string $receiving_type
|
||||
* @param string $location_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function detailed_receivings(string $start_date, string $end_date, string $receiving_type, string $location_id = 'all'): void
|
||||
public function detailed_receivings(string $start_date, string $end_date, string $receiving_type, string $location_id = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -1993,13 +2000,13 @@ class Reports extends Secure_Controller
|
||||
'overall_summary_data' => $this->detailed_receivings->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular_details', $data);
|
||||
return view('reports/tabular_details', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function inventory_low(): void
|
||||
public function inventory_low(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -2028,16 +2035,16 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $inventory_low->getSummaryData($inputs)
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the inventory summary input view. Used in app/Config/Routes.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function inventory_summary_input(): void
|
||||
public function inventory_summary_input(): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -2048,15 +2055,15 @@ class Reports extends Secure_Controller
|
||||
$stock_locations['all'] = lang('Reports.all');
|
||||
$data['stock_locations'] = array_reverse($stock_locations, true);
|
||||
|
||||
echo view('reports/inventory_summary_input', $data);
|
||||
return view('reports/inventory_summary_input', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $location_id
|
||||
* @param string $item_count
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function inventory_summary(string $location_id = 'all', string $item_count = 'all'): void
|
||||
public function inventory_summary(string $location_id = 'all', string $item_count = 'all'): string
|
||||
{
|
||||
$this->clearCache();
|
||||
|
||||
@@ -2088,7 +2095,7 @@ class Reports extends Secure_Controller
|
||||
'summary_data' => $this->inventory_summary->getSummaryData($report_data)
|
||||
];
|
||||
|
||||
echo view('reports/tabular', $data);
|
||||
return view('reports/tabular', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,6 +20,7 @@ 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;
|
||||
@@ -65,22 +66,19 @@ class Sales extends Secure_Controller
|
||||
$this->employee = model(Employee::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): ResponseInterface|string
|
||||
{
|
||||
$this->session->set('allow_temp_items', 1);
|
||||
$this->_reload(); // TODO: Hungarian Notation
|
||||
return $this->_reload(); // TODO: Hungarian Notation
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the sale edit modal. Used in app/Views/sales/register.php.
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getManage(): void
|
||||
public function getManage(): string
|
||||
{
|
||||
$person_id = $this->session->get('person_id');
|
||||
|
||||
@@ -107,26 +105,26 @@ class Sales extends Secure_Controller
|
||||
}
|
||||
$data['selected_filters'] = $selected_filters;
|
||||
|
||||
echo view('sales/manage', $data);
|
||||
return view('sales/manage', $data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$sale_info = $this->sale->get_info($row_id)->getRow();
|
||||
$data_row = get_sale_data_row($sale_info);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -166,16 +164,16 @@ class Sales extends Secure_Controller
|
||||
$data_rows[] = get_sale_data_last_row($sales);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
|
||||
return $this->response->setJSON(['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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getItemSearch(): void
|
||||
public function getItemSearch(): ResponseInterface
|
||||
{
|
||||
$suggestions = [];
|
||||
$receipt = $search = $this->request->getGet('term') != ''
|
||||
@@ -189,13 +187,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));
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term') != ''
|
||||
? $this->request->getPost('term')
|
||||
@@ -203,16 +201,16 @@ class Sales extends Secure_Controller
|
||||
|
||||
$suggestions = $this->sale->get_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a given customer. Used in app/Views/sales/register.php.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSelectCustomer(): void
|
||||
public function postSelectCustomer(): ResponseInterface|string
|
||||
{
|
||||
$customer_id = (int)$this->request->getPost('customer', FILTER_SANITIZE_NUMBER_INT);
|
||||
if ($this->customer->exists($customer_id)) {
|
||||
@@ -226,16 +224,16 @@ class Sales extends Secure_Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->_reload();
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the sale mode in the register to carry out different types of sales
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postChangeMode(): void
|
||||
public function postChangeMode(): ResponseInterface|string
|
||||
{
|
||||
$mode = $this->request->getPost('mode', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$this->sale_lib->set_mode($mode);
|
||||
@@ -276,14 +274,14 @@ class Sales extends Secure_Controller
|
||||
|
||||
$this->sale_lib->empty_payments();
|
||||
|
||||
$this->_reload();
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $sale_type
|
||||
* @return void
|
||||
* @return ResponseInterface|string
|
||||
*/
|
||||
public function change_register_mode(int $sale_type): void
|
||||
public function change_register_mode(int $sale_type): ResponseInterface|string
|
||||
{
|
||||
$mode = match ($sale_type) {
|
||||
SALE_TYPE_QUOTE => 'sale_quote',
|
||||
@@ -294,81 +292,87 @@ 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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetComment(): void
|
||||
public function postSetComment(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetInvoiceNumber(): void
|
||||
public function postSetInvoiceNumber(): ResponseInterface|string
|
||||
{
|
||||
$this->sale_lib->set_invoice_number($this->request->getPost('sales_invoice_number', FILTER_SANITIZE_NUMBER_INT));
|
||||
return $this->response->setJSON(['success' => true]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSetPaymentType(): void // TODO: This function does not appear to be called anywhere in the code.
|
||||
public function postSetPaymentType(): ResponseInterface|string // 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));
|
||||
$this->_reload(); // TODO: Hungarian notation.
|
||||
return $this->_reload(); // TODO: Hungarian notation.
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets PrintAfterSale flag. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetPrintAfterSale(): void
|
||||
public function postSetPrintAfterSale(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetPriceWorkOrders(): void
|
||||
public function postSetPriceWorkOrders(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSetEmailReceipt(): void
|
||||
public function postSetEmailReceipt(): ResponseInterface
|
||||
{
|
||||
$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 void
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postAddPayment(): void
|
||||
public function postAddPayment(): ResponseInterface|string
|
||||
{
|
||||
$data = [];
|
||||
$giftcard = model(Giftcard::class);
|
||||
@@ -453,32 +457,32 @@ class Sales extends Secure_Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->_reload($data);
|
||||
return $this->_reload($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiple Payments. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @param string $payment_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getDeletePayment(string $payment_id): void
|
||||
public function getDeletePayment(string $payment_id): ResponseInterface|string
|
||||
{
|
||||
helper('url');
|
||||
|
||||
$this->sale_lib->delete_payment(base64url_decode($payment_id));
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an item to the sale. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postAdd(): void
|
||||
public function postAdd(): ResponseInterface|string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -549,17 +553,17 @@ class Sales extends Secure_Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->_reload($data);
|
||||
return $this->_reload($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit an item in the sale. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @param string $line
|
||||
* @return void
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postEditItem(string $line): void
|
||||
public function postEditItem(string $line): ResponseInterface|string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -594,33 +598,33 @@ class Sales extends Secure_Controller
|
||||
$data['error'] = lang('Sales.error_editing_item');
|
||||
}
|
||||
|
||||
$this->_reload($data);
|
||||
return $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 void
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getDeleteItem(int $item_id): void
|
||||
public function getDeleteItem(int $item_id): ResponseInterface|string
|
||||
{
|
||||
$this->sale_lib->delete_item($item_id);
|
||||
|
||||
$this->sale_lib->empty_payments();
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the current customer from the sale. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getRemoveCustomer(): void
|
||||
public function getRemoveCustomer(): ResponseInterface|string
|
||||
{
|
||||
$this->sale_lib->clear_giftcard_remainder();
|
||||
$this->sale_lib->clear_rewards_remainder();
|
||||
@@ -629,17 +633,17 @@ class Sales extends Secure_Controller
|
||||
$this->sale_lib->clear_quote_number();
|
||||
$this->sale_lib->remove_customer();
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete and finalize a sale. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @throws ReflectionException
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postComplete(): void // TODO: this function is huge. Probably should be refactored.
|
||||
public function postComplete(): string // TODO: this function is huge. Probably should be refactored.
|
||||
{
|
||||
$sale_id = $this->sale_lib->get_sale_id();
|
||||
$data = [];
|
||||
@@ -751,8 +755,11 @@ class Sales extends Secure_Controller
|
||||
$data['sale_status'] = COMPLETED;
|
||||
$sale_type = SALE_TYPE_INVOICE;
|
||||
|
||||
// The PHP file name is the same as the invoice_type key
|
||||
$invoice_view = $this->config['invoice_type'];
|
||||
$invoice_type = $this->config['invoice_type'];
|
||||
if (!Sale_lib::isValidInvoiceType($invoice_type)) {
|
||||
$invoice_type = 'invoice';
|
||||
}
|
||||
$invoice_view = $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);
|
||||
@@ -765,7 +772,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']);
|
||||
echo view('sales/' . $invoice_view, $data);
|
||||
return view('sales/' . $invoice_view, $data);
|
||||
$this->sale_lib->clear_all();
|
||||
}
|
||||
}
|
||||
@@ -799,7 +806,7 @@ class Sales extends Secure_Controller
|
||||
|
||||
$data['barcode'] = null;
|
||||
|
||||
echo view('sales/work_order', $data);
|
||||
return view('sales/work_order', $data);
|
||||
$this->sale_lib->clear_mode();
|
||||
$this->sale_lib->clear_all();
|
||||
}
|
||||
@@ -827,7 +834,7 @@ class Sales extends Secure_Controller
|
||||
$data['cart'] = $this->sale_lib->sort_and_filter_cart($data['cart']);
|
||||
$data['barcode'] = null;
|
||||
|
||||
echo view('sales/quote', $data);
|
||||
return view('sales/quote', $data);
|
||||
$this->sale_lib->clear_mode();
|
||||
$this->sale_lib->clear_all();
|
||||
}
|
||||
@@ -850,7 +857,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']);
|
||||
echo view('sales/receipt', $data);
|
||||
return view('sales/receipt', $data);
|
||||
$this->sale_lib->clear_all();
|
||||
}
|
||||
}
|
||||
@@ -861,10 +868,10 @@ class Sales extends Secure_Controller
|
||||
*
|
||||
* @param int $sale_id
|
||||
* @param string $type
|
||||
* @return bool
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSendPdf(int $sale_id, string $type = 'invoice'): bool
|
||||
public function getSendPdf(int $sale_id, string $type = 'invoice'): ResponseInterface
|
||||
{
|
||||
$sale_data = $this->_load_sale_data($sale_id);
|
||||
|
||||
@@ -899,21 +906,19 @@ 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 $result;
|
||||
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Emails sales receipt to customer. Used in app/Views/sales/receipt.php
|
||||
*
|
||||
* @param int $sale_id
|
||||
* @return bool
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSendReceipt(int $sale_id): bool
|
||||
public function getSendReceipt(int $sale_id): ResponseInterface
|
||||
{
|
||||
$sale_data = $this->_load_sale_data($sale_id);
|
||||
|
||||
@@ -922,6 +927,13 @@ 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');
|
||||
@@ -934,11 +946,9 @@ 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 $result;
|
||||
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1100,6 +1110,9 @@ 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;
|
||||
@@ -1109,7 +1122,7 @@ class Sales extends Secure_Controller
|
||||
* @param array $data
|
||||
* @return void
|
||||
*/
|
||||
private function _reload(array $data = []): void // TODO: Hungarian notation
|
||||
private function _reload(array $data = []): ResponseInterface|string // TODO: Hungarian notation
|
||||
{
|
||||
$sale_id = $this->session->get('sale_id'); // TODO: This variable is never used
|
||||
|
||||
@@ -1215,40 +1228,47 @@ class Sales extends Secure_Controller
|
||||
$data['customer_required'] = lang('Sales.customer_optional');
|
||||
}
|
||||
|
||||
echo view("sales/register", $data);
|
||||
return view("sales/register", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the sales receipt for a sale. Used in app/Views/sales/form.php
|
||||
*
|
||||
* @param int $sale_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getReceipt(int $sale_id): void
|
||||
public function getReceipt(int $sale_id): string
|
||||
{
|
||||
$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 void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getInvoice(int $sale_id): void
|
||||
public function getInvoice(int $sale_id): string
|
||||
{
|
||||
$data = $this->_load_sale_data($sale_id);
|
||||
|
||||
echo view('sales/' . $data['invoice_view'], $data);
|
||||
$this->sale_lib->clear_all();
|
||||
|
||||
return view('sales/' . $data['invoice_view'], $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Edits an existing sale or work order. Used in app/Views/sales/form.php
|
||||
*
|
||||
* @param int $sale_id
|
||||
* @return void
|
||||
* @return string
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function getEdit(int $sale_id): void
|
||||
public function getEdit(int $sale_id): string
|
||||
{
|
||||
$data = [];
|
||||
|
||||
@@ -1293,30 +1313,32 @@ class Sales extends Secure_Controller
|
||||
|
||||
$data['new_payment_options'] = $payment_options;
|
||||
|
||||
echo view('sales/form', $data);
|
||||
return view('sales/form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $sale_id
|
||||
* @return ResponseInterface
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function postDelete(int $sale_id = NEW_ENTRY, bool $update_inventory = true): void
|
||||
public function postDelete(int $sale_id = NEW_ENTRY, bool $update_inventory = true): ResponseInterface
|
||||
{
|
||||
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
|
||||
|
||||
if (!$has_grant) {
|
||||
echo json_encode(['success' => false, 'message' => lang('Sales.not_authorized')]);
|
||||
return $this->response->setJSON(['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)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Sales.successfully_deleted') . ' ' . count($sale_ids) . ' ' . lang('Sales.one_or_multiple'),
|
||||
'ids' => $sale_ids
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1324,26 +1346,26 @@ class Sales extends Secure_Controller
|
||||
/**
|
||||
* @param int $sale_id
|
||||
* @param bool $update_inventory
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function restore(int $sale_id = NEW_ENTRY, bool $update_inventory = true): void
|
||||
public function restore(int $sale_id = NEW_ENTRY, bool $update_inventory = true): ResponseInterface
|
||||
{
|
||||
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
|
||||
|
||||
if (!$has_grant) {
|
||||
echo json_encode(['success' => false, 'message' => lang('Sales.not_authorized')]);
|
||||
return $this->response->setJSON(['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)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Sales.successfully_restored') . ' ' . count($sale_ids) . ' ' . lang('Sales.one_or_multiple'),
|
||||
'ids' => $sale_ids
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_restored')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_restored')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1352,9 +1374,10 @@ 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): void
|
||||
public function postSave(int $sale_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
|
||||
@@ -1435,9 +1458,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)) {
|
||||
echo json_encode(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $sale_id]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $sale_id]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $sale_id]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $sale_id]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1447,10 +1470,11 @@ 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(): void
|
||||
public function postCancel(): ResponseInterface|string
|
||||
{
|
||||
$sale_id = $this->sale_lib->get_sale_id();
|
||||
if ($sale_id != NEW_ENTRY && $sale_id != '') {
|
||||
@@ -1472,32 +1496,32 @@ class Sales extends Secure_Controller
|
||||
}
|
||||
|
||||
$this->sale_lib->clear_all();
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Discards the suspended sale. Used in app/Views/sales/quote.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getDiscardSuspendedSale(): void
|
||||
public function getDiscardSuspendedSale(): ResponseInterface|string
|
||||
{
|
||||
$suspended_id = $this->sale_lib->get_suspended_id();
|
||||
$this->sale_lib->clear_all();
|
||||
$this->sale->delete_suspended_sale($suspended_id);
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*
|
||||
* @throws ReflectionException
|
||||
* @return ResponseInterface|string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSuspend(): void
|
||||
public function postSuspend(): ResponseInterface|string
|
||||
{
|
||||
$sale_id = $this->sale_lib->get_sale_id();
|
||||
$dinner_table = $this->sale_lib->get_dinner_table();
|
||||
@@ -1528,28 +1552,29 @@ class Sales extends Secure_Controller
|
||||
|
||||
$this->sale_lib->clear_all();
|
||||
|
||||
$this->_reload($data); // TODO: Hungarian notation
|
||||
return $this->_reload($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* List suspended sales
|
||||
* @return string
|
||||
*/
|
||||
public function getSuspended(): void
|
||||
public function getSuspended(): string
|
||||
{
|
||||
$data = [];
|
||||
$customer_id = $this->sale_lib->get_customer();
|
||||
$data['suspended_sales'] = $this->sale->get_all_suspended($customer_id);
|
||||
echo view('sales/suspended', $data);
|
||||
return 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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postUnsuspend(): void
|
||||
public function postUnsuspend(): ResponseInterface|string
|
||||
{
|
||||
$sale_id = $this->request->getPost('suspended_sale_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$this->sale_lib->clear_all();
|
||||
@@ -1561,32 +1586,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());
|
||||
|
||||
$this->_reload(); // TODO: Hungarian notation
|
||||
return $this->_reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Keyboard shortcut modal. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSalesKeyboardHelp(): void
|
||||
public function getSalesKeyboardHelp(): string
|
||||
{
|
||||
echo view('sales/help');
|
||||
return view('sales/help');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the validity of an invoice number. Used in app/Views/sales/form.php.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postCheckInvoiceNumber(): void
|
||||
public function postCheckInvoiceNumber(): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
echo !$exists ? 'true' : 'false';
|
||||
return $this->response->setJSON(!$exists ? 'true' : 'false');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1613,10 +1638,10 @@ class Sales extends Secure_Controller
|
||||
/**
|
||||
* Update the item number in the register. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postChangeItemNumber(): void
|
||||
public function postChangeItemNumber(): ResponseInterface
|
||||
{
|
||||
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$item_number = $this->request->getPost('item_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -1632,10 +1657,10 @@ class Sales extends Secure_Controller
|
||||
/**
|
||||
* Change a given item name. Used in app/Views/sales/register.php.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postChangeItemName(): void
|
||||
public function postChangeItemName(): ResponseInterface
|
||||
{
|
||||
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$name = $this->request->getPost('item_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -1655,10 +1680,10 @@ class Sales extends Secure_Controller
|
||||
/**
|
||||
* Update the given item description. Used in app/Views/sales/register.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postChangeItemDescription(): void
|
||||
public function postChangeItemDescription(): ResponseInterface
|
||||
{
|
||||
$item_id = $this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$description = $this->request->getPost('item_description', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
|
||||
@@ -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,18 +85,17 @@ class Secure_Controller extends BaseController
|
||||
|
||||
/**
|
||||
* AJAX function used to confirm whether values sent in the request are numeric
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getCheckNumeric(): void
|
||||
public function getCheckNumeric(): ResponseInterface
|
||||
{
|
||||
foreach ($this->request->getGet() as $value) {
|
||||
if (parse_decimals($value) === false) {
|
||||
echo 'false';
|
||||
return;
|
||||
return $this->response->setJSON('false');
|
||||
}
|
||||
}
|
||||
echo 'true';
|
||||
return $this->response->setJSON('true');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Supplier;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
class Suppliers extends Persons
|
||||
@@ -17,33 +18,33 @@ class Suppliers extends Persons
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_suppliers_manage_table_headers();
|
||||
|
||||
echo view('people/manage', $data);
|
||||
return 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 void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow($row_id): void
|
||||
public function getRow($row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_supplier_data_row($this->supplier->get_info($row_id));
|
||||
$data_row['category'] = $this->supplier->get_category_name($data_row['category']);
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Supplier table data rows. This will be called with AJAX.
|
||||
* @return void
|
||||
**/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -62,38 +63,39 @@ class Suppliers extends Persons
|
||||
$data_rows[] = $row;
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for
|
||||
* @return ResponseInterface
|
||||
**/
|
||||
public function getSuggest(): void
|
||||
public function getSuggest(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('term');
|
||||
$suggestions = $this->supplier->get_search_suggestions($search, true);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->supplier->get_search_suggestions($search, false);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the supplier edit form
|
||||
*
|
||||
* @param int $supplier_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $supplier_id = NEW_ENTRY): void
|
||||
public function getView(int $supplier_id = NEW_ENTRY): string
|
||||
{
|
||||
$info = $this->supplier->get_info($supplier_id);
|
||||
foreach (get_object_vars($info) as $property => $value) {
|
||||
@@ -102,16 +104,16 @@ class Suppliers extends Persons
|
||||
$data['person_info'] = $info;
|
||||
$data['categories'] = $this->supplier->get_categories();
|
||||
|
||||
echo view("suppliers/form", $data);
|
||||
return view("suppliers/form", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts/updates a supplier
|
||||
*
|
||||
* @param int $supplier_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $supplier_id = NEW_ENTRY): void
|
||||
public function postSave(int $supplier_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
@@ -147,21 +149,21 @@ class Suppliers extends Persons
|
||||
if ($this->supplier->save_supplier($person_data, $supplier_data, $supplier_id)) {
|
||||
// New supplier
|
||||
if ($supplier_id == NEW_ENTRY) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Suppliers.successful_adding') . ' ' . $supplier_data['company_name'],
|
||||
'id' => $supplier_data['person_id']
|
||||
]);
|
||||
} else { // Existing supplier
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Suppliers.successful_updating') . ' ' . $supplier_data['company_name'],
|
||||
'id' => $supplier_id
|
||||
]);
|
||||
}
|
||||
} else { // Failure
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Suppliers.error_adding_updating') . ' ' . $supplier_data['company_name'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -172,19 +174,19 @@ class Suppliers extends Persons
|
||||
/**
|
||||
* This deletes suppliers from the suppliers table
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$suppliers_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
|
||||
|
||||
if ($this->supplier->delete_list($suppliers_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Suppliers.successful_deleted') . ' ' . count($suppliers_to_delete) . ' ' . lang('Suppliers.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Suppliers.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Suppliers.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Tax_category;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
/**
|
||||
@@ -20,13 +21,13 @@ class Tax_categories extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['tax_categories_table_headers'] = get_tax_categories_table_headers();
|
||||
|
||||
echo view('taxes/tax_categories', $data);
|
||||
return view('taxes/tax_categories', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,7 +35,7 @@ class Tax_categories extends Secure_Controller
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -50,37 +51,37 @@ class Tax_categories extends Secure_Controller
|
||||
$data_rows[] = get_tax_categories_data_row($tax_category);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow($row_id): void
|
||||
public function getRow($row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_tax_categories_data_row($this->tax_category->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_category_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $tax_category_id = NEW_ENTRY): void
|
||||
public function getView(int $tax_category_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['tax_category_info'] = $this->tax_category->get_info($tax_category_id);
|
||||
|
||||
echo view("taxes/tax_category_form", $data);
|
||||
return view("taxes/tax_category_form", $data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $tax_category_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $tax_category_id = NEW_ENTRY): void
|
||||
public function postSave(int $tax_category_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$tax_category_data = [
|
||||
'tax_category' => $this->request->getPost('tax_category', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
|
||||
@@ -91,20 +92,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) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_categories.successful_adding'),
|
||||
'id' => $tax_category_data['tax_category_id']
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_categories.successful_updating'),
|
||||
'id' => $tax_category_id
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Tax_categories.error_adding_updating') . ' ' . $tax_category_data['tax_category'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -113,19 +114,19 @@ class Tax_categories extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$tax_categories_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
|
||||
|
||||
if ($this->tax_category->delete_list($tax_categories_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_categories.successful_deleted') . ' ' . count($tax_categories_to_delete) . ' ' . lang('Tax_categories.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Tax_categories.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_categories.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Tax_code;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
/**
|
||||
@@ -22,11 +23,11 @@ class Tax_codes extends Secure_Controller
|
||||
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
echo view('taxes/tax_codes', $this->get_data());
|
||||
return view('taxes/tax_codes', $this->get_data());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,7 +45,7 @@ class Tax_codes extends Secure_Controller
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -61,37 +62,37 @@ class Tax_codes extends Secure_Controller
|
||||
$data_rows[] = get_tax_code_data_row($tax_code);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_tax_code_data_row($this->tax_code->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_code_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $tax_code_id = NEW_ENTRY): void
|
||||
public function getView(int $tax_code_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['tax_code_info'] = $this->tax_code->get_info($tax_code_id);
|
||||
|
||||
echo view("taxes/tax_code_form", $data);
|
||||
return view("taxes/tax_code_form", $data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $tax_code_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $tax_code_id = NEW_ENTRY): void
|
||||
public function postSave(int $tax_code_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$tax_code_data = [
|
||||
'tax_code' => $this->request->getPost('tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
|
||||
@@ -102,20 +103,20 @@ class Tax_codes extends Secure_Controller
|
||||
|
||||
if ($this->tax_code->save($tax_code_data)) {
|
||||
if ($tax_code_id == NEW_ENTRY) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_codes.successful_adding'),
|
||||
'id' => $tax_code_data['tax_code_id']
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_codes.successful_updating'),
|
||||
'id' => $tax_code_id
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Tax_codes.error_adding_updating') . ' ' . $tax_code_data['tax_code_id'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -124,19 +125,19 @@ class Tax_codes extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$tax_codes_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
|
||||
|
||||
if ($this->tax_code->delete_list($tax_codes_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_codes.successful_deleted') . ' ' . count($tax_codes_to_delete) . ' ' . lang('Tax_codes.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Tax_codes.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_codes.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Models\Tax_jurisdiction;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
/**
|
||||
@@ -23,13 +24,13 @@ class Tax_jurisdictions extends Secure_Controller
|
||||
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['table_headers'] = get_tax_jurisdictions_table_headers();
|
||||
|
||||
echo view('taxes/tax_jurisdictions', $data);
|
||||
return view('taxes/tax_jurisdictions', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -37,7 +38,7 @@ class Tax_jurisdictions extends Secure_Controller
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -53,37 +54,37 @@ class Tax_jurisdictions extends Secure_Controller
|
||||
$data_rows[] = get_tax_jurisdictions_data_row($tax_jurisdiction);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_tax_jurisdictions_data_row($this->tax_jurisdiction->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_jurisdiction_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $tax_jurisdiction_id = NEW_ENTRY): void
|
||||
public function getView(int $tax_jurisdiction_id = NEW_ENTRY): string
|
||||
{
|
||||
$data['tax_jurisdiction_info'] = $this->tax_jurisdiction->get_info($tax_jurisdiction_id);
|
||||
|
||||
echo view("taxes/tax_jurisdiction_form", $data);
|
||||
return view("taxes/tax_jurisdiction_form", $data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $jurisdiction_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $jurisdiction_id = NEW_ENTRY): void
|
||||
public function postSave(int $jurisdiction_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$tax_jurisdiction_data = [
|
||||
'jurisdiction_name' => $this->request->getPost('jurisdiction_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
|
||||
@@ -92,20 +93,20 @@ class Tax_jurisdictions extends Secure_Controller
|
||||
|
||||
if ($this->tax_jurisdiction->save_value($tax_jurisdiction_data)) {
|
||||
if ($jurisdiction_id == NEW_ENTRY) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_jurisdictions.successful_adding'),
|
||||
'id' => $tax_jurisdiction_data['jurisdiction_id']
|
||||
]);
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_jurisdictions.successful_updating'),
|
||||
'id' => $jurisdiction_id
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => false,
|
||||
'message' => lang('Tax_jurisdictions.error_adding_updating') . ' ' . $tax_jurisdiction_data['jurisdiction_name'],
|
||||
'id' => NEW_ENTRY
|
||||
@@ -114,19 +115,19 @@ class Tax_jurisdictions extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$tax_jurisdictions_to_delete = $this->request->getPost('ids', FILTER_SANITIZE_NUMBER_INT);
|
||||
|
||||
if ($this->tax_jurisdiction->delete_list($tax_jurisdictions_to_delete)) {
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => true,
|
||||
'message' => lang('Tax_jurisdictions.successful_deleted') . ' ' . count($tax_jurisdictions_to_delete) . ' ' . lang('Tax_jurisdictions.one_or_multiple')
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Tax_jurisdictions.cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Tax_jurisdictions.cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ 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;
|
||||
|
||||
@@ -36,9 +37,9 @@ class Taxes extends Secure_Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getIndex(): void
|
||||
public function getIndex(): string
|
||||
{
|
||||
$data['tax_codes'] = $this->tax_code->get_all()->getResultArray();
|
||||
if (count($data['tax_codes']) == 0) {
|
||||
@@ -67,7 +68,7 @@ class Taxes extends Secure_Controller
|
||||
|
||||
$data['tax_type_options'] = $this->tax_lib->get_tax_type_options($data['default_tax_type']);
|
||||
|
||||
echo view('taxes/manage', $data);
|
||||
return view('taxes/manage', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -75,7 +76,7 @@ class Taxes extends Secure_Controller
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getSearch(): void
|
||||
public function getSearch(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getGet('search');
|
||||
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
|
||||
@@ -92,50 +93,50 @@ class Taxes extends Secure_Controller
|
||||
$data_rows[] = get_tax_rates_data_row($tax_rate_row);
|
||||
}
|
||||
|
||||
echo json_encode(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives search suggestions based on what is being searched for
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_search(): void
|
||||
public function suggest_search(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->tax->get_search_suggestions($search); // TODO: There is no get_search_suggestions function in the tax model
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides list of tax categories to select from
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function suggest_tax_categories(): void
|
||||
public function suggest_tax_categories(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPost('term');
|
||||
$suggestions = $this->tax_category->get_tax_category_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $row_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function getRow(int $row_id): void
|
||||
public function getRow(int $row_id): ResponseInterface
|
||||
{
|
||||
$data_row = get_tax_rates_data_row($this->tax->get_info($row_id));
|
||||
|
||||
echo json_encode($data_row);
|
||||
return $this->response->setJSON($data_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_code
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView_tax_codes(int $tax_code = NEW_ENTRY): void
|
||||
public function getView_tax_codes(int $tax_code = NEW_ENTRY): string
|
||||
{
|
||||
$tax_code_info = $this->tax->get_info($tax_code);
|
||||
|
||||
@@ -192,15 +193,15 @@ class Taxes extends Secure_Controller
|
||||
|
||||
$data['tax_rates'] = $tax_rates;
|
||||
|
||||
echo view('taxes/tax_code_form', $data);
|
||||
return view('taxes/tax_code_form', $data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $tax_rate_id
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView(int $tax_rate_id = NEW_ENTRY): void
|
||||
public function getView(int $tax_rate_id = NEW_ENTRY): string
|
||||
{
|
||||
$tax_rate_info = $this->tax->get_info($tax_rate_id);
|
||||
|
||||
@@ -226,14 +227,14 @@ class Taxes extends Secure_Controller
|
||||
$data['tax_rate'] = $tax_rate_info->tax_rate;
|
||||
}
|
||||
|
||||
echo view('taxes/tax_rates_form', $data);
|
||||
return view('taxes/tax_rates_form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_code
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView_tax_categories(int $tax_code = NEW_ENTRY): void // TODO: This appears to be called no where in the code.
|
||||
public function getView_tax_categories(int $tax_code = NEW_ENTRY): string // TODO: This appears to be called no where in the code.
|
||||
{
|
||||
$tax_code_info = $this->tax->get_info($tax_code); // TODO: Duplicated Code
|
||||
|
||||
@@ -290,14 +291,14 @@ class Taxes extends Secure_Controller
|
||||
|
||||
$data['tax_rates'] = $tax_rates;
|
||||
|
||||
echo view('taxes/tax_category_form', $data);
|
||||
return view('taxes/tax_category_form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $tax_code
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getView_tax_jurisdictions(int $tax_code = NEW_ENTRY): void // TODO: This appears to be called no where in the code.
|
||||
public function getView_tax_jurisdictions(int $tax_code = NEW_ENTRY): string // TODO: This appears to be called no where in the code.
|
||||
{
|
||||
$tax_code_info = $this->tax->get_info($tax_code); // TODO: Duplicated code
|
||||
|
||||
@@ -354,7 +355,7 @@ class Taxes extends Secure_Controller
|
||||
|
||||
$data['tax_rates'] = $tax_rates;
|
||||
|
||||
echo view('taxes/tax_jurisdiction_form', $data);
|
||||
return view('taxes/tax_jurisdiction_form', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -367,9 +368,9 @@ class Taxes extends Secure_Controller
|
||||
|
||||
/**
|
||||
* @param int $tax_rate_id
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postSave(int $tax_rate_id = NEW_ENTRY): void
|
||||
public function postSave(int $tax_rate_id = NEW_ENTRY): ResponseInterface
|
||||
{
|
||||
$tax_category_id = $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$tax_rate = parse_tax($this->request->getPost('tax_rate'));
|
||||
@@ -388,50 +389,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
|
||||
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_rate_successfully_added')]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_rate_successfully_added')]);
|
||||
} else { // Existing tax_code
|
||||
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_rate_successful_updated')]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_rate_successful_updated')]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Taxes.tax_rate_error_adding_updating')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Taxes.tax_rate_error_adding_updating')]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public function postDelete(): void
|
||||
public function postDelete(): ResponseInterface
|
||||
{
|
||||
$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
|
||||
echo json_encode(['success' => true, 'message' => lang('Taxes.tax_code_successful_deleted')]);
|
||||
return $this->response->setJSON(['success' => true, 'message' => lang('Taxes.tax_code_successful_deleted')]);
|
||||
} else {
|
||||
echo json_encode(['success' => false, 'message' => lang('Taxes.tax_code_cannot_be_deleted')]);
|
||||
return $this->response->setJSON(['success' => false, 'message' => lang('Taxes.tax_code_cannot_be_deleted')]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get search suggestions for tax codes. Used in app/Views/customers/form.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getSuggestTaxCodes(): void
|
||||
public function getSuggestTaxCodes(): ResponseInterface
|
||||
{
|
||||
$search = $this->request->getPostGet('term');
|
||||
$suggestions = $this->tax_code->get_tax_codes_search_suggestions($search);
|
||||
|
||||
echo json_encode($suggestions);
|
||||
return $this->response->setJSON($suggestions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves Tax Codes. Used in app/Views/taxes/tax_codes.php
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSave_tax_codes(): void
|
||||
public function postSave_tax_codes(): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
@@ -452,7 +453,7 @@ class Taxes extends Secure_Controller
|
||||
|
||||
$success = $this->tax_code->save_tax_codes($array_save);
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'success' => $success,
|
||||
'message' => lang('Taxes.tax_codes_saved_' . ($success ? '' : 'un') . 'successfully')
|
||||
]);
|
||||
@@ -461,10 +462,10 @@ class Taxes extends Secure_Controller
|
||||
/**
|
||||
* Saves given tax jurisdiction. Used in app/Views/taxes/tax_jurisdictions.php.
|
||||
*
|
||||
* @return void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSave_tax_jurisdictions(): void
|
||||
public function postSave_tax_jurisdictions(): ResponseInterface
|
||||
{
|
||||
$jurisdiction_id = $this->request->getPost('jurisdiction_id', FILTER_SANITIZE_NUMBER_INT);
|
||||
$jurisdiction_name = $this->request->getPost('jurisdiction_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
|
||||
@@ -489,11 +490,10 @@ 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)`
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'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);
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'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 void
|
||||
* @return ResponseInterface
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function postSave_tax_categories(): void
|
||||
public function postSave_tax_categories(): ResponseInterface
|
||||
{
|
||||
$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);
|
||||
|
||||
echo json_encode([
|
||||
return $this->response->setJSON([
|
||||
'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 void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getAjax_tax_codes(): void
|
||||
public function getAjax_tax_codes(): string
|
||||
{
|
||||
$tax_codes = $this->tax_code->get_all()->getResultArray();
|
||||
|
||||
echo view('partial/tax_codes', ['tax_codes' => $tax_codes]);
|
||||
return view('partial/tax_codes', ['tax_codes' => $tax_codes]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets current tax categories. Used in app/Views/taxes/tax_categories.php
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getAjax_tax_categories(): void
|
||||
public function getAjax_tax_categories(): string
|
||||
{
|
||||
$tax_categories = $this->tax_category->get_all()->getResultArray();
|
||||
|
||||
echo view('partial/tax_categories', ['tax_categories' => $tax_categories]);
|
||||
return view('partial/tax_categories', ['tax_categories' => $tax_categories]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the tax jurisdiction partial view. Used in app/Views/taxes/tax_jurisdictions.php.
|
||||
*
|
||||
* @return void
|
||||
* @return string
|
||||
* @noinspection PhpUnused
|
||||
*/
|
||||
public function getAjax_tax_jurisdictions(): void
|
||||
public function getAjax_tax_jurisdictions(): string
|
||||
{
|
||||
$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();
|
||||
|
||||
echo view('partial/tax_jurisdictions', [
|
||||
return view('partial/tax_jurisdictions', [
|
||||
'tax_jurisdictions' => $tax_jurisdictions,
|
||||
'tax_types' => $tax_types,
|
||||
'default_tax_type' => $default_tax_type
|
||||
|
||||
@@ -267,6 +267,8 @@ 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;
|
||||
@@ -376,7 +378,7 @@ class Migration_Sales_Tax_Data extends Migration
|
||||
$decimals = totals_decimals();
|
||||
|
||||
foreach ($sales_taxes as $row_number => $sales_tax) {
|
||||
$sale_tax_amount = $sales_tax['sale_tax_amount'];
|
||||
$sale_tax_amount = (float)$sales_tax['sale_tax_amount'];
|
||||
$rounding_code = $sales_tax['rounding_code'];
|
||||
$rounded_sale_tax_amount = $sale_tax_amount;
|
||||
|
||||
|
||||
@@ -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\'');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,6 +243,8 @@ 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;
|
||||
@@ -354,7 +356,7 @@ class Migration_TaxAmount extends Migration
|
||||
$decimals = totals_decimals();
|
||||
|
||||
foreach ($sales_taxes as $row_number => $sales_tax) {
|
||||
$sale_tax_amount = $sales_tax['sale_tax_amount'];
|
||||
$sale_tax_amount = (float)$sales_tax['sale_tax_amount'];
|
||||
$rounding_code = $sales_tax['rounding_code'];
|
||||
$rounded_sale_tax_amount = $sale_tax_amount;
|
||||
|
||||
|
||||
96
app/Database/Migrations/20250310000000_ApiKeys.php
Normal file
96
app/Database/Migrations/20250310000000_ApiKeys.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace App\Database\Migrations;
|
||||
|
||||
use CodeIgniter\Database\Migration;
|
||||
|
||||
class ApiKeys extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$this->forge->addField([
|
||||
'api_key_id' => [
|
||||
'type' => 'INT',
|
||||
'constraint' => 11,
|
||||
'unsigned' => true,
|
||||
'auto_increment' => true
|
||||
],
|
||||
'employee_id' => [
|
||||
'type' => 'INT',
|
||||
'constraint' => 10
|
||||
],
|
||||
'key_hash' => [
|
||||
'type' => 'VARCHAR',
|
||||
'constraint' => 64
|
||||
],
|
||||
'key_prefix' => [
|
||||
'type' => 'VARCHAR',
|
||||
'constraint' => 12
|
||||
],
|
||||
'name' => [
|
||||
'type' => 'VARCHAR',
|
||||
'constraint' => 255,
|
||||
'null' => true
|
||||
],
|
||||
'last_used' => [
|
||||
'type' => 'DATETIME',
|
||||
'null' => true
|
||||
],
|
||||
'created' => [
|
||||
'type' => 'DATETIME',
|
||||
'null' => true
|
||||
],
|
||||
'expires_at' => [
|
||||
'type' => 'DATETIME',
|
||||
'null' => true
|
||||
],
|
||||
'disabled' => [
|
||||
'type' => 'TINYINT',
|
||||
'constraint' => 1,
|
||||
'default' => 0
|
||||
]
|
||||
]);
|
||||
|
||||
$this->forge->addKey('api_key_id', true);
|
||||
$this->forge->addKey('employee_id');
|
||||
$this->forge->addKey('key_hash');
|
||||
|
||||
$this->forge->createTable('api_keys', true);
|
||||
|
||||
$this->db->query(
|
||||
'ALTER TABLE ' . $this->db->prefixTable('api_keys') .
|
||||
' ADD CONSTRAINT ' . $this->db->prefixTable('api_keys') . '_employee_id_foreign' .
|
||||
' FOREIGN KEY (employee_id) REFERENCES ' . $this->db->prefixTable('employees') .
|
||||
' (person_id) ON DELETE CASCADE ON UPDATE CASCADE'
|
||||
);
|
||||
|
||||
$this->db->query(
|
||||
'INSERT INTO ' . $this->db->prefixTable('permissions') . ' (permission_id, module_id)' .
|
||||
" VALUES ('api_keys', 'office') ON DUPLICATE KEY UPDATE permission_id = 'api_keys'"
|
||||
);
|
||||
|
||||
$this->db->query(
|
||||
'INSERT INTO ' . $this->db->prefixTable('modules') . ' (module_id, name_lang_key, desc_lang_key, sort)' .
|
||||
" VALUES ('api_keys', 'module_api_keys', 'module_desc_api_keys', 25)" .
|
||||
" ON DUPLICATE KEY UPDATE module_id = 'module_id'"
|
||||
);
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
$this->db->query(
|
||||
'ALTER TABLE ' . $this->db->prefixTable('api_keys') .
|
||||
' DROP FOREIGN KEY ' . $this->db->prefixTable('api_keys') . '_employee_id_foreign'
|
||||
);
|
||||
|
||||
$this->db->query(
|
||||
'DELETE FROM ' . $this->db->prefixTable('permissions') . " WHERE permission_id = 'api_keys'"
|
||||
);
|
||||
|
||||
$this->db->query(
|
||||
'DELETE FROM ' . $this->db->prefixTable('modules') . " WHERE module_id = 'api_keys'"
|
||||
);
|
||||
|
||||
$this->forge->dropTable('api_keys', true);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
[mysqld]
|
||||
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
|
||||
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
|
||||
|
||||
key_buffer = 16M
|
||||
max_allowed_packet = 1M
|
||||
|
||||
48
app/Filters/ApiAuth.php
Normal file
48
app/Filters/ApiAuth.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filters;
|
||||
|
||||
use App\Models\ApiKey;
|
||||
use CodeIgniter\Filters\FilterInterface;
|
||||
use CodeIgniter\HTTP\RequestInterface;
|
||||
use CodeIgniter\HTTP\ResponseInterface;
|
||||
use Config\Services;
|
||||
|
||||
class ApiAuth implements FilterInterface
|
||||
{
|
||||
public function before(RequestInterface $request, $arguments = null): mixed
|
||||
{
|
||||
$apiKey = $request->getHeaderLine('X-API-Key');
|
||||
|
||||
if (empty($apiKey)) {
|
||||
return $this->unauthorized('API key required');
|
||||
}
|
||||
|
||||
$apiKeyModel = model(ApiKey::class);
|
||||
$employeeId = $apiKeyModel->validateKey($apiKey);
|
||||
|
||||
if (!$employeeId) {
|
||||
return $this->unauthorized('Invalid or expired API key');
|
||||
}
|
||||
|
||||
$request->employeeId = $employeeId;
|
||||
Services::set('apiEmployeeId', $employeeId);
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): mixed
|
||||
{
|
||||
return $response;
|
||||
}
|
||||
|
||||
private function unauthorized(string $message): ResponseInterface
|
||||
{
|
||||
return Services::response()
|
||||
->setStatusCode(401)
|
||||
->setJSON([
|
||||
'success' => false,
|
||||
'message' => $message
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -89,6 +89,8 @@ 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',
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "ابداء بكتابة اسم المورد....",
|
||||
"stock" => "المخزون",
|
||||
"stock_destination" => "المخزون المحول له",
|
||||
"stock_locaiton" => "مكان المخزون",
|
||||
"stock_location" => "مكان المخزون",
|
||||
"stock_source" => "مصدر المخزون",
|
||||
"successfully_deleted" => "لقد تم الحذف",
|
||||
"successfully_updated" => "لقد تم التحديث",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "ابداء بكتابة اسم المورد....",
|
||||
"stock" => "المخزون",
|
||||
"stock_destination" => "المخزون المحول له",
|
||||
"stock_locaiton" => "مكان المخزون",
|
||||
"stock_location" => "مكان المخزون",
|
||||
"stock_source" => "مصدر المخزون",
|
||||
"successfully_deleted" => "لقد تم الحذف",
|
||||
"successfully_updated" => "لقد تم التحديث",
|
||||
|
||||
@@ -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_locaiton" => "Ehtiyyatın Yeri",
|
||||
"stock_location" => "Ehtiyyatın Yeri",
|
||||
"stock_source" => "Ehtiyyatın Mənbəyi",
|
||||
"successfully_deleted" => "cəmi",
|
||||
"successfully_updated" => "alışda sehv var",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Start Typing Supplier's name...",
|
||||
"stock" => "",
|
||||
"stock_destination" => "Stock Destination",
|
||||
"stock_locaiton" => "Stock Location",
|
||||
"stock_location" => "Stock Location",
|
||||
"stock_source" => "Stock Source",
|
||||
"successfully_deleted" => "You have successfully deleted",
|
||||
"successfully_updated" => "Receiving successfully updated",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Počnite upisivati ime dobavljača ...",
|
||||
"stock" => "Skladište",
|
||||
"stock_destination" => "Destinacija skladišta",
|
||||
"stock_locaiton" => "Lokacija zaliha",
|
||||
"stock_location" => "Lokacija zaliha",
|
||||
"stock_source" => "Izvor zaliha",
|
||||
"successfully_deleted" => "Uspješno ste izbrisali prijem",
|
||||
"successfully_updated" => "Uspješno ste ažurirali prijem",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
'start_typing_supplier_name' => "دەست بکە بە نووسینی ناوی دابینکەر...",
|
||||
'stock' => "کۆگا",
|
||||
'stock_destination' => "شوێنی مەبەستی کۆگا",
|
||||
'stock_locaiton' => "شوێنی کۆگا",
|
||||
'stock_location' => "شوێنی کۆگا",
|
||||
'stock_source' => "سەرچاوەی کۆگا",
|
||||
'successfully_deleted' => "بەسەرکەوتوویی سڕیتەوە",
|
||||
'successfully_updated' => "وەرگرتن بە سەرکەوتوویی نوێ کراوەتەوە",
|
||||
|
||||
@@ -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_locaiton" => "Umístění skladu",
|
||||
"stock_location" => "Umístění skladu",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "Smazáno",
|
||||
"successfully_updated" => "Upraveno",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Lieferantenname eingeben",
|
||||
"stock" => "",
|
||||
"stock_destination" => "Lagerort (Ziel)",
|
||||
"stock_locaiton" => "Lagerort",
|
||||
"stock_location" => "Lagerort",
|
||||
"stock_source" => "Lagerort (Quelle)",
|
||||
"successfully_deleted" => "Löschung erfolgreich",
|
||||
"successfully_updated" => "Änderung erfolgreich",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Eintippen des Namens des Lieferanten beginnen...",
|
||||
"stock" => "Lager",
|
||||
"stock_destination" => "Lagerort (Ziel)",
|
||||
"stock_locaiton" => "Lagerort",
|
||||
"stock_location" => "Lagerort",
|
||||
"stock_source" => "Lagerort (Quelle)",
|
||||
"successfully_deleted" => "Löschung erfolgreich",
|
||||
"successfully_updated" => "Änderung erfolgreich",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Πληκτρολογήστε το όνομα του Προμηθευτή...",
|
||||
"stock" => "Απόθεμα",
|
||||
"stock_destination" => "Προορισμός Αποθέματος",
|
||||
"stock_locaiton" => "Τοποθεσία Αποθέματος",
|
||||
"stock_location" => "Τοποθεσία Αποθέματος",
|
||||
"stock_source" => "Προέλευση Αποθέματος",
|
||||
"successfully_deleted" => "Έχετε διαγράψει επιτυχώς",
|
||||
"successfully_updated" => "Επιτυχής ενημέρωση Παραλαβής",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Start Typing Supplier's name...",
|
||||
"stock" => "Stock",
|
||||
"stock_destination" => "Stock Destination",
|
||||
"stock_locaiton" => "Stock Location",
|
||||
"stock_location" => "Stock Location",
|
||||
"stock_source" => "Stock Source",
|
||||
"successfully_deleted" => "You have successfully deleted receiving",
|
||||
"successfully_updated" => "Receiving successfully updated",
|
||||
|
||||
29
app/Language/en/Api_keys.php
Normal file
29
app/Language/en/Api_keys.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'module_api_keys' => 'API Keys',
|
||||
'module_desc_api_keys' => 'Manage API access keys for integrations.',
|
||||
'api_keys' => 'API Keys',
|
||||
'api_key' => 'API Key',
|
||||
'generate_key' => 'Generate API Key',
|
||||
'regenerate_key' => 'Regenerate',
|
||||
'revoke_key' => 'Revoke',
|
||||
'key_name' => 'Key Name',
|
||||
'key_prefix' => 'Key Prefix',
|
||||
'last_used' => 'Last Used',
|
||||
'created' => 'Created',
|
||||
'expires' => 'Expires',
|
||||
'never' => 'Never',
|
||||
'disabled' => 'Disabled',
|
||||
'key_generated' => 'API key generated successfully',
|
||||
'key_generation_failed' => 'Failed to generate API key',
|
||||
'key_revoked' => 'API key revoked successfully',
|
||||
'key_revoke_failed' => 'Failed to revoke API key',
|
||||
'key_regenerated' => 'API key regenerated successfully',
|
||||
'key_regeneration_failed' => 'Failed to regenerate API key',
|
||||
'copy_warning' => 'Copy this key now! It will not be shown again.',
|
||||
'no_keys' => 'No API keys have been generated yet.',
|
||||
'confirm_revoke' => 'Are you sure you want to revoke this API key? This action cannot be undone.',
|
||||
'confirm_regenerate' => 'Are you sure you want to regenerate this API key? The old key will immediately stop working.',
|
||||
'key_description' => 'API keys allow external applications to access your OSPOS data. Keep your keys secure and never share them publicly.',
|
||||
];
|
||||
@@ -14,7 +14,9 @@ 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",
|
||||
|
||||
@@ -26,6 +26,7 @@ return [
|
||||
"cost_price_required" => "Wholesale Price is a required field.",
|
||||
"count" => "Update Inventory",
|
||||
"csv_import_failed" => "CSV import failed",
|
||||
"csv_import_invalid_location" => "Invalid stock location(s) found: {0}. Only valid stock locations are allowed.",
|
||||
"csv_import_nodata_wrongformat" => "The uploaded CSV file has no data or is formatted incorrectly.",
|
||||
"csv_import_partially_failed" => "There were {0} item import failure(s) on line(s): {1}. No rows were imported.",
|
||||
"csv_import_success" => "Item CSV import successful.",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Start Typing Supplier's name...",
|
||||
"stock" => "Stock",
|
||||
"stock_destination" => "Stock Destination",
|
||||
"stock_locaiton" => "Stock Location",
|
||||
"stock_location" => "Stock Location",
|
||||
"stock_source" => "Stock Source",
|
||||
"successfully_deleted" => "You have successfully deleted",
|
||||
"successfully_updated" => "Receiving successfully updated",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Empieza a escribir el nombre del proveedor...",
|
||||
"stock" => "Inventario",
|
||||
"stock_destination" => "Inventario de Destino",
|
||||
"stock_locaiton" => "Ubicación de Inventario",
|
||||
"stock_location" => "Ubicación de Inventario",
|
||||
"stock_source" => "Inventario de Origen",
|
||||
"successfully_deleted" => "Borro exitosamente",
|
||||
"successfully_updated" => "Recepción exitosamente actualizada",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Empiece a escribir el nombre del Proveedor...",
|
||||
"stock" => "Existencia",
|
||||
"stock_destination" => "Destino del Inventario",
|
||||
"stock_locaiton" => "Ubicación del Inventario",
|
||||
"stock_location" => "Ubicación del Inventario",
|
||||
"stock_source" => "Origen del Inventario",
|
||||
"successfully_deleted" => "Se ha borrado exitosamente",
|
||||
"successfully_updated" => "Recepción actualizada exitosamente",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "شروع به تایپ کردن نام ارائه دهنده ...",
|
||||
"stock" => "موجودی",
|
||||
"stock_destination" => "مقصد سهام",
|
||||
"stock_locaiton" => "موقعیت مکانی سهام",
|
||||
"stock_location" => "موقعیت مکانی سهام",
|
||||
"stock_source" => "منبع سهام",
|
||||
"successfully_deleted" => "شما با موفقیت حذف شده اید",
|
||||
"successfully_updated" => "دریافت با موفقیت به روز شد",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Commencez à saisir le nom du fournisseur...",
|
||||
"stock" => "Inventaire",
|
||||
"stock_destination" => "Destination de stock",
|
||||
"stock_locaiton" => "Emplacement du stock",
|
||||
"stock_location" => "Emplacement du stock",
|
||||
"stock_source" => "Source de stock",
|
||||
"successfully_deleted" => "Suppression réussie",
|
||||
"successfully_updated" => "Réception correctement mise à jour",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "התחל להקליד את שם הספק ...",
|
||||
"stock" => "מלאי",
|
||||
"stock_destination" => "יעד מלאי",
|
||||
"stock_locaiton" => "מיקום מלאי",
|
||||
"stock_location" => "מיקום מלאי",
|
||||
"stock_source" => "מקור מלאי",
|
||||
"successfully_deleted" => "נמחק בהצלחה",
|
||||
"successfully_updated" => "החזרה עודכנה בהצלחה",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Počnite upisivati ime dobavljača ...",
|
||||
"stock" => "",
|
||||
"stock_destination" => "Na skladište",
|
||||
"stock_locaiton" => "Mjesto skladišta",
|
||||
"stock_location" => "Mjesto skladišta",
|
||||
"stock_source" => "Iz skladišta",
|
||||
"successfully_deleted" => "Uspješno ste obrisali primku",
|
||||
"successfully_updated" => "Uspješno ste ažurirali primku",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Kezdje gépelni a beszállitó nevét",
|
||||
"stock" => "",
|
||||
"stock_destination" => "Célraktár",
|
||||
"stock_locaiton" => "Raktár helyszin",
|
||||
"stock_location" => "Raktár helyszin",
|
||||
"stock_source" => "Raktár forrás",
|
||||
"successfully_deleted" => "Sikeres törlés",
|
||||
"successfully_updated" => "Átvétel sikeresen módositva",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Ketik nama pemasok ...",
|
||||
"stock" => "Stok",
|
||||
"stock_destination" => "Tujuan Stok",
|
||||
"stock_locaiton" => "Lokasi Stok",
|
||||
"stock_location" => "Lokasi Stok",
|
||||
"stock_source" => "Asal Stok",
|
||||
"successfully_deleted" => "Berhasil Dihapus",
|
||||
"successfully_updated" => "Berhasil Diperbaharui",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Incomincia a digitare il nome del Fornitore...",
|
||||
"stock" => "Scorta",
|
||||
"stock_destination" => "Destinazione Stock",
|
||||
"stock_locaiton" => "Luogo di Stock",
|
||||
"stock_location" => "Luogo di Stock",
|
||||
"stock_source" => "Provenienza Stock",
|
||||
"successfully_deleted" => "Eliminata correttamente",
|
||||
"successfully_updated" => "Ricezione correttamente aggiornata",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Start Typing Supplier's name...",
|
||||
"stock" => "",
|
||||
"stock_destination" => "Stock Destination",
|
||||
"stock_locaiton" => "Stock Location",
|
||||
"stock_location" => "Stock Location",
|
||||
"stock_source" => "Stock Source",
|
||||
"successfully_deleted" => "You have successfully deleted",
|
||||
"successfully_updated" => "Receiving successfully updated",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Typ naam leverancier..",
|
||||
"stock" => "Voorraad",
|
||||
"stock_destination" => "Stock bestemming",
|
||||
"stock_locaiton" => "Stock locatie",
|
||||
"stock_location" => "Stock locatie",
|
||||
"stock_source" => "Stock bron",
|
||||
"successfully_deleted" => "Er werd(en)",
|
||||
"successfully_updated" => "Order werd geupdatet",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Leveranciersnaam typen...",
|
||||
"stock" => "Voorraad",
|
||||
"stock_destination" => "Voorraad bestemming",
|
||||
"stock_locaiton" => "Voorraad locatie",
|
||||
"stock_location" => "Voorraad locatie",
|
||||
"stock_source" => "Voorraad herkomst",
|
||||
"successfully_deleted" => "Succesvol verwijderd",
|
||||
"successfully_updated" => "Levering succesvol bijgewerkt",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Digite o nome do fornecedor...",
|
||||
"stock" => "Estoque",
|
||||
"stock_destination" => "Destinação do estoque",
|
||||
"stock_locaiton" => "Localização do estoque",
|
||||
"stock_location" => "Localização do estoque",
|
||||
"stock_source" => "Fonte do estoque",
|
||||
"successfully_deleted" => "Você excluiu com sucesso",
|
||||
"successfully_updated" => "Recebimento atualizado com sucesso",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "",
|
||||
"stock" => "",
|
||||
"stock_destination" => "",
|
||||
"stock_locaiton" => "",
|
||||
"stock_location" => "",
|
||||
"stock_source" => "",
|
||||
"successfully_deleted" => "",
|
||||
"successfully_updated" => "",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Начните вводить название поставщика...",
|
||||
"stock" => "Запасы",
|
||||
"stock_destination" => "Назначение запасов",
|
||||
"stock_locaiton" => "Расположение запасов",
|
||||
"stock_location" => "Расположение запасов",
|
||||
"stock_source" => "Источник запасов",
|
||||
"successfully_deleted" => "Успешно удалено",
|
||||
"successfully_updated" => "Закупка успешно обновлена",
|
||||
|
||||
@@ -43,7 +43,7 @@ return [
|
||||
"start_typing_supplier_name" => "Börja skriva leverantörens namn ...",
|
||||
"stock" => "Lager",
|
||||
"stock_destination" => "Lagerplats",
|
||||
"stock_locaiton" => "Lagerplats",
|
||||
"stock_location" => "Lagerplats",
|
||||
"stock_source" => "Lagerplats",
|
||||
"successfully_deleted" => "Du har tagit bort",
|
||||
"successfully_updated" => "Mottagning uppdaterad",
|
||||
|
||||
33
app/Language/sw-KE/Attributes.php
Normal file
33
app/Language/sw-KE/Attributes.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"attribute_value_invalid_chars" => "Thamani ya sifa haiwezi kuwa na '_' au '|'",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta sifa iliyochaguliwa/zilizochaguliwa?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha sifa iliyochaguliwa/zilizochaguliwa?",
|
||||
"definition_cannot_be_deleted" => "Haiwezekani kufuta sifa iliyochaguliwa/zilizochaguliwa",
|
||||
"definition_error_adding_updating" => "Sifa {0} haiwezekani kuongezwa au kusasishwa. Tafadhali angalia logi ya makosa.",
|
||||
"definition_flags" => "Uonekano wa Sifa",
|
||||
"definition_group" => "Kundi",
|
||||
"definition_id" => "Id",
|
||||
"definition_name" => "Ongeza Sifa",
|
||||
"definition_name_required" => "Jina la sifa ni kiashiria kinachohitajika",
|
||||
"definition_one_or_multiple" => "Sifa",
|
||||
"definition_successful_adding" => "Umefanikiwa kuongeza kipengee(Item)",
|
||||
"definition_successful_deleted" => "Umefanikiwa kufuta",
|
||||
"definition_successful_updating" => "Umefanikiwa kusasisha sifa",
|
||||
"definition_type" => "Aina ya Sifa",
|
||||
"definition_type_required" => "Aina ya sifa ni kiashiria kinachohitajika",
|
||||
"definition_unit" => "Kipimo",
|
||||
"definition_values" => "Thamani za Sifa",
|
||||
"new" => "Sifa Mpya",
|
||||
"no_attributes_to_display" => "Hakuna Sifa za kuonyesha",
|
||||
"receipt_visibility" => "Risiti",
|
||||
"show_in_items" => "Onyesha kwenye bidhaa",
|
||||
"show_in_items_visibility" => "Bidhaa",
|
||||
"show_in_receipt" => "Onyesha kwenye risiti",
|
||||
"show_in_receivings" => "Onyesha kwenye Manunuzi",
|
||||
"show_in_receivings_visibility" => "Manunuzi",
|
||||
"show_in_sales" => "Onyesha kwenye Mauzo",
|
||||
"show_in_sales_visibility" => "Mauzo",
|
||||
"update" => "Sasisha Sifa",
|
||||
];
|
||||
12
app/Language/sw-KE/Bootstrap_tables.php
Normal file
12
app/Language/sw-KE/Bootstrap_tables.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"all" => "Zote",
|
||||
"columns" => "Safu wima",
|
||||
"hide_show_pagination" => "Ficha/Onyesha upangaji kurasa",
|
||||
"loading" => "Inapakia, tafadhali subiri...",
|
||||
"page_from_to" => "Inaonyesha {0} hadi {1} kati ya Mistari {2}",
|
||||
"refresh" => "Sasisha",
|
||||
"rows_per_page" => "Mistari {0} kwa kila ukurasa",
|
||||
"toggle" => "Badilisha",
|
||||
];
|
||||
49
app/Language/sw-KE/Calendar.php
Normal file
49
app/Language/sw-KE/Calendar.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"su" => "J2",
|
||||
"mo" => "J3",
|
||||
"tu" => "J4",
|
||||
"we" => "J5",
|
||||
"th" => "Al",
|
||||
"fr" => "Ij",
|
||||
"sa" => "Jm",
|
||||
"sun" => "Jm2",
|
||||
"mon" => "Jm3",
|
||||
"tue" => "Jm4",
|
||||
"wed" => "Jm5",
|
||||
"thu" => "Alh",
|
||||
"fri" => "Iju",
|
||||
"sat" => "Jmo",
|
||||
"sunday" => "Jumapili",
|
||||
"monday" => "Jumatatu",
|
||||
"tuesday" => "Jumanne",
|
||||
"wednesday" => "Jumatano",
|
||||
"thursday" => "Alhamisi",
|
||||
"friday" => "Ijumaa",
|
||||
"saturday" => "Jumamosi",
|
||||
"jan" => "Jan",
|
||||
"feb" => "Feb",
|
||||
"mar" => "Mac",
|
||||
"apr" => "Apr",
|
||||
"may" => "Mei",
|
||||
"jun" => "Jun",
|
||||
"jul" => "Jul",
|
||||
"aug" => "Ago",
|
||||
"sep" => "Sep",
|
||||
"oct" => "Okt",
|
||||
"nov" => "Nov",
|
||||
"dec" => "Des",
|
||||
"january" => "Januari",
|
||||
"february" => "Februari",
|
||||
"march" => "Machi",
|
||||
"april" => "Aprili",
|
||||
"mayl" => "Mei",
|
||||
"june" => "Juni",
|
||||
"july" => "Julai",
|
||||
"august" => "Agosti",
|
||||
"september" => "Septemba",
|
||||
"october" => "Oktoba",
|
||||
"november" => "Novemba",
|
||||
"december" => "Disemba",
|
||||
];
|
||||
50
app/Language/sw-KE/Cashups.php
Normal file
50
app/Language/sw-KE/Cashups.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"amount" => "Kiasi",
|
||||
"amount_number" => "Kiasi lazima kiwe namba",
|
||||
"amount_required" => "Kiasi ni shamba linalohitajika.",
|
||||
"cancel_cashups" => "",
|
||||
"cancel_cashups_enter" => "",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta Cashup",
|
||||
"cash_difference" => "",
|
||||
"close_date" => "Tarehe ya Kufunga",
|
||||
"close_employee" => "Amefunga",
|
||||
"closed_amount_card" => "Kadi",
|
||||
"closed_amount_cash" => "Fedha Iliyofungwa",
|
||||
"closed_amount_check" => "Hundi",
|
||||
"closed_amount_due" => "Madeni",
|
||||
"closed_amount_giftcard" => "",
|
||||
"closed_amount_total" => "Jumla",
|
||||
"closed_date" => "Tarehe ya Kufungwa",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Fedha Taslimu uliyochagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Fedha Taslimu uliyochagua?",
|
||||
"confirm_submit" => "",
|
||||
"date_number" => "Tarehe lazima iwe namba",
|
||||
"date_required" => "Tarehe ni shamba linalohitajika",
|
||||
"description" => "Maelezo",
|
||||
"enable_expected" => "",
|
||||
"error_adding_updating" => "Hitilafu katika kuongeza/kusasisha Fedha Taslimu",
|
||||
"giftcard" => "",
|
||||
"id" => "Id",
|
||||
"info" => "Taarifa za Fedha Taslimu",
|
||||
"info_employee" => "",
|
||||
"is_deleted" => "Imefutwa",
|
||||
"new" => "Fedha Taslimu Mpya",
|
||||
"no_cashups_to_display" => "Hakuna Fedha Taslimu za kuonyesha",
|
||||
"none_selected" => "Hujachagua Fedha Taslimu yoyote",
|
||||
"note" => "Maelezo",
|
||||
"one_or_multiple" => "Fedha Taslimu",
|
||||
"open_amount_cash" => "Fedha Iliyofunguliwa",
|
||||
"open_date" => "Tarehe ya Kufungua",
|
||||
"open_employee" => "Imefunguliwa na",
|
||||
"opened_date" => "Tarehe ya Kufunguliwa",
|
||||
"successful_adding" => "Kuongeza Fedha Taslimu kumewezekana",
|
||||
"successful_deleted" => "Kufuta Fedha Taslimu kumewezekana",
|
||||
"successful_updating" => "Kusasisha Fedha Taslimu kumewezekana",
|
||||
"total" => "Jumla",
|
||||
"transfer_amount_cash" => "Fedha Ndani/Nje",
|
||||
"transfer_amount_cash_minus" => "",
|
||||
"update" => "Sasisha Fedha Taslimu",
|
||||
"warning" => "",
|
||||
];
|
||||
89
app/Language/sw-KE/Common.php
Normal file
89
app/Language/sw-KE/Common.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"address_1" => "Anwani 1",
|
||||
"address_2" => "Anwani 2",
|
||||
"admin" => "",
|
||||
"city" => "Jiji",
|
||||
"clerk" => "",
|
||||
"close" => "Funga",
|
||||
"color" => "",
|
||||
"comments" => "Maoni",
|
||||
"common" => "Kawaida",
|
||||
"confirm_search" => "Umechagua safu moja au zaidi, hizi hazitachaguliwa tena baada ya utafutaji wako. Una uhakika unataka kuwasilisha utafutaji huu?",
|
||||
"copyrights" => "© 2010 - {0}",
|
||||
"correct_errors" => "Tafadhali rekebisha makosa yaliyotambuliwa kabla ya kuhifadhi",
|
||||
"country" => "Nchi",
|
||||
"dashboard" => "",
|
||||
"date" => "Tarehe",
|
||||
"delete" => "Futa",
|
||||
"det" => "Maelezo",
|
||||
"download_import_template" => "Pakua Kiolezo cha CSV cha Uingizaji",
|
||||
"edit" => "Hariri",
|
||||
"email" => "Barua Pepe",
|
||||
"email_invalid_format" => "Anwani ya barua pepe si katika muundo sahihi.",
|
||||
"export_csv" => "Hamisha CSV",
|
||||
"export_csv_no" => "Hapana",
|
||||
"export_csv_yes" => "Ndiyo",
|
||||
"fields_required_message" => "Sehemu zilizo na rangi nyekundu ni za lazima",
|
||||
"fields_required_message_unique" => "",
|
||||
"first_name" => "Jina la Kwanza",
|
||||
"first_name_required" => "Jina la kwanza ni kiashiria kinachohitajika.",
|
||||
"first_page" => "Kwanza",
|
||||
"gender" => "Jinsia",
|
||||
"gender_female" => "K",
|
||||
"gender_male" => "M",
|
||||
"gender_undefined" => "",
|
||||
"icon" => "Icon",
|
||||
"id" => "ID",
|
||||
"import" => "Ingiza",
|
||||
"import_change_file" => "Badilisha",
|
||||
"import_csv" => "Ingiza CSV",
|
||||
"import_full_path" => "Njia kamili ya faili ya CSV inahitajika",
|
||||
"import_remove_file" => "Ondoa",
|
||||
"import_select_file" => "Chagua faili",
|
||||
"inv" => "Ankara",
|
||||
"last_name" => "Jina la Mwisho",
|
||||
"last_name_required" => "Jina la mwisho ni kiashiria kinachohitajika.",
|
||||
"last_page" => "Mwisho",
|
||||
"learn_about_project" => "kujua taarifa za hivi karibuni kuhusu mradi.",
|
||||
"list_of" => "Orodha ya",
|
||||
"logo" => "Nembo",
|
||||
"logo_mark" => "Alama",
|
||||
"logout" => "",
|
||||
"manager" => "",
|
||||
"migration_needed" => "",
|
||||
"new" => "Mpya",
|
||||
"no" => "Hapana",
|
||||
"no_persons_to_display" => "Hakuna watu wa kuonyesha.",
|
||||
"none_selected_text" => "[Chagua]",
|
||||
"or" => "AU",
|
||||
"people" => "",
|
||||
"phone_number" => "Namba ya Simu",
|
||||
"phone_number_required" => "",
|
||||
"please_visit_my" => "Tafadhali tembelea",
|
||||
"position" => "",
|
||||
"powered_by" => "Imewezeshwa na",
|
||||
"price" => "Bei",
|
||||
"print" => "Chapisha",
|
||||
"remove" => "Ondoa",
|
||||
"required" => "Lazima",
|
||||
"restore" => "Rejesha",
|
||||
"return_policy" => "Sera ya Kurudisha",
|
||||
"search" => "Tafuta",
|
||||
"search_options" => "Chaguo za Utafutaji",
|
||||
"searched_for" => "Umetafuta",
|
||||
"software_short" => "OSPOS",
|
||||
"software_title" => "Open Source Point of Sale",
|
||||
"state" => "Jimbo",
|
||||
"submit" => "Wasilisha",
|
||||
"total_spent" => "Jumla Iliyotumika",
|
||||
"unknown" => "Haijulikani",
|
||||
"view_recent_sales" => "Angalia Mauzo ya Hivi Karibuni",
|
||||
"website" => "opensourcepos.org",
|
||||
"welcome" => "Karibu",
|
||||
"welcome_message" => "Karibu OSPOS, bonyeza moduli hapa chini kuanza.",
|
||||
"yes" => "Ndiyo",
|
||||
"you_are_using_ospos" => "",
|
||||
"zip" => "Namba ya Posta",
|
||||
];
|
||||
331
app/Language/sw-KE/Config.php
Normal file
331
app/Language/sw-KE/Config.php
Normal file
@@ -0,0 +1,331 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"address" => "Anwani ya Kampuni",
|
||||
"address_required" => "Anwani ya kampuni ni kiashiria kinachohitajika.",
|
||||
"all_set" => "Ruhusa zote za faili zimewekwa vizuri!",
|
||||
"allow_duplicate_barcodes" => "Ruhusu Misimbomstari iliyorudiwa",
|
||||
"apostrophe" => "apostrofi",
|
||||
"backup_button" => "Hifadhi Nakala",
|
||||
"backup_database" => "Hifadhi Nakala ya Hifadhidata",
|
||||
"barcode" => "Msimbo wa Mstari",
|
||||
"barcode_company" => "Jina la Kampuni",
|
||||
"barcode_configuration" => "Mpangilio wa Msimbomstari",
|
||||
"barcode_content" => "Yaliyomo kwenye Msimbomstari",
|
||||
"barcode_first_row" => "Safu 1",
|
||||
"barcode_font" => "Aina ya Herufi",
|
||||
"barcode_formats" => "Aina za Uingizaji",
|
||||
"barcode_generate_if_empty" => "Tengeneza ikiwa tupu.",
|
||||
"barcode_height" => "Urefu (px)",
|
||||
"barcode_id" => "Id ya Bidhaa/Jina",
|
||||
"barcode_info" => "Taarifa za Mpangilio wa Msimbomstari",
|
||||
"barcode_layout" => "Mpangilio wa Msimbomstari",
|
||||
"barcode_name" => "Jina",
|
||||
"barcode_number" => "Msimbomstari",
|
||||
"barcode_number_in_row" => "Idadi kwenye safu",
|
||||
"barcode_page_cellspacing" => "Onyesha nafasi kati ya seli za ukurasa.",
|
||||
"barcode_page_width" => "Onyesha upana wa ukurasa",
|
||||
"barcode_price" => "Bei",
|
||||
"barcode_second_row" => "Safu 2",
|
||||
"barcode_third_row" => "Safu 3",
|
||||
"barcode_tooltip" => "Tahadhari: Kipengele hiki kinaweza kusababisha kurudiwa kwa bidhaa zilizoingizwa au kuundwa. Usitumie ikiwa hutaki Msimbomstari(Barcode) zilizorudiwa.",
|
||||
"barcode_type" => "Aina ya Msimbomstari",
|
||||
"barcode_width" => "Upana (px)",
|
||||
"bottom" => "Chini",
|
||||
"cash_button" => "",
|
||||
"cash_button_1" => "",
|
||||
"cash_button_2" => "",
|
||||
"cash_button_3" => "",
|
||||
"cash_button_4" => "",
|
||||
"cash_button_5" => "",
|
||||
"cash_button_6" => "",
|
||||
"cash_decimals" => "Desimali za Fedha Taslimu",
|
||||
"cash_decimals_tooltip" => "Ikiwa Desimali za Fedha Taslimu na Desimali za Sarafu ni sawa basi hakuna mzunguko wa fedha taslimu utakaofanyika, isipokuwa Mzunguko wa Fedha Taslimu umewekwa kwenye Nusu Tano.",
|
||||
"cash_rounding" => "Mzunguko wa Fedha Taslimu",
|
||||
"category_dropdown" => "Onyesha Kategoria kama orodha ya kushuka",
|
||||
"center" => "Katikati",
|
||||
"change_apperance_tooltip" => "",
|
||||
"comma" => "koma",
|
||||
"company" => "Jina la Kampuni",
|
||||
"company_avatar" => "",
|
||||
"company_change_image" => "Badilisha Picha",
|
||||
"company_logo" => "Nembo ya Kampuni",
|
||||
"company_remove_image" => "Ondoa Picha",
|
||||
"company_required" => "Jina la kampuni ni kiashiria kinachohitajika",
|
||||
"company_select_image" => "Chagua Picha",
|
||||
"company_website_url" => "Tovuti ya kampuni si URL halali (http://...).",
|
||||
"country_codes" => "Msimbo wa Nchi",
|
||||
"country_codes_tooltip" => "Orodha ya misimbo ya nchi zilizotenganishwa kwa koma kwa utafutaji wa anwani wa uteuzi.",
|
||||
"currency_code" => "Nambari ya Sarafu",
|
||||
"currency_decimals" => "Desimali za Sarafu",
|
||||
"currency_symbol" => "Alama ya Sarafu",
|
||||
"current_employee_only" => "",
|
||||
"customer_reward" => "Zawadi",
|
||||
"customer_reward_duplicate" => "Zawadi lazima iwe ya kipekee.",
|
||||
"customer_reward_enable" => "Washa Zawadi kwa Wateja",
|
||||
"customer_reward_invalid_chars" => "Zawadi haiwezi kuwa na '_'",
|
||||
"customer_reward_required" => "Zawadi ni kiashiria kinachohitajika",
|
||||
"customer_sales_tax_support" => "",
|
||||
"date_or_time_format" => "Kichujio cha Tarehe na Muda",
|
||||
"datetimeformat" => "Muundo wa Tarehe na Muda",
|
||||
"decimal_point" => "Nukta ya Desimali",
|
||||
"default_barcode_font_size_number" => "Ukubwa wa herufi wa Msimbomstari lazima uwe nambari.",
|
||||
"default_barcode_font_size_required" => "Ukubwa wa herufi wa Msimbomstari ni kiashiria kinachohitajika.",
|
||||
"default_barcode_height_number" => "Urefu wa Msimbomstari lazima uwe nambari.",
|
||||
"default_barcode_height_required" => "Urefu wa Msimbomstari ni kiashiria kinachohitajika.",
|
||||
"default_barcode_num_in_row_number" => "Idadi ya Msimbomstari kwenye safu lazima iwe nambari.",
|
||||
"default_barcode_num_in_row_required" => "Idadi ya Msimbomstari kwenye safu ni kiashiria kinachohitajika.",
|
||||
"default_barcode_page_cellspacing_number" => "Nafasi kati ya chumba cha ukurasa wa Msimbomstari lazima iwe nambari.",
|
||||
"default_barcode_page_cellspacing_required" => "Nafasi kati ya chumba cha ukurasa wa Msimbomstari ni kiashiria kinachohitajika.",
|
||||
"default_barcode_page_width_number" => "Upana wa ukurasa wa Msimbomstari lazima uwe nambari.",
|
||||
"default_barcode_page_width_required" => "Upana wa ukurasa wa Msimbomstari ni kiashiria kinachohitajika.",
|
||||
"default_barcode_width_number" => "Upana wa Msimbomstari lazima uwe nambari.",
|
||||
"default_barcode_width_required" => "Upana wa Msimbomstari ni kiashiria kinachohitajika.",
|
||||
"default_item_columns" => "Safu wima za Bidhaa Zinazoonekana Kwa Chaguo-msingi",
|
||||
"default_origin_tax_code" => "Nambari ya Kodi ya Asili kwa Chaguo-msingi",
|
||||
"default_receivings_discount" => "Punguzo la Manunuzi kwa Chaguo-msingi",
|
||||
"default_receivings_discount_number" => "Punguzo la Manunuzi kwa Chaguo-msingi lazima liwe nambari.",
|
||||
"default_receivings_discount_required" => "Punguzo la Manunuzi kwa Chaguo-msingi ni kiashiria kinachohitajika.",
|
||||
"default_sales_discount" => "Punguzo la Mauzo kwa Chaguo-msingi",
|
||||
"default_sales_discount_number" => "Punguzo la Mauzo kwa Chaguo-msingi lazima liwe nambari.",
|
||||
"default_sales_discount_required" => "Punguzo la Mauzo kwa Chaguo-msingi ni kiashiria kinachohitajika.",
|
||||
"default_tax_category" => "Aina ya Kodi kwa Chaguo-msingi",
|
||||
"default_tax_code" => "Nambari ya Kodi kwa Chaguo-msingi",
|
||||
"default_tax_jurisdiction" => "Eneo la Kodi kwa Chaguo-msingi",
|
||||
"default_tax_name_number" => "Jina la Kodi lazima liwe maandishi.",
|
||||
"default_tax_name_required" => "Jina la Kodi ni kiashiria kinachohitajika.",
|
||||
"default_tax_rate" => "Kiwango cha Kodi kwa Chaguo-msingi %",
|
||||
"default_tax_rate_1" => "Kiwango cha Kodi 1",
|
||||
"default_tax_rate_2" => "Kiwango cha Kodi 2",
|
||||
"default_tax_rate_3" => "",
|
||||
"default_tax_rate_number" => "Kiwango cha Kodi kwa Chaguo-msingi lazima kiwe nambari.",
|
||||
"default_tax_rate_required" => "Kiwango cha Kodi kwa Chaguo-msingi ni kiashiria kinachohitajika.",
|
||||
"derive_sale_quantity" => "Ruhusu Kiasi cha Mauzo Kilichotokana",
|
||||
"derive_sale_quantity_tooltip" => "Ikiwa imechaguliwa basi aina mpya ya bidhaa itatolewa kwa bidhaa zilizoagizwa kwa kiasi kilichoongezwa",
|
||||
"dinner_table" => "Jedwali",
|
||||
"dinner_table_duplicate" => "Jedwali lazima iwe ya kipekee.",
|
||||
"dinner_table_enable" => "Washa Jedwali za Chakula",
|
||||
"dinner_table_invalid_chars" => "Jina la Jedwali haliwezi kuwa na '_'.",
|
||||
"dinner_table_required" => "Jedwali ni kiashiria kinachohitajika.",
|
||||
"dot" => "nukta",
|
||||
"email" => "Barua Pepe",
|
||||
"email_configuration" => "Mpangilio wa Barua Pepe",
|
||||
"email_mailpath" => "Njia ya Sendmail",
|
||||
"email_protocol" => "Itifaki",
|
||||
"email_receipt_check_behaviour" => "Kisanduku cha Risiti ya Barua Pepe",
|
||||
"email_receipt_check_behaviour_always" => "Daima imechaguliwa",
|
||||
"email_receipt_check_behaviour_last" => "Kumbuka chaguo la mwisho",
|
||||
"email_receipt_check_behaviour_never" => "Daima haijachaguliwa",
|
||||
"email_smtp_crypto" => "Usimbaji wa SMTP",
|
||||
"email_smtp_host" => "Seva ya SMTP",
|
||||
"email_smtp_pass" => "Nenosiri la SMTP",
|
||||
"email_smtp_port" => "Lango la SMTP",
|
||||
"email_smtp_timeout" => "Muda wa SMTP kuisha",
|
||||
"email_smtp_user" => "Jina la Mtumiaji la SMTP",
|
||||
"enable_avatar" => "",
|
||||
"enable_avatar_tooltip" => "",
|
||||
"enable_dropdown_tooltip" => "",
|
||||
"enable_new_look" => "",
|
||||
"enable_right_bar" => "",
|
||||
"enable_right_bar_tooltip" => "",
|
||||
"enforce_privacy" => "Lazimisha Faragha",
|
||||
"enforce_privacy_tooltip" => "Linda faragha ya Wateja kwa kulazimisha kuchanganya data endapo data zao zitafutwa",
|
||||
"fax" => "Faksi",
|
||||
"file_perm" => "Kuna matatizo na ruhusa za faili. Tafadhali rekebisha na upakie upya ukurasa huu.",
|
||||
"financial_year" => "Mwanzo wa Mwaka wa Fedha",
|
||||
"financial_year_apr" => "1 Aprili",
|
||||
"financial_year_aug" => "1 Agosti",
|
||||
"financial_year_dec" => "1 Desemba",
|
||||
"financial_year_feb" => "1 Februari",
|
||||
"financial_year_jan" => "1 Januari",
|
||||
"financial_year_jul" => "1 Julai",
|
||||
"financial_year_jun" => "1 Juni",
|
||||
"financial_year_mar" => "1 Machi",
|
||||
"financial_year_may" => "1 Mei",
|
||||
"financial_year_nov" => "1 Novemba",
|
||||
"financial_year_oct" => "1 Oktoba",
|
||||
"financial_year_sep" => "1 Septemba",
|
||||
"floating_labels" => "Lebo Zinazoelea",
|
||||
"gcaptcha_enable" => "Ukurasa wa Ingia reCAPTCHA",
|
||||
"gcaptcha_secret_key" => "Funguo ya Siri ya reCAPTCHA",
|
||||
"gcaptcha_secret_key_required" => "Funguo ya Siri ya reCAPTCHA ni kiashiria kinachohitajika",
|
||||
"gcaptcha_site_key" => "Funguo ya Tovuti ya reCAPTCHA",
|
||||
"gcaptcha_site_key_required" => "Funguo ya Tovuti ya reCAPTCHA ni kiashiria kinachohitajika",
|
||||
"gcaptcha_tooltip" => "Linda ukurasa wa Ingia kwa Google reCAPTCHA, bonyeza ikoni kupata jozi ya funguo za API.",
|
||||
"general" => "Jumla",
|
||||
"general_configuration" => "Mpangilio wa Jumla",
|
||||
"giftcard_number" => "Nambari ya Kadi ya Zawadi",
|
||||
"giftcard_random" => "Tengeneza kwa Nasibu",
|
||||
"giftcard_series" => "Tengeneza kwa Mfululizo",
|
||||
"image_allowed_file_types" => "Aina za faili zinazoruhusiwa",
|
||||
"image_max_height_tooltip" => "Urefu wa juu wa picha zinazopakiwa kwa pikseli (px).",
|
||||
"image_max_size_tooltip" => "Ukubwa wa juu wa faili za picha zinazopakiwa kwa kilobaiti (kb).",
|
||||
"image_max_width_tooltip" => "Upana wa juu wa picha zinazopakiwa kwa pikseli (px).",
|
||||
"image_restrictions" => "Vizuizi vya Upakiaji wa Picha",
|
||||
"include_hsn" => "Jumuisha Msaada wa Nambari za HSN",
|
||||
"info" => "Taarifa",
|
||||
"info_configuration" => "Taarifa za Duka",
|
||||
"input_groups" => "Makundi ya Uingizaji",
|
||||
"integrations" => "Muunganiko",
|
||||
"integrations_configuration" => "Muunganiko wa Watu wengine",
|
||||
"invoice" => "Ankara",
|
||||
"invoice_configuration" => "Mpangilio wa Uchapishaji wa Ankara",
|
||||
"invoice_default_comments" => "Maoni ya Chaguo-msingi ya Ankara",
|
||||
"invoice_email_message" => "Kiolezo cha Barua Pepe ya Ankara",
|
||||
"invoice_enable" => "Washa Utoaji wa Ankara",
|
||||
"invoice_printer" => "Kichapishi cha Ankara",
|
||||
"invoice_type" => "Aina ya Ankara",
|
||||
"is_readable" => "inasomeka, lakini ruhusa zimewekwa vibaya. Tafadhali weka 640 au 660 na upakie upya.",
|
||||
"is_writable" => "inaandikika, lakini ruhusa zimewekwa vibaya. Tafadhali weka 750 na upakie upya.",
|
||||
"item_markup" => "",
|
||||
"jsprintsetup_required" => "Tahadhari: Kipengele hiki kitafanya kazi tu ikiwa una kiendelezi cha FireFox jsPrintSetup kimewekwa. Hifadhi hata hivyo?",
|
||||
"language" => "Lugha",
|
||||
"last_used_invoice_number" => "Nambari ya mwisho ya Ankara iliyotumika",
|
||||
"last_used_quote_number" => "Nambari ya mwisho ya Nukuu iliyotumika",
|
||||
"last_used_work_order_number" => "Nambari ya mwisho ya Agizo la Kazi iliyotumika",
|
||||
"left" => "Kushoto",
|
||||
"license" => "Leseni",
|
||||
"license_configuration" => "Taarifa ya Leseni",
|
||||
"line_sequence" => "Mpangilio wa Mistari",
|
||||
"lines_per_page" => "Mistari kwa Kila Ukurasa",
|
||||
"lines_per_page_number" => "Mistari kwa Kila Ukurasa lazima iwe nambari.",
|
||||
"lines_per_page_required" => "Mistari kwa Kila Ukurasa ni kiashiria kinachohitajika.",
|
||||
"locale" => "Ujanibishaji",
|
||||
"locale_configuration" => "Mpangilio wa Ujanibishaji",
|
||||
"locale_info" => "Taarifa za Mpangilio wa Ujanibishaji",
|
||||
"location" => "Stoo",
|
||||
"location_configuration" => "Maeneo ya Stoo",
|
||||
"location_info" => "Taarifa za Mpangilio wa Stoo",
|
||||
"login_form" => "Aina ya Fomu ya Ingia",
|
||||
"logout" => "Unataka kufanya hifadhi nakala kabla ya kutoka? Bonyeza [Sawa] kuhifadhi au [Ghairi] kutoka.",
|
||||
"mailchimp" => "MailChimp",
|
||||
"mailchimp_api_key" => "Funguo ya API ya MailChimp",
|
||||
"mailchimp_configuration" => "Mpangilio wa MailChimp",
|
||||
"mailchimp_key_successfully" => "Funguo ya API ni sahihi.",
|
||||
"mailchimp_key_unsuccessfully" => "Funguo ya API si sahihi.",
|
||||
"mailchimp_lists" => "Orodha za MailChimp",
|
||||
"mailchimp_tooltip" => "Bonyeza ikoni kupata Funguo ya API.",
|
||||
"message" => "Ujumbe",
|
||||
"message_configuration" => "Mpangilio wa Ujumbe",
|
||||
"msg_msg" => "Ujumbe wa SMS uliohifadhiwa",
|
||||
"msg_msg_placeholder" => "Ikiwa unataka kutumia kiolezo cha SMS hifadhi ujumbe wako hapa, vinginevyo acha kisanduku wazi.",
|
||||
"msg_pwd" => "Nenosiri la SMS-API",
|
||||
"msg_pwd_required" => "Nenosiri la SMS-API ni kiashiria kinachohitajika",
|
||||
"msg_src" => "ID ya Mtumaji wa SMS-API",
|
||||
"msg_src_required" => "ID ya Mtumaji wa SMS-API ni kiashiria kinachohitajika",
|
||||
"msg_uid" => "Jina la Mtumiaji la SMS-API",
|
||||
"msg_uid_required" => "Jina la Mtumiaji la SMS-API ni kiashiria kinachohitajika",
|
||||
"multi_pack_enabled" => "Vifurushi Vingi kwa Kila Bidhaa",
|
||||
"no_risk" => "Hakuna hatari za usalama/udhaifu.",
|
||||
"none" => "hakuna",
|
||||
"notify_alignment" => "Nafasi ya Taarifa Ibukizi",
|
||||
"number_format" => "Muundo wa Nambari",
|
||||
"number_locale" => "Ujanibishaji",
|
||||
"number_locale_invalid" => "Ujanibishaji uliyoingiza si sahihi. Angalia kiungo kwenye kidokezo kupata Ujanibishaji sahihi.",
|
||||
"number_locale_required" => "Ujanibishaji ya Nambari ni kiashiria kinachohitajika.",
|
||||
"number_locale_tooltip" => "Tafuta Ujanibishaji inayofaa kupitia kiungo hiki.",
|
||||
"os_timezone" => "Saa ya OSPOS:",
|
||||
"ospos_info" => "Taarifa za Usakinishaji wa OSPOS",
|
||||
"payment_options_order" => "Mpangilio wa Chaguo za Malipo",
|
||||
"perm_risk" => "Ruhusa zisizo sahihi zinaacha programu hii kwenye hatari.",
|
||||
"phone" => "Namba ya simu ya Kampuni",
|
||||
"phone_required" => "Namba ya simu ya Kampuni ni kiashiria kinachohitajika.",
|
||||
"print_bottom_margin" => "Pembe ya Chini",
|
||||
"print_bottom_margin_number" => "Pembe ya Chini lazima iwe nambari.",
|
||||
"print_bottom_margin_required" => "Pembe ya Chini ni kiashiria kinachohitajika.",
|
||||
"print_delay_autoreturn" => "Muda wa Kurudi Moja kwa Moja kwenye Mauzo",
|
||||
"print_delay_autoreturn_number" => "Muda wa Kurudi Moja kwa Moja kwenye Mauzo ni kiashiria kinachohitajika.",
|
||||
"print_delay_autoreturn_required" => "Muda wa Kurudi Moja kwa Moja kwenye Mauzo lazima uwe nambari.",
|
||||
"print_footer" => "Chapisha Kijachini cha Kivinjari",
|
||||
"print_header" => "Chapisha Kijuu cha Kivinjari",
|
||||
"print_left_margin" => "Pembe ya Kushoto",
|
||||
"print_left_margin_number" => "Pembe ya Kushoto lazima iwe nambari.",
|
||||
"print_left_margin_required" => "Pembe ya Kushoto ni kiashiria kinachohitajika.",
|
||||
"print_receipt_check_behaviour" => "Kisanduku cha Risiti ya Kuchapisha",
|
||||
"print_receipt_check_behaviour_always" => "Daima imechaguliwa",
|
||||
"print_receipt_check_behaviour_last" => "Kumbuka chaguo la mwisho",
|
||||
"print_receipt_check_behaviour_never" => "Daima haijachaguliwa",
|
||||
"print_right_margin" => "Pembe ya Kulia",
|
||||
"print_right_margin_number" => "Pembe ya Kulia lazima iwe nambari.",
|
||||
"print_right_margin_required" => "Pembe ya Kulia ni kiashiria kinachohitajika.",
|
||||
"print_silently" => "Onyesha Dirisha la Kuchapisha",
|
||||
"print_top_margin" => "Pembe ya Juu",
|
||||
"print_top_margin_number" => "Pembe ya Juu lazima iwe nambari.",
|
||||
"print_top_margin_required" => "Pembe ya Juu ni kiashiria kinachohitajika.",
|
||||
"quantity_decimals" => "Desimali za Kiasi",
|
||||
"quick_cash_enable" => "",
|
||||
"quote_default_comments" => "Maoni ya Chaguo-msingi la Nukuu",
|
||||
"receipt" => "Risiti",
|
||||
"receipt_category" => "",
|
||||
"receipt_configuration" => "Mpangilio wa Uchapishaji wa Risiti",
|
||||
"receipt_default" => "Chaguo-msingi",
|
||||
"receipt_font_size" => "Ukubwa wa Herufi",
|
||||
"receipt_font_size_number" => "Ukubwa wa Herufi lazima uwe nambari.",
|
||||
"receipt_font_size_required" => "Ukubwa wa Herufi ni kiashiria kinachohitajika.",
|
||||
"receipt_info" => "Taarifa za Mpangilio wa Risiti",
|
||||
"receipt_printer" => "Kichapishi cha Tiketi",
|
||||
"receipt_short" => "Fupi",
|
||||
"receipt_show_company_name" => "Onyesha Jina la Kampuni",
|
||||
"receipt_show_description" => "Onyesha Maelezo",
|
||||
"receipt_show_serialnumber" => "Onyesha Serial Number",
|
||||
"receipt_show_tax_ind" => "Onyesha Kiashiria cha Kodi",
|
||||
"receipt_show_taxes" => "Onyesha Kodi",
|
||||
"receipt_show_total_discount" => "Onyesha Jumla ya Punguzo",
|
||||
"receipt_template" => "Kiolezo cha Risiti",
|
||||
"receiving_calculate_average_price" => "Hesabu Bei ya wastani (Manunuzi)",
|
||||
"recv_invoice_format" => "Muundo wa Ankara ya Manunuzi",
|
||||
"register_mode_default" => "Hali ya Usajili kwa Chaguo-msingi",
|
||||
"report_an_issue" => "Ripoti tatizo",
|
||||
"return_policy_required" => "Return Policy ni kiashiria kinachohitajika.",
|
||||
"reward" => "Zawadi",
|
||||
"reward_configuration" => "Mpangilio wa Zawadi",
|
||||
"right" => "Kulia",
|
||||
"sales_invoice_format" => "Muundo wa Ankara ya Mauzo",
|
||||
"sales_quote_format" => "Muundo wa Nukuu ya Mauzo",
|
||||
"saved_successfully" => "Mpangilio umehifadhiwa kwa mafanikio.",
|
||||
"saved_unsuccessfully" => "Mpangilio umeshindwa kuhifadhiwa.",
|
||||
"security_issue" => "Onyo la Udhaifu wa Usalama",
|
||||
"server_notice" => "Tafadhali tumia taarifa zilizo hapa chini kuripoti tatizo.",
|
||||
"service_charge" => "",
|
||||
"show_due_enable" => "",
|
||||
"show_office_group" => "Onyesha ikoni ya ofisi",
|
||||
"statistics" => "Tuma Takwimu",
|
||||
"statistics_tooltip" => "Tuma takwimu kwa madhumuni ya maendeleo na uboreshaji wa vipengele.",
|
||||
"stock_location" => "Stoo",
|
||||
"stock_location_duplicate" => "Stoo lazima iwe ya kipekee.",
|
||||
"stock_location_invalid_chars" => "Stoo haiwezi kuwa na '_'.",
|
||||
"stock_location_required" => "Stoo ni kiashiria kinachohitajika.",
|
||||
"suggestions_fifth_column" => "",
|
||||
"suggestions_first_column" => "Safu wima 1",
|
||||
"suggestions_fourth_column" => "",
|
||||
"suggestions_layout" => "Mpangilio wa Mapendekezo ya Utafutaji",
|
||||
"suggestions_second_column" => "Safu wima 2",
|
||||
"suggestions_third_column" => "Safu wima 3",
|
||||
"system_conf" => "Usanidi & Mpangilio",
|
||||
"system_info" => "Taarifa za Mfumo",
|
||||
"table" => "Jedwali",
|
||||
"table_configuration" => "Jedwali la Mpangilio",
|
||||
"takings_printer" => "Kichapishi cha Risiti",
|
||||
"tax" => "Kodi",
|
||||
"tax_category" => "Aina ya Kodi",
|
||||
"tax_category_duplicate" => "Aina ya kodi uliyoingiza tayari ipo.",
|
||||
"tax_category_invalid_chars" => "Aina ya kodi uliyoingiza si sahihi.",
|
||||
"tax_category_required" => "Aina ya kodi ni lazima.",
|
||||
"tax_category_used" => "Aina ya kodi haiwezi kufutwa kwa sababu inatumika.",
|
||||
"tax_configuration" => "Mpangilio wa Kodi",
|
||||
"tax_decimals" => "Desimali za Kodi",
|
||||
"tax_id" => "Nambari ya Kodi",
|
||||
"tax_included" => "Kodi Imejumuishwa",
|
||||
"theme" => "Mandhari",
|
||||
"theme_preview" => "Onyesha Mandhari:",
|
||||
"thousands_separator" => "Kitenganishi cha Maelfu",
|
||||
"timezone" => "Saa za Eneo",
|
||||
"timezone_error" => "Saa za OSPOS ni tofauti na Saa za Eneo lako.",
|
||||
"top" => "Juu",
|
||||
"use_destination_based_tax" => "Tumia Kodi ya Kulingana na Eneo",
|
||||
"user_timezone" => "Saa za Eneo lako:",
|
||||
"website" => "Tovuti",
|
||||
"wholesale_markup" => "",
|
||||
"work_order_enable" => "Msaada wa Agizo la Kazi",
|
||||
"work_order_format" => "Muundo wa Agizo la Kazi",
|
||||
];
|
||||
57
app/Language/sw-KE/Customers.php
Normal file
57
app/Language/sw-KE/Customers.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"account_number" => "Nambari ya Akaunti",
|
||||
"account_number_duplicate" => "Nambari ya Akaunti tayari ipo kwenye kanzidata.",
|
||||
"available_points" => "Pointi Zinazopatikana",
|
||||
"available_points_value" => "",
|
||||
"average" => "Wastani wa matumizi",
|
||||
"avg_discount" => "Wastani wa punguzo",
|
||||
"basic_information" => "Taarifa za Msingi",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta wateja waliochaguliwa, mmoja au zaidi tayari ana mauzo.",
|
||||
"company_name" => "Kampuni",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta mteja/wateja waliochaguliwa?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha mteja/wateja waliochaguliwa?",
|
||||
"consent" => "Idhini ya Usajili",
|
||||
"consent_required" => "Idhini ya usajili ni shamba linalohitajika.",
|
||||
"csv_import_failed" => "Uingizaji wa CSV umeshindikana",
|
||||
"csv_import_nodata_wrongformat" => "Faili iliyopakiwa haina data au imepangwa vibaya.",
|
||||
"csv_import_partially_failed" => "Uingizaji wa wateja umefanikiwa na baadhi ya makosa:",
|
||||
"csv_import_success" => "Uingizaji wa wateja umefanikiwa.",
|
||||
"customer" => "Mteja",
|
||||
"date" => "Tarehe",
|
||||
"discount" => "Punguzo",
|
||||
"discount_fixed" => "Punguzo la Kudumu",
|
||||
"discount_percent" => "Punguzo la Asilimia",
|
||||
"discount_type" => "Aina ya Punguzo",
|
||||
"email_duplicate" => "Barua pepe tayari ipo kwenye kanzidata.",
|
||||
"employee" => "Mfanyakazi",
|
||||
"error_adding_updating" => "Kuongeza au kusasisha mteja kimeshindikana.",
|
||||
"import_items_csv" => "Ingiza Wateja kutoka CSV",
|
||||
"mailchimp_activity_click" => "Bofya Barua Pepe",
|
||||
"mailchimp_activity_lastopen" => "Barua Pepe ya Mwisho Kufunguliwa",
|
||||
"mailchimp_activity_open" => "Barua Pepe Zilizofunguliwa",
|
||||
"mailchimp_activity_total" => "Barua Pepe Zilizotumwa",
|
||||
"mailchimp_activity_unopen" => "Barua Pepe Zisizofunguliwa",
|
||||
"mailchimp_email_client" => "Mteja wa Barua Pepe",
|
||||
"mailchimp_info" => "MailChimp",
|
||||
"mailchimp_member_rating" => "Tathmini",
|
||||
"mailchimp_status" => "Hadhi",
|
||||
"mailchimp_vip" => "VIP",
|
||||
"max" => "Matumizi ya Juu",
|
||||
"min" => "Matumizi ya Chini",
|
||||
"new" => "Mteja Mpya",
|
||||
"none_selected" => "Hujachagua mteja/wateja wa kufuta.",
|
||||
"one_or_multiple" => "Mteja/wateja",
|
||||
"quantity" => "Kiasi",
|
||||
"stats_info" => "Takwimu",
|
||||
"successful_adding" => "Umefanikiwa kuongeza mteja",
|
||||
"successful_deleted" => "Umefanikiwa kufuta",
|
||||
"successful_updating" => "Umefanikiwa kusasisha mteja",
|
||||
"tax_code" => "Nambari ya Kodi",
|
||||
"tax_id" => "Kitambulisho cha Kodi",
|
||||
"taxable" => "Inatozwa Kodi",
|
||||
"total" => "Jumla ya matumizi",
|
||||
"update" => "Sasisha Mteja",
|
||||
"rewards_package" => "Kifurushi cha Zawadi",
|
||||
];
|
||||
24
app/Language/sw-KE/Datepicker.php
Normal file
24
app/Language/sw-KE/Datepicker.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"all_time" => "Wakati Wote",
|
||||
"apply" => "Weka",
|
||||
"cancel" => "Ghairi",
|
||||
"custom" => "Maalum",
|
||||
"from" => "Kutoka",
|
||||
"last_30" => "Siku 30 Zilizopita",
|
||||
"last_7" => "Siku 7 Zilizopita",
|
||||
"last_financial_year" => "Mwaka wa Fedha Uliopita",
|
||||
"last_month" => "Mwezi Uliopita",
|
||||
"last_year" => "Mwaka Uliopita",
|
||||
"same_month_last_year" => "Mwezi huu Mwaka Uliopita",
|
||||
"same_month_to_same_day_last_year" => "Mwezi huu hadi Siku hii Mwaka Uliopita",
|
||||
"this_financial_year" => "Mwaka wa Fedha wa Sasa",
|
||||
"this_month" => "Mwezi wa Sasa",
|
||||
"this_year" => "Mwaka wa Sasa",
|
||||
"to" => "Hadi",
|
||||
"today" => "Leo",
|
||||
"today_last_year" => "Leo Mwaka Uliopita",
|
||||
"weekstart" => "0",
|
||||
"yesterday" => "Jana",
|
||||
];
|
||||
45
app/Language/sw-KE/Employees.php
Normal file
45
app/Language/sw-KE/Employees.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"administrator" => "",
|
||||
"basic_information" => "Taarifa za Msingi",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta M/Wafanyakazi aliyechaguliwa, mmoja au zaidi ameshashughulikia mauzo au unajaribu kufuta akaunti yako.",
|
||||
"change_employee" => "",
|
||||
"change_password" => "Badilisha Nenosiri",
|
||||
"clerk" => "",
|
||||
"commission" => "",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta mfanyakazi aliyechaguliwa?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Mfanyakazi/Wafanyakazi aliyechaguliwa?",
|
||||
"current_password" => "Nenosiri la Sasa",
|
||||
"current_password_invalid" => "Nenosiri la sasa si sahihi.",
|
||||
"employee" => "Mfanyakazi",
|
||||
"error_adding_updating" => "Kuongeza au kusasisha mfanyakazi kumeshindikana.",
|
||||
"error_deleting_demo_admin" => "Huwezi kufuta mtumiaji wa admin wa majaribio.",
|
||||
"error_updating_demo_admin" => "Huwezi kubadilisha mtumiaji wa admin wa majaribio.",
|
||||
"language" => "Lugha",
|
||||
"login_info" => "Ingia",
|
||||
"manager" => "",
|
||||
"new" => "Mfanyakazi Mpya",
|
||||
"none_selected" => "Hujachagua Mfanyakazi/Wafanyakazi yeyote wa kufuta.",
|
||||
"one_or_multiple" => "Mfanyakazi/Wafanyakazi",
|
||||
"password" => "Nenosiri",
|
||||
"password_minlength" => "Nenosiri lazima liwe na angalau herufi 8.",
|
||||
"password_must_match" => "Manenosiri hayafanani.",
|
||||
"password_not_must_match" => "Nenosiri la sasa na jipya lazima liwe tofauti.",
|
||||
"password_required" => "Nenosiri linahitajika.",
|
||||
"permission_desc" => "Chagua visanduku hapa chini kutoa ruhusa kwa moduli.",
|
||||
"permission_info" => "Ruhusa",
|
||||
"repeat_password" => "Rudia Nenosiri",
|
||||
"subpermission_required" => "Ongeza angalau ruhusa moja kwa kila moduli.",
|
||||
"successful_adding" => "Umefanikiwa kuongeza mfanyakazi.",
|
||||
"successful_change_password" => "Umefanikiwa kubadili nenosiri.",
|
||||
"successful_deleted" => "Umefanikiwa kufuta",
|
||||
"successful_updating" => "Umefanikiwa kusasisha mfanyakazi",
|
||||
"system_language" => "Lugha ya Mfumo",
|
||||
"unsuccessful_change_password" => "Imeshindikana kubadili Nenosiri.",
|
||||
"update" => "Sasisha Mfanyakazi",
|
||||
"username" => "Jina la Mtumiaji",
|
||||
"username_duplicate" => "Jina la mtumiaji tayari linatumika. Tafadhali chagua lingine.",
|
||||
"username_minlength" => "Jina la mtumiaji lazima liwe na angalau herufi 5.",
|
||||
"username_required" => "Jina la mtumiaji ni lazima.",
|
||||
];
|
||||
11
app/Language/sw-KE/Enum.php
Normal file
11
app/Language/sw-KE/Enum.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"half_down" => "Nusu Chini",
|
||||
"half_even" => "Nusu Shufwa",
|
||||
"half_five" => "Nusu Tano",
|
||||
"half_odd" => "Nusu Witiri",
|
||||
"half_up" => "Nusu Juu",
|
||||
"round_down" => "Punguza",
|
||||
"round_up" => "Ongeza",
|
||||
];
|
||||
6
app/Language/sw-KE/Error.php
Normal file
6
app/Language/sw-KE/Error.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"no_permission_module" => "Huna ruhusa ya kufikia moduli iliyoitwa",
|
||||
"unknown" => "Hitilafu isiyotarajiwa",
|
||||
];
|
||||
51
app/Language/sw-KE/Expenses.php
Normal file
51
app/Language/sw-KE/Expenses.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"add_item" => "Ongeza Matumizi",
|
||||
"amount" => "Kiasi",
|
||||
"amount_number" => "Kiasi lazima kiwe Namba",
|
||||
"amount_required" => "Kiasi cha Matumizi kinahitajika",
|
||||
"by_category" => "Kategoria",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta Kategoria ya Matumizi",
|
||||
"cash" => "Fedha Taslimu",
|
||||
"cash_filter" => "Fedha Taslimu",
|
||||
"categories_name" => "Kategoria",
|
||||
"category_required" => "Kategoria ni kiashiria kinachohitajika",
|
||||
"check" => "Hundi",
|
||||
"check_filter" => "Hundi",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Matumizi uliyoyachagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Matumizi uliyoyachagua?",
|
||||
"credit" => "Kadi ya Mkopo",
|
||||
"credit_filter" => "Kadi ya Mkopo",
|
||||
"date" => "Tarehe",
|
||||
"date_number" => "Tarehe lazima iwe Namba",
|
||||
"date_required" => "Tarehe ni kiashiria kinachohitajika",
|
||||
"debit" => "Kadi ya Debit",
|
||||
"debit_filter" => "Kadi ya Debit",
|
||||
"description" => "Maelezo",
|
||||
"due" => "Deni",
|
||||
"due_filter" => "Deni",
|
||||
"employee" => "Imeundwa na",
|
||||
"error_adding_updating" => "Hitilafu katika kuongeza/kusasisha Matumizi",
|
||||
"expense_id" => "Id",
|
||||
"expenses_employee" => "Mfanyakazi",
|
||||
"info" => "Taarifa za Matumizi",
|
||||
"ip_address" => "",
|
||||
"is_deleted" => "Imefutwa",
|
||||
"name_required" => "Jina la Matumizi linahitajika",
|
||||
"new" => "Matumizi Mpya",
|
||||
"new_supplier" => "",
|
||||
"no_expenses_to_display" => "Hakuna Matumizi ya kuonyesha",
|
||||
"none_selected" => "Hujachagua Matumizi yoyote",
|
||||
"one_or_multiple" => "Matumizi",
|
||||
"payment" => "Aina ya Malipo",
|
||||
"start_typing_supplier_name" => "Anza kuandika jina la Msambazaji...",
|
||||
"successful_adding" => "Kuongeza Matumizi kumewezekana",
|
||||
"successful_deleted" => "Kufuta Matumizi kumewezekana",
|
||||
"successful_updating" => "Kusasisha Matumizi kumewezekana",
|
||||
"supplier_name" => "Msambazaji",
|
||||
"supplier_tax_code" => "Namba ya Kodi",
|
||||
"tax_amount" => "Kodi",
|
||||
"tax_amount_number" => "",
|
||||
"update" => "Sasisha Matumizi",
|
||||
];
|
||||
23
app/Language/sw-KE/Expenses_categories.php
Normal file
23
app/Language/sw-KE/Expenses_categories.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"category_name_required" => "Jina la Kategoria ya Matumizi linahitajika",
|
||||
"add_item" => "Ongeza Kategoria",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta Kategoria ya Matumizi",
|
||||
"category_id" => "Id",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Kategoria ya Matumizi uliyochagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Kategoria ya Matumizi uliyochagua?",
|
||||
"description" => "Maelezo ya Kategoria",
|
||||
"error_adding_updating" => "Hitilafu katika kuongeza/kusasisha Kategoria ya Matumizi",
|
||||
"info" => "Taarifa za Kategoria ya Matumizi",
|
||||
"name" => "Jina la Kategoria",
|
||||
"new" => "Kategoria Mpya",
|
||||
"no_expenses_categories_to_display" => "Hakuna Kategoria ya kuonyesha",
|
||||
"none_selected" => "Hujachagua Kategoria yoyote ya Matumizi",
|
||||
"one_or_multiple" => "Kategoria ya Matumizi",
|
||||
"quantity" => "Kiasi",
|
||||
"successful_adding" => "Kuongeza Kategoria ya Matumizi kumewezekana",
|
||||
"successful_deleted" => "Kufuta Kategoria ya Matumizi kumewezekana",
|
||||
"successful_updating" => "Kusasisha Kategoria ya Matumizi kumewezekana",
|
||||
"update" => "Sasisha Kategoria",
|
||||
];
|
||||
72
app/Language/sw-KE/Giftcards.php
Normal file
72
app/Language/sw-KE/Giftcards.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"add_minus" => "Hisa ya kuongeza au kutoa.",
|
||||
"allow_alt_description" => "Ruhusu Maelezo Mbadala",
|
||||
"bulk_edit" => "Hariri kwa Wingi",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta Kadi za Zawadi ulizochagua, moja au zaidi tayari ina mauzo.",
|
||||
"cannot_find_giftcard" => "Kadi ya Zawadi haijapatikana.",
|
||||
"cannot_use" => "Kadi ya Zawadi {0} haiwezi kutumika kwa mauzo haya: Mteja si sahihi.",
|
||||
"card_value" => "Thamani",
|
||||
"category" => "Kategoria",
|
||||
"change_all_to_allow_alt_desc" => "Ruhusu maelezo mbadala kwa zote.",
|
||||
"change_all_to_not_allow_allow_desc" => "Usiruhusu maelezo mbadala kwa zote.",
|
||||
"change_all_to_serialized" => "Badilisha zote kuwa katika Mfululizo",
|
||||
"change_all_to_unserialized" => "Badilisha zote zisiwe katika Mfululizo",
|
||||
"confirm_bulk_edit" => "Una uhakika unataka kuhariri Kadi za Zawadi ulizochagua?",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Kadi za Zawadi ulizochagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Kadi za Zawadi ulizochagua?",
|
||||
"cost_price" => "Bei ya Jumla",
|
||||
"count" => "Sasisha Hisa",
|
||||
"csv_import_failed" => "Uingizaji wa CSV umeshindikana.",
|
||||
"current_quantity" => "Kiasi Kilichopo",
|
||||
"description" => "Maelezo",
|
||||
"details_count" => "Maelezo ya Hesabu ya Hisa",
|
||||
"do_nothing" => "Usifanye chochote",
|
||||
"edit_fields_you_want_to_update" => "Hariri sehemu unazotaka kwa Kadi za Zawadi ulizochagua.",
|
||||
"edit_multiple_giftcards" => "Hariri Kadi za Zawadi Nyingi.",
|
||||
"error_adding_updating" => "Kuongeza au kusasisha Kadi ya Zawadi kimeshindikana.",
|
||||
"error_updating_multiple" => "Kusasisha Kadi za Zawadi kumesindikana.",
|
||||
"generate_barcodes" => "Tengeneza Misimbomstari",
|
||||
"giftcard" => "Kadi ya Zawadi",
|
||||
"giftcard_number" => "Nambari ya Kadi ya Zawadi",
|
||||
"info_provided_by" => "Taarifa imetolewa na",
|
||||
"inventory_comments" => "Maoni",
|
||||
"is_serialized" => "Kadi ya Zawadi ina Nambari ya Seriali",
|
||||
"low_inventory_giftcards" => "Kadi za Zawadi zilizobakia kidogo",
|
||||
"manually_editing_of_quantity" => "Hariri Kiasi kwa Mkono",
|
||||
"must_select_giftcard_for_barcode" => "Lazima uchague angalau Kadi moja ya Zawadi kutengeneza misimbomstari.",
|
||||
"new" => "Kadi Mpya ya Zawadi",
|
||||
"no_description_giftcards" => "Kadi za Zawadi bila Maelezo",
|
||||
"no_giftcards_to_display" => "Hakuna Kadi za Zawadi za kuonyesha.",
|
||||
"none" => "Hakuna",
|
||||
"none_selected" => "Hakuna Kadi za Zawadi zilizochaguliwa kuhariri.",
|
||||
"number" => "Nambari ya Kadi ya Zawadi lazima iwe nambari.",
|
||||
"number_information" => "Nambari ya Kadi ya Zawadi",
|
||||
"number_required" => "Nambari ya Kadi ya Zawadi ni kiashiria kinachohitajika.",
|
||||
"one_or_multiple" => "Kadi za Zawadi",
|
||||
"person_id" => "Mteja",
|
||||
"quantity" => "Kiasi",
|
||||
"quantity_required" => "Kiasi ni kiashiria kinachohitajika. Tafadhali funga (X) kughairi.",
|
||||
"remaining_balance" => "Thamani iliyobaki ya Kadi ya Zawadi {0} ni {1}!",
|
||||
"reorder_level" => "Kiwango cha Kuagiza Tena",
|
||||
"retrive_giftcard_info" => "Pata Taarifa ya Kadi ya Zawadi",
|
||||
"sales_tax_1" => "Kodi ya Mauzo",
|
||||
"sales_tax_2" => "Kodi ya Mauzo 2",
|
||||
"serialized_giftcards" => "Kadi za Zawadi katika Mfululizo",
|
||||
"successful_adding" => "Umefanikiwa kuongeza Kadi ya Zawadi",
|
||||
"successful_bulk_edit" => "Umefanikiwa kusasisha Kadi za Zawadi ulizochagua",
|
||||
"successful_deleted" => "Umefanikiwa kufuta",
|
||||
"successful_updating" => "Umefanikiwa kusasisha Kadi ya Zawadi",
|
||||
"supplier" => "Msambazaji",
|
||||
"tax_1" => "Kodi 1",
|
||||
"tax_2" => "Kodi 2",
|
||||
"tax_percent" => "Asilimia ya Kodi",
|
||||
"tax_percents" => "Asilimia za Kodi",
|
||||
"unit_price" => "Thamani ya Rejareja",
|
||||
"upc_database" => "Kanzidata ya Misimbomstari",
|
||||
"update" => "Sasisha Kadi ya Zawadi",
|
||||
"use_inventory_menu" => "Tumia Menyu ya Hisa",
|
||||
"value" => "Thamani ya Kadi ya Zawadi lazima iwe nambari.",
|
||||
"value_required" => "Thamani ya Kadi ya Zawadi ni kiashiria kinachohitajika.",
|
||||
];
|
||||
42
app/Language/sw-KE/Item_kits.php
Normal file
42
app/Language/sw-KE/Item_kits.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"add_item" => "Ongeza Bidhaa",
|
||||
"all" => "Zote",
|
||||
"cannot_be_deleted" => "Imeshindikana Kufuta Vifurushi vya Bidhaa.",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Vifurushi vya Bidhaa ulivyochagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Vifurushi vya Bidhaa ulivyochagua?",
|
||||
"description" => "Maelezo ya Kifurushi cha Bidhaa",
|
||||
"discount" => "Punguzo",
|
||||
"discount_fixed" => "Punguzo la Kudumu",
|
||||
"discount_percent" => "Asilimia ya Punguzo",
|
||||
"discount_type" => "Aina ya Punguzo",
|
||||
"error_adding_updating" => "Imeshindikana Kuongeza au kusasisha Kifurushi cha Bidhaa.",
|
||||
"find_kit_item" => "Bidhaa ya Kifurushi",
|
||||
"info" => "Taarifa za Kifurushi cha Bidhaa",
|
||||
"item" => "Bidhaa",
|
||||
"item_kit_number" => "Msimbo wa Mstari",
|
||||
"item_kit_number_duplicate" => "Nambari ya Kifurushi cha Bidhaa tayari ipo kwenye kanzidata.",
|
||||
"item_number" => "",
|
||||
"item_number_duplicate" => "",
|
||||
"items" => "Bidhaa",
|
||||
"kit" => "ID ya Kifurushi",
|
||||
"kit_and_components" => "Kifurushi na Vipengele",
|
||||
"kit_and_stock" => "Kifurushi na Hisa",
|
||||
"kit_only" => "Kifurushi Pekee",
|
||||
"name" => "Jina la Kifurushi cha Bidhaa",
|
||||
"new" => "Kifurushi Kipya cha Bidhaa",
|
||||
"no_item_kits_to_display" => "Hakuna Vifurushi vya Bidhaa vya kuonyesha.",
|
||||
"none_selected" => "Hujachagua Kifurushi chochote cha Bidhaa.",
|
||||
"one_or_multiple" => "Kifurushi cha Bidhaa",
|
||||
"price_option" => "Chaguo la Bei",
|
||||
"priced_only" => "Bei Pekee",
|
||||
"print_option" => "Chaguo la Kuchapisha",
|
||||
"quantity" => "Kiasi",
|
||||
"sequence" => "Mpangilio",
|
||||
"successful_adding" => "Umefanikiwa kuongeza Kifurushi cha Bidhaa",
|
||||
"successful_deleted" => "Umefanikiwa kufuta",
|
||||
"successful_updating" => "Umefanikiwa kusasisha Kifurushi cha Bidhaa",
|
||||
"unit_price" => "",
|
||||
"update" => "Sasisha Kifurushi cha Bidhaa",
|
||||
];
|
||||
121
app/Language/sw-KE/Items.php
Normal file
121
app/Language/sw-KE/Items.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"add_minus" => "Hisa ya kuongeza au kutoa.",
|
||||
"allow_alt_description" => "Ruhusu Maelezo Mbadala",
|
||||
"amount_entry" => "Uingizaji wa Kiasi",
|
||||
"bulk_edit" => "Hariri kwa Wingi",
|
||||
"buy_price_required" => "Bei ya Ununuzi ni kiashiria kinachohitajika.",
|
||||
"cannot_be_deleted" => "Haiwezekani kufuta Bidhaa ulizochagua, moja au zaidi tayari ina mauzo.",
|
||||
"cannot_find_item" => "Bidhaa haijapatikana.",
|
||||
"categories" => "",
|
||||
"category" => "Kategoria",
|
||||
"category_new" => "",
|
||||
"category_required" => "Kategoria ni kiashiria kinachohitajika.",
|
||||
"change_all_to_allow_alt_desc" => "Ruhusu Maelezo Mbadala kwa zote.",
|
||||
"change_all_to_not_allow_allow_desc" => "Usiruhusu Maelezo Mbadala kwa zote.",
|
||||
"change_all_to_serialized" => "Badilisha zote kuwa na Serialized",
|
||||
"change_all_to_unserialized" => "Badilisha zote kuwa bila Unserialized",
|
||||
"change_image" => "Badilisha Picha",
|
||||
"confirm_bulk_edit" => "Una uhakika unataka kuhariri Bidhaa ulizochagua?",
|
||||
"confirm_bulk_edit_wipe_taxes" => "Taarifa zote za Kodi ya Bidhaa zitabadilishwa.",
|
||||
"confirm_delete" => "Una uhakika unataka kufuta Bidhaa ulizochagua?",
|
||||
"confirm_restore" => "Una uhakika unataka kurejesha Bidhaa ulizochagua?",
|
||||
"cost_price" => "Bei ya Jumla",
|
||||
"cost_price_number" => "Bei ya Jumla lazima iwe namba.",
|
||||
"cost_price_required" => "Bei ya Jumla ni kiashiria kinachohitajika.",
|
||||
"count" => "Sasisha Hisa",
|
||||
"csv_import_failed" => "Uingizaji wa CSV umeshindikana",
|
||||
"csv_import_nodata_wrongformat" => "Faili ya CSV iliyopakiwa haina data au imepangwa vibaya.",
|
||||
"csv_import_partially_failed" => "Kumekuwa na makosa {0} ya uingizaji wa bidhaa kwenye mstari: {1}. Hakuna safu zilizoingizwa.",
|
||||
"csv_import_success" => "Uingizaji wa Bidhaa kutoka CSV umefanikiwa.",
|
||||
"current_quantity" => "Kiasi Kilichopo",
|
||||
"default_pack_name" => "Kila",
|
||||
"description" => "Maelezo",
|
||||
"details_count" => "Maelezo ya Hesabu ya Hisa",
|
||||
"do_nothing" => "Usifanye chochote",
|
||||
"edit" => "",
|
||||
"edit_fields_you_want_to_update" => "Hariri sehemu unazotaka kwa Bidhaa ulizochagua.",
|
||||
"edit_multiple_items" => "Hariri Bidhaa Nyingi",
|
||||
"empty_upc_items" => "Bidhaa zisizo na Msimbo wa Mstari",
|
||||
"error_adding_updating" => "Hitilafu katika kuongeza/kusasisha Bidhaa",
|
||||
"error_updating_multiple" => "Hitilafu katika kusasisha Bidhaa",
|
||||
"generate_barcodes" => "Tengeneza Misimbomstari",
|
||||
"hsn_code" => "Harmonized System Nomenclature",
|
||||
"image" => "Picha",
|
||||
"import_items_csv" => "Ingiza Bidhaa kutoka CSV",
|
||||
"info_provided_by" => "Taarifa imetolewa na",
|
||||
"inventory" => "Hisa",
|
||||
"inventory_CSV_import_quantity" => "Kiasi kilichoingizwa kutoka CSV",
|
||||
"inventory_comments" => "Maoni",
|
||||
"inventory_data_tracking" => "Inventory Data Tracking",
|
||||
"inventory_date" => "Tarehe",
|
||||
"inventory_employee" => "Mfanyakazi",
|
||||
"inventory_in_out_quantity" => "Kiasi Ndani/Nje",
|
||||
"inventory_remarks" => "Maelezo",
|
||||
"is_deleted" => "Imefutwa",
|
||||
"is_printed" => "",
|
||||
"is_serialized" => "Bidhaa ina Serial Number",
|
||||
"item" => "Bidhaa",
|
||||
"item_id" => "",
|
||||
"item_number" => "Msimbo wa Mstari",
|
||||
"item_number_duplicate" => "namba ya Bidhaa tayari ipo kwenye Kanzidata.",
|
||||
"kit" => "Kifurushi",
|
||||
"location" => "Mahali",
|
||||
"low_inventory_items" => "Bidhaa Zilizokwisha Stoo",
|
||||
"low_sell_item" => "Bidhaa yenye mauzo kidogo",
|
||||
"manually_editing_of_quantity" => "Hariri Kiasi kwa kuandika",
|
||||
"markup" => "",
|
||||
"name" => "Jina la Bidhaa",
|
||||
"name_required" => "Jina la Bidhaa ni kiashiria kinachohitajika.",
|
||||
"new" => "Bidhaa Mpya",
|
||||
"no_description_items" => "Bidhaa zisizo na Maelezo",
|
||||
"no_items_to_display" => "Hakuna Bidhaa za kuonyesha.",
|
||||
"none" => "Hakuna",
|
||||
"none_selected" => "Hujachagua Bidhaa yoyote kuhariri",
|
||||
"nonstock" => "Isiyo na Akiba",
|
||||
"number_information" => "Namba ya Bidhaa",
|
||||
"number_required" => "Msimbo wa Mstari ni kiashiria kinachohitajika.",
|
||||
"one_or_multiple" => "bidhaa",
|
||||
"pack_name" => "Jina la Pakiti",
|
||||
"qty_per_pack" => "Kiasi kwa kila pakiti",
|
||||
"quantity" => "Kiasi",
|
||||
"quantity_number" => "Kiasi lazima kiwe namba.",
|
||||
"quantity_required" => "Kiasi ni kiashiria kinachohitajika.",
|
||||
"receiving_quantity" => "Kiasi Kinachopokelewa",
|
||||
"remove_image" => "Ondoa Picha",
|
||||
"reorder_level" => "Kiwango cha Kuagiza Tena",
|
||||
"reorder_level_number" => "Kiwango cha Kuagiza Tena lazima kiwe namba.",
|
||||
"reorder_level_required" => "Kiwango cha Kuagiza Tena ni kiashiria kinachohitajika.",
|
||||
"retrive_item_info" => "Pata Taarifa ya Bidhaa",
|
||||
"sales_tax_1" => "Kodi ya Mauzo",
|
||||
"sales_tax_2" => "Kodi ya Mauzo 2",
|
||||
"search_attributes" => "Tafuta Sifa",
|
||||
"select_image" => "Chagua Picha",
|
||||
"serialized_items" => "Bidhaa katika Mfululizo",
|
||||
"standard" => "Kawaida",
|
||||
"stock" => "Hisa",
|
||||
"stock_location" => "Stoo",
|
||||
"stock_type" => "Aina ya Hisa",
|
||||
"successful_adding" => "Umefanikiwa kuongeza Bidhaa",
|
||||
"successful_bulk_edit" => "Umefanikiwa kusasisha Bidhaa ulizochagua",
|
||||
"successful_deleted" => "Umefanikiwa kufuta",
|
||||
"successful_updating" => "Umefanikiwa kusasisha Bidhaa",
|
||||
"supplier" => "Msambazaji",
|
||||
"tax_1" => "Kodi 1",
|
||||
"tax_2" => "Kodi 2",
|
||||
"tax_3" => "",
|
||||
"tax_category" => "Aina ya Kodi",
|
||||
"tax_percent" => "Asilimia ya Kodi",
|
||||
"tax_percent_number" => "Asilimia ya Kodi lazima iwe namba",
|
||||
"tax_percent_required" => "Asilimia ya Kodi ni kiashiria kinachohitajika.",
|
||||
"tax_percents" => "Asilimia za Kodi",
|
||||
"temp" => "isiyodumu",
|
||||
"type" => "Aina ya Bidhaa",
|
||||
"unit_price" => "Bei ya Rejareja",
|
||||
"unit_price_number" => "Bei ya Rejareja lazima iwe namba.",
|
||||
"unit_price_required" => "Bei ya Rejareja ni kiashiria kinachohitajika.",
|
||||
"upc_database" => "Kanzidata ya Misimbomstari",
|
||||
"update" => "Sasisha Bidhaa",
|
||||
"use_inventory_menu" => "Tumia Menyu ya Hisa",
|
||||
];
|
||||
16
app/Language/sw-KE/Login.php
Normal file
16
app/Language/sw-KE/Login.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"gcaptcha" => "Mimi si roboti.",
|
||||
"go" => "Nenda",
|
||||
"invalid_gcaptcha" => "Tafadhali thibitisha kuwa wewe si roboti.",
|
||||
"invalid_installation" => "Usakinishaji si sahihi, angalia faili yako ya php.ini.",
|
||||
"invalid_username_and_password" => "Jina la mtumiaji na/au nenosiri si sahihi.",
|
||||
"login" => "Ingia",
|
||||
"logout" => "Toka",
|
||||
"migration_needed" => "Uhamishaji wa kanzidata hadi {0} utaanza baada ya kuingia.",
|
||||
"password" => "Nenosiri",
|
||||
"required_username" => "Jina la mtumiaji ni lazima.",
|
||||
"username" => "Jina la Mtumiaji",
|
||||
"welcome" => "Karibu kwenye {0}!",
|
||||
];
|
||||
16
app/Language/sw-KE/Messages.php
Normal file
16
app/Language/sw-KE/Messages.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"first_name" => "Jina la Kwanza",
|
||||
"last_name" => "Jina la Mwisho",
|
||||
"message" => "Ujumbe",
|
||||
"message_placeholder" => "Ujumbe wako hapa...",
|
||||
"message_required" => "Ujumbe unahitajika",
|
||||
"multiple_phones" => "(Ikiwa kuna wapokeaji wengi, ingiza nambari za simu zilizotenganishwa kwa koma)",
|
||||
"phone" => "Namba ya Simu",
|
||||
"phone_number_required" => "Namba ya simu inahitajika",
|
||||
"phone_placeholder" => "Namba ya Simu hapa...",
|
||||
"sms_send" => "Tuma ujumbe mfupi wa maneno",
|
||||
"successfully_sent" => "Ujumbe umetumwa kwa mafanikio kwa: ",
|
||||
"unsuccessfully_sent" => "Ujumbe umetumwa bila mafanikio kwa: ",
|
||||
];
|
||||
49
app/Language/sw-KE/Module.php
Normal file
49
app/Language/sw-KE/Module.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
"admin_cashups" => "",
|
||||
"admin_cashups_desc" => "",
|
||||
"attributes" => "Sifa",
|
||||
"attributes_desc" => "Ongeza, Sasisha, Futa, na Tafuta sifa.",
|
||||
"both" => "Vyote",
|
||||
"cashups" => "Fedha Taslimu",
|
||||
"cashups_desc" => "Ongeza, Sasisha, Futa, na Tafuta Fedha Taslimu.",
|
||||
"config" => "Mipangilio",
|
||||
"config_desc" => "Badilisha Mipangilio ya OSPOS.",
|
||||
"customers" => "Wateja",
|
||||
"customers_desc" => "Ongeza, Sasisha, Futa, na Tafuta Wateja.",
|
||||
"employees" => "Wafanyakazi",
|
||||
"employees_desc" => "Ongeza, Sasisha, Futa, na Tafuta Wafanyakazi.",
|
||||
"expenses" => "Matumizi",
|
||||
"expenses_categories" => "Aina za Matumizi",
|
||||
"expenses_categories_desc" => "Ongeza, Sasisha, na Futa Aina za Matumizi.",
|
||||
"expenses_desc" => "Ongeza, Sasisha, Futa, na Tafuta Matumizi.",
|
||||
"giftcards" => "Kadi za Zawadi",
|
||||
"giftcards_desc" => "Ongeza, Sasisha, Futa na Tafuta Kadi za Zawadi.",
|
||||
"home" => "Mwanzo",
|
||||
"home_desc" => "Orodhesha moduli za menyu ya mwanzo.",
|
||||
"item_kits" => "Vifurushi vya Bidhaa",
|
||||
"item_kits_desc" => "Ongeza, Sasisha, Futa na Tafuta Vifurushi vya Bidhaa.",
|
||||
"items" => "Bidhaa",
|
||||
"items_desc" => "Ongeza, Sasisha, Futa, na Tafuta Bidhaa.",
|
||||
"messages" => "Ujumbe",
|
||||
"messages_desc" => "Tuma Ujumbe kwa Wateja, Wasambazaji na Wafanyakazi.",
|
||||
"migrate" => "Hamisha",
|
||||
"migrate_desc" => "Sasisha kanzidata ya OSPOS.",
|
||||
"office" => "Ofisi",
|
||||
"office_desc" => "Orodhesha moduli za menyu ya ofisi.",
|
||||
"receivings" => "Manunuzi",
|
||||
"receivings_desc" => "Shughulikia Maagizo ya Ununuzi.",
|
||||
"reports" => "Ripoti",
|
||||
"reports_desc" => "Angalia na tengeneza Ripoti.",
|
||||
"sales" => "Mauzo",
|
||||
"sales_desc" => "Shughulikia Mauzo na Marejesho.",
|
||||
"suppliers" => "Wasambazaji",
|
||||
"suppliers_desc" => "Ongeza, Sasisha, Futa, na Tafuta Wasambazaji.",
|
||||
"taxes" => "Kodi",
|
||||
"taxes_desc" => "Sanidi Kodi ya Mauzo.",
|
||||
"timeclocks" => "",
|
||||
"timeclocks_categories" => "",
|
||||
"timeclocks_categories_desc" => "",
|
||||
"timeclocks_desc" => "",
|
||||
];
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user